diff --git a/services/audio_policy/server/domain/pipe/include/audio_policy_config_manager.h b/services/audio_policy/server/domain/pipe/include/audio_policy_config_manager.h index d0b40f6c11bf1761c3ff216d8db2bdfdecde50ac..b0723dc6cab0c45a5ae1232fb862739dcbc8ead9 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_policy_config_manager.h +++ b/services/audio_policy/server/domain/pipe/include/audio_policy_config_manager.h @@ -113,6 +113,8 @@ private: std::shared_ptr adapterPipeInfo, std::shared_ptr &info, const AudioChannel &tempChannel); std::shared_ptr GetNormalRecordAdapterInfo(std::shared_ptr desc); + std::shared_ptr GetSuitableStreamPropInfo( + std::list> &dynamicStreamPropInfos, uint32_t sampleRate); std::shared_ptr GetDynamicStreamPropInfoFromPipe(std::shared_ptr &info, AudioSampleFormat format, uint32_t sampleRate, AudioChannel channels); AudioSampleFormat ParseFormat(std::string format); diff --git a/services/audio_policy/server/domain/pipe/src/audio_policy_config_manager.cpp b/services/audio_policy/server/domain/pipe/src/audio_policy_config_manager.cpp index 027996f8ad0b39dd2bc705103d72997f762cc0a7..7d7a628670f1da6ec23f075d157586b31910bb38 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_policy_config_manager.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_policy_config_manager.cpp @@ -716,25 +716,41 @@ void AudioPolicyConfigManager::UpdateBasicStreamInfo(std::shared_ptr GetSuitableStreamPropInfo( + std::list> &dynamicStreamPropInfos, uint32_t sampleRate) +{ + dynamicStreamPropInfos.sort([](const auto &a, const auto &b) { + if (a == nullptr) { + return true; + } else if (b == nullptr) { + return false; + } else { + return a->sampleRate_ < b->sampleRate_; + } + }); + + for (auto &streamProp : dynamicStreamPropInfos) { + CHECK_AND_RETURN_RET(!(streamProp && streamProp->sampleRate_ >= sampleRate), streamProp); + } + + return dynamicStreamPropInfos.back(); +} + std::shared_ptr AudioPolicyConfigManager::GetDynamicStreamPropInfoFromPipe( std::shared_ptr &info, AudioSampleFormat format, uint32_t sampleRate, AudioChannel channels) { std::unique_lock lock(info->dynamicMtx_); CHECK_AND_RETURN_RET(info && !info->dynamicStreamPropInfos_.empty(), nullptr); - std::shared_ptr defaultStreamProp = nullptr; AUDIO_INFO_LOG("use dynamic streamProp"); + std::list> channelMatchInfos; for (auto &streamProp : info->dynamicStreamPropInfos_) { - CHECK_AND_CONTINUE(streamProp && streamProp->sampleRate_ >= sampleRate); - CHECK_AND_RETURN_RET(streamProp->sampleRate_ != sampleRate, streamProp); - // find min sampleRate bigger than music sampleRate, eg: 44100 -> 48000 when has 32000, 48000, 96000, 192000 - CHECK_AND_CONTINUE(defaultStreamProp == nullptr || (defaultStreamProp != nullptr && - defaultStreamProp->sampleRate_ > streamProp->sampleRate_)); - defaultStreamProp = streamProp; - } - CHECK_AND_RETURN_RET_LOG(defaultStreamProp != nullptr, info->dynamicStreamPropInfos_.back(), - "not match any streamProp"); - return defaultStreamProp; + CHECK_AND_CONTINUE(streamProp && streamProp->channels_ >= channels); + channelMatchInfos.push_back(streamProp); + } + + CHECK_AND_RETURN_RET(channelMatchInfos.size() == 0, GetSuitableStreamPropInfo(channelMatchInfos, sampleRate)); + return GetSuitableStreamPropInfo(info->dynamicStreamPropInfos_, sampleRate); } std::shared_ptr AudioPolicyConfigManager::GetStreamPropInfoFromPipe( diff --git a/services/audio_policy/test/unittest/audio_policy_service_unit_test/src/audio_policy_service_thirdext_unit_test.cpp b/services/audio_policy/test/unittest/audio_policy_service_unit_test/src/audio_policy_service_thirdext_unit_test.cpp index adb0bf4a432d3dd607e400e1a9ad493eb3f66ce4..b12206e2a1c1d8c464d716e1d88655e803e36041 100644 --- a/services/audio_policy/test/unittest/audio_policy_service_unit_test/src/audio_policy_service_thirdext_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_policy_service_unit_test/src/audio_policy_service_thirdext_unit_test.cpp @@ -1557,6 +1557,59 @@ HWTEST_F(AudioPolicyServiceFourthUnitTest, UpdateBasicStreamInfo_001, TestSize.L EXPECT_EQ(streamInfo.channels, STEREO); } +/** +* @tc.name : Test AudioPolicyConfigManager. +* @tc.number: GetDynamicStreamPropInfoFromPipe_001 +* @tc.desc : Test GetDynamicStreamPropInfoFromPipe +*/ +HWTEST_F(AudioPolicyServiceFourthUnitTest, GetDynamicStreamPropInfoFromPipe_001, TestSize.Level1) +{ + AudioPolicyConfigManager &manager = AudioPolicyConfigManager::GetInstance(); + EXPECT_EQ(manager.Init(true), true); + std::vector channelVec = {AudioChannel::MONO, AudioChannel::STEREO, AudioChannel::CHANNEL_3, + AudioChannel::CHANNEL_4, AudioChannel::STEREO, AudioChannel::STEREO }; + std::vector sampleRateVec = { 192000, 32000, 48000, 96000, 42000, 41000 }; + std::shared_ptr info = std::make_shared(); + info->dynamicStreamPropInfos_.push_back(nullptr); + for (size_t i = 0; i < channelVec.size(); i++) { + std::shared_ptr temp = std::make_shared(); + temp->channels_ = channelVec[i]; + temp->sampleRate_ = sampleRateVec[i]; + info->dynamicStreamPropInfos_.push_back(temp); + } + info->dynamicStreamPropInfos_.push_back(nullptr); + + AudioSampleFormat format = AudioSampleFormat::SAMPLE_S16LE; + std::shared_ptr defaultStreamProp = nullptr; + uint32_t sampleRate; + AudioChannel channels; + auto isEqual = [](const AudioChannel &channel, const uint32_t &sampleRate, + std::shared_ptr &defaultStreamProp) { + return channel == defaultStreamProp->channels_ && sampleRate == defaultStreamProp->sampleRate_; + }; + + sampleRate = 192100; + channels = AudioChannel::CHANNEL_5; + defaultStreamProp = manager.GetDynamicStreamPropInfoFromPipe(info, format, sampleRate, channels); + EXPECT_EQ(true, isEqual(channelVec[0], sampleRateVec[0], defaultStreamProp)); + + sampleRate = 41000; + channels = AudioChannel::STEREO; + defaultStreamProp = manager.GetDynamicStreamPropInfoFromPipe(info, format, sampleRate, channels); + EXPECT_EQ(true, isEqual(channelVec[5], sampleRateVec[5], defaultStreamProp)); + + sampleRate = 44100; + channels = AudioChannel::STEREO; + defaultStreamProp = manager.GetDynamicStreamPropInfoFromPipe(info, format, sampleRate, channels); + EXPECT_EQ(true, isEqual(channelVec[4], sampleRateVec[4], defaultStreamProp)); + + info->dynamicStreamPropInfos_.clear(); + info->dynamicStreamPropInfos_.push_back(nullptr); + info->dynamicStreamPropInfos_.push_back(nullptr); + defaultStreamProp = manager.GetDynamicStreamPropInfoFromPipe(info, format, sampleRate, channels); + EXPECT_EQ(true, defaultStreamProp == nullptr); +} + /** * @tc.name : Test AudioPolicyConfigManager. * @tc.number: ParseFormat_001