xref: /aosp_15_r20/hardware/interfaces/bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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