blob: 3ed9e070c54a2f9a83ccff5744908e02a696c4bb [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>
Sagar Verma62df9102022-12-07 17:56:04 +053023#include <aidl/android/hardware/bluetooth/audio/AptxAdaptiveLeCapabilities.h>
24#include <aidl/android/hardware/bluetooth/audio/AptxAdaptiveLeConfiguration.h>
Josh Wu20bac522021-12-29 23:52:39 -080025#include <aidl/android/hardware/bluetooth/audio/AptxCapabilities.h>
26#include <aidl/android/hardware/bluetooth/audio/ChannelMode.h>
27#include <aidl/android/hardware/bluetooth/audio/LdacCapabilities.h>
28#include <aidl/android/hardware/bluetooth/audio/LdacChannelMode.h>
29#include <aidl/android/hardware/bluetooth/audio/LdacQualityIndex.h>
30#include <aidl/android/hardware/bluetooth/audio/LeAudioConfiguration.h>
Omer Osmana2587da2022-05-01 03:54:11 +000031#include <aidl/android/hardware/bluetooth/audio/OpusCapabilities.h>
32#include <aidl/android/hardware/bluetooth/audio/OpusConfiguration.h>
Josh Wu20bac522021-12-29 23:52:39 -080033#include <aidl/android/hardware/bluetooth/audio/SbcCapabilities.h>
34#include <aidl/android/hardware/bluetooth/audio/SbcChannelMode.h>
35#include <android-base/logging.h>
36
shihchienc8ed901a2022-09-06 08:44:44 +000037#include "BluetoothLeAudioCodecsProvider.h"
38
Josh Wu20bac522021-12-29 23:52:39 -080039namespace aidl {
40namespace android {
41namespace hardware {
42namespace bluetooth {
43namespace audio {
44
45static const PcmCapabilities kDefaultSoftwarePcmCapabilities = {
Ɓukasz Rymanowski4d14c1e2022-05-06 17:12:50 +000046 .sampleRateHz = {16000, 24000, 32000, 44100, 48000, 88200, 96000},
Josh Wu20bac522021-12-29 23:52:39 -080047 .channelMode = {ChannelMode::MONO, ChannelMode::STEREO},
48 .bitsPerSample = {16, 24, 32},
49 .dataIntervalUs = {},
50};
51
52static const SbcCapabilities kDefaultOffloadSbcCapability = {
53 .sampleRateHz = {44100},
54 .channelMode = {SbcChannelMode::MONO, SbcChannelMode::JOINT_STEREO},
55 .blockLength = {4, 8, 12, 16},
56 .numSubbands = {8},
57 .allocMethod = {SbcAllocMethod::ALLOC_MD_L},
58 .bitsPerSample = {16},
59 .minBitpool = 2,
60 .maxBitpool = 53};
61
62static const AacCapabilities kDefaultOffloadAacCapability = {
63 .objectType = {AacObjectType::MPEG2_LC},
64 .sampleRateHz = {44100},
65 .channelMode = {ChannelMode::STEREO},
66 .variableBitRateSupported = true,
67 .bitsPerSample = {16}};
68
69static const LdacCapabilities kDefaultOffloadLdacCapability = {
70 .sampleRateHz = {44100, 48000, 88200, 96000},
71 .channelMode = {LdacChannelMode::DUAL, LdacChannelMode::STEREO},
72 .qualityIndex = {LdacQualityIndex::HIGH},
73 .bitsPerSample = {16, 24, 32}};
74
75static const AptxCapabilities kDefaultOffloadAptxCapability = {
76 .sampleRateHz = {44100, 48000},
77 .channelMode = {ChannelMode::STEREO},
78 .bitsPerSample = {16},
79};
80
81static const AptxCapabilities kDefaultOffloadAptxHdCapability = {
82 .sampleRateHz = {44100, 48000},
83 .channelMode = {ChannelMode::STEREO},
84 .bitsPerSample = {24},
85};
86
Omer Osmana2587da2022-05-01 03:54:11 +000087static const OpusCapabilities kDefaultOffloadOpusCapability = {
88 .samplingFrequencyHz = {48000},
89 .frameDurationUs = {10000, 20000},
Josh Wu20bac522021-12-29 23:52:39 -080090 .channelMode = {ChannelMode::MONO, ChannelMode::STEREO},
91};
92
93const std::vector<CodecCapabilities> kDefaultOffloadA2dpCodecCapabilities = {
94 {.codecType = CodecType::SBC, .capabilities = {}},
95 {.codecType = CodecType::AAC, .capabilities = {}},
96 {.codecType = CodecType::LDAC, .capabilities = {}},
97 {.codecType = CodecType::APTX, .capabilities = {}},
98 {.codecType = CodecType::APTX_HD, .capabilities = {}},
Omer Osmana2587da2022-05-01 03:54:11 +000099 {.codecType = CodecType::OPUS, .capabilities = {}}};
Josh Wu20bac522021-12-29 23:52:39 -0800100
101std::vector<LeAudioCodecCapabilitiesSetting> kDefaultOffloadLeAudioCapabilities;
102
Sagar Verma62df9102022-12-07 17:56:04 +0530103static const UnicastCapability kInvalidUnicastCapability = {
104 .codecType = CodecType::UNKNOWN};
105
106static const AptxAdaptiveLeCapabilities
107 kDefaultOffloadAptxAdaptiveLeCapability_48k = {
108 .samplingFrequencyHz = {48000},
109 .frameDurationUs = {10000},
110 .octetsPerFrame = {816}};
111
112static const AptxAdaptiveLeCapabilities
113 kDefaultOffloadAptxAdaptiveLeCapability_96k = {
114 .samplingFrequencyHz = {96000},
115 .frameDurationUs = {10000},
116 .octetsPerFrame = {816}};
117
118static const AptxAdaptiveLeCapabilities
119 kDefaultOffloadAptxAdaptiveLeXCapability_48k = {
120 .samplingFrequencyHz = {48000},
121 .frameDurationUs = {10000},
122 .octetsPerFrame = {816}};
123
124static const AptxAdaptiveLeCapabilities
125 kDefaultOffloadAptxAdaptiveLeXCapability_96k = {
126 .samplingFrequencyHz = {96000},
127 .frameDurationUs = {10000},
128 .octetsPerFrame = {816}};
129
130static const BroadcastCapability kInvalidBroadcastCapability = {
131 .codecType = CodecType::UNKNOWN};
132
133static AudioLocation stereoAudio = static_cast<AudioLocation>(
134 static_cast<uint8_t>(AudioLocation::FRONT_LEFT) |
135 static_cast<uint8_t>(AudioLocation::FRONT_RIGHT));
136
137static const std::vector<AptxAdaptiveLeCapabilities>
138 supportedAptxAdaptiveLeCapabilityList = {
139 kDefaultOffloadAptxAdaptiveLeCapability_48k,
140 kDefaultOffloadAptxAdaptiveLeCapability_96k,
141 kDefaultOffloadAptxAdaptiveLeXCapability_48k,
142 kDefaultOffloadAptxAdaptiveLeXCapability_96k};
143
144// Stores the supported setting of audio location, connected device, and the
145// channel count for each device
146std::vector<std::tuple<AudioLocation, uint8_t, uint8_t>>
147 supportedDeviceSetting = {
148 // Stereo, one connected device for both L and R
149 std::make_tuple(stereoAudio, 1, 2),
150};
151
Josh Wu20bac522021-12-29 23:52:39 -0800152template <class T>
153bool BluetoothAudioCodecs::ContainedInVector(
154 const std::vector<T>& vector, const typename identity<T>::type& target) {
155 return std::find(vector.begin(), vector.end(), target) != vector.end();
156}
157
158bool BluetoothAudioCodecs::IsOffloadSbcConfigurationValid(
159 const CodecConfiguration::CodecSpecific& codec_specific) {
160 if (codec_specific.getTag() != CodecConfiguration::CodecSpecific::sbcConfig) {
161 LOG(WARNING) << __func__
162 << ": Invalid CodecSpecific=" << codec_specific.toString();
163 return false;
164 }
165 const SbcConfiguration sbc_data =
166 codec_specific.get<CodecConfiguration::CodecSpecific::sbcConfig>();
167
168 if (ContainedInVector(kDefaultOffloadSbcCapability.sampleRateHz,
169 sbc_data.sampleRateHz) &&
170 ContainedInVector(kDefaultOffloadSbcCapability.blockLength,
171 sbc_data.blockLength) &&
172 ContainedInVector(kDefaultOffloadSbcCapability.numSubbands,
173 sbc_data.numSubbands) &&
174 ContainedInVector(kDefaultOffloadSbcCapability.bitsPerSample,
175 sbc_data.bitsPerSample) &&
176 ContainedInVector(kDefaultOffloadSbcCapability.channelMode,
177 sbc_data.channelMode) &&
178 ContainedInVector(kDefaultOffloadSbcCapability.allocMethod,
179 sbc_data.allocMethod) &&
180 sbc_data.minBitpool <= sbc_data.maxBitpool &&
181 kDefaultOffloadSbcCapability.minBitpool <= sbc_data.minBitpool &&
182 kDefaultOffloadSbcCapability.maxBitpool >= sbc_data.maxBitpool) {
183 return true;
184 }
185 LOG(WARNING) << __func__
186 << ": Unsupported CodecSpecific=" << codec_specific.toString();
187 return false;
188}
189
190bool BluetoothAudioCodecs::IsOffloadAacConfigurationValid(
191 const CodecConfiguration::CodecSpecific& codec_specific) {
192 if (codec_specific.getTag() != CodecConfiguration::CodecSpecific::aacConfig) {
193 LOG(WARNING) << __func__
194 << ": Invalid CodecSpecific=" << codec_specific.toString();
195 return false;
196 }
197 const AacConfiguration aac_data =
198 codec_specific.get<CodecConfiguration::CodecSpecific::aacConfig>();
199
200 if (ContainedInVector(kDefaultOffloadAacCapability.sampleRateHz,
201 aac_data.sampleRateHz) &&
202 ContainedInVector(kDefaultOffloadAacCapability.bitsPerSample,
203 aac_data.bitsPerSample) &&
204 ContainedInVector(kDefaultOffloadAacCapability.channelMode,
205 aac_data.channelMode) &&
206 ContainedInVector(kDefaultOffloadAacCapability.objectType,
207 aac_data.objectType) &&
208 (!aac_data.variableBitRateEnabled ||
209 kDefaultOffloadAacCapability.variableBitRateSupported)) {
210 return true;
211 }
212 LOG(WARNING) << __func__
213 << ": Unsupported CodecSpecific=" << codec_specific.toString();
214 return false;
215}
216
217bool BluetoothAudioCodecs::IsOffloadLdacConfigurationValid(
218 const CodecConfiguration::CodecSpecific& codec_specific) {
219 if (codec_specific.getTag() !=
220 CodecConfiguration::CodecSpecific::ldacConfig) {
221 LOG(WARNING) << __func__
222 << ": Invalid CodecSpecific=" << codec_specific.toString();
223 return false;
224 }
225 const LdacConfiguration ldac_data =
226 codec_specific.get<CodecConfiguration::CodecSpecific::ldacConfig>();
227
228 if (ContainedInVector(kDefaultOffloadLdacCapability.sampleRateHz,
229 ldac_data.sampleRateHz) &&
230 ContainedInVector(kDefaultOffloadLdacCapability.bitsPerSample,
231 ldac_data.bitsPerSample) &&
232 ContainedInVector(kDefaultOffloadLdacCapability.channelMode,
233 ldac_data.channelMode) &&
234 ContainedInVector(kDefaultOffloadLdacCapability.qualityIndex,
235 ldac_data.qualityIndex)) {
236 return true;
237 }
238 LOG(WARNING) << __func__
239 << ": Unsupported CodecSpecific=" << codec_specific.toString();
240 return false;
241}
242
243bool BluetoothAudioCodecs::IsOffloadAptxConfigurationValid(
244 const CodecConfiguration::CodecSpecific& codec_specific) {
245 if (codec_specific.getTag() !=
246 CodecConfiguration::CodecSpecific::aptxConfig) {
247 LOG(WARNING) << __func__
248 << ": Invalid CodecSpecific=" << codec_specific.toString();
249 return false;
250 }
251 const AptxConfiguration aptx_data =
252 codec_specific.get<CodecConfiguration::CodecSpecific::aptxConfig>();
253
254 if (ContainedInVector(kDefaultOffloadAptxCapability.sampleRateHz,
255 aptx_data.sampleRateHz) &&
256 ContainedInVector(kDefaultOffloadAptxCapability.bitsPerSample,
257 aptx_data.bitsPerSample) &&
258 ContainedInVector(kDefaultOffloadAptxCapability.channelMode,
259 aptx_data.channelMode)) {
260 return true;
261 }
262 LOG(WARNING) << __func__
263 << ": Unsupported CodecSpecific=" << codec_specific.toString();
264 return false;
265}
266
267bool BluetoothAudioCodecs::IsOffloadAptxHdConfigurationValid(
268 const CodecConfiguration::CodecSpecific& codec_specific) {
269 if (codec_specific.getTag() !=
270 CodecConfiguration::CodecSpecific::aptxConfig) {
271 LOG(WARNING) << __func__
272 << ": Invalid CodecSpecific=" << codec_specific.toString();
273 return false;
274 }
275 const AptxConfiguration aptx_data =
276 codec_specific.get<CodecConfiguration::CodecSpecific::aptxConfig>();
277
278 if (ContainedInVector(kDefaultOffloadAptxHdCapability.sampleRateHz,
279 aptx_data.sampleRateHz) &&
280 ContainedInVector(kDefaultOffloadAptxHdCapability.bitsPerSample,
281 aptx_data.bitsPerSample) &&
282 ContainedInVector(kDefaultOffloadAptxHdCapability.channelMode,
283 aptx_data.channelMode)) {
284 return true;
285 }
286 LOG(WARNING) << __func__
287 << ": Unsupported CodecSpecific=" << codec_specific.toString();
288 return false;
289}
290
Omer Osmana2587da2022-05-01 03:54:11 +0000291bool BluetoothAudioCodecs::IsOffloadOpusConfigurationValid(
Josh Wu20bac522021-12-29 23:52:39 -0800292 const CodecConfiguration::CodecSpecific& codec_specific) {
Omer Osmana2587da2022-05-01 03:54:11 +0000293 if (codec_specific.getTag() !=
294 CodecConfiguration::CodecSpecific::opusConfig) {
Josh Wu20bac522021-12-29 23:52:39 -0800295 LOG(WARNING) << __func__
296 << ": Invalid CodecSpecific=" << codec_specific.toString();
297 return false;
298 }
Omer Osmana2587da2022-05-01 03:54:11 +0000299 std::optional<OpusConfiguration> opus_data =
300 codec_specific.get<CodecConfiguration::CodecSpecific::opusConfig>();
Josh Wu20bac522021-12-29 23:52:39 -0800301
Omer Osmana2587da2022-05-01 03:54:11 +0000302 if (opus_data.has_value() &&
303 ContainedInVector(kDefaultOffloadOpusCapability.samplingFrequencyHz,
304 opus_data->samplingFrequencyHz) &&
305 ContainedInVector(kDefaultOffloadOpusCapability.frameDurationUs,
306 opus_data->frameDurationUs) &&
307 ContainedInVector(kDefaultOffloadOpusCapability.channelMode,
308 opus_data->channelMode)) {
Josh Wu20bac522021-12-29 23:52:39 -0800309 return true;
310 }
311 LOG(WARNING) << __func__
312 << ": Unsupported CodecSpecific=" << codec_specific.toString();
313 return false;
314}
315
Josh Wu20bac522021-12-29 23:52:39 -0800316std::vector<PcmCapabilities>
317BluetoothAudioCodecs::GetSoftwarePcmCapabilities() {
318 return {kDefaultSoftwarePcmCapabilities};
319}
320
321std::vector<CodecCapabilities>
322BluetoothAudioCodecs::GetA2dpOffloadCodecCapabilities(
323 const SessionType& session_type) {
Alice Kuoadcceec2022-03-28 13:28:43 +0800324 if (session_type != SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
325 session_type != SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800326 return {};
327 }
328 std::vector<CodecCapabilities> offload_a2dp_codec_capabilities =
329 kDefaultOffloadA2dpCodecCapabilities;
330 for (auto& codec_capability : offload_a2dp_codec_capabilities) {
331 switch (codec_capability.codecType) {
332 case CodecType::SBC:
333 codec_capability.capabilities
334 .set<CodecCapabilities::Capabilities::sbcCapabilities>(
335 kDefaultOffloadSbcCapability);
336 break;
337 case CodecType::AAC:
338 codec_capability.capabilities
339 .set<CodecCapabilities::Capabilities::aacCapabilities>(
340 kDefaultOffloadAacCapability);
341 break;
342 case CodecType::LDAC:
343 codec_capability.capabilities
344 .set<CodecCapabilities::Capabilities::ldacCapabilities>(
345 kDefaultOffloadLdacCapability);
346 break;
347 case CodecType::APTX:
348 codec_capability.capabilities
349 .set<CodecCapabilities::Capabilities::aptxCapabilities>(
350 kDefaultOffloadAptxCapability);
351 break;
352 case CodecType::APTX_HD:
353 codec_capability.capabilities
354 .set<CodecCapabilities::Capabilities::aptxCapabilities>(
355 kDefaultOffloadAptxHdCapability);
356 break;
Omer Osmana2587da2022-05-01 03:54:11 +0000357 case CodecType::OPUS:
Josh Wu20bac522021-12-29 23:52:39 -0800358 codec_capability.capabilities
Omer Osmana2587da2022-05-01 03:54:11 +0000359 .set<CodecCapabilities::Capabilities::opusCapabilities>(
360 kDefaultOffloadOpusCapability);
Josh Wu20bac522021-12-29 23:52:39 -0800361 break;
362 case CodecType::UNKNOWN:
Alice Kuo79c936d2022-01-20 23:10:10 +0800363 case CodecType::VENDOR:
Omer Osmana2587da2022-05-01 03:54:11 +0000364 case CodecType::LC3:
Sagar Vermad13bbb32022-01-08 20:09:04 +0530365 case CodecType::APTX_ADAPTIVE:
Sagar Verma62df9102022-12-07 17:56:04 +0530366 case CodecType::APTX_ADAPTIVE_LE:
367 case CodecType::APTX_ADAPTIVE_LEX:
Josh Wu20bac522021-12-29 23:52:39 -0800368 break;
369 }
370 }
371 return offload_a2dp_codec_capabilities;
372}
373
374bool BluetoothAudioCodecs::IsSoftwarePcmConfigurationValid(
375 const PcmConfiguration& pcm_config) {
376 if (ContainedInVector(kDefaultSoftwarePcmCapabilities.sampleRateHz,
377 pcm_config.sampleRateHz) &&
378 ContainedInVector(kDefaultSoftwarePcmCapabilities.bitsPerSample,
379 pcm_config.bitsPerSample) &&
380 ContainedInVector(kDefaultSoftwarePcmCapabilities.channelMode,
381 pcm_config.channelMode)
382 // data interval is not checked for now
383 // && pcm_config.dataIntervalUs != 0
384 ) {
385 return true;
386 }
387 LOG(WARNING) << __func__
388 << ": Unsupported CodecSpecific=" << pcm_config.toString();
389 return false;
390}
391
392bool BluetoothAudioCodecs::IsOffloadCodecConfigurationValid(
393 const SessionType& session_type, const CodecConfiguration& codec_config) {
Alice Kuoadcceec2022-03-28 13:28:43 +0800394 if (session_type != SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
395 session_type != SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800396 LOG(ERROR) << __func__
397 << ": Invalid SessionType=" << toString(session_type);
398 return false;
399 }
400 const CodecConfiguration::CodecSpecific& codec_specific = codec_config.config;
401 switch (codec_config.codecType) {
402 case CodecType::SBC:
403 if (IsOffloadSbcConfigurationValid(codec_specific)) {
404 return true;
405 }
406 break;
407 case CodecType::AAC:
408 if (IsOffloadAacConfigurationValid(codec_specific)) {
409 return true;
410 }
411 break;
412 case CodecType::LDAC:
413 if (IsOffloadLdacConfigurationValid(codec_specific)) {
414 return true;
415 }
416 break;
417 case CodecType::APTX:
418 if (IsOffloadAptxConfigurationValid(codec_specific)) {
419 return true;
420 }
421 break;
422 case CodecType::APTX_HD:
423 if (IsOffloadAptxHdConfigurationValid(codec_specific)) {
424 return true;
425 }
426 break;
Omer Osmana2587da2022-05-01 03:54:11 +0000427 case CodecType::OPUS:
428 if (IsOffloadOpusConfigurationValid(codec_specific)) {
Josh Wu20bac522021-12-29 23:52:39 -0800429 return true;
430 }
431 break;
Sagar Vermad13bbb32022-01-08 20:09:04 +0530432 case CodecType::APTX_ADAPTIVE:
Sagar Verma62df9102022-12-07 17:56:04 +0530433 case CodecType::APTX_ADAPTIVE_LE:
434 case CodecType::APTX_ADAPTIVE_LEX:
Omer Osmana2587da2022-05-01 03:54:11 +0000435 case CodecType::LC3:
Josh Wu20bac522021-12-29 23:52:39 -0800436 case CodecType::UNKNOWN:
Alice Kuo79c936d2022-01-20 23:10:10 +0800437 case CodecType::VENDOR:
Josh Wu20bac522021-12-29 23:52:39 -0800438 break;
439 }
440 return false;
441}
442
Josh Wu20bac522021-12-29 23:52:39 -0800443std::vector<LeAudioCodecCapabilitiesSetting>
444BluetoothAudioCodecs::GetLeAudioOffloadCodecCapabilities(
445 const SessionType& session_type) {
446 if (session_type !=
447 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
448 session_type !=
Josh Wu5d50dc02022-02-15 08:41:53 -0800449 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH &&
450 session_type !=
451 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH) {
Josh Wu20bac522021-12-29 23:52:39 -0800452 return std::vector<LeAudioCodecCapabilitiesSetting>(0);
453 }
454
455 if (kDefaultOffloadLeAudioCapabilities.empty()) {
shihchiencd7f565a2022-10-14 13:45:37 +0000456 auto le_audio_offload_setting =
457 BluetoothLeAudioCodecsProvider::ParseFromLeAudioOffloadSettingFile();
shihchienc8ed901a2022-09-06 08:44:44 +0000458 kDefaultOffloadLeAudioCapabilities =
shihchiencd7f565a2022-10-14 13:45:37 +0000459 BluetoothLeAudioCodecsProvider::GetLeAudioCodecCapabilities(
460 le_audio_offload_setting);
Josh Wu20bac522021-12-29 23:52:39 -0800461
Sagar Verma62df9102022-12-07 17:56:04 +0530462 for (auto [audioLocation, deviceCnt, channelCount] :
463 supportedDeviceSetting) {
464 for (auto capability : supportedAptxAdaptiveLeCapabilityList) {
465 for (auto codec_type :
466 {CodecType::APTX_ADAPTIVE_LE, CodecType::APTX_ADAPTIVE_LEX}) {
467 if (session_type ==
468 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH) {
469 UnicastCapability aptx_adaptive_le_cap = {
470 .codecType = codec_type,
471 .supportedChannel = audioLocation,
472 .deviceCount = deviceCnt,
473 .channelCountPerDevice = channelCount,
474 .leAudioCodecCapabilities =
475 UnicastCapability::LeAudioCodecCapabilities(capability),
476 };
477
478 // Adds the capability for encode only
479 kDefaultOffloadLeAudioCapabilities.push_back(
480 {.unicastEncodeCapability = aptx_adaptive_le_cap,
481 .unicastDecodeCapability = kInvalidUnicastCapability,
482 .broadcastCapability = kInvalidBroadcastCapability});
483 }
484 }
485 }
486 }
487 }
Josh Wu20bac522021-12-29 23:52:39 -0800488 return kDefaultOffloadLeAudioCapabilities;
489}
490
491} // namespace audio
492} // namespace bluetooth
493} // namespace hardware
494} // namespace android
Sagar Vermad13bbb32022-01-08 20:09:04 +0530495} // namespace aidl