From f8f7e04bfb1f774477ac2ab6315af09dc8a6f50c Mon Sep 17 00:00:00 2001 From: nldjhdb <16164694+nldjhdb@user.noreply.gitee.com> Date: Wed, 20 Aug 2025 07:57:08 +0000 Subject: [PATCH] 4mic bugfix when reload normal source Signed-off-by: nldjhdb <16164694+nldjhdb@user.noreply.gitee.com> --- frameworks/native/hdiadapter_new/BUILD.gn | 1 + .../include/source/audio_capture_source.h | 1 + .../source/audio_capture_source.cpp | 76 ++++++++++++- .../source/audio_capture_source_unit_test.cpp | 106 +++++++++++++++++- .../domain/pipe/src/audio_ec_manager.cpp | 3 + .../src/audio_adapter_manager_unit_test.cpp | 15 +++ 6 files changed, 200 insertions(+), 2 deletions(-) diff --git a/frameworks/native/hdiadapter_new/BUILD.gn b/frameworks/native/hdiadapter_new/BUILD.gn index 7bc564b570..de68690665 100644 --- a/frameworks/native/hdiadapter_new/BUILD.gn +++ b/frameworks/native/hdiadapter_new/BUILD.gn @@ -172,6 +172,7 @@ ohos_unittest("hdiadapter_unit_test") { "../../../interfaces/inner_api/native/audiocommon/include", "../audioutils/include", "../../../frameworks/native/hdiadapter_new/include/sink", + "../../../frameworks/native/audioclock/include", ] sources = [ diff --git a/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h b/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h index ebd47a8ab0..140390d8c7 100644 --- a/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h +++ b/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h @@ -80,6 +80,7 @@ public: private: static AudioFormat ConvertToHdiFormat(AudioSampleFormat format); static uint64_t GetChannelLayoutByChannelCount(uint32_t channelCount); + static uint64_t GetChannelCountByChannelLayout(uint64_t channelLayout); static enum AudioInputType ConvertToHDIAudioInputType(int32_t sourceType, std::string hdiSourceType); static AudioSampleFormat ParseAudioFormat(const std::string &format); static AudioCategory GetAudioCategory(AudioScene audioScene); diff --git a/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp b/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp index 3db67612f2..2d4b708043 100644 --- a/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp +++ b/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp @@ -606,6 +606,79 @@ uint64_t AudioCaptureSource::GetChannelLayoutByChannelCount(uint32_t channelCoun return channelLayout; } +uint64_t AudioCaptureSource::GetChannelCountByChannelLayout(uint64_t channelLayout) +{ + AudioChannel channel = AudioChannel::CHANNEL_UNKNOW; + switch (layout) { + case AudioChannelLayout::CH_LAYOUT_MONO: + channel = AudioChannel::MONO; + break; + case AudioChannelLayout::CH_LAYOUT_STEREO: + case AudioChannelLayout::CH_LAYOUT_STEREO_DOWNMIX: + channel = AudioChannel::STEREO; + break; + case AudioChannelLayout::CH_LAYOUT_2POINT1: + case AudioChannelLayout::CH_LAYOUT_3POINT0: + case AudioChannelLayout::CH_LAYOUT_SURROUND: + channel = AudioChannel::CHANNEL_3; + break; + case AudioChannelLayout::CH_LAYOUT_3POINT1: + case AudioChannelLayout::CH_LAYOUT_4POINT0: + case AudioChannelLayout::CH_LAYOUT_QUAD_SIDE: + case AudioChannelLayout::CH_LAYOUT_QUAD: + case AudioChannelLayout::CH_LAYOUT_2POINT0POINT2: + channel = AudioChannel::CHANNEL_4; + break; + case AudioChannelLayout::CH_LAYOUT_4POINT1: + case AudioChannelLayout::CH_LAYOUT_5POINT0: + case AudioChannelLayout::CH_LAYOUT_5POINT0_BACK: + case AudioChannelLayout::CH_LAYOUT_2POINT1POINT2: + case AudioChannelLayout::CH_LAYOUT_3POINT0POINT2: + channel = AudioChannel::CHANNEL_5; + break; + case AudioChannelLayout::CH_LAYOUT_5POINT1: + case AudioChannelLayout::CH_LAYOUT_5POINT1_BACK: + case AudioChannelLayout::CH_LAYOUT_6POINT0: + case AudioChannelLayout::CH_LAYOUT_HEXAGONAL: + case AudioChannelLayout::CH_LAYOUT_3POINT1POINT2: + case AudioChannelLayout::CH_LAYOUT_6POINT0_FRONT: + channel = AudioChannel::CHANNEL_6; + break; + case AudioChannelLayout::CH_LAYOUT_6POINT1: + case AudioChannelLayout::CH_LAYOUT_6POINT1_BACK: + case AudioChannelLayout::CH_LAYOUT_6POINT1_FRONT: + case AudioChannelLayout::CH_LAYOUT_7POINT0: + case AudioChannelLayout::CH_LAYOUT_7POINT0_FRONT: + channel = AudioChannel::CHANNEL_7; + break; + case AudioChannelLayout::CH_LAYOUT_7POINT1: + case AudioChannelLayout::CH_LAYOUT_OCTAGONAL: + case AudioChannelLayout::CH_LAYOUT_5POINT1POINT2: + case AudioChannelLayout::CH_LAYOUT_7POINT1_WIDE: + case AudioChannelLayout::CH_LAYOUT_7POINT1_WIDE_BACK: + channel = AudioChannel::CHANNEL_8; + break; + case AudioChannelLayout::CH_LAYOUT_5POINT1POINT4: + case AudioChannelLayout::CH_LAYOUT_7POINT1POINT2: + channel = AudioChannel::CHANNEL_10; + break; + case AudioChannelLayout::CH_LAYOUT_7POINT1POINT4: + case AudioChannelLayout::CH_LAYOUT_10POINT2: + channel = AudioChannel::CHANNEL_12; + break; + case AudioChannelLayout::CH_LAYOUT_9POINT1POINT4: + channel = AudioChannel::CHANNEL_14; + case AudioChannelLayout::CH_LAYOUT_9POINT1POINT6: + case AudioChannelLayout::CH_LAYOUT_HEXADECAGONAL: + channel = AudioChannel::CHANNEL_16; + break; + default: + channel = AudioChannel::CHANNEL_UNKNOW; + break; + } + return static_cast(channel); +} + const std::unordered_map AudioCaptureSource::audioInputTypeMap_ = { {"AUDIO_INPUT_MIC_TYPE", AUDIO_INPUT_MIC_TYPE}, {"AUDIO_INPUT_SPEECH_WAKEUP_TYPE", AUDIO_INPUT_SPEECH_WAKEUP_TYPE}, @@ -842,7 +915,8 @@ void AudioCaptureSource::InitAudioSampleAttr(struct AudioSampleAttributes ¶m param.isBigEndian = attr_.isBigEndian; param.channelCount = attr_.channel; param.channelLayout = attr_.channelLayout; - if (param.channelLayout == CH_LAYOUT_UNKNOWN) { + if (GetChannelCountByChannelLayout(param.channelLayout) != param.channelCount) { + AUDIO_INFO_LOG("channelLayout is ot suitable for channelCount, convert channel to channelLayout"); param.channelLayout = GetChannelLayoutByChannelCount(attr_.channel); } param.silenceThreshold = attr_.bufferSize; diff --git a/frameworks/native/hdiadapter_new/test/unittest/source/audio_capture_source_unit_test.cpp b/frameworks/native/hdiadapter_new/test/unittest/source/audio_capture_source_unit_test.cpp index a40e03150a..c97237791d 100644 --- a/frameworks/native/hdiadapter_new/test/unittest/source/audio_capture_source_unit_test.cpp +++ b/frameworks/native/hdiadapter_new/test/unittest/source/audio_capture_source_unit_test.cpp @@ -19,6 +19,7 @@ #include "audio_utils.h" #include "common/hdi_adapter_info.h" #include "manager/hdi_adapter_manager.h" +#include "source/audio_capture_source.h" using namespace testing::ext; @@ -73,7 +74,7 @@ void AudioCaptureSourceUnitTest::InitPrimarySource() attr_.sampleRate = 48000; // 48000: sample rate attr_.channel = 2; // 2: channel attr_.format = SAMPLE_S16LE; - attr_.channelLayout = 3; // 3: channel layout + attr_.channelLayout = CH_LAYOUT_UNKNOWN; attr_.deviceType = DEVICE_TYPE_MIC; attr_.openMicSpeaker = 1; primarySource_->Init(attr_); @@ -390,5 +391,108 @@ HWTEST_F(AudioCaptureSourceUnitTest, UsbSourceUnitTest_004, TestSize.Level1) DeInitUsbSource(); } +/** +* @tc.name : Test GetChannelCountByChannelLayout API +* @tc.number : GetChannelCountByChannelLayout_001 +* @tc.desc : Test GetChannelCountByChannelLayout API +*/ +HWTEST_F(AudioCaptureSourceUnitTest, GetChannelCountByChannelLayout_001, TestSize.Level1) +{ + uint64_t channelCount = 0; + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_UNKNOWN); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_UNKNOWN); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_MONO); + EXPECT_EQ(channelCount, AudioChannel::MONO); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_STEREO); + EXPECT_EQ(channelCount, AudioChannel::STEREO); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_STEREO_DOWNMIX); + EXPECT_EQ(channelCount, AudioChannel::STEREO); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_2POINT1); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_3); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_3POINT0); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_3); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_SURROUND); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_3); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_3POINT1); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_4); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_4POINT0); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_4); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_QUAD_SIDE); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_4); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_QUAD); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_4); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_2POINT0POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_4); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_4POINT1); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_5); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_5POINT0); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_5); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_5POINT0_BACK); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_5); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_2POINT1POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_5); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_3POINT0POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_5); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_5POINT1); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_6); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_5POINT1_BACK); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_6); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_6POINT0); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_6); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_HEXAGONAL); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_6); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_3POINT1POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_6); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_6POINT0_FRONT); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_6); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_6POINT1); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_7); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_6POINT1_BACK); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_7); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_6POINT1_FRONT); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_7); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT0); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_7); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT0_FRONT); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_7); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT1); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_8); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_OCTAGONAL); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_8); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_5POINT1POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_8); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT1_WIDE); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_8); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT1_WIDE_BACK); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_8); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_5POINT1POINT4); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_10); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT1POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_10); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_7POINT1POINT4); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_12); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_10POINT2); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_12); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_9POINT1POINT4); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_14); + + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_9POINT1POINT6); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_16); + channelCount = AudioCaptureSource::GetChannelCountByChannelLayout(AudioChannelLayout::CH_LAYOUT_HEXADECAGONAL); + EXPECT_EQ(channelCount, AudioChannel::CHANNEL_16); +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp b/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp index c1ec4be4ea..08ab156752 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp @@ -227,6 +227,7 @@ void AudioEcManager::UpdateStreamCommonInfo(AudioModuleInfo &moduleInfo, PipeStr moduleInfo.bufferSize = std::to_string(targetInfo.bufferSize_); moduleInfo.format = AudioDefinitionPolicyUtils::enumToFormatStr[targetInfo.format_]; moduleInfo.sourceType = std::to_string(sourceType); + moduleInfo.channelLayout = std::to_string(targetInfo.channelLayout_); } else { shared_ptr inputDesc = audioRouterCenter_.FetchInputDevice(sourceType, -1); if (inputDesc != nullptr && inputDesc->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) { @@ -240,6 +241,7 @@ void AudioEcManager::UpdateStreamCommonInfo(AudioModuleInfo &moduleInfo, PipeStr moduleInfo.bufferSize = std::to_string(targetInfo.bufferSize_); moduleInfo.format = AudioDefinitionPolicyUtils::enumToFormatStr[targetInfo.format_]; moduleInfo.sourceType = std::to_string(sourceType); + moduleInfo.channelLayout = std::to_string(targetInfo.channelLayout_); if (inputDesc != nullptr) { moduleInfo.deviceType = std::to_string(static_cast(inputDesc->deviceType_)); } @@ -247,6 +249,7 @@ void AudioEcManager::UpdateStreamCommonInfo(AudioModuleInfo &moduleInfo, PipeStr primaryMicModuleInfo_.channels = std::to_string(targetInfo.channels_); primaryMicModuleInfo_.rate = std::to_string(targetInfo.sampleRate_); primaryMicModuleInfo_.format = AudioDefinitionPolicyUtils::enumToFormatStr[targetInfo.format_]; + primaryMicModuleInfo_.channelLayout = std::to_string(targetInfo.channelLayout_) } } } diff --git a/services/audio_policy/test/unittest/audio_adapter_manager_unit_test/src/audio_adapter_manager_unit_test.cpp b/services/audio_policy/test/unittest/audio_adapter_manager_unit_test/src/audio_adapter_manager_unit_test.cpp index 1248f09dce..35363a0bae 100644 --- a/services/audio_policy/test/unittest/audio_adapter_manager_unit_test/src/audio_adapter_manager_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_adapter_manager_unit_test/src/audio_adapter_manager_unit_test.cpp @@ -718,5 +718,20 @@ HWTEST_F(AudioAdapterManagerUnitTest, GetMinVolumeLevel_004, TestSize.Level1) EXPECT_EQ(ret, audioAdapterManager->minVolumeIndexMap_[STREAM_MUSIC]); } +/** + * @tc.name: Test GetAudioSourceAttr + * @tc.number: GetAudioSourceAttr_001 + * @tc.type: FUNC + * @tc.desc: when inof layout is not empty, passthrought layout to attr + */ +HWTEST_F(AudioAdapterManagerUnitTest, GetAudioSourceAttr_001, TestSize.Level1) +{ + auto audioAdapterManager = std::make_shared(); + AudioModuleInfo info; + info.channelLayout = "263"; // 263 = 100000111 + IAudioSourceAttr attr = audioAdapterManager->GetAudioSourceAttr(info); + EXPECT_EQ(attr.channelLayout, 263); // 263 = 100000111 +} + } // namespace AudioStandard } // namespace OHOS -- Gitee