diff --git a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp index 406856896c..426171d321 100644 --- a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp +++ b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp @@ -507,14 +507,93 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration( return ndk::ScopedAStatus::ok(); }; +bool LeAudioOffloadAudioProvider::isMatchedQosRequirement( + LeAudioAseQosConfiguration setting_qos, + AseQosDirectionRequirement requirement_qos) { + if (setting_qos.retransmissionNum != + requirement_qos.preferredRetransmissionNum) + return false; + if (setting_qos.maxTransportLatencyMs > requirement_qos.maxTransportLatencyMs) + return false; + // Ignore other parameters, as they are not populated in the setting_qos + return true; +} + ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseQosConfiguration( const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement& in_qosRequirement, IBluetoothAudioProvider::LeAudioAseQosConfigurationPair* _aidl_return) { - /* TODO: Implement */ - (void)in_qosRequirement; - (void)_aidl_return; - return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + IBluetoothAudioProvider::LeAudioAseQosConfigurationPair result; + // Get all configuration settings + std::vector + ase_configuration_settings = + BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings(); + + // Direction QoS matching + // Only handle one direction input case + uint8_t direction = 0; + std::optional direction_qos_requirement = + std::nullopt; + if (in_qosRequirement.sinkAseQosRequirement.has_value()) { + direction_qos_requirement = in_qosRequirement.sinkAseQosRequirement.value(); + direction = kLeAudioDirectionSink; + } else if (in_qosRequirement.sourceAseQosRequirement.has_value()) { + direction_qos_requirement = + in_qosRequirement.sourceAseQosRequirement.value(); + direction = kLeAudioDirectionSource; + } + + for (auto& setting : ase_configuration_settings) { + // Context matching + if (setting.audioContext != in_qosRequirement.contextType) continue; + + // Match configuration flags + // Currently configuration flags are not populated, ignore. + + // Get a list of all matched AseDirectionConfiguration + // for the input direction + std::vector>* + direction_configuration = nullptr; + if (direction == kLeAudioDirectionSink) { + if (!setting.sinkAseConfiguration.has_value()) continue; + direction_configuration = &setting.sinkAseConfiguration.value(); + } else { + if (!setting.sourceAseConfiguration.has_value()) continue; + direction_configuration = &setting.sourceAseConfiguration.value(); + } + + for (auto cfg : *direction_configuration) { + if (!cfg.has_value()) continue; + // If no requirement, return the first QoS + if (!direction_qos_requirement.has_value()) { + result.sinkQosConfiguration = cfg.value().qosConfiguration; + result.sourceQosConfiguration = cfg.value().qosConfiguration; + *_aidl_return = result; + return ndk::ScopedAStatus::ok(); + } + + // If has requirement, return the first matched QoS + // Try to match the ASE configuration + // and QoS with requirement + if (!cfg.value().qosConfiguration.has_value()) continue; + if (isMatchedAseConfiguration( + cfg.value().aseConfiguration, + direction_qos_requirement.value().aseConfiguration) && + isMatchedQosRequirement(cfg.value().qosConfiguration.value(), + direction_qos_requirement.value())) { + if (direction == kLeAudioDirectionSink) + result.sinkQosConfiguration = cfg.value().qosConfiguration; + else + result.sourceQosConfiguration = cfg.value().qosConfiguration; + *_aidl_return = result; + return ndk::ScopedAStatus::ok(); + } + } + } + + // No match, return empty QoS + *_aidl_return = result; + return ndk::ScopedAStatus::ok(); }; ndk::ScopedAStatus LeAudioOffloadAudioProvider::onSinkAseMetadataChanged( diff --git a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h index 2488f9b78b..b6037c3c88 100644 --- a/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h +++ b/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h @@ -34,6 +34,10 @@ using AseDirectionRequirement = IBluetoothAudioProvider:: LeAudioConfigurationRequirement::AseDirectionRequirement; using AseDirectionConfiguration = IBluetoothAudioProvider:: LeAudioAseConfigurationSetting::AseDirectionConfiguration; +using AseQosDirectionRequirement = IBluetoothAudioProvider:: + LeAudioAseQosConfigurationRequirement::AseQosDirectionRequirement; +using LeAudioAseQosConfiguration = + IBluetoothAudioProvider::LeAudioAseQosConfiguration; class LeAudioOffloadAudioProvider : public BluetoothAudioProvider { public: @@ -138,6 +142,8 @@ class LeAudioOffloadAudioProvider : public BluetoothAudioProvider { IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting, const IBluetoothAudioProvider::LeAudioConfigurationRequirement& requirement); + bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos, + AseQosDirectionRequirement requirement_qos); }; class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider {