blob: 1fb0e4199cdaeae40dabeaeddcfcc7a96f6a7fe0 [file] [log] [blame]
Josh Wu20bac522021-12-29 23:52:39 -08001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "BTAudioCodecsAidl"
18
19#include "BluetoothAudioCodecs.h"
20
21#include <aidl/android/hardware/bluetooth/audio/AacCapabilities.h>
22#include <aidl/android/hardware/bluetooth/audio/AacObjectType.h>
23#include <aidl/android/hardware/bluetooth/audio/AptxCapabilities.h>
24#include <aidl/android/hardware/bluetooth/audio/ChannelMode.h>
25#include <aidl/android/hardware/bluetooth/audio/LdacCapabilities.h>
26#include <aidl/android/hardware/bluetooth/audio/LdacChannelMode.h>
27#include <aidl/android/hardware/bluetooth/audio/LdacQualityIndex.h>
28#include <aidl/android/hardware/bluetooth/audio/LeAudioConfiguration.h>
29#include <aidl/android/hardware/bluetooth/audio/SbcCapabilities.h>
30#include <aidl/android/hardware/bluetooth/audio/SbcChannelMode.h>
31#include <android-base/logging.h>
32
33namespace aidl {
34namespace android {
35namespace hardware {
36namespace bluetooth {
37namespace audio {
38
39static const PcmCapabilities kDefaultSoftwarePcmCapabilities = {
Ɓukasz Rymanowski4d14c1e2022-05-06 17:12:50 +000040 .sampleRateHz = {16000, 24000, 32000, 44100, 48000, 88200, 96000},
Josh Wu20bac522021-12-29 23:52:39 -080041 .channelMode = {ChannelMode::MONO, ChannelMode::STEREO},
42 .bitsPerSample = {16, 24, 32},
43 .dataIntervalUs = {},
44};
45
46static const SbcCapabilities kDefaultOffloadSbcCapability = {
47 .sampleRateHz = {44100},
48 .channelMode = {SbcChannelMode::MONO, SbcChannelMode::JOINT_STEREO},
49 .blockLength = {4, 8, 12, 16},
50 .numSubbands = {8},
51 .allocMethod = {SbcAllocMethod::ALLOC_MD_L},
52 .bitsPerSample = {16},
53 .minBitpool = 2,
54 .maxBitpool = 53};
55
56static const AacCapabilities kDefaultOffloadAacCapability = {
57 .objectType = {AacObjectType::MPEG2_LC},
58 .sampleRateHz = {44100},
59 .channelMode = {ChannelMode::STEREO},
60 .variableBitRateSupported = true,
61 .bitsPerSample = {16}};
62
63static const LdacCapabilities kDefaultOffloadLdacCapability = {
64 .sampleRateHz = {44100, 48000, 88200, 96000},
65 .channelMode = {LdacChannelMode::DUAL, LdacChannelMode::STEREO},
66 .qualityIndex = {LdacQualityIndex::HIGH},
67 .bitsPerSample = {16, 24, 32}};
68
69static const AptxCapabilities kDefaultOffloadAptxCapability = {
70 .sampleRateHz = {44100, 48000},
71 .channelMode = {ChannelMode::STEREO},
72 .bitsPerSample = {16},
73};
74
75static const AptxCapabilities kDefaultOffloadAptxHdCapability = {
76 .sampleRateHz = {44100, 48000},
77 .channelMode = {ChannelMode::STEREO},
78 .bitsPerSample = {24},
79};
80
Josh Wu75462aa2022-01-21 21:51:21 -080081static const Lc3Capabilities kDefaultA2dpOffloadLc3Capability = {
Josh Wu20bac522021-12-29 23:52:39 -080082 .samplingFrequencyHz = {44100, 48000},
83 .frameDurationUs = {7500, 10000},
84 .channelMode = {ChannelMode::MONO, ChannelMode::STEREO},
85};
86
87const std::vector<CodecCapabilities> kDefaultOffloadA2dpCodecCapabilities = {
88 {.codecType = CodecType::SBC, .capabilities = {}},
89 {.codecType = CodecType::AAC, .capabilities = {}},
90 {.codecType = CodecType::LDAC, .capabilities = {}},
91 {.codecType = CodecType::APTX, .capabilities = {}},
92 {.codecType = CodecType::APTX_HD, .capabilities = {}},
93 {.codecType = CodecType::LC3, .capabilities = {}}};
94
95std::vector<LeAudioCodecCapabilitiesSetting> kDefaultOffloadLeAudioCapabilities;
96
97static const UnicastCapability kInvalidUnicastCapability = {
98 .codecType = CodecType::UNKNOWN};
99
100static const BroadcastCapability kInvalidBroadcastCapability = {
101 .codecType = CodecType::UNKNOWN};
102
103// Default Supported Codecs
104// LC3 16_1: sample rate: 16 kHz, frame duration: 7.5 ms, octets per frame: 30
105static const Lc3Capabilities kLc3Capability_16_1 = {
106 .samplingFrequencyHz = {16000},
107 .frameDurationUs = {7500},
108 .octetsPerFrame = {30}};
109
110// Default Supported Codecs
111// LC3 16_2: sample rate: 16 kHz, frame duration: 10 ms, octets per frame: 40
112static const Lc3Capabilities kLc3Capability_16_2 = {
113 .samplingFrequencyHz = {16000},
114 .frameDurationUs = {10000},
115 .octetsPerFrame = {40}};
116
117// Default Supported Codecs
Patty Huangbdf65ba2022-04-26 20:33:39 +0800118// LC3 24_2: sample rate: 24 kHz, frame duration: 10 ms, octets per frame: 60
119static const Lc3Capabilities kLc3Capability_24_2 = {
120 .samplingFrequencyHz = {24000},
121 .frameDurationUs = {10000},
122 .octetsPerFrame = {60}};
123
124// Default Supported Codecs
125// LC3 32_2: sample rate: 32 kHz, frame duration: 10 ms, octets per frame: 80
126static const Lc3Capabilities kLc3Capability_32_2 = {
127 .samplingFrequencyHz = {32000},
128 .frameDurationUs = {10000},
129 .octetsPerFrame = {80}};
130
131// Default Supported Codecs
Josh Wu20bac522021-12-29 23:52:39 -0800132// LC3 48_4: sample rate: 48 kHz, frame duration: 10 ms, octets per frame: 120
133static const Lc3Capabilities kLc3Capability_48_4 = {
134 .samplingFrequencyHz = {48000},
135 .frameDurationUs = {10000},
136 .octetsPerFrame = {120}};
137
138static const std::vector<Lc3Capabilities> supportedLc3CapabilityList = {
Patty Huangbdf65ba2022-04-26 20:33:39 +0800139 kLc3Capability_48_4, kLc3Capability_32_2, kLc3Capability_24_2,
140 kLc3Capability_16_2, kLc3Capability_16_1};
Josh Wu20bac522021-12-29 23:52:39 -0800141
142static AudioLocation stereoAudio = static_cast<AudioLocation>(
143 static_cast<uint8_t>(AudioLocation::FRONT_LEFT) |
144 static_cast<uint8_t>(AudioLocation::FRONT_RIGHT));
145static AudioLocation monoAudio = AudioLocation::UNKNOWN;
146
147// Stores the supported setting of audio location, connected device, and the
148// channel count for each device
149std::vector<std::tuple<AudioLocation, uint8_t, uint8_t>>
Patty03cbe712022-02-10 10:07:17 +0800150 supportedDeviceSetting = {
151 // Stereo, two connected device, one for L one for R
152 std::make_tuple(stereoAudio, 2, 1),
153 // Stereo, one connected device for both L and R
154 std::make_tuple(stereoAudio, 1, 2),
155 // Mono
156 std::make_tuple(monoAudio, 1, 1)};
Josh Wu20bac522021-12-29 23:52:39 -0800157
158template <class T>
159bool BluetoothAudioCodecs::ContainedInVector(
160 const std::vector<T>& vector, const typename identity<T>::type& target) {
161 return std::find(vector.begin(), vector.end(), target) != vector.end();
162}
163
164bool BluetoothAudioCodecs::IsOffloadSbcConfigurationValid(
165 const CodecConfiguration::CodecSpecific& codec_specific) {
166 if (codec_specific.getTag() != CodecConfiguration::CodecSpecific::sbcConfig) {
167 LOG(WARNING) << __func__
168 << ": Invalid CodecSpecific=" << codec_specific.toString();
169 return false;
170 }
171 const SbcConfiguration sbc_data =
172 codec_specific.get<CodecConfiguration::CodecSpecific::sbcConfig>();
173
174 if (ContainedInVector(kDefaultOffloadSbcCapability.sampleRateHz,
175 sbc_data.sampleRateHz) &&
176 ContainedInVector(kDefaultOffloadSbcCapability.blockLength,
177 sbc_data.blockLength) &&
178 ContainedInVector(kDefaultOffloadSbcCapability.numSubbands,
179 sbc_data.numSubbands) &&
180 ContainedInVector(kDefaultOffloadSbcCapability.bitsPerSample,
181 sbc_data.bitsPerSample) &&
182 ContainedInVector(kDefaultOffloadSbcCapability.channelMode,
183 sbc_data.channelMode) &&
184 ContainedInVector(kDefaultOffloadSbcCapability.allocMethod,
185 sbc_data.allocMethod) &&
186 sbc_data.minBitpool <= sbc_data.maxBitpool &&
187 kDefaultOffloadSbcCapability.minBitpool <= sbc_data.minBitpool &&
188 kDefaultOffloadSbcCapability.maxBitpool >= sbc_data.maxBitpool) {
189 return true;
190 }
191 LOG(WARNING) << __func__
192 << ": Unsupported CodecSpecific=" << codec_specific.toString();
193 return false;
194}
195
196bool BluetoothAudioCodecs::IsOffloadAacConfigurationValid(
197 const CodecConfiguration::CodecSpecific& codec_specific) {
198 if (codec_specific.getTag() != CodecConfiguration::CodecSpecific::aacConfig) {
199 LOG(WARNING) << __func__
200 << ": Invalid CodecSpecific=" << codec_specific.toString();
201 return false;
202 }
203 const AacConfiguration aac_data =
204 codec_specific.get<CodecConfiguration::CodecSpecific::aacConfig>();
205
206 if (ContainedInVector(kDefaultOffloadAacCapability.sampleRateHz,
207 aac_data.sampleRateHz) &&
208 ContainedInVector(kDefaultOffloadAacCapability.bitsPerSample,
209 aac_data.bitsPerSample) &&
210 ContainedInVector(kDefaultOffloadAacCapability.channelMode,
211 aac_data.channelMode) &&
212 ContainedInVector(kDefaultOffloadAacCapability.objectType,
213 aac_data.objectType) &&
214 (!aac_data.variableBitRateEnabled ||
215 kDefaultOffloadAacCapability.variableBitRateSupported)) {
216 return true;
217 }
218 LOG(WARNING) << __func__
219 << ": Unsupported CodecSpecific=" << codec_specific.toString();
220 return false;
221}
222
223bool BluetoothAudioCodecs::IsOffloadLdacConfigurationValid(
224 const CodecConfiguration::CodecSpecific& codec_specific) {
225 if (codec_specific.getTag() !=
226 CodecConfiguration::CodecSpecific::ldacConfig) {
227 LOG(WARNING) << __func__
228 << ": Invalid CodecSpecific=" << codec_specific.toString();
229 return false;
230 }
231 const LdacConfiguration ldac_data =
232 codec_specific.get<CodecConfiguration::CodecSpecific::ldacConfig>();
233
234 if (ContainedInVector(kDefaultOffloadLdacCapability.sampleRateHz,
235 ldac_data.sampleRateHz) &&
236 ContainedInVector(kDefaultOffloadLdacCapability.bitsPerSample,
237 ldac_data.bitsPerSample) &&
238 ContainedInVector(kDefaultOffloadLdacCapability.channelMode,
239 ldac_data.channelMode) &&
240 ContainedInVector(kDefaultOffloadLdacCapability.qualityIndex,
241 ldac_data.qualityIndex)) {
242 return true;
243 }
244 LOG(WARNING) << __func__
245 << ": Unsupported CodecSpecific=" << codec_specific.toString();
246 return false;
247}
248
249bool BluetoothAudioCodecs::IsOffloadAptxConfigurationValid(
250 const CodecConfiguration::CodecSpecific& codec_specific) {
251 if (codec_specific.getTag() !=
252 CodecConfiguration::CodecSpecific::aptxConfig) {
253 LOG(WARNING) << __func__
254 << ": Invalid CodecSpecific=" << codec_specific.toString();
255 return false;
256 }
257 const AptxConfiguration aptx_data =
258 codec_specific.get<CodecConfiguration::CodecSpecific::aptxConfig>();
259
260 if (ContainedInVector(kDefaultOffloadAptxCapability.sampleRateHz,
261 aptx_data.sampleRateHz) &&
262 ContainedInVector(kDefaultOffloadAptxCapability.bitsPerSample,
263 aptx_data.bitsPerSample) &&
264 ContainedInVector(kDefaultOffloadAptxCapability.channelMode,
265 aptx_data.channelMode)) {
266 return true;
267 }
268 LOG(WARNING) << __func__
269 << ": Unsupported CodecSpecific=" << codec_specific.toString();
270 return false;
271}
272
273bool BluetoothAudioCodecs::IsOffloadAptxHdConfigurationValid(
274 const CodecConfiguration::CodecSpecific& codec_specific) {
275 if (codec_specific.getTag() !=
276 CodecConfiguration::CodecSpecific::aptxConfig) {
277 LOG(WARNING) << __func__
278 << ": Invalid CodecSpecific=" << codec_specific.toString();
279 return false;
280 }
281 const AptxConfiguration aptx_data =
282 codec_specific.get<CodecConfiguration::CodecSpecific::aptxConfig>();
283
284 if (ContainedInVector(kDefaultOffloadAptxHdCapability.sampleRateHz,
285 aptx_data.sampleRateHz) &&
286 ContainedInVector(kDefaultOffloadAptxHdCapability.bitsPerSample,
287 aptx_data.bitsPerSample) &&
288 ContainedInVector(kDefaultOffloadAptxHdCapability.channelMode,
289 aptx_data.channelMode)) {
290 return true;
291 }
292 LOG(WARNING) << __func__
293 << ": Unsupported CodecSpecific=" << codec_specific.toString();
294 return false;
295}
296
297bool BluetoothAudioCodecs::IsOffloadLc3ConfigurationValid(
298 const CodecConfiguration::CodecSpecific& codec_specific) {
299 if (codec_specific.getTag() != CodecConfiguration::CodecSpecific::lc3Config) {
300 LOG(WARNING) << __func__
301 << ": Invalid CodecSpecific=" << codec_specific.toString();
302 return false;
303 }
304 const Lc3Configuration lc3_data =
305 codec_specific.get<CodecConfiguration::CodecSpecific::lc3Config>();
306
Josh Wu75462aa2022-01-21 21:51:21 -0800307 if (ContainedInVector(kDefaultA2dpOffloadLc3Capability.samplingFrequencyHz,
Josh Wu20bac522021-12-29 23:52:39 -0800308 lc3_data.samplingFrequencyHz) &&
Josh Wu75462aa2022-01-21 21:51:21 -0800309 ContainedInVector(kDefaultA2dpOffloadLc3Capability.frameDurationUs,
Josh Wu20bac522021-12-29 23:52:39 -0800310 lc3_data.frameDurationUs) &&
Josh Wu75462aa2022-01-21 21:51:21 -0800311 ContainedInVector(kDefaultA2dpOffloadLc3Capability.channelMode,
Josh Wu20bac522021-12-29 23:52:39 -0800312 lc3_data.channelMode)) {
313 return true;
314 }
315 LOG(WARNING) << __func__
316 << ": Unsupported CodecSpecific=" << codec_specific.toString();
317 return false;
318}
319
320bool BluetoothAudioCodecs::IsOffloadLeAudioConfigurationValid(
321 const SessionType& session_type, const LeAudioConfiguration&) {
322 if (session_type !=
323 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
324 session_type !=
Josh Wu5d50dc02022-02-15 08:41:53 -0800325 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH &&
326 session_type !=
327 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800328 return false;
329 }
330 return true;
331}
332
333std::vector<PcmCapabilities>
334BluetoothAudioCodecs::GetSoftwarePcmCapabilities() {
335 return {kDefaultSoftwarePcmCapabilities};
336}
337
338std::vector<CodecCapabilities>
339BluetoothAudioCodecs::GetA2dpOffloadCodecCapabilities(
340 const SessionType& session_type) {
Alice Kuoadcceec2022-03-28 13:28:43 +0800341 if (session_type != SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
342 session_type != SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800343 return {};
344 }
345 std::vector<CodecCapabilities> offload_a2dp_codec_capabilities =
346 kDefaultOffloadA2dpCodecCapabilities;
347 for (auto& codec_capability : offload_a2dp_codec_capabilities) {
348 switch (codec_capability.codecType) {
349 case CodecType::SBC:
350 codec_capability.capabilities
351 .set<CodecCapabilities::Capabilities::sbcCapabilities>(
352 kDefaultOffloadSbcCapability);
353 break;
354 case CodecType::AAC:
355 codec_capability.capabilities
356 .set<CodecCapabilities::Capabilities::aacCapabilities>(
357 kDefaultOffloadAacCapability);
358 break;
359 case CodecType::LDAC:
360 codec_capability.capabilities
361 .set<CodecCapabilities::Capabilities::ldacCapabilities>(
362 kDefaultOffloadLdacCapability);
363 break;
364 case CodecType::APTX:
365 codec_capability.capabilities
366 .set<CodecCapabilities::Capabilities::aptxCapabilities>(
367 kDefaultOffloadAptxCapability);
368 break;
369 case CodecType::APTX_HD:
370 codec_capability.capabilities
371 .set<CodecCapabilities::Capabilities::aptxCapabilities>(
372 kDefaultOffloadAptxHdCapability);
373 break;
374 case CodecType::LC3:
375 codec_capability.capabilities
376 .set<CodecCapabilities::Capabilities::lc3Capabilities>(
Josh Wu75462aa2022-01-21 21:51:21 -0800377 kDefaultA2dpOffloadLc3Capability);
Josh Wu20bac522021-12-29 23:52:39 -0800378 break;
379 case CodecType::UNKNOWN:
Alice Kuo79c936d2022-01-20 23:10:10 +0800380 case CodecType::VENDOR:
Sagar Vermad13bbb32022-01-08 20:09:04 +0530381 case CodecType::APTX_ADAPTIVE:
Josh Wu20bac522021-12-29 23:52:39 -0800382 break;
383 }
384 }
385 return offload_a2dp_codec_capabilities;
386}
387
388bool BluetoothAudioCodecs::IsSoftwarePcmConfigurationValid(
389 const PcmConfiguration& pcm_config) {
390 if (ContainedInVector(kDefaultSoftwarePcmCapabilities.sampleRateHz,
391 pcm_config.sampleRateHz) &&
392 ContainedInVector(kDefaultSoftwarePcmCapabilities.bitsPerSample,
393 pcm_config.bitsPerSample) &&
394 ContainedInVector(kDefaultSoftwarePcmCapabilities.channelMode,
395 pcm_config.channelMode)
396 // data interval is not checked for now
397 // && pcm_config.dataIntervalUs != 0
398 ) {
399 return true;
400 }
401 LOG(WARNING) << __func__
402 << ": Unsupported CodecSpecific=" << pcm_config.toString();
403 return false;
404}
405
406bool BluetoothAudioCodecs::IsOffloadCodecConfigurationValid(
407 const SessionType& session_type, const CodecConfiguration& codec_config) {
Alice Kuoadcceec2022-03-28 13:28:43 +0800408 if (session_type != SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
409 session_type != SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800410 LOG(ERROR) << __func__
411 << ": Invalid SessionType=" << toString(session_type);
412 return false;
413 }
414 const CodecConfiguration::CodecSpecific& codec_specific = codec_config.config;
415 switch (codec_config.codecType) {
416 case CodecType::SBC:
417 if (IsOffloadSbcConfigurationValid(codec_specific)) {
418 return true;
419 }
420 break;
421 case CodecType::AAC:
422 if (IsOffloadAacConfigurationValid(codec_specific)) {
423 return true;
424 }
425 break;
426 case CodecType::LDAC:
427 if (IsOffloadLdacConfigurationValid(codec_specific)) {
428 return true;
429 }
430 break;
431 case CodecType::APTX:
432 if (IsOffloadAptxConfigurationValid(codec_specific)) {
433 return true;
434 }
435 break;
436 case CodecType::APTX_HD:
437 if (IsOffloadAptxHdConfigurationValid(codec_specific)) {
438 return true;
439 }
440 break;
441 case CodecType::LC3:
442 if (IsOffloadLc3ConfigurationValid(codec_specific)) {
443 return true;
444 }
445 break;
Sagar Vermad13bbb32022-01-08 20:09:04 +0530446 case CodecType::APTX_ADAPTIVE:
Josh Wu20bac522021-12-29 23:52:39 -0800447 case CodecType::UNKNOWN:
Alice Kuo79c936d2022-01-20 23:10:10 +0800448 case CodecType::VENDOR:
Josh Wu20bac522021-12-29 23:52:39 -0800449 break;
450 }
451 return false;
452}
453
454UnicastCapability composeUnicastLc3Capability(
455 AudioLocation audioLocation, uint8_t deviceCnt, uint8_t channelCount,
456 const Lc3Capabilities& capability) {
457 return {
458 .codecType = CodecType::LC3,
459 .supportedChannel = audioLocation,
460 .deviceCount = deviceCnt,
461 .channelCountPerDevice = channelCount,
462 .leAudioCodecCapabilities =
463 UnicastCapability::LeAudioCodecCapabilities(capability),
464 };
465}
466
467std::vector<LeAudioCodecCapabilitiesSetting>
468BluetoothAudioCodecs::GetLeAudioOffloadCodecCapabilities(
469 const SessionType& session_type) {
470 if (session_type !=
471 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
472 session_type !=
Josh Wu5d50dc02022-02-15 08:41:53 -0800473 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH &&
474 session_type !=
475 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800476 return std::vector<LeAudioCodecCapabilitiesSetting>(0);
477 }
478
479 if (kDefaultOffloadLeAudioCapabilities.empty()) {
480 for (auto [audioLocation, deviceCnt, channelCount] :
481 supportedDeviceSetting) {
482 for (auto capability : supportedLc3CapabilityList) {
483 UnicastCapability lc3Capability = composeUnicastLc3Capability(
484 audioLocation, deviceCnt, channelCount, capability);
485 UnicastCapability lc3MonoDecodeCapability =
486 composeUnicastLc3Capability(monoAudio, 1, 1, capability);
487
488 // Adds the capability for encode only
489 kDefaultOffloadLeAudioCapabilities.push_back(
490 {.unicastEncodeCapability = lc3Capability,
491 .unicastDecodeCapability = kInvalidUnicastCapability,
492 .broadcastCapability = kInvalidBroadcastCapability});
493
494 // Adds the capability for decode only
495 kDefaultOffloadLeAudioCapabilities.push_back(
496 {.unicastEncodeCapability = kInvalidUnicastCapability,
497 .unicastDecodeCapability = lc3Capability,
498 .broadcastCapability = kInvalidBroadcastCapability});
499
500 // Adds the capability for the case that encode and decode exist at the
501 // same time
502 kDefaultOffloadLeAudioCapabilities.push_back(
503 {.unicastEncodeCapability = lc3Capability,
504 .unicastDecodeCapability = lc3MonoDecodeCapability,
505 .broadcastCapability = kInvalidBroadcastCapability});
506 }
507 }
508 }
509
510 return kDefaultOffloadLeAudioCapabilities;
511}
512
513} // namespace audio
514} // namespace bluetooth
515} // namespace hardware
516} // namespace android
Sagar Vermad13bbb32022-01-08 20:09:04 +0530517} // namespace aidl