diff --git a/frameworks/native/hdiadapter_new/BUILD.gn b/frameworks/native/hdiadapter_new/BUILD.gn index 7bc564b5708ce20b15d023963fe7378a4ea6fd5d..de68690665171224d7c038e702947e1ee5220306 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 ebd47a8ab003440b70d4bc23f83d8b92a177ca13..140390d8c761186e0b2cbe356bf6e2661321909d 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 3db67612f2f97f7d804d993aa67a1a34dd3fb084..2d4b708043e74d141664fe217bfbf2f92f4c7a2e 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 a40e03150a874467f0e7a0cf2c309d7b516b0118..c97237791dd38a19f835abc023c13d3c6ed540cd 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 c1ec4be4ea61815051a9c77506f968c95c51daa6..08ab156752bdb5dd44b1166a11accf6a6838cf79 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 1248f09dce8ccb4cd39af54d26faba2eb2b545e0..fac614e9b51caf2435536580472801f41cf5991b 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