Loading system/bta/le_audio/codec_manager.cc +19 −0 Original line number Diff line number Diff line Loading @@ -127,6 +127,11 @@ struct codec_manager_impl { } CodecLocation GetCodecLocation(void) const { return codec_location_; } bool IsOffloadDualBiDirSwbSupported(void) const { return codec_location_ == le_audio::types::CodecLocation::ADSP && offload_dual_bidirection_swb_supported_; } void UpdateActiveAudioConfig( const types::BidirectionalPair<stream_parameters>& stream_params, types::BidirectionalPair<uint16_t> delays_ms, Loading Loading @@ -505,6 +510,11 @@ struct codec_manager_impl { adsp_capabilities)) { LOG(INFO) << "Offload supported conf, context type: " << (int)ctx_type << ", settings -> " << software_audio_set_conf->name; if (AudioSetConfigurationProvider::Get() ->CheckConfigurationIsDualBiDirSwb( *software_audio_set_conf)) { offload_dual_bidirection_swb_supported_ = true; } context_type_offload_config_map_[ctx_type].push_back( software_audio_set_conf); } Loading @@ -516,6 +526,7 @@ struct codec_manager_impl { CodecLocation codec_location_ = CodecLocation::HOST; bool offload_enable_ = false; bool offload_dual_bidirection_swb_supported_ = false; types::BidirectionalPair<offloader_stream_maps_t> offloader_stream_maps; std::vector<le_audio::broadcast_offload_config> supported_broadcast_config; std::unordered_map<types::LeAudioContextType, AudioSetConfigurations> Loading Loading @@ -566,6 +577,14 @@ types::CodecLocation CodecManager::GetCodecLocation(void) const { return pimpl_->codec_manager_impl_->GetCodecLocation(); } bool CodecManager::IsOffloadDualBiDirSwbSupported(void) const { if (!pimpl_->IsRunning()) { return false; } return pimpl_->codec_manager_impl_->IsOffloadDualBiDirSwbSupported(); } void CodecManager::UpdateActiveAudioConfig( const types::BidirectionalPair<stream_parameters>& stream_params, types::BidirectionalPair<uint16_t> delays_ms, Loading system/bta/le_audio/codec_manager.h +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ class CodecManager { offloading_preference); void Stop(void); virtual types::CodecLocation GetCodecLocation(void) const; virtual bool IsOffloadDualBiDirSwbSupported(void) const; virtual void UpdateCisConfiguration( const std::vector<struct types::cis>& cises, const stream_parameters& stream_params, uint8_t direction); Loading system/bta/le_audio/devices.cc +16 −8 Original line number Diff line number Diff line Loading @@ -1413,17 +1413,25 @@ bool LeAudioDeviceGroup::IsAudioSetConfigurationSupported( } } // when disabling 32k dual mic, for later join case, we need to // make sure the device is always choosing the config that its // sampling rate matches with the sampling rate which is used // when all devices in the group are connected. bool dual_bidirection_swb_supported_ = osi_property_get_bool( "bluetooth.leaudio.dual_bidirection_swb.supported", true); if (Size() > 1 && !dual_bidirection_swb_supported_ && /* when disabling 32k dual mic, for later join case, we need to * make sure the device is always choosing the config that its * sampling rate matches with the sampling rate which is used * when all devices in the group are connected. */ bool dual_bidirection_swb_supported_ = AudioSetConfigurationProvider::Get()->IsDualBiDirSwbSupported(); if (Size() > 1 && AudioSetConfigurationProvider::Get()->CheckConfigurationIsBiDirSwb( *audio_set_conf)) { if (!dual_bidirection_swb_supported_ || !CodecManager::GetInstance()->IsOffloadDualBiDirSwbSupported()) { /* two conditions * 1) dual bidirection swb is not supported for both software/offload * 2) offload not supported */ return false; } } LOG_DEBUG("Chosen ASE Configuration for group: %d, configuration: %s", this->group_id_, audio_set_conf->name.c_str()); Loading system/bta/le_audio/le_audio_set_configuration_provider.h +3 −0 Original line number Diff line number Diff line Loading @@ -32,8 +32,11 @@ class AudioSetConfigurationProvider { static void Cleanup(); virtual const set_configurations::AudioSetConfigurations* GetConfigurations( ::le_audio::types::LeAudioContextType content_type) const; virtual bool IsDualBiDirSwbSupported(void) const; virtual bool CheckConfigurationIsBiDirSwb( const set_configurations::AudioSetConfiguration& set_configuration) const; virtual bool CheckConfigurationIsDualBiDirSwb( const set_configurations::AudioSetConfiguration& set_configuration) const; private: struct impl; Loading system/bta/le_audio/le_audio_set_configuration_provider_json.cc +36 −2 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ struct AudioSetConfigurationProviderJson { AudioSetConfigurationProviderJson(types::CodecLocation location) { dual_bidirection_swb_supported_ = osi_property_get_bool( "bluetooth.leaudio.dual_bidirection_swb.supported", true); "bluetooth.leaudio.dual_bidirection_swb.supported", false); ASSERT_LOG(LoadContent(kLeAudioSetConfigs, kLeAudioSetScenarios, location), ": Unable to load le audio set configuration files."); } Loading Loading @@ -167,6 +167,10 @@ struct AudioSetConfigurationProviderJson { return nullptr; }; bool IsDualBiDirSwbSupported(void) const { return dual_bidirection_swb_supported_; } private: /* Codec configurations */ std::map<std::string, const AudioSetConfiguration> configurations_; Loading @@ -176,7 +180,8 @@ struct AudioSetConfigurationProviderJson { context_configurations_; /* property to check if bidirectional sampling frequency >= 32k dual mic is * supported or not */ * supported or not */ bool dual_bidirection_swb_supported_; static const bluetooth::le_audio::CodecSpecificConfiguration* Loading Loading @@ -766,4 +771,33 @@ bool AudioSetConfigurationProvider::CheckConfigurationIsBiDirSwb( return dir == le_audio::types::kLeAudioDirectionBoth; } bool AudioSetConfigurationProvider::CheckConfigurationIsDualBiDirSwb( const set_configurations::AudioSetConfiguration& set_configuration) const { bool single_dev_dual_bidir_swb = false; bool dual_dev_dual_bidir_swb = false; for (const auto& conf : set_configuration.confs) { if (conf.codec.GetConfigSamplingFrequency() < le_audio::LeAudioCodecConfiguration::kSampleRate32000) { return false; } if (conf.device_cnt == 1 && conf.ase_cnt == 2) { single_dev_dual_bidir_swb |= conf.direction; } else if (conf.device_cnt == 2 && conf.ase_cnt == 2) { dual_dev_dual_bidir_swb |= conf.direction; } } return single_dev_dual_bidir_swb == le_audio::types::kLeAudioDirectionBoth || dual_dev_dual_bidir_swb == le_audio::types::kLeAudioDirectionBoth; } bool AudioSetConfigurationProvider::IsDualBiDirSwbSupported(void) const { if (pimpl_->IsRunning()) { return pimpl_->config_provider_impl_->IsDualBiDirSwbSupported(); } return false; } } // namespace le_audio Loading
system/bta/le_audio/codec_manager.cc +19 −0 Original line number Diff line number Diff line Loading @@ -127,6 +127,11 @@ struct codec_manager_impl { } CodecLocation GetCodecLocation(void) const { return codec_location_; } bool IsOffloadDualBiDirSwbSupported(void) const { return codec_location_ == le_audio::types::CodecLocation::ADSP && offload_dual_bidirection_swb_supported_; } void UpdateActiveAudioConfig( const types::BidirectionalPair<stream_parameters>& stream_params, types::BidirectionalPair<uint16_t> delays_ms, Loading Loading @@ -505,6 +510,11 @@ struct codec_manager_impl { adsp_capabilities)) { LOG(INFO) << "Offload supported conf, context type: " << (int)ctx_type << ", settings -> " << software_audio_set_conf->name; if (AudioSetConfigurationProvider::Get() ->CheckConfigurationIsDualBiDirSwb( *software_audio_set_conf)) { offload_dual_bidirection_swb_supported_ = true; } context_type_offload_config_map_[ctx_type].push_back( software_audio_set_conf); } Loading @@ -516,6 +526,7 @@ struct codec_manager_impl { CodecLocation codec_location_ = CodecLocation::HOST; bool offload_enable_ = false; bool offload_dual_bidirection_swb_supported_ = false; types::BidirectionalPair<offloader_stream_maps_t> offloader_stream_maps; std::vector<le_audio::broadcast_offload_config> supported_broadcast_config; std::unordered_map<types::LeAudioContextType, AudioSetConfigurations> Loading Loading @@ -566,6 +577,14 @@ types::CodecLocation CodecManager::GetCodecLocation(void) const { return pimpl_->codec_manager_impl_->GetCodecLocation(); } bool CodecManager::IsOffloadDualBiDirSwbSupported(void) const { if (!pimpl_->IsRunning()) { return false; } return pimpl_->codec_manager_impl_->IsOffloadDualBiDirSwbSupported(); } void CodecManager::UpdateActiveAudioConfig( const types::BidirectionalPair<stream_parameters>& stream_params, types::BidirectionalPair<uint16_t> delays_ms, Loading
system/bta/le_audio/codec_manager.h +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ class CodecManager { offloading_preference); void Stop(void); virtual types::CodecLocation GetCodecLocation(void) const; virtual bool IsOffloadDualBiDirSwbSupported(void) const; virtual void UpdateCisConfiguration( const std::vector<struct types::cis>& cises, const stream_parameters& stream_params, uint8_t direction); Loading
system/bta/le_audio/devices.cc +16 −8 Original line number Diff line number Diff line Loading @@ -1413,17 +1413,25 @@ bool LeAudioDeviceGroup::IsAudioSetConfigurationSupported( } } // when disabling 32k dual mic, for later join case, we need to // make sure the device is always choosing the config that its // sampling rate matches with the sampling rate which is used // when all devices in the group are connected. bool dual_bidirection_swb_supported_ = osi_property_get_bool( "bluetooth.leaudio.dual_bidirection_swb.supported", true); if (Size() > 1 && !dual_bidirection_swb_supported_ && /* when disabling 32k dual mic, for later join case, we need to * make sure the device is always choosing the config that its * sampling rate matches with the sampling rate which is used * when all devices in the group are connected. */ bool dual_bidirection_swb_supported_ = AudioSetConfigurationProvider::Get()->IsDualBiDirSwbSupported(); if (Size() > 1 && AudioSetConfigurationProvider::Get()->CheckConfigurationIsBiDirSwb( *audio_set_conf)) { if (!dual_bidirection_swb_supported_ || !CodecManager::GetInstance()->IsOffloadDualBiDirSwbSupported()) { /* two conditions * 1) dual bidirection swb is not supported for both software/offload * 2) offload not supported */ return false; } } LOG_DEBUG("Chosen ASE Configuration for group: %d, configuration: %s", this->group_id_, audio_set_conf->name.c_str()); Loading
system/bta/le_audio/le_audio_set_configuration_provider.h +3 −0 Original line number Diff line number Diff line Loading @@ -32,8 +32,11 @@ class AudioSetConfigurationProvider { static void Cleanup(); virtual const set_configurations::AudioSetConfigurations* GetConfigurations( ::le_audio::types::LeAudioContextType content_type) const; virtual bool IsDualBiDirSwbSupported(void) const; virtual bool CheckConfigurationIsBiDirSwb( const set_configurations::AudioSetConfiguration& set_configuration) const; virtual bool CheckConfigurationIsDualBiDirSwb( const set_configurations::AudioSetConfiguration& set_configuration) const; private: struct impl; Loading
system/bta/le_audio/le_audio_set_configuration_provider_json.cc +36 −2 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ struct AudioSetConfigurationProviderJson { AudioSetConfigurationProviderJson(types::CodecLocation location) { dual_bidirection_swb_supported_ = osi_property_get_bool( "bluetooth.leaudio.dual_bidirection_swb.supported", true); "bluetooth.leaudio.dual_bidirection_swb.supported", false); ASSERT_LOG(LoadContent(kLeAudioSetConfigs, kLeAudioSetScenarios, location), ": Unable to load le audio set configuration files."); } Loading Loading @@ -167,6 +167,10 @@ struct AudioSetConfigurationProviderJson { return nullptr; }; bool IsDualBiDirSwbSupported(void) const { return dual_bidirection_swb_supported_; } private: /* Codec configurations */ std::map<std::string, const AudioSetConfiguration> configurations_; Loading @@ -176,7 +180,8 @@ struct AudioSetConfigurationProviderJson { context_configurations_; /* property to check if bidirectional sampling frequency >= 32k dual mic is * supported or not */ * supported or not */ bool dual_bidirection_swb_supported_; static const bluetooth::le_audio::CodecSpecificConfiguration* Loading Loading @@ -766,4 +771,33 @@ bool AudioSetConfigurationProvider::CheckConfigurationIsBiDirSwb( return dir == le_audio::types::kLeAudioDirectionBoth; } bool AudioSetConfigurationProvider::CheckConfigurationIsDualBiDirSwb( const set_configurations::AudioSetConfiguration& set_configuration) const { bool single_dev_dual_bidir_swb = false; bool dual_dev_dual_bidir_swb = false; for (const auto& conf : set_configuration.confs) { if (conf.codec.GetConfigSamplingFrequency() < le_audio::LeAudioCodecConfiguration::kSampleRate32000) { return false; } if (conf.device_cnt == 1 && conf.ase_cnt == 2) { single_dev_dual_bidir_swb |= conf.direction; } else if (conf.device_cnt == 2 && conf.ase_cnt == 2) { dual_dev_dual_bidir_swb |= conf.direction; } } return single_dev_dual_bidir_swb == le_audio::types::kLeAudioDirectionBoth || dual_dev_dual_bidir_swb == le_audio::types::kLeAudioDirectionBoth; } bool AudioSetConfigurationProvider::IsDualBiDirSwbSupported(void) const { if (pimpl_->IsRunning()) { return pimpl_->config_provider_impl_->IsDualBiDirSwbSupported(); } return false; } } // namespace le_audio