1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #pragma once 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker #include <map> 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker #include "BluetoothAudioProvider.h" 22*4d7e907cSAndroid Build Coastguard Worker #include "aidl/android/hardware/bluetooth/audio/LeAudioAseConfiguration.h" 23*4d7e907cSAndroid Build Coastguard Worker #include "aidl/android/hardware/bluetooth/audio/MetadataLtv.h" 24*4d7e907cSAndroid Build Coastguard Worker #include "aidl/android/hardware/bluetooth/audio/SessionType.h" 25*4d7e907cSAndroid Build Coastguard Worker 26*4d7e907cSAndroid Build Coastguard Worker namespace aidl { 27*4d7e907cSAndroid Build Coastguard Worker namespace android { 28*4d7e907cSAndroid Build Coastguard Worker namespace hardware { 29*4d7e907cSAndroid Build Coastguard Worker namespace bluetooth { 30*4d7e907cSAndroid Build Coastguard Worker namespace audio { 31*4d7e907cSAndroid Build Coastguard Worker 32*4d7e907cSAndroid Build Coastguard Worker using LeAudioAseConfigurationSetting = 33*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioAseConfigurationSetting; 34*4d7e907cSAndroid Build Coastguard Worker using AseDirectionRequirement = IBluetoothAudioProvider:: 35*4d7e907cSAndroid Build Coastguard Worker LeAudioConfigurationRequirement::AseDirectionRequirement; 36*4d7e907cSAndroid Build Coastguard Worker using AseDirectionConfiguration = IBluetoothAudioProvider:: 37*4d7e907cSAndroid Build Coastguard Worker LeAudioAseConfigurationSetting::AseDirectionConfiguration; 38*4d7e907cSAndroid Build Coastguard Worker using AseQosDirectionRequirement = IBluetoothAudioProvider:: 39*4d7e907cSAndroid Build Coastguard Worker LeAudioAseQosConfigurationRequirement::AseQosDirectionRequirement; 40*4d7e907cSAndroid Build Coastguard Worker using LeAudioAseQosConfiguration = 41*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioAseQosConfiguration; 42*4d7e907cSAndroid Build Coastguard Worker using LeAudioBroadcastConfigurationSetting = 43*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioBroadcastConfigurationSetting; 44*4d7e907cSAndroid Build Coastguard Worker 45*4d7e907cSAndroid Build Coastguard Worker class LeAudioOffloadAudioProvider : public BluetoothAudioProvider { 46*4d7e907cSAndroid Build Coastguard Worker public: 47*4d7e907cSAndroid Build Coastguard Worker LeAudioOffloadAudioProvider(); 48*4d7e907cSAndroid Build Coastguard Worker 49*4d7e907cSAndroid Build Coastguard Worker bool isValid(const SessionType& sessionType) override; 50*4d7e907cSAndroid Build Coastguard Worker 51*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus startSession( 52*4d7e907cSAndroid Build Coastguard Worker const std::shared_ptr<IBluetoothAudioPort>& host_if, 53*4d7e907cSAndroid Build Coastguard Worker const AudioConfiguration& audio_config, 54*4d7e907cSAndroid Build Coastguard Worker const std::vector<LatencyMode>& latency_modes, DataMQDesc* _aidl_return); 55*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus setCodecPriority(const CodecId& in_codecId, 56*4d7e907cSAndroid Build Coastguard Worker int32_t in_priority) override; 57*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus getLeAudioAseConfiguration( 58*4d7e907cSAndroid Build Coastguard Worker const std::optional<std::vector< 59*4d7e907cSAndroid Build Coastguard Worker std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>& 60*4d7e907cSAndroid Build Coastguard Worker in_remoteSinkAudioCapabilities, 61*4d7e907cSAndroid Build Coastguard Worker const std::optional<std::vector< 62*4d7e907cSAndroid Build Coastguard Worker std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>& 63*4d7e907cSAndroid Build Coastguard Worker in_remoteSourceAudioCapabilities, 64*4d7e907cSAndroid Build Coastguard Worker const std::vector< 65*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioConfigurationRequirement>& 66*4d7e907cSAndroid Build Coastguard Worker in_requirements, 67*4d7e907cSAndroid Build Coastguard Worker std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>* 68*4d7e907cSAndroid Build Coastguard Worker _aidl_return) override; 69*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus getLeAudioAseQosConfiguration( 70*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement& 71*4d7e907cSAndroid Build Coastguard Worker in_qosRequirement, 72*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioAseQosConfigurationPair* _aidl_return) 73*4d7e907cSAndroid Build Coastguard Worker override; 74*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus onSourceAseMetadataChanged( 75*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::AseState in_state, int32_t in_cigId, 76*4d7e907cSAndroid Build Coastguard Worker int32_t in_cisId, 77*4d7e907cSAndroid Build Coastguard Worker const std::optional<std::vector<std::optional<MetadataLtv>>>& in_metadata) 78*4d7e907cSAndroid Build Coastguard Worker override; 79*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus onSinkAseMetadataChanged( 80*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::AseState in_state, int32_t in_cigId, 81*4d7e907cSAndroid Build Coastguard Worker int32_t in_cisId, 82*4d7e907cSAndroid Build Coastguard Worker const std::optional<std::vector<std::optional<MetadataLtv>>>& in_metadata) 83*4d7e907cSAndroid Build Coastguard Worker override; 84*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus getLeAudioBroadcastConfiguration( 85*4d7e907cSAndroid Build Coastguard Worker const std::optional<std::vector< 86*4d7e907cSAndroid Build Coastguard Worker std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>& 87*4d7e907cSAndroid Build Coastguard Worker in_remoteSinkAudioCapabilities, 88*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioBroadcastConfigurationRequirement& 89*4d7e907cSAndroid Build Coastguard Worker in_requirement, 90*4d7e907cSAndroid Build Coastguard Worker LeAudioBroadcastConfigurationSetting* _aidl_return) override; 91*4d7e907cSAndroid Build Coastguard Worker 92*4d7e907cSAndroid Build Coastguard Worker private: 93*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus onSessionReady(DataMQDesc* _aidl_return) override; 94*4d7e907cSAndroid Build Coastguard Worker std::map<CodecId, uint32_t> codec_priority_map_; 95*4d7e907cSAndroid Build Coastguard Worker std::vector<LeAudioBroadcastConfigurationSetting> broadcast_settings; 96*4d7e907cSAndroid Build Coastguard Worker 97*4d7e907cSAndroid Build Coastguard Worker // Private matching function definitions 98*4d7e907cSAndroid Build Coastguard Worker bool isMatchedValidCodec(CodecId cfg_codec, CodecId req_codec); 99*4d7e907cSAndroid Build Coastguard Worker bool filterCapabilitiesMatchedContext( 100*4d7e907cSAndroid Build Coastguard Worker AudioContext& setting_context, 101*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities); 102*4d7e907cSAndroid Build Coastguard Worker bool isMatchedSamplingFreq( 103*4d7e907cSAndroid Build Coastguard Worker CodecSpecificConfigurationLtv::SamplingFrequency& cfg_freq, 104*4d7e907cSAndroid Build Coastguard Worker CodecSpecificCapabilitiesLtv::SupportedSamplingFrequencies& 105*4d7e907cSAndroid Build Coastguard Worker capability_freq); 106*4d7e907cSAndroid Build Coastguard Worker bool isMatchedFrameDuration( 107*4d7e907cSAndroid Build Coastguard Worker CodecSpecificConfigurationLtv::FrameDuration& cfg_fduration, 108*4d7e907cSAndroid Build Coastguard Worker CodecSpecificCapabilitiesLtv::SupportedFrameDurations& 109*4d7e907cSAndroid Build Coastguard Worker capability_fduration); 110*4d7e907cSAndroid Build Coastguard Worker bool isMatchedAudioChannel( 111*4d7e907cSAndroid Build Coastguard Worker CodecSpecificConfigurationLtv::AudioChannelAllocation& cfg_channel, 112*4d7e907cSAndroid Build Coastguard Worker CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts& 113*4d7e907cSAndroid Build Coastguard Worker capability_channel); 114*4d7e907cSAndroid Build Coastguard Worker bool isMatchedCodecFramesPerSDU( 115*4d7e907cSAndroid Build Coastguard Worker CodecSpecificConfigurationLtv::CodecFrameBlocksPerSDU& cfg_frame_sdu, 116*4d7e907cSAndroid Build Coastguard Worker CodecSpecificCapabilitiesLtv::SupportedMaxCodecFramesPerSDU& 117*4d7e907cSAndroid Build Coastguard Worker capability_frame_sdu); 118*4d7e907cSAndroid Build Coastguard Worker bool isMatchedOctetsPerCodecFrame( 119*4d7e907cSAndroid Build Coastguard Worker CodecSpecificConfigurationLtv::OctetsPerCodecFrame& cfg_octets, 120*4d7e907cSAndroid Build Coastguard Worker CodecSpecificCapabilitiesLtv::SupportedOctetsPerCodecFrame& 121*4d7e907cSAndroid Build Coastguard Worker capability_octets); 122*4d7e907cSAndroid Build Coastguard Worker bool isCapabilitiesMatchedCodecConfiguration( 123*4d7e907cSAndroid Build Coastguard Worker std::vector<CodecSpecificConfigurationLtv>& codec_cfg, 124*4d7e907cSAndroid Build Coastguard Worker std::vector<CodecSpecificCapabilitiesLtv> codec_capabilities); 125*4d7e907cSAndroid Build Coastguard Worker bool filterMatchedAseConfiguration( 126*4d7e907cSAndroid Build Coastguard Worker LeAudioAseConfiguration& setting_cfg, 127*4d7e907cSAndroid Build Coastguard Worker const LeAudioAseConfiguration& requirement_cfg); 128*4d7e907cSAndroid Build Coastguard Worker bool isMatchedBISConfiguration( 129*4d7e907cSAndroid Build Coastguard Worker LeAudioBisConfiguration bis_cfg, 130*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities); 131*4d7e907cSAndroid Build Coastguard Worker void filterCapabilitiesAseDirectionConfiguration( 132*4d7e907cSAndroid Build Coastguard Worker std::vector<std::optional<AseDirectionConfiguration>>& 133*4d7e907cSAndroid Build Coastguard Worker direction_configurations, 134*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities, 135*4d7e907cSAndroid Build Coastguard Worker std::vector<std::optional<AseDirectionConfiguration>>& 136*4d7e907cSAndroid Build Coastguard Worker valid_direction_configurations); 137*4d7e907cSAndroid Build Coastguard Worker void filterRequirementAseDirectionConfiguration( 138*4d7e907cSAndroid Build Coastguard Worker std::optional<std::vector<std::optional<AseDirectionConfiguration>>>& 139*4d7e907cSAndroid Build Coastguard Worker direction_configurations, 140*4d7e907cSAndroid Build Coastguard Worker const std::vector<std::optional<AseDirectionRequirement>>& requirements, 141*4d7e907cSAndroid Build Coastguard Worker std::optional<std::vector<std::optional<AseDirectionConfiguration>>>& 142*4d7e907cSAndroid Build Coastguard Worker valid_direction_configurations, 143*4d7e907cSAndroid Build Coastguard Worker bool isExact); 144*4d7e907cSAndroid Build Coastguard Worker std::optional<LeAudioAseConfigurationSetting> 145*4d7e907cSAndroid Build Coastguard Worker getCapabilitiesMatchedAseConfigurationSettings( 146*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting, 147*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities, 148*4d7e907cSAndroid Build Coastguard Worker uint8_t direction); 149*4d7e907cSAndroid Build Coastguard Worker std::optional<LeAudioAseConfigurationSetting> 150*4d7e907cSAndroid Build Coastguard Worker getRequirementMatchedAseConfigurationSettings( 151*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting, 152*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioConfigurationRequirement& 153*4d7e907cSAndroid Build Coastguard Worker requirement, 154*4d7e907cSAndroid Build Coastguard Worker bool isExact); 155*4d7e907cSAndroid Build Coastguard Worker bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos, 156*4d7e907cSAndroid Build Coastguard Worker AseQosDirectionRequirement requirement_qos); 157*4d7e907cSAndroid Build Coastguard Worker std::optional<LeAudioBroadcastConfigurationSetting> 158*4d7e907cSAndroid Build Coastguard Worker getCapabilitiesMatchedBroadcastConfigurationSettings( 159*4d7e907cSAndroid Build Coastguard Worker LeAudioBroadcastConfigurationSetting& setting, 160*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities); 161*4d7e907cSAndroid Build Coastguard Worker void getBroadcastSettings(); 162*4d7e907cSAndroid Build Coastguard Worker std::optional<LeAudioAseQosConfiguration> getDirectionQosConfiguration( 163*4d7e907cSAndroid Build Coastguard Worker uint8_t direction, 164*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement& 165*4d7e907cSAndroid Build Coastguard Worker qosRequirement, 166*4d7e907cSAndroid Build Coastguard Worker std::vector<LeAudioAseConfigurationSetting>& ase_configuration_settings, 167*4d7e907cSAndroid Build Coastguard Worker bool is_exact); 168*4d7e907cSAndroid Build Coastguard Worker bool isSubgroupConfigurationMatchedContext( 169*4d7e907cSAndroid Build Coastguard Worker AudioContext requirement_context, 170*4d7e907cSAndroid Build Coastguard Worker IBluetoothAudioProvider::BroadcastQuality quality, 171*4d7e907cSAndroid Build Coastguard Worker LeAudioBroadcastSubgroupConfiguration configuration); 172*4d7e907cSAndroid Build Coastguard Worker std::optional<IBluetoothAudioProvider::LeAudioAseConfigurationSetting> 173*4d7e907cSAndroid Build Coastguard Worker matchWithRequirement( 174*4d7e907cSAndroid Build Coastguard Worker std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>& 175*4d7e907cSAndroid Build Coastguard Worker matched_ase_configuration_settings, 176*4d7e907cSAndroid Build Coastguard Worker const IBluetoothAudioProvider::LeAudioConfigurationRequirement& 177*4d7e907cSAndroid Build Coastguard Worker requirements, 178*4d7e907cSAndroid Build Coastguard Worker bool isMatchContext, bool isExact); 179*4d7e907cSAndroid Build Coastguard Worker }; 180*4d7e907cSAndroid Build Coastguard Worker 181*4d7e907cSAndroid Build Coastguard Worker class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider { 182*4d7e907cSAndroid Build Coastguard Worker public: 183*4d7e907cSAndroid Build Coastguard Worker LeAudioOffloadOutputAudioProvider(); 184*4d7e907cSAndroid Build Coastguard Worker }; 185*4d7e907cSAndroid Build Coastguard Worker 186*4d7e907cSAndroid Build Coastguard Worker class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider { 187*4d7e907cSAndroid Build Coastguard Worker public: 188*4d7e907cSAndroid Build Coastguard Worker LeAudioOffloadInputAudioProvider(); 189*4d7e907cSAndroid Build Coastguard Worker }; 190*4d7e907cSAndroid Build Coastguard Worker 191*4d7e907cSAndroid Build Coastguard Worker class LeAudioOffloadBroadcastAudioProvider 192*4d7e907cSAndroid Build Coastguard Worker : public LeAudioOffloadAudioProvider { 193*4d7e907cSAndroid Build Coastguard Worker public: 194*4d7e907cSAndroid Build Coastguard Worker LeAudioOffloadBroadcastAudioProvider(); 195*4d7e907cSAndroid Build Coastguard Worker }; 196*4d7e907cSAndroid Build Coastguard Worker 197*4d7e907cSAndroid Build Coastguard Worker } // namespace audio 198*4d7e907cSAndroid Build Coastguard Worker } // namespace bluetooth 199*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 200*4d7e907cSAndroid Build Coastguard Worker } // namespace android 201*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl 202