blob: c1a1b7af8435475edee18e5516659b15f956c790 [file] [log] [blame]
Josh Wu049e2cd2022-01-12 05:42:58 -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#include <aidl/Gtest.h>
17#include <aidl/Vintf.h>
18#include <aidl/android/hardware/bluetooth/audio/BnBluetoothAudioPort.h>
19#include <aidl/android/hardware/bluetooth/audio/IBluetoothAudioPort.h>
20#include <aidl/android/hardware/bluetooth/audio/IBluetoothAudioProviderFactory.h>
21#include <android/binder_auto_utils.h>
22#include <android/binder_manager.h>
23#include <android/binder_process.h>
24#include <binder/IServiceManager.h>
25#include <binder/ProcessState.h>
shihchienc3ab9f5e2022-09-23 08:18:05 +000026#include <cutils/properties.h>
Josh Wu049e2cd2022-01-12 05:42:58 -080027#include <fmq/AidlMessageQueue.h>
28
29#include <cstdint>
30#include <future>
31#include <unordered_set>
32#include <vector>
33
34using aidl::android::hardware::audio::common::SinkMetadata;
35using aidl::android::hardware::audio::common::SourceMetadata;
36using aidl::android::hardware::bluetooth::audio::AacCapabilities;
37using aidl::android::hardware::bluetooth::audio::AacConfiguration;
Sagar Verma62df9102022-12-07 17:56:04 +053038using aidl::android::hardware::bluetooth::audio::AptxAdaptiveLeCapabilities;
39using aidl::android::hardware::bluetooth::audio::AptxAdaptiveLeConfiguration;
Josh Wu049e2cd2022-01-12 05:42:58 -080040using aidl::android::hardware::bluetooth::audio::AptxCapabilities;
41using aidl::android::hardware::bluetooth::audio::AptxConfiguration;
42using aidl::android::hardware::bluetooth::audio::AudioCapabilities;
43using aidl::android::hardware::bluetooth::audio::AudioConfiguration;
44using aidl::android::hardware::bluetooth::audio::BnBluetoothAudioPort;
Alice Kuo336d90c2022-02-16 09:09:59 +080045using aidl::android::hardware::bluetooth::audio::BroadcastCapability;
Josh Wu049e2cd2022-01-12 05:42:58 -080046using aidl::android::hardware::bluetooth::audio::ChannelMode;
47using aidl::android::hardware::bluetooth::audio::CodecCapabilities;
48using aidl::android::hardware::bluetooth::audio::CodecConfiguration;
Antoine SOULIER8c90f1f2023-09-26 18:55:17 +000049using aidl::android::hardware::bluetooth::audio::CodecId;
50using aidl::android::hardware::bluetooth::audio::CodecInfo;
Josh Wu049e2cd2022-01-12 05:42:58 -080051using aidl::android::hardware::bluetooth::audio::CodecType;
Bao Do72399432023-11-09 08:13:05 +000052using aidl::android::hardware::bluetooth::audio::HfpConfiguration;
Josh Wu049e2cd2022-01-12 05:42:58 -080053using aidl::android::hardware::bluetooth::audio::IBluetoothAudioPort;
54using aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider;
55using aidl::android::hardware::bluetooth::audio::IBluetoothAudioProviderFactory;
56using aidl::android::hardware::bluetooth::audio::LatencyMode;
57using aidl::android::hardware::bluetooth::audio::Lc3Capabilities;
58using aidl::android::hardware::bluetooth::audio::Lc3Configuration;
59using aidl::android::hardware::bluetooth::audio::LdacCapabilities;
60using aidl::android::hardware::bluetooth::audio::LdacConfiguration;
Alice Kuo336d90c2022-02-16 09:09:59 +080061using aidl::android::hardware::bluetooth::audio::LeAudioBroadcastConfiguration;
Josh Wu049e2cd2022-01-12 05:42:58 -080062using aidl::android::hardware::bluetooth::audio::
63 LeAudioCodecCapabilitiesSetting;
64using aidl::android::hardware::bluetooth::audio::LeAudioCodecConfiguration;
65using aidl::android::hardware::bluetooth::audio::LeAudioConfiguration;
Omer Osmana2587da2022-05-01 03:54:11 +000066using aidl::android::hardware::bluetooth::audio::OpusCapabilities;
67using aidl::android::hardware::bluetooth::audio::OpusConfiguration;
Josh Wu049e2cd2022-01-12 05:42:58 -080068using aidl::android::hardware::bluetooth::audio::PcmConfiguration;
69using aidl::android::hardware::bluetooth::audio::PresentationPosition;
70using aidl::android::hardware::bluetooth::audio::SbcAllocMethod;
71using aidl::android::hardware::bluetooth::audio::SbcCapabilities;
72using aidl::android::hardware::bluetooth::audio::SbcChannelMode;
73using aidl::android::hardware::bluetooth::audio::SbcConfiguration;
74using aidl::android::hardware::bluetooth::audio::SessionType;
75using aidl::android::hardware::bluetooth::audio::UnicastCapability;
76using aidl::android::hardware::common::fmq::MQDescriptor;
77using aidl::android::hardware::common::fmq::SynchronizedReadWrite;
78using android::AidlMessageQueue;
79using android::ProcessState;
80using android::String16;
81using ndk::ScopedAStatus;
82using ndk::SpAIBinder;
83
84using MqDataType = int8_t;
85using MqDataMode = SynchronizedReadWrite;
86using DataMQ = AidlMessageQueue<MqDataType, MqDataMode>;
87using DataMQDesc = MQDescriptor<MqDataType, MqDataMode>;
88
89// Constants
90
91static constexpr int32_t a2dp_sample_rates[] = {0, 44100, 48000, 88200, 96000};
92static constexpr int8_t a2dp_bits_per_samples[] = {0, 16, 24, 32};
93static constexpr ChannelMode a2dp_channel_modes[] = {
94 ChannelMode::UNKNOWN, ChannelMode::MONO, ChannelMode::STEREO};
Chen Chenc92270e2022-02-14 18:29:52 -080095static std::vector<LatencyMode> latency_modes = {LatencyMode::FREE};
Bao Do72399432023-11-09 08:13:05 +000096
97// Some valid configs for HFP PCM configuration (software sessions)
98static constexpr int32_t hfp_sample_rates_[] = {8000, 16000, 32000};
99static constexpr int8_t hfp_bits_per_samples_[] = {16};
100static constexpr ChannelMode hfp_channel_modes_[] = {ChannelMode::MONO};
101static constexpr int32_t hfp_data_interval_us_[] = {7500};
102
Josh Wu049e2cd2022-01-12 05:42:58 -0800103// Helpers
104
105template <typename T>
106struct identity {
107 typedef T type;
108};
109
110template <class T>
111bool contained_in_vector(const std::vector<T>& vector,
112 const typename identity<T>::type& target) {
113 return std::find(vector.begin(), vector.end(), target) != vector.end();
114}
115
116void copy_codec_specific(CodecConfiguration::CodecSpecific& dst,
117 const CodecConfiguration::CodecSpecific& src) {
118 switch (src.getTag()) {
119 case CodecConfiguration::CodecSpecific::sbcConfig:
120 dst.set<CodecConfiguration::CodecSpecific::sbcConfig>(
121 src.get<CodecConfiguration::CodecSpecific::sbcConfig>());
122 break;
123 case CodecConfiguration::CodecSpecific::aacConfig:
124 dst.set<CodecConfiguration::CodecSpecific::aacConfig>(
125 src.get<CodecConfiguration::CodecSpecific::aacConfig>());
126 break;
127 case CodecConfiguration::CodecSpecific::ldacConfig:
128 dst.set<CodecConfiguration::CodecSpecific::ldacConfig>(
129 src.get<CodecConfiguration::CodecSpecific::ldacConfig>());
130 break;
131 case CodecConfiguration::CodecSpecific::aptxConfig:
132 dst.set<CodecConfiguration::CodecSpecific::aptxConfig>(
133 src.get<CodecConfiguration::CodecSpecific::aptxConfig>());
134 break;
Omer Osmana2587da2022-05-01 03:54:11 +0000135 case CodecConfiguration::CodecSpecific::opusConfig:
136 dst.set<CodecConfiguration::CodecSpecific::opusConfig>(
137 src.get<CodecConfiguration::CodecSpecific::opusConfig>());
Josh Wu049e2cd2022-01-12 05:42:58 -0800138 break;
139 case CodecConfiguration::CodecSpecific::aptxAdaptiveConfig:
140 dst.set<CodecConfiguration::CodecSpecific::aptxAdaptiveConfig>(
141 src.get<CodecConfiguration::CodecSpecific::aptxAdaptiveConfig>());
142 break;
143 default:
144 break;
145 }
146}
147
148class BluetoothAudioPort : public BnBluetoothAudioPort {
149 public:
150 BluetoothAudioPort() {}
151
Chen Chen0a68a922022-02-15 18:43:26 -0800152 ndk::ScopedAStatus startStream(bool) { return ScopedAStatus::ok(); }
Josh Wu049e2cd2022-01-12 05:42:58 -0800153
154 ndk::ScopedAStatus suspendStream() { return ScopedAStatus::ok(); }
155
156 ndk::ScopedAStatus stopStream() { return ScopedAStatus::ok(); }
157
158 ndk::ScopedAStatus getPresentationPosition(PresentationPosition*) {
159 return ScopedAStatus::ok();
160 }
161
162 ndk::ScopedAStatus updateSourceMetadata(const SourceMetadata&) {
163 return ScopedAStatus::ok();
164 }
165
166 ndk::ScopedAStatus updateSinkMetadata(const SinkMetadata&) {
167 return ScopedAStatus::ok();
168 }
169
170 ndk::ScopedAStatus setLatencyMode(const LatencyMode) {
171 return ScopedAStatus::ok();
172 }
173
174 ndk::ScopedAStatus setCodecType(const CodecType) {
175 return ScopedAStatus::ok();
176 }
177
178 protected:
179 virtual ~BluetoothAudioPort() = default;
180};
181
182class BluetoothAudioProviderFactoryAidl
183 : public testing::TestWithParam<std::string> {
184 public:
185 virtual void SetUp() override {
186 provider_factory_ = IBluetoothAudioProviderFactory::fromBinder(
187 SpAIBinder(AServiceManager_getService(GetParam().c_str())));
188 audio_provider_ = nullptr;
189 ASSERT_NE(provider_factory_, nullptr);
190 }
191
192 virtual void TearDown() override { provider_factory_ = nullptr; }
193
194 void GetProviderCapabilitiesHelper(const SessionType& session_type) {
195 temp_provider_capabilities_.clear();
196 auto aidl_retval = provider_factory_->getProviderCapabilities(
197 session_type, &temp_provider_capabilities_);
198 // AIDL calls should not be failed and callback has to be executed
199 ASSERT_TRUE(aidl_retval.isOk());
200 switch (session_type) {
201 case SessionType::UNKNOWN: {
202 ASSERT_TRUE(temp_provider_capabilities_.empty());
203 } break;
204 case SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
205 case SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
206 case SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
207 case SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH:
Bao Do72399432023-11-09 08:13:05 +0000208 case SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH:
209 case SessionType::HFP_SOFTWARE_ENCODING_DATAPATH: {
Josh Wu049e2cd2022-01-12 05:42:58 -0800210 // All software paths are mandatory and must have exact 1
211 // "PcmParameters"
212 ASSERT_EQ(temp_provider_capabilities_.size(), 1);
213 ASSERT_EQ(temp_provider_capabilities_[0].getTag(),
214 AudioCapabilities::pcmCapabilities);
215 } break;
Alice Kuoadcceec2022-03-28 13:28:43 +0800216 case SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
217 case SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH: {
Josh Wu049e2cd2022-01-12 05:42:58 -0800218 std::unordered_set<CodecType> codec_types;
219 // empty capability means offload is unsupported
220 for (auto& audio_capability : temp_provider_capabilities_) {
221 ASSERT_EQ(audio_capability.getTag(),
222 AudioCapabilities::a2dpCapabilities);
223 const auto& codec_capabilities =
224 audio_capability.get<AudioCapabilities::a2dpCapabilities>();
225 // Every codec can present once at most
226 ASSERT_EQ(codec_types.count(codec_capabilities.codecType), 0);
227 switch (codec_capabilities.codecType) {
228 case CodecType::SBC:
229 ASSERT_EQ(codec_capabilities.capabilities.getTag(),
230 CodecCapabilities::Capabilities::sbcCapabilities);
231 break;
232 case CodecType::AAC:
233 ASSERT_EQ(codec_capabilities.capabilities.getTag(),
234 CodecCapabilities::Capabilities::aacCapabilities);
235 break;
236 case CodecType::APTX:
237 case CodecType::APTX_HD:
238 ASSERT_EQ(codec_capabilities.capabilities.getTag(),
239 CodecCapabilities::Capabilities::aptxCapabilities);
240 break;
241 case CodecType::LDAC:
242 ASSERT_EQ(codec_capabilities.capabilities.getTag(),
243 CodecCapabilities::Capabilities::ldacCapabilities);
244 break;
Omer Osmana2587da2022-05-01 03:54:11 +0000245 case CodecType::OPUS:
Josh Wu049e2cd2022-01-12 05:42:58 -0800246 ASSERT_EQ(codec_capabilities.capabilities.getTag(),
Omer Osmana2587da2022-05-01 03:54:11 +0000247 CodecCapabilities::Capabilities::opusCapabilities);
Josh Wu049e2cd2022-01-12 05:42:58 -0800248 break;
249 case CodecType::APTX_ADAPTIVE:
Sagar Verma62df9102022-12-07 17:56:04 +0530250 case CodecType::APTX_ADAPTIVE_LE:
251 case CodecType::APTX_ADAPTIVE_LEX:
Omer Osmana2587da2022-05-01 03:54:11 +0000252 case CodecType::LC3:
Josh Wu049e2cd2022-01-12 05:42:58 -0800253 case CodecType::VENDOR:
254 case CodecType::UNKNOWN:
255 break;
256 }
257 codec_types.insert(codec_capabilities.codecType);
258 }
259 } break;
260 case SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
261 case SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH:
262 case SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH: {
shihchienc3ab9f5e2022-09-23 08:18:05 +0000263 // empty capability means offload is unsupported since capabilities are
264 // not hardcoded
Josh Wu049e2cd2022-01-12 05:42:58 -0800265 for (auto audio_capability : temp_provider_capabilities_) {
266 ASSERT_EQ(audio_capability.getTag(),
267 AudioCapabilities::leAudioCapabilities);
268 }
269 } break;
Bao Do72399432023-11-09 08:13:05 +0000270 case SessionType::A2DP_SOFTWARE_DECODING_DATAPATH:
271 case SessionType::HFP_SOFTWARE_DECODING_DATAPATH: {
Alice Kuoadcceec2022-03-28 13:28:43 +0800272 if (!temp_provider_capabilities_.empty()) {
273 ASSERT_EQ(temp_provider_capabilities_.size(), 1);
274 ASSERT_EQ(temp_provider_capabilities_[0].getTag(),
275 AudioCapabilities::pcmCapabilities);
276 }
277 } break;
278 default: {
279 ASSERT_TRUE(temp_provider_capabilities_.empty());
280 }
Josh Wu049e2cd2022-01-12 05:42:58 -0800281 }
282 }
283
284 /***
285 * This helps to open the specified provider and check the openProvider()
286 * has corruct return values. BUT, to keep it simple, it does not consider
287 * the capability, and please do so at the SetUp of each session's test.
288 ***/
289 void OpenProviderHelper(const SessionType& session_type) {
290 auto aidl_retval =
291 provider_factory_->openProvider(session_type, &audio_provider_);
292 if (aidl_retval.isOk()) {
293 ASSERT_NE(session_type, SessionType::UNKNOWN);
294 ASSERT_NE(audio_provider_, nullptr);
295 audio_port_ = ndk::SharedRefBase::make<BluetoothAudioPort>();
296 } else {
Alice Kuoadcceec2022-03-28 13:28:43 +0800297 // optional session type
Josh Wu049e2cd2022-01-12 05:42:58 -0800298 ASSERT_TRUE(
299 session_type == SessionType::UNKNOWN ||
300 session_type ==
301 SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
302 session_type ==
303 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH ||
304 session_type ==
305 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
306 session_type ==
307 SessionType::
Alice Kuoadcceec2022-03-28 13:28:43 +0800308 LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
309 session_type ==
310 SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH ||
Bao Do72399432023-11-09 08:13:05 +0000311 session_type == SessionType::A2DP_SOFTWARE_DECODING_DATAPATH ||
312 session_type == SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH ||
313 session_type == SessionType::HFP_SOFTWARE_DECODING_DATAPATH ||
314 session_type == SessionType::HFP_SOFTWARE_ENCODING_DATAPATH);
Josh Wu049e2cd2022-01-12 05:42:58 -0800315 ASSERT_EQ(audio_provider_, nullptr);
316 }
317 }
318
Josh Wu049e2cd2022-01-12 05:42:58 -0800319 void GetA2dpOffloadCapabilityHelper(const CodecType& codec_type) {
320 temp_codec_capabilities_ = nullptr;
Josh Wu4d2938f2022-02-15 09:21:10 -0800321 for (auto& codec_capability : temp_provider_capabilities_) {
Josh Wu049e2cd2022-01-12 05:42:58 -0800322 auto& a2dp_capabilities =
323 codec_capability.get<AudioCapabilities::a2dpCapabilities>();
324 if (a2dp_capabilities.codecType != codec_type) {
325 continue;
326 }
327 temp_codec_capabilities_ = &a2dp_capabilities;
328 }
329 }
330
331 std::vector<CodecConfiguration::CodecSpecific>
332 GetSbcCodecSpecificSupportedList(bool supported) {
333 std::vector<CodecConfiguration::CodecSpecific> sbc_codec_specifics;
334 if (!supported) {
335 SbcConfiguration sbc_config{.sampleRateHz = 0, .bitsPerSample = 0};
336 sbc_codec_specifics.push_back(
337 CodecConfiguration::CodecSpecific(sbc_config));
338 return sbc_codec_specifics;
339 }
340 GetA2dpOffloadCapabilityHelper(CodecType::SBC);
341 if (temp_codec_capabilities_ == nullptr ||
342 temp_codec_capabilities_->codecType != CodecType::SBC) {
343 return sbc_codec_specifics;
344 }
345 // parse the capability
346 auto& sbc_capability =
347 temp_codec_capabilities_->capabilities
348 .get<CodecCapabilities::Capabilities::sbcCapabilities>();
349 if (sbc_capability.minBitpool > sbc_capability.maxBitpool) {
350 return sbc_codec_specifics;
351 }
352
353 // combine those parameters into one list of
354 // CodecConfiguration::CodecSpecific
355 for (int32_t sample_rate : sbc_capability.sampleRateHz) {
356 for (int8_t block_length : sbc_capability.blockLength) {
357 for (int8_t num_subbands : sbc_capability.numSubbands) {
358 for (int8_t bits_per_sample : sbc_capability.bitsPerSample) {
359 for (auto channel_mode : sbc_capability.channelMode) {
360 for (auto alloc_method : sbc_capability.allocMethod) {
361 SbcConfiguration sbc_data = {
362 .sampleRateHz = sample_rate,
363 .channelMode = channel_mode,
364 .blockLength = block_length,
365 .numSubbands = num_subbands,
366 .allocMethod = alloc_method,
367 .bitsPerSample = bits_per_sample,
368 .minBitpool = sbc_capability.minBitpool,
369 .maxBitpool = sbc_capability.maxBitpool};
370 sbc_codec_specifics.push_back(
371 CodecConfiguration::CodecSpecific(sbc_data));
372 }
373 }
374 }
375 }
376 }
377 }
378 return sbc_codec_specifics;
379 }
380
381 std::vector<CodecConfiguration::CodecSpecific>
382 GetAacCodecSpecificSupportedList(bool supported) {
383 std::vector<CodecConfiguration::CodecSpecific> aac_codec_specifics;
384 if (!supported) {
385 AacConfiguration aac_config{.sampleRateHz = 0, .bitsPerSample = 0};
386 aac_codec_specifics.push_back(
387 CodecConfiguration::CodecSpecific(aac_config));
388 return aac_codec_specifics;
389 }
390 GetA2dpOffloadCapabilityHelper(CodecType::AAC);
391 if (temp_codec_capabilities_ == nullptr ||
392 temp_codec_capabilities_->codecType != CodecType::AAC) {
393 return aac_codec_specifics;
394 }
395 // parse the capability
396 auto& aac_capability =
397 temp_codec_capabilities_->capabilities
398 .get<CodecCapabilities::Capabilities::aacCapabilities>();
399
400 std::vector<bool> variable_bit_rate_enableds = {false};
401 if (aac_capability.variableBitRateSupported) {
402 variable_bit_rate_enableds.push_back(true);
403 }
404
Sagar Verma62df9102022-12-07 17:56:04 +0530405 std::vector<bool> adaptive_bit_rate_supporteds = {false};
406 if (aac_capability.adaptiveBitRateSupported) {
407 adaptive_bit_rate_supporteds.push_back(true);
408 }
409
Josh Wu049e2cd2022-01-12 05:42:58 -0800410 // combine those parameters into one list of
411 // CodecConfiguration::CodecSpecific
412 for (auto object_type : aac_capability.objectType) {
413 for (int32_t sample_rate : aac_capability.sampleRateHz) {
414 for (auto channel_mode : aac_capability.channelMode) {
415 for (int8_t bits_per_sample : aac_capability.bitsPerSample) {
416 for (auto variable_bit_rate_enabled : variable_bit_rate_enableds) {
Sagar Verma62df9102022-12-07 17:56:04 +0530417 for (auto adaptive_bit_rate_supported :
418 adaptive_bit_rate_supporteds) {
419 AacConfiguration aac_data{
420 .objectType = object_type,
421 .sampleRateHz = sample_rate,
422 .channelMode = channel_mode,
423 .variableBitRateEnabled = variable_bit_rate_enabled,
424 .bitsPerSample = bits_per_sample,
425 .adaptiveBitRateSupported = adaptive_bit_rate_supported};
426 aac_codec_specifics.push_back(
427 CodecConfiguration::CodecSpecific(aac_data));
428 }
Josh Wu049e2cd2022-01-12 05:42:58 -0800429 }
430 }
431 }
432 }
433 }
434 return aac_codec_specifics;
435 }
436
437 std::vector<CodecConfiguration::CodecSpecific>
438 GetLdacCodecSpecificSupportedList(bool supported) {
439 std::vector<CodecConfiguration::CodecSpecific> ldac_codec_specifics;
440 if (!supported) {
441 LdacConfiguration ldac_config{.sampleRateHz = 0, .bitsPerSample = 0};
442 ldac_codec_specifics.push_back(
443 CodecConfiguration::CodecSpecific(ldac_config));
444 return ldac_codec_specifics;
445 }
446 GetA2dpOffloadCapabilityHelper(CodecType::LDAC);
447 if (temp_codec_capabilities_ == nullptr ||
448 temp_codec_capabilities_->codecType != CodecType::LDAC) {
449 return ldac_codec_specifics;
450 }
451 // parse the capability
452 auto& ldac_capability =
453 temp_codec_capabilities_->capabilities
454 .get<CodecCapabilities::Capabilities::ldacCapabilities>();
455
456 // combine those parameters into one list of
457 // CodecConfiguration::CodecSpecific
458 for (int32_t sample_rate : ldac_capability.sampleRateHz) {
459 for (int8_t bits_per_sample : ldac_capability.bitsPerSample) {
460 for (auto channel_mode : ldac_capability.channelMode) {
461 for (auto quality_index : ldac_capability.qualityIndex) {
462 LdacConfiguration ldac_data{.sampleRateHz = sample_rate,
463 .channelMode = channel_mode,
464 .qualityIndex = quality_index,
465 .bitsPerSample = bits_per_sample};
466 ldac_codec_specifics.push_back(
467 CodecConfiguration::CodecSpecific(ldac_data));
468 }
469 }
470 }
471 }
472 return ldac_codec_specifics;
473 }
474
475 std::vector<CodecConfiguration::CodecSpecific>
476 GetAptxCodecSpecificSupportedList(bool is_hd, bool supported) {
477 std::vector<CodecConfiguration::CodecSpecific> aptx_codec_specifics;
478 if (!supported) {
479 AptxConfiguration aptx_config{.sampleRateHz = 0, .bitsPerSample = 0};
480 aptx_codec_specifics.push_back(
481 CodecConfiguration::CodecSpecific(aptx_config));
482 return aptx_codec_specifics;
483 }
484 GetA2dpOffloadCapabilityHelper(
485 (is_hd ? CodecType::APTX_HD : CodecType::APTX));
486 if (temp_codec_capabilities_ == nullptr) {
487 return aptx_codec_specifics;
488 }
489 if ((is_hd && temp_codec_capabilities_->codecType != CodecType::APTX_HD) ||
490 (!is_hd && temp_codec_capabilities_->codecType != CodecType::APTX)) {
491 return aptx_codec_specifics;
492 }
493
494 // parse the capability
495 auto& aptx_capability =
496 temp_codec_capabilities_->capabilities
497 .get<CodecCapabilities::Capabilities::aptxCapabilities>();
498
499 // combine those parameters into one list of
500 // CodecConfiguration::CodecSpecific
501 for (int8_t bits_per_sample : aptx_capability.bitsPerSample) {
502 for (int32_t sample_rate : aptx_capability.sampleRateHz) {
503 for (auto channel_mode : aptx_capability.channelMode) {
504 AptxConfiguration aptx_data{.sampleRateHz = sample_rate,
505 .channelMode = channel_mode,
506 .bitsPerSample = bits_per_sample};
507 aptx_codec_specifics.push_back(
508 CodecConfiguration::CodecSpecific(aptx_data));
509 }
510 }
511 }
512 return aptx_codec_specifics;
513 }
514
515 std::vector<CodecConfiguration::CodecSpecific>
Omer Osmana2587da2022-05-01 03:54:11 +0000516 GetOpusCodecSpecificSupportedList(bool supported) {
517 std::vector<CodecConfiguration::CodecSpecific> opus_codec_specifics;
Josh Wu049e2cd2022-01-12 05:42:58 -0800518 if (!supported) {
Omer Osmana2587da2022-05-01 03:54:11 +0000519 OpusConfiguration opus_config{.samplingFrequencyHz = 0,
520 .frameDurationUs = 0};
521 opus_codec_specifics.push_back(
522 CodecConfiguration::CodecSpecific(opus_config));
523 return opus_codec_specifics;
Josh Wu049e2cd2022-01-12 05:42:58 -0800524 }
Omer Osmana2587da2022-05-01 03:54:11 +0000525 GetA2dpOffloadCapabilityHelper(CodecType::OPUS);
Josh Wu049e2cd2022-01-12 05:42:58 -0800526 if (temp_codec_capabilities_ == nullptr ||
Omer Osmana2587da2022-05-01 03:54:11 +0000527 temp_codec_capabilities_->codecType != CodecType::OPUS) {
528 return opus_codec_specifics;
Josh Wu049e2cd2022-01-12 05:42:58 -0800529 }
530 // parse the capability
Omer Osmana2587da2022-05-01 03:54:11 +0000531 auto& opus_capability =
Josh Wu049e2cd2022-01-12 05:42:58 -0800532 temp_codec_capabilities_->capabilities
Omer Osmana2587da2022-05-01 03:54:11 +0000533 .get<CodecCapabilities::Capabilities::opusCapabilities>();
Josh Wu049e2cd2022-01-12 05:42:58 -0800534
535 // combine those parameters into one list of
536 // CodecConfiguration::CodecSpecific
Omer Osmana2587da2022-05-01 03:54:11 +0000537 for (int32_t samplingFrequencyHz : opus_capability->samplingFrequencyHz) {
538 for (int32_t frameDurationUs : opus_capability->frameDurationUs) {
539 for (auto channel_mode : opus_capability->channelMode) {
540 OpusConfiguration opus_data{
541 .samplingFrequencyHz = samplingFrequencyHz,
shihchienc3ab9f5e2022-09-23 08:18:05 +0000542 .frameDurationUs = frameDurationUs,
Omer Osmana2587da2022-05-01 03:54:11 +0000543 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +0000544 };
Omer Osmana2587da2022-05-01 03:54:11 +0000545 opus_codec_specifics.push_back(
546 CodecConfiguration::CodecSpecific(opus_data));
Josh Wu049e2cd2022-01-12 05:42:58 -0800547 }
548 }
549 }
Omer Osmana2587da2022-05-01 03:54:11 +0000550 return opus_codec_specifics;
Josh Wu049e2cd2022-01-12 05:42:58 -0800551 }
552
Alice Kuoadcceec2022-03-28 13:28:43 +0800553 bool IsPcmConfigSupported(const PcmConfiguration& pcm_config) {
554 if (temp_provider_capabilities_.size() != 1 ||
555 temp_provider_capabilities_[0].getTag() !=
556 AudioCapabilities::pcmCapabilities) {
557 return false;
558 }
559 auto pcm_capability = temp_provider_capabilities_[0]
560 .get<AudioCapabilities::pcmCapabilities>();
561 return (contained_in_vector(pcm_capability.channelMode,
562 pcm_config.channelMode) &&
563 contained_in_vector(pcm_capability.sampleRateHz,
564 pcm_config.sampleRateHz) &&
565 contained_in_vector(pcm_capability.bitsPerSample,
566 pcm_config.bitsPerSample));
567 }
568
569 std::shared_ptr<IBluetoothAudioProviderFactory> provider_factory_;
570 std::shared_ptr<IBluetoothAudioProvider> audio_provider_;
571 std::shared_ptr<IBluetoothAudioPort> audio_port_;
572 std::vector<AudioCapabilities> temp_provider_capabilities_;
573
Josh Wu049e2cd2022-01-12 05:42:58 -0800574 // temp storage saves the specified codec capability by
575 // GetOffloadCodecCapabilityHelper()
576 CodecCapabilities* temp_codec_capabilities_;
Alice Kuoadcceec2022-03-28 13:28:43 +0800577
578 static constexpr SessionType kSessionTypes[] = {
579 SessionType::UNKNOWN,
580 SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH,
581 SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
582 SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH,
583 SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH,
584 SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH,
585 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
586 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH,
587 SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH,
588 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
589 SessionType::A2DP_SOFTWARE_DECODING_DATAPATH,
590 SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH,
Bao Do72399432023-11-09 08:13:05 +0000591 SessionType::HFP_SOFTWARE_ENCODING_DATAPATH,
592 SessionType::HFP_SOFTWARE_DECODING_DATAPATH,
Alice Kuoadcceec2022-03-28 13:28:43 +0800593 };
594};
595
596/**
597 * Test whether we can get the FactoryService from HIDL
598 */
599TEST_P(BluetoothAudioProviderFactoryAidl, GetProviderFactoryService) {}
600
601/**
602 * Test whether we can open a provider for each provider returned by
603 * getProviderCapabilities() with non-empty capabalities
604 */
605TEST_P(BluetoothAudioProviderFactoryAidl,
606 OpenProviderAndCheckCapabilitiesBySession) {
607 for (auto session_type : kSessionTypes) {
608 GetProviderCapabilitiesHelper(session_type);
609 OpenProviderHelper(session_type);
610 // We must be able to open a provider if its getProviderCapabilities()
611 // returns non-empty list.
612 EXPECT_TRUE(temp_provider_capabilities_.empty() ||
613 audio_provider_ != nullptr);
614 }
615}
616
617/**
Antoine SOULIER8c90f1f2023-09-26 18:55:17 +0000618 * Test that getProviderInfo, when implemented,
619 * returns empty information for session types for
620 * software data paths.
621 */
622TEST_P(BluetoothAudioProviderFactoryAidl, getProviderInfo_invalidSessionTypes) {
623 static constexpr SessionType kInvalidSessionTypes[]{
624 SessionType::UNKNOWN,
625 SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH,
626 SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH,
627 SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH,
628 SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH,
629 SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH,
630 SessionType::A2DP_SOFTWARE_DECODING_DATAPATH,
631 };
632
633 for (auto session_type : kInvalidSessionTypes) {
634 std::optional<IBluetoothAudioProviderFactory::ProviderInfo> provider_info =
635 std::nullopt;
636 auto aidl_retval =
637 provider_factory_->getProviderInfo(session_type, &provider_info);
638 if (!aidl_retval.isOk()) {
639 continue;
640 }
641
642 // If getProviderInfo is supported, the provider info
643 // must be empty for software session types.
644 ASSERT_FALSE(provider_info.has_value());
645 }
646}
647
648/**
649 * Test that getProviderInfo, when implemented,
650 * returns valid information for session types for
651 * a2dp hardware data paths.
652 */
653TEST_P(BluetoothAudioProviderFactoryAidl, getProviderInfo_a2dpSessionTypes) {
654 static constexpr SessionType kA2dpSessionTypes[]{
655 SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
656 SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH,
657 };
658
659 for (auto session_type : kA2dpSessionTypes) {
660 std::optional<IBluetoothAudioProviderFactory::ProviderInfo> provider_info =
661 std::nullopt;
662 auto aidl_retval =
663 provider_factory_->getProviderInfo(session_type, &provider_info);
664 if (!aidl_retval.isOk() || !provider_info.has_value()) {
665 continue;
666 }
667
668 for (auto const& codec_info : provider_info->codecInfos) {
669 // The codec id must not be core.
670 ASSERT_NE(codec_info.id.getTag(), CodecId::core);
671 // The codec info must contain the information
672 // for a2dp transport.
673 ASSERT_EQ(codec_info.transport.getTag(), CodecInfo::Transport::a2dp);
674 }
675 }
676}
677
678/**
679 * Test that getProviderInfo, when implemented,
680 * returns valid information for session types for
681 * le audio hardware data paths.
682 */
683TEST_P(BluetoothAudioProviderFactoryAidl, getProviderInfo_leAudioSessionTypes) {
684 static constexpr SessionType kLeAudioSessionTypes[]{
685 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
686 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH,
687 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
688 };
689
690 for (auto session_type : kLeAudioSessionTypes) {
691 std::optional<IBluetoothAudioProviderFactory::ProviderInfo> provider_info =
692 std::nullopt;
693 auto aidl_retval =
694 provider_factory_->getProviderInfo(session_type, &provider_info);
695 if (!aidl_retval.isOk() || !provider_info.has_value()) {
696 continue;
697 }
698
699 for (auto const& codec_info : provider_info->codecInfos) {
700 // The codec id must not be a2dp.
701 ASSERT_NE(codec_info.id.getTag(), CodecId::a2dp);
702 // The codec info must contain the information
703 // for le audio transport.
704 // ASSERT_EQ(codec_info.transport.getTag(),
705 // CodecInfo::Transport::le_audio);
706 }
707 }
708}
709
710/**
Alice Kuoadcceec2022-03-28 13:28:43 +0800711 * openProvider A2DP_SOFTWARE_ENCODING_DATAPATH
712 */
713class BluetoothAudioProviderA2dpEncodingSoftwareAidl
714 : public BluetoothAudioProviderFactoryAidl {
715 public:
716 virtual void SetUp() override {
717 BluetoothAudioProviderFactoryAidl::SetUp();
718 GetProviderCapabilitiesHelper(SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH);
719 OpenProviderHelper(SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH);
720 ASSERT_NE(audio_provider_, nullptr);
721 }
722
723 virtual void TearDown() override {
724 audio_port_ = nullptr;
725 audio_provider_ = nullptr;
726 BluetoothAudioProviderFactoryAidl::TearDown();
727 }
Josh Wu049e2cd2022-01-12 05:42:58 -0800728};
729
730/**
731 * Test whether we can open a provider of type
732 */
Alice Kuoadcceec2022-03-28 13:28:43 +0800733TEST_P(BluetoothAudioProviderA2dpEncodingSoftwareAidl,
734 OpenA2dpEncodingSoftwareProvider) {}
735
736/**
737 * Test whether each provider of type
738 * SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH can be started and stopped with
739 * different PCM config
740 */
741TEST_P(BluetoothAudioProviderA2dpEncodingSoftwareAidl,
742 StartAndEndA2dpEncodingSoftwareSessionWithPossiblePcmConfig) {
743 for (auto sample_rate : a2dp_sample_rates) {
744 for (auto bits_per_sample : a2dp_bits_per_samples) {
745 for (auto channel_mode : a2dp_channel_modes) {
746 PcmConfiguration pcm_config{
747 .sampleRateHz = sample_rate,
Alice Kuoadcceec2022-03-28 13:28:43 +0800748 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +0000749 .bitsPerSample = bits_per_sample,
Alice Kuoadcceec2022-03-28 13:28:43 +0800750 };
751 bool is_codec_config_valid = IsPcmConfigSupported(pcm_config);
752 DataMQDesc mq_desc;
753 auto aidl_retval = audio_provider_->startSession(
754 audio_port_, AudioConfiguration(pcm_config), latency_modes,
755 &mq_desc);
756 DataMQ data_mq(mq_desc);
757
758 EXPECT_EQ(aidl_retval.isOk(), is_codec_config_valid);
759 if (is_codec_config_valid) {
760 EXPECT_TRUE(data_mq.isValid());
761 }
762 EXPECT_TRUE(audio_provider_->endSession().isOk());
763 }
764 }
765 }
766}
767
768/**
Bao Do72399432023-11-09 08:13:05 +0000769 * openProvider HFP_SOFTWARE_ENCODING_DATAPATH
770 */
771class BluetoothAudioProviderHfpSoftwareEncodingAidl
772 : public BluetoothAudioProviderFactoryAidl {
773 public:
774 virtual void SetUp() override {
775 BluetoothAudioProviderFactoryAidl::SetUp();
776 GetProviderCapabilitiesHelper(SessionType::HFP_SOFTWARE_ENCODING_DATAPATH);
777 OpenProviderHelper(SessionType::HFP_SOFTWARE_ENCODING_DATAPATH);
778 ASSERT_NE(audio_provider_, nullptr);
779 }
780
781 virtual void TearDown() override {
782 audio_port_ = nullptr;
783 audio_provider_ = nullptr;
784 BluetoothAudioProviderFactoryAidl::TearDown();
785 }
786
787 bool OpenSession(int32_t sample_rate, int8_t bits_per_sample,
788 ChannelMode channel_mode, int32_t data_interval_us) {
789 PcmConfiguration pcm_config{
790 .sampleRateHz = sample_rate,
791 .channelMode = channel_mode,
792 .bitsPerSample = bits_per_sample,
793 .dataIntervalUs = data_interval_us,
794 };
795 // Checking against provider capability from getProviderCapabilities
796 // For HFP software, it's
797 // BluetoothAudioCodecs::GetSoftwarePcmCapabilities();
798 DataMQDesc mq_desc;
799 auto aidl_retval = audio_provider_->startSession(
800 audio_port_, AudioConfiguration(pcm_config), latency_modes, &mq_desc);
801 DataMQ data_mq(mq_desc);
802
803 if (!aidl_retval.isOk()) return false;
804 if (!data_mq.isValid()) return false;
805 return true;
806 }
807};
808
809/**
810 * Test whether we can open a provider of type
811 */
812TEST_P(BluetoothAudioProviderHfpSoftwareEncodingAidl,
813 OpenHfpSoftwareEncodingProvider) {}
814
815/**
816 * Test whether each provider of type
817 * SessionType::HFP_SOFTWARE_ENCODING_DATAPATH can be started and stopped with
818 * different PCM config
819 */
820TEST_P(BluetoothAudioProviderHfpSoftwareEncodingAidl,
821 StartAndEndHfpEncodingSoftwareSessionWithPossiblePcmConfig) {
822 for (auto sample_rate : hfp_sample_rates_) {
823 for (auto bits_per_sample : hfp_bits_per_samples_) {
824 for (auto channel_mode : hfp_channel_modes_) {
825 for (auto data_interval_us: hfp_data_interval_us_) {
826 EXPECT_TRUE(OpenSession(sample_rate, bits_per_sample,
827 channel_mode, data_interval_us));
828 EXPECT_TRUE(audio_provider_->endSession().isOk());
829 }
830 }
831 }
832 }
833}
834
835/**
836 * openProvider HFP_SOFTWARE_DECODING_DATAPATH
837 */
838class BluetoothAudioProviderHfpSoftwareDecodingAidl
839 : public BluetoothAudioProviderFactoryAidl {
840 public:
841 virtual void SetUp() override {
842 BluetoothAudioProviderFactoryAidl::SetUp();
843 GetProviderCapabilitiesHelper(SessionType::HFP_SOFTWARE_DECODING_DATAPATH);
844 OpenProviderHelper(SessionType::HFP_SOFTWARE_DECODING_DATAPATH);
845 ASSERT_NE(audio_provider_, nullptr);
846 }
847
848 virtual void TearDown() override {
849 audio_port_ = nullptr;
850 audio_provider_ = nullptr;
851 BluetoothAudioProviderFactoryAidl::TearDown();
852 }
853
854 bool OpenSession(int32_t sample_rate, int8_t bits_per_sample,
855 ChannelMode channel_mode, int32_t data_interval_us) {
856 PcmConfiguration pcm_config{
857 .sampleRateHz = sample_rate,
858 .channelMode = channel_mode,
859 .bitsPerSample = bits_per_sample,
860 .dataIntervalUs = data_interval_us,
861 };
862 DataMQDesc mq_desc;
863 auto aidl_retval = audio_provider_->startSession(
864 audio_port_, AudioConfiguration(pcm_config), latency_modes, &mq_desc);
865 DataMQ data_mq(mq_desc);
866
867 if (!aidl_retval.isOk()) return false;
868 if (!data_mq.isValid()) return false;
869 return true;
870 }
871};
872
873/**
874 * Test whether we can open a provider of type
875 */
876TEST_P(BluetoothAudioProviderHfpSoftwareDecodingAidl,
877 OpenHfpSoftwareDecodingProvider) {}
878
879/**
880 * Test whether each provider of type
881 * SessionType::HFP_SOFTWARE_DECODING_DATAPATH can be started and stopped with
882 * different PCM config
883 */
884TEST_P(BluetoothAudioProviderHfpSoftwareDecodingAidl,
885 StartAndEndHfpDecodingSoftwareSessionWithPossiblePcmConfig) {
886 for (auto sample_rate : hfp_sample_rates_) {
887 for (auto bits_per_sample : hfp_bits_per_samples_) {
888 for (auto channel_mode : hfp_channel_modes_) {
889 for (auto data_interval_us: hfp_data_interval_us_) {
890 EXPECT_TRUE(OpenSession(sample_rate, bits_per_sample,
891 channel_mode, data_interval_us));
892 EXPECT_TRUE(audio_provider_->endSession().isOk());
893 }
894 }
895 }
896 }
897}
898
899/**
Alice Kuoadcceec2022-03-28 13:28:43 +0800900 * openProvider A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH
901 */
902class BluetoothAudioProviderA2dpEncodingHardwareAidl
903 : public BluetoothAudioProviderFactoryAidl {
904 public:
905 virtual void SetUp() override {
906 BluetoothAudioProviderFactoryAidl::SetUp();
907 GetProviderCapabilitiesHelper(
908 SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
909 OpenProviderHelper(SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
910 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
911 audio_provider_ != nullptr);
912 }
913
914 virtual void TearDown() override {
915 audio_port_ = nullptr;
916 audio_provider_ = nullptr;
917 BluetoothAudioProviderFactoryAidl::TearDown();
918 }
919
920 bool IsOffloadSupported() { return (temp_provider_capabilities_.size() > 0); }
921};
922
923/**
924 * Test whether we can open a provider of type
925 */
926TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
927 OpenA2dpEncodingHardwareProvider) {}
Josh Wu049e2cd2022-01-12 05:42:58 -0800928
929/**
930 * Test whether each provider of type
931 * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
932 * SBC hardware encoding config
933 */
Alice Kuoadcceec2022-03-28 13:28:43 +0800934TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
935 StartAndEndA2dpSbcEncodingHardwareSession) {
Josh Wu049e2cd2022-01-12 05:42:58 -0800936 if (!IsOffloadSupported()) {
937 return;
938 }
939
940 CodecConfiguration codec_config = {
941 .codecType = CodecType::SBC,
942 .encodedAudioBitrate = 328000,
943 .peerMtu = 1005,
944 .isScmstEnabled = false,
945 };
946 auto sbc_codec_specifics = GetSbcCodecSpecificSupportedList(true);
947
948 for (auto& codec_specific : sbc_codec_specifics) {
949 copy_codec_specific(codec_config.config, codec_specific);
950 DataMQDesc mq_desc;
951 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -0800952 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -0800953
954 ASSERT_TRUE(aidl_retval.isOk());
955 EXPECT_TRUE(audio_provider_->endSession().isOk());
956 }
957}
958
959/**
960 * Test whether each provider of type
961 * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
962 * AAC hardware encoding config
963 */
Alice Kuoadcceec2022-03-28 13:28:43 +0800964TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
965 StartAndEndA2dpAacEncodingHardwareSession) {
Josh Wu049e2cd2022-01-12 05:42:58 -0800966 if (!IsOffloadSupported()) {
967 return;
968 }
969
970 CodecConfiguration codec_config = {
971 .codecType = CodecType::AAC,
972 .encodedAudioBitrate = 320000,
973 .peerMtu = 1005,
974 .isScmstEnabled = false,
975 };
976 auto aac_codec_specifics = GetAacCodecSpecificSupportedList(true);
977
978 for (auto& codec_specific : aac_codec_specifics) {
979 copy_codec_specific(codec_config.config, codec_specific);
980 DataMQDesc mq_desc;
981 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -0800982 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -0800983
984 ASSERT_TRUE(aidl_retval.isOk());
985 EXPECT_TRUE(audio_provider_->endSession().isOk());
986 }
987}
988
989/**
990 * Test whether each provider of type
991 * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
992 * LDAC hardware encoding config
993 */
Alice Kuoadcceec2022-03-28 13:28:43 +0800994TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
995 StartAndEndA2dpLdacEncodingHardwareSession) {
Josh Wu049e2cd2022-01-12 05:42:58 -0800996 if (!IsOffloadSupported()) {
997 return;
998 }
999
1000 CodecConfiguration codec_config = {
1001 .codecType = CodecType::LDAC,
1002 .encodedAudioBitrate = 990000,
1003 .peerMtu = 1005,
1004 .isScmstEnabled = false,
1005 };
1006 auto ldac_codec_specifics = GetLdacCodecSpecificSupportedList(true);
1007
1008 for (auto& codec_specific : ldac_codec_specifics) {
1009 copy_codec_specific(codec_config.config, codec_specific);
1010 DataMQDesc mq_desc;
1011 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001012 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001013
1014 ASSERT_TRUE(aidl_retval.isOk());
1015 EXPECT_TRUE(audio_provider_->endSession().isOk());
1016 }
1017}
1018
1019/**
1020 * Test whether each provider of type
1021 * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
Omer Osmana2587da2022-05-01 03:54:11 +00001022 * Opus hardware encoding config
Josh Wu049e2cd2022-01-12 05:42:58 -08001023 */
Alice Kuoadcceec2022-03-28 13:28:43 +08001024TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
Omer Osmana2587da2022-05-01 03:54:11 +00001025 StartAndEndA2dpOpusEncodingHardwareSession) {
Josh Wu049e2cd2022-01-12 05:42:58 -08001026 if (!IsOffloadSupported()) {
1027 return;
1028 }
1029
1030 CodecConfiguration codec_config = {
Omer Osmana2587da2022-05-01 03:54:11 +00001031 .codecType = CodecType::OPUS,
Josh Wu049e2cd2022-01-12 05:42:58 -08001032 .encodedAudioBitrate = 990000,
1033 .peerMtu = 1005,
1034 .isScmstEnabled = false,
1035 };
Omer Osmana2587da2022-05-01 03:54:11 +00001036 auto opus_codec_specifics = GetOpusCodecSpecificSupportedList(true);
Josh Wu049e2cd2022-01-12 05:42:58 -08001037
Omer Osmana2587da2022-05-01 03:54:11 +00001038 for (auto& codec_specific : opus_codec_specifics) {
Josh Wu049e2cd2022-01-12 05:42:58 -08001039 copy_codec_specific(codec_config.config, codec_specific);
1040 DataMQDesc mq_desc;
1041 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001042 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001043
1044 ASSERT_TRUE(aidl_retval.isOk());
1045 EXPECT_TRUE(audio_provider_->endSession().isOk());
1046 }
1047}
1048
1049/**
1050 * Test whether each provider of type
1051 * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
1052 * AptX hardware encoding config
1053 */
Alice Kuoadcceec2022-03-28 13:28:43 +08001054TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
1055 StartAndEndA2dpAptxEncodingHardwareSession) {
Josh Wu049e2cd2022-01-12 05:42:58 -08001056 if (!IsOffloadSupported()) {
1057 return;
1058 }
1059
1060 for (auto codec_type : {CodecType::APTX, CodecType::APTX_HD}) {
1061 CodecConfiguration codec_config = {
1062 .codecType = codec_type,
1063 .encodedAudioBitrate =
1064 (codec_type == CodecType::APTX ? 352000 : 576000),
1065 .peerMtu = 1005,
1066 .isScmstEnabled = false,
1067 };
1068
1069 auto aptx_codec_specifics = GetAptxCodecSpecificSupportedList(
1070 (codec_type == CodecType::APTX_HD ? true : false), true);
1071
1072 for (auto& codec_specific : aptx_codec_specifics) {
1073 copy_codec_specific(codec_config.config, codec_specific);
1074 DataMQDesc mq_desc;
1075 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001076 audio_port_, AudioConfiguration(codec_config), latency_modes,
1077 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001078
1079 ASSERT_TRUE(aidl_retval.isOk());
1080 EXPECT_TRUE(audio_provider_->endSession().isOk());
1081 }
1082 }
1083}
1084
1085/**
1086 * Test whether each provider of type
1087 * SessionType::A2DP_HARDWARE_ENCODING_DATAPATH can be started and stopped with
1088 * an invalid codec config
1089 */
Alice Kuoadcceec2022-03-28 13:28:43 +08001090TEST_P(BluetoothAudioProviderA2dpEncodingHardwareAidl,
1091 StartAndEndA2dpEncodingHardwareSessionInvalidCodecConfig) {
Josh Wu049e2cd2022-01-12 05:42:58 -08001092 if (!IsOffloadSupported()) {
1093 return;
1094 }
1095 ASSERT_NE(audio_provider_, nullptr);
1096
1097 std::vector<CodecConfiguration::CodecSpecific> codec_specifics;
Sagar Verma62df9102022-12-07 17:56:04 +05301098 for (auto codec_type : ndk::enum_range<CodecType>()) {
Josh Wu049e2cd2022-01-12 05:42:58 -08001099 switch (codec_type) {
1100 case CodecType::SBC:
1101 codec_specifics = GetSbcCodecSpecificSupportedList(false);
1102 break;
1103 case CodecType::AAC:
1104 codec_specifics = GetAacCodecSpecificSupportedList(false);
1105 break;
1106 case CodecType::LDAC:
1107 codec_specifics = GetLdacCodecSpecificSupportedList(false);
1108 break;
1109 case CodecType::APTX:
1110 codec_specifics = GetAptxCodecSpecificSupportedList(false, false);
1111 break;
1112 case CodecType::APTX_HD:
1113 codec_specifics = GetAptxCodecSpecificSupportedList(true, false);
1114 break;
Omer Osmana2587da2022-05-01 03:54:11 +00001115 case CodecType::OPUS:
1116 codec_specifics = GetOpusCodecSpecificSupportedList(false);
Josh Wu049e2cd2022-01-12 05:42:58 -08001117 continue;
1118 case CodecType::APTX_ADAPTIVE:
Sagar Verma62df9102022-12-07 17:56:04 +05301119 case CodecType::APTX_ADAPTIVE_LE:
1120 case CodecType::APTX_ADAPTIVE_LEX:
Omer Osmana2587da2022-05-01 03:54:11 +00001121 case CodecType::LC3:
Josh Wu049e2cd2022-01-12 05:42:58 -08001122 case CodecType::VENDOR:
1123 case CodecType::UNKNOWN:
1124 codec_specifics.clear();
1125 break;
1126 }
1127 if (codec_specifics.empty()) {
1128 continue;
1129 }
1130
1131 CodecConfiguration codec_config = {
1132 .codecType = codec_type,
1133 .encodedAudioBitrate = 328000,
1134 .peerMtu = 1005,
1135 .isScmstEnabled = false,
1136 };
1137 for (auto codec_specific : codec_specifics) {
1138 copy_codec_specific(codec_config.config, codec_specific);
1139 DataMQDesc mq_desc;
1140 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001141 audio_port_, AudioConfiguration(codec_config), latency_modes,
1142 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001143
1144 // AIDL call should fail on invalid codec
1145 ASSERT_FALSE(aidl_retval.isOk());
1146 EXPECT_TRUE(audio_provider_->endSession().isOk());
1147 }
1148 }
1149}
1150
1151/**
Bao Do72399432023-11-09 08:13:05 +00001152 * openProvider HFP_HARDWARE_OFFLOAD_DATAPATH
1153 */
1154class BluetoothAudioProviderHfpHardwareAidl
1155 : public BluetoothAudioProviderFactoryAidl {
1156 public:
1157 virtual void SetUp() override {
1158 BluetoothAudioProviderFactoryAidl::SetUp();
1159 OpenProviderHelper(SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH);
1160 // Can open or empty capability
1161 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
1162 audio_provider_ != nullptr);
1163 }
1164
1165 virtual void TearDown() override {
1166 audio_port_ = nullptr;
1167 audio_provider_ = nullptr;
1168 BluetoothAudioProviderFactoryAidl::TearDown();
1169 }
1170
1171 bool OpenSession(CodecId codec_id, int connection_handle, bool nrec,
1172 bool controller_codec) {
1173 // Check if can open session with a Hfp configuration
1174 HfpConfiguration hfp_configuration{
1175 .codecId = codec_id,
1176 .connectionHandle = connection_handle,
1177 .nrec = nrec,
1178 .controllerCodec = controller_codec,
1179 };
1180 DataMQDesc mq_desc;
1181 auto aidl_retval = audio_provider_->startSession(
1182 audio_port_, AudioConfiguration(hfp_configuration), latency_modes,
1183 &mq_desc);
1184
1185 // Only check if aidl is ok to start session.
1186 return aidl_retval.isOk();
1187 }
1188};
1189
1190/**
1191 * Test whether we can open a provider of type
1192 */
1193TEST_P(BluetoothAudioProviderHfpHardwareAidl, OpenHfpHardwareProvider) {}
1194
1195/**
1196 * Test whether each provider of type
1197 * SessionType::HFP_SOFTWARE_DECODING_DATAPATH can be started and stopped with
1198 * different HFP config
1199 */
1200TEST_P(BluetoothAudioProviderHfpHardwareAidl,
1201 StartAndEndHfpHardwareSessionWithPossiblePcmConfig) {
1202 // Try to open with a sample configuration
1203 EXPECT_TRUE(OpenSession(CodecId::Core::CVSD, 6, false, true));
1204 EXPECT_TRUE(audio_provider_->endSession().isOk());
1205}
1206
1207/**
Josh Wu049e2cd2022-01-12 05:42:58 -08001208 * openProvider HEARING_AID_SOFTWARE_ENCODING_DATAPATH
1209 */
1210class BluetoothAudioProviderHearingAidSoftwareAidl
1211 : public BluetoothAudioProviderFactoryAidl {
1212 public:
1213 virtual void SetUp() override {
1214 BluetoothAudioProviderFactoryAidl::SetUp();
1215 GetProviderCapabilitiesHelper(
1216 SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH);
1217 OpenProviderHelper(SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH);
1218 ASSERT_NE(audio_provider_, nullptr);
1219 }
1220
1221 virtual void TearDown() override {
1222 audio_port_ = nullptr;
1223 audio_provider_ = nullptr;
1224 BluetoothAudioProviderFactoryAidl::TearDown();
1225 }
1226
1227 static constexpr int32_t hearing_aid_sample_rates_[] = {0, 16000, 24000};
1228 static constexpr int8_t hearing_aid_bits_per_samples_[] = {0, 16, 24};
1229 static constexpr ChannelMode hearing_aid_channel_modes_[] = {
1230 ChannelMode::UNKNOWN, ChannelMode::MONO, ChannelMode::STEREO};
1231};
1232
1233/**
1234 * Test whether we can open a provider of type
1235 */
1236TEST_P(BluetoothAudioProviderHearingAidSoftwareAidl,
1237 OpenHearingAidSoftwareProvider) {}
1238
1239/**
1240 * Test whether each provider of type
1241 * SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH can be started and
1242 * stopped with different PCM config
1243 */
1244TEST_P(BluetoothAudioProviderHearingAidSoftwareAidl,
1245 StartAndEndHearingAidSessionWithPossiblePcmConfig) {
1246 for (int32_t sample_rate : hearing_aid_sample_rates_) {
1247 for (int8_t bits_per_sample : hearing_aid_bits_per_samples_) {
1248 for (auto channel_mode : hearing_aid_channel_modes_) {
1249 PcmConfiguration pcm_config{
1250 .sampleRateHz = sample_rate,
Josh Wu049e2cd2022-01-12 05:42:58 -08001251 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +00001252 .bitsPerSample = bits_per_sample,
Josh Wu049e2cd2022-01-12 05:42:58 -08001253 };
1254 bool is_codec_config_valid = IsPcmConfigSupported(pcm_config);
1255 DataMQDesc mq_desc;
1256 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001257 audio_port_, AudioConfiguration(pcm_config), latency_modes,
1258 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001259 DataMQ data_mq(mq_desc);
1260
1261 EXPECT_EQ(aidl_retval.isOk(), is_codec_config_valid);
1262 if (is_codec_config_valid) {
1263 EXPECT_TRUE(data_mq.isValid());
1264 }
1265 EXPECT_TRUE(audio_provider_->endSession().isOk());
1266 }
1267 }
1268 }
1269}
1270
1271/**
1272 * openProvider LE_AUDIO_SOFTWARE_ENCODING_DATAPATH
1273 */
1274class BluetoothAudioProviderLeAudioOutputSoftwareAidl
1275 : public BluetoothAudioProviderFactoryAidl {
1276 public:
1277 virtual void SetUp() override {
1278 BluetoothAudioProviderFactoryAidl::SetUp();
1279 GetProviderCapabilitiesHelper(
1280 SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH);
1281 OpenProviderHelper(SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH);
1282 ASSERT_NE(audio_provider_, nullptr);
1283 }
1284
1285 virtual void TearDown() override {
1286 audio_port_ = nullptr;
1287 audio_provider_ = nullptr;
1288 BluetoothAudioProviderFactoryAidl::TearDown();
1289 }
1290
1291 static constexpr int32_t le_audio_output_sample_rates_[] = {
1292 0, 8000, 16000, 24000, 32000, 44100, 48000,
1293 };
1294 static constexpr int8_t le_audio_output_bits_per_samples_[] = {0, 16, 24};
1295 static constexpr ChannelMode le_audio_output_channel_modes_[] = {
1296 ChannelMode::UNKNOWN, ChannelMode::MONO, ChannelMode::STEREO};
1297 static constexpr int32_t le_audio_output_data_interval_us_[] = {
1298 0 /* Invalid */, 10000 /* Valid 10ms */};
1299};
1300
1301/**
1302 * Test whether each provider of type
1303 * SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH can be started and
1304 * stopped
1305 */
1306TEST_P(BluetoothAudioProviderLeAudioOutputSoftwareAidl,
1307 OpenLeAudioOutputSoftwareProvider) {}
1308
1309/**
1310 * Test whether each provider of type
1311 * SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH can be started and
1312 * stopped with different PCM config
1313 */
1314TEST_P(BluetoothAudioProviderLeAudioOutputSoftwareAidl,
1315 StartAndEndLeAudioOutputSessionWithPossiblePcmConfig) {
1316 for (auto sample_rate : le_audio_output_sample_rates_) {
1317 for (auto bits_per_sample : le_audio_output_bits_per_samples_) {
1318 for (auto channel_mode : le_audio_output_channel_modes_) {
1319 for (auto data_interval_us : le_audio_output_data_interval_us_) {
1320 PcmConfiguration pcm_config{
1321 .sampleRateHz = sample_rate,
Josh Wu049e2cd2022-01-12 05:42:58 -08001322 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +00001323 .bitsPerSample = bits_per_sample,
Josh Wu049e2cd2022-01-12 05:42:58 -08001324 .dataIntervalUs = data_interval_us,
1325 };
Josh Wu8a1be762022-02-15 09:37:29 -08001326 bool is_codec_config_valid =
1327 IsPcmConfigSupported(pcm_config) && pcm_config.dataIntervalUs > 0;
Josh Wu049e2cd2022-01-12 05:42:58 -08001328 DataMQDesc mq_desc;
1329 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001330 audio_port_, AudioConfiguration(pcm_config), latency_modes,
1331 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001332 DataMQ data_mq(mq_desc);
1333
1334 EXPECT_EQ(aidl_retval.isOk(), is_codec_config_valid);
1335 if (is_codec_config_valid) {
1336 EXPECT_TRUE(data_mq.isValid());
1337 }
1338 EXPECT_TRUE(audio_provider_->endSession().isOk());
1339 }
1340 }
1341 }
1342 }
1343}
1344
1345/**
Alice Kuo04a399a2022-02-16 09:19:56 +08001346 * openProvider LE_AUDIO_SOFTWARE_DECODING_DATAPATH
Josh Wu049e2cd2022-01-12 05:42:58 -08001347 */
1348class BluetoothAudioProviderLeAudioInputSoftwareAidl
1349 : public BluetoothAudioProviderFactoryAidl {
1350 public:
1351 virtual void SetUp() override {
1352 BluetoothAudioProviderFactoryAidl::SetUp();
1353 GetProviderCapabilitiesHelper(
1354 SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH);
1355 OpenProviderHelper(SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH);
1356 ASSERT_NE(audio_provider_, nullptr);
1357 }
1358
1359 virtual void TearDown() override {
1360 audio_port_ = nullptr;
1361 audio_provider_ = nullptr;
1362 BluetoothAudioProviderFactoryAidl::TearDown();
1363 }
1364
1365 static constexpr int32_t le_audio_input_sample_rates_[] = {
1366 0, 8000, 16000, 24000, 32000, 44100, 48000};
1367 static constexpr int8_t le_audio_input_bits_per_samples_[] = {0, 16, 24};
1368 static constexpr ChannelMode le_audio_input_channel_modes_[] = {
1369 ChannelMode::UNKNOWN, ChannelMode::MONO, ChannelMode::STEREO};
1370 static constexpr int32_t le_audio_input_data_interval_us_[] = {
1371 0 /* Invalid */, 10000 /* Valid 10ms */};
1372};
1373
1374/**
1375 * Test whether each provider of type
Alice Kuo04a399a2022-02-16 09:19:56 +08001376 * SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH can be started and
Josh Wu049e2cd2022-01-12 05:42:58 -08001377 * stopped
1378 */
1379TEST_P(BluetoothAudioProviderLeAudioInputSoftwareAidl,
1380 OpenLeAudioInputSoftwareProvider) {}
1381
1382/**
1383 * Test whether each provider of type
Alice Kuo04a399a2022-02-16 09:19:56 +08001384 * SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH can be started and
Josh Wu049e2cd2022-01-12 05:42:58 -08001385 * stopped with different PCM config
1386 */
1387TEST_P(BluetoothAudioProviderLeAudioInputSoftwareAidl,
1388 StartAndEndLeAudioInputSessionWithPossiblePcmConfig) {
1389 for (auto sample_rate : le_audio_input_sample_rates_) {
1390 for (auto bits_per_sample : le_audio_input_bits_per_samples_) {
1391 for (auto channel_mode : le_audio_input_channel_modes_) {
1392 for (auto data_interval_us : le_audio_input_data_interval_us_) {
1393 PcmConfiguration pcm_config{
1394 .sampleRateHz = sample_rate,
Josh Wu049e2cd2022-01-12 05:42:58 -08001395 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +00001396 .bitsPerSample = bits_per_sample,
Josh Wu049e2cd2022-01-12 05:42:58 -08001397 .dataIntervalUs = data_interval_us,
1398 };
Josh Wu8a1be762022-02-15 09:37:29 -08001399 bool is_codec_config_valid =
1400 IsPcmConfigSupported(pcm_config) && pcm_config.dataIntervalUs > 0;
Josh Wu049e2cd2022-01-12 05:42:58 -08001401 DataMQDesc mq_desc;
1402 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001403 audio_port_, AudioConfiguration(pcm_config), latency_modes,
1404 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001405 DataMQ data_mq(mq_desc);
1406
1407 EXPECT_EQ(aidl_retval.isOk(), is_codec_config_valid);
1408 if (is_codec_config_valid) {
1409 EXPECT_TRUE(data_mq.isValid());
1410 }
1411 EXPECT_TRUE(audio_provider_->endSession().isOk());
1412 }
1413 }
1414 }
1415 }
1416}
1417
1418/**
Alice Kuo04a399a2022-02-16 09:19:56 +08001419 * openProvider LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH
Josh Wu049e2cd2022-01-12 05:42:58 -08001420 */
1421class BluetoothAudioProviderLeAudioOutputHardwareAidl
1422 : public BluetoothAudioProviderFactoryAidl {
1423 public:
1424 virtual void SetUp() override {
1425 BluetoothAudioProviderFactoryAidl::SetUp();
1426 GetProviderCapabilitiesHelper(
1427 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
1428 OpenProviderHelper(
1429 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
1430 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
1431 audio_provider_ != nullptr);
1432 }
1433
1434 virtual void TearDown() override {
1435 audio_port_ = nullptr;
1436 audio_provider_ = nullptr;
1437 BluetoothAudioProviderFactoryAidl::TearDown();
1438 }
1439
1440 bool IsOffloadOutputSupported() {
1441 for (auto& capability : temp_provider_capabilities_) {
1442 if (capability.getTag() != AudioCapabilities::leAudioCapabilities) {
1443 continue;
1444 }
1445 auto& le_audio_capability =
1446 capability.get<AudioCapabilities::leAudioCapabilities>();
1447 if (le_audio_capability.unicastEncodeCapability.codecType !=
1448 CodecType::UNKNOWN)
1449 return true;
1450 }
1451 return false;
1452 }
1453
1454 std::vector<Lc3Configuration> GetUnicastLc3SupportedList(bool decoding,
1455 bool supported) {
1456 std::vector<Lc3Configuration> le_audio_codec_configs;
1457 if (!supported) {
shihchienc3ab9f5e2022-09-23 08:18:05 +00001458 Lc3Configuration lc3_config{.pcmBitDepth = 0, .samplingFrequencyHz = 0};
Josh Wu049e2cd2022-01-12 05:42:58 -08001459 le_audio_codec_configs.push_back(lc3_config);
1460 return le_audio_codec_configs;
1461 }
1462
1463 // There might be more than one LeAudioCodecCapabilitiesSetting
1464 std::vector<Lc3Capabilities> lc3_capabilities;
1465 for (auto& capability : temp_provider_capabilities_) {
1466 if (capability.getTag() != AudioCapabilities::leAudioCapabilities) {
1467 continue;
1468 }
1469 auto& le_audio_capability =
1470 capability.get<AudioCapabilities::leAudioCapabilities>();
1471 auto& unicast_capability =
1472 decoding ? le_audio_capability.unicastDecodeCapability
1473 : le_audio_capability.unicastEncodeCapability;
1474 if (unicast_capability.codecType != CodecType::LC3) {
1475 continue;
1476 }
1477 auto& lc3_capability = unicast_capability.leAudioCodecCapabilities.get<
1478 UnicastCapability::LeAudioCodecCapabilities::lc3Capabilities>();
1479 lc3_capabilities.push_back(lc3_capability);
1480 }
1481
1482 // Combine those parameters into one list of LeAudioCodecConfiguration
1483 // This seems horrible, but usually each Lc3Capability only contains a
1484 // single Lc3Configuration, which means every array has a length of 1.
1485 for (auto& lc3_capability : lc3_capabilities) {
1486 for (int32_t samplingFrequencyHz : lc3_capability.samplingFrequencyHz) {
1487 for (int32_t frameDurationUs : lc3_capability.frameDurationUs) {
1488 for (int32_t octetsPerFrame : lc3_capability.octetsPerFrame) {
1489 Lc3Configuration lc3_config = {
1490 .samplingFrequencyHz = samplingFrequencyHz,
1491 .frameDurationUs = frameDurationUs,
1492 .octetsPerFrame = octetsPerFrame,
1493 };
1494 le_audio_codec_configs.push_back(lc3_config);
1495 }
1496 }
1497 }
1498 }
1499
1500 return le_audio_codec_configs;
1501 }
1502
Sagar Verma62df9102022-12-07 17:56:04 +05301503 static constexpr int32_t apx_adaptive_le_config_codec_modes[] = {0, 1, 2, 3};
1504
1505 std::vector<AptxAdaptiveLeConfiguration>
1506 GetUnicastAptxAdaptiveLeSupportedList(bool decoding, bool supported,
1507 bool is_le_extended) {
1508 std::vector<AptxAdaptiveLeConfiguration> le_audio_codec_configs;
1509 if (!supported) {
1510 AptxAdaptiveLeConfiguration aptx_adaptive_le_config{
1511 .pcmBitDepth = 0, .samplingFrequencyHz = 0};
1512 le_audio_codec_configs.push_back(aptx_adaptive_le_config);
1513 return le_audio_codec_configs;
1514 }
1515
1516 // There might be more than one LeAudioCodecCapabilitiesSetting
1517 std::vector<AptxAdaptiveLeCapabilities> aptx_adaptive_le_capabilities;
1518 for (auto& capability : temp_provider_capabilities_) {
1519 if (capability.getTag() != AudioCapabilities::leAudioCapabilities) {
1520 continue;
1521 }
1522 auto& le_audio_capability =
1523 capability.get<AudioCapabilities::leAudioCapabilities>();
1524 auto& unicast_capability =
1525 decoding ? le_audio_capability.unicastDecodeCapability
1526 : le_audio_capability.unicastEncodeCapability;
1527 if ((!is_le_extended &&
1528 unicast_capability.codecType != CodecType::APTX_ADAPTIVE_LE) ||
1529 (is_le_extended &&
1530 unicast_capability.codecType != CodecType::APTX_ADAPTIVE_LEX)) {
1531 continue;
1532 }
1533
1534 auto& aptx_adaptive_le_capability =
1535 unicast_capability.leAudioCodecCapabilities
1536 .get<UnicastCapability::LeAudioCodecCapabilities::
1537 aptxAdaptiveLeCapabilities>();
1538
1539 aptx_adaptive_le_capabilities.push_back(aptx_adaptive_le_capability);
1540 }
1541
1542 for (auto& aptx_adaptive_le_capability : aptx_adaptive_le_capabilities) {
1543 for (int32_t samplingFrequencyHz :
1544 aptx_adaptive_le_capability.samplingFrequencyHz) {
1545 for (int32_t frameDurationUs :
1546 aptx_adaptive_le_capability.frameDurationUs) {
1547 for (int32_t octetsPerFrame :
1548 aptx_adaptive_le_capability.octetsPerFrame) {
1549 for (int8_t blocksPerSdu :
1550 aptx_adaptive_le_capability.blocksPerSdu) {
1551 for (int32_t codecMode : apx_adaptive_le_config_codec_modes) {
1552 AptxAdaptiveLeConfiguration aptx_adaptive_le_config = {
1553 .samplingFrequencyHz = samplingFrequencyHz,
1554 .frameDurationUs = frameDurationUs,
1555 .octetsPerFrame = octetsPerFrame,
1556 .blocksPerSdu = blocksPerSdu,
1557 .codecMode = codecMode,
1558 };
1559 le_audio_codec_configs.push_back(aptx_adaptive_le_config);
1560 }
1561 }
1562 }
1563 }
1564 }
1565 }
1566
1567 return le_audio_codec_configs;
1568 }
1569
Josh Wu049e2cd2022-01-12 05:42:58 -08001570 LeAudioCodecCapabilitiesSetting temp_le_audio_capabilities_;
1571};
1572
1573/**
1574 * Test whether each provider of type
1575 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1576 * stopped
1577 */
1578TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
1579 OpenLeAudioOutputHardwareProvider) {}
1580
1581/**
1582 * Test whether each provider of type
1583 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1584 * stopped with Unicast hardware encoding config
1585 */
1586TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
1587 StartAndEndLeAudioOutputSessionWithPossibleUnicastConfig) {
1588 if (!IsOffloadOutputSupported()) {
1589 return;
1590 }
1591
1592 auto lc3_codec_configs =
1593 GetUnicastLc3SupportedList(false /* decoding */, true /* supported */);
1594 LeAudioConfiguration le_audio_config = {
1595 .codecType = CodecType::LC3,
1596 .peerDelayUs = 0,
1597 };
1598
1599 for (auto& lc3_config : lc3_codec_configs) {
1600 le_audio_config.leAudioCodecConfig
1601 .set<LeAudioCodecConfiguration::lc3Config>(lc3_config);
1602 DataMQDesc mq_desc;
1603 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001604 audio_port_, AudioConfiguration(le_audio_config), latency_modes,
1605 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001606
1607 ASSERT_TRUE(aidl_retval.isOk());
1608 EXPECT_TRUE(audio_provider_->endSession().isOk());
1609 }
1610}
1611
1612/**
1613 * Test whether each provider of type
1614 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1615 * stopped with Unicast hardware encoding config
1616 *
1617 * Disabled since offload codec checking is not ready
1618 */
1619TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
1620 DISABLED_StartAndEndLeAudioOutputSessionWithInvalidAudioConfiguration) {
1621 if (!IsOffloadOutputSupported()) {
1622 return;
1623 }
1624
1625 auto lc3_codec_configs =
1626 GetUnicastLc3SupportedList(false /* decoding */, false /* supported */);
1627 LeAudioConfiguration le_audio_config = {
1628 .codecType = CodecType::LC3,
1629 .peerDelayUs = 0,
1630 };
1631
1632 for (auto& lc3_config : lc3_codec_configs) {
1633 le_audio_config.leAudioCodecConfig
1634 .set<LeAudioCodecConfiguration::lc3Config>(lc3_config);
1635 DataMQDesc mq_desc;
1636 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001637 audio_port_, AudioConfiguration(le_audio_config), latency_modes,
1638 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001639
1640 // AIDL call should fail on invalid codec
1641 ASSERT_FALSE(aidl_retval.isOk());
1642 EXPECT_TRUE(audio_provider_->endSession().isOk());
1643 }
1644}
1645
Sagar Verma62df9102022-12-07 17:56:04 +05301646static std::vector<uint8_t> vendorMetadata = {0x0B, // Length
1647 0xFF, // Type: Vendor-specific
1648 0x0A, 0x00, // Company_ID
1649 0x01, 0x02, 0x03, 0x04, // Data
1650 0x05, 0x06, 0x07, 0x08};
1651
1652/**
1653 * Test whether each provider of type
1654 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1655 * stopped with Unicast hardware encoding config
1656 */
1657TEST_P(BluetoothAudioProviderLeAudioOutputHardwareAidl,
1658 StartAndEndLeAudioOutputSessionWithAptxAdaptiveLeUnicastConfig) {
1659 if (!IsOffloadOutputSupported()) {
1660 return;
1661 }
1662 for (auto codec_type :
1663 {CodecType::APTX_ADAPTIVE_LE, CodecType::APTX_ADAPTIVE_LEX}) {
1664 bool is_le_extended = (codec_type == CodecType::APTX_ADAPTIVE_LEX);
1665 auto aptx_adaptive_le_codec_configs =
1666 GetUnicastAptxAdaptiveLeSupportedList(false, true, is_le_extended);
1667 LeAudioConfiguration le_audio_config = {
1668 .codecType = codec_type,
1669 .peerDelayUs = 0,
1670 .vendorSpecificMetadata = vendorMetadata,
1671 };
1672
1673 for (auto& aptx_adaptive_le_config : aptx_adaptive_le_codec_configs) {
1674 le_audio_config.leAudioCodecConfig
1675 .set<LeAudioCodecConfiguration::aptxAdaptiveLeConfig>(
1676 aptx_adaptive_le_config);
1677 DataMQDesc mq_desc;
1678 auto aidl_retval = audio_provider_->startSession(
1679 audio_port_, AudioConfiguration(le_audio_config), latency_modes,
1680 &mq_desc);
1681
1682 ASSERT_TRUE(aidl_retval.isOk());
1683 EXPECT_TRUE(audio_provider_->endSession().isOk());
1684 }
1685 }
1686}
1687
1688/**
1689 * Test whether each provider of type
1690 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1691 * stopped with Unicast hardware encoding config
1692 */
1693TEST_P(
1694 BluetoothAudioProviderLeAudioOutputHardwareAidl,
1695 BluetoothAudioProviderLeAudioOutputHardwareAidl_StartAndEndLeAudioOutputSessionWithInvalidAptxAdaptiveLeAudioConfiguration) {
1696 if (!IsOffloadOutputSupported()) {
1697 return;
1698 }
1699
1700 for (auto codec_type :
1701 {CodecType::APTX_ADAPTIVE_LE, CodecType::APTX_ADAPTIVE_LEX}) {
1702 bool is_le_extended = (codec_type == CodecType::APTX_ADAPTIVE_LEX);
1703 auto aptx_adaptive_le_codec_configs =
1704 GetUnicastAptxAdaptiveLeSupportedList(false, true, is_le_extended);
1705 LeAudioConfiguration le_audio_config = {
1706 .codecType = codec_type,
1707 .peerDelayUs = 0,
1708 .vendorSpecificMetadata = vendorMetadata,
1709 };
1710
1711 for (auto& aptx_adaptive_le_config : aptx_adaptive_le_codec_configs) {
1712 le_audio_config.leAudioCodecConfig
1713 .set<LeAudioCodecConfiguration::aptxAdaptiveLeConfig>(
1714 aptx_adaptive_le_config);
1715 DataMQDesc mq_desc;
1716 auto aidl_retval = audio_provider_->startSession(
1717 audio_port_, AudioConfiguration(le_audio_config), latency_modes,
1718 &mq_desc);
1719
1720 // AIDL call should fail on invalid codec
1721 ASSERT_FALSE(aidl_retval.isOk());
1722 EXPECT_TRUE(audio_provider_->endSession().isOk());
1723 }
1724 }
1725}
1726
Josh Wu049e2cd2022-01-12 05:42:58 -08001727/**
1728 * openProvider LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH
1729 */
1730class BluetoothAudioProviderLeAudioInputHardwareAidl
1731 : public BluetoothAudioProviderLeAudioOutputHardwareAidl {
1732 public:
1733 virtual void SetUp() override {
1734 BluetoothAudioProviderFactoryAidl::SetUp();
1735 GetProviderCapabilitiesHelper(
1736 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH);
1737 OpenProviderHelper(
1738 SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH);
1739 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
1740 audio_provider_ != nullptr);
1741 }
1742
1743 bool IsOffloadInputSupported() {
1744 for (auto& capability : temp_provider_capabilities_) {
1745 if (capability.getTag() != AudioCapabilities::leAudioCapabilities) {
1746 continue;
1747 }
1748 auto& le_audio_capability =
1749 capability.get<AudioCapabilities::leAudioCapabilities>();
1750 if (le_audio_capability.unicastDecodeCapability.codecType !=
1751 CodecType::UNKNOWN)
1752 return true;
1753 }
1754 return false;
1755 }
1756
1757 virtual void TearDown() override {
1758 audio_port_ = nullptr;
1759 audio_provider_ = nullptr;
1760 BluetoothAudioProviderFactoryAidl::TearDown();
1761 }
1762};
1763
1764/**
1765 * Test whether each provider of type
1766 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1767 * stopped
1768 */
1769TEST_P(BluetoothAudioProviderLeAudioInputHardwareAidl,
1770 OpenLeAudioInputHardwareProvider) {}
1771
1772/**
1773 * Test whether each provider of type
1774 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1775 * stopped with Unicast hardware encoding config
1776 */
1777TEST_P(BluetoothAudioProviderLeAudioInputHardwareAidl,
1778 StartAndEndLeAudioInputSessionWithPossibleUnicastConfig) {
1779 if (!IsOffloadInputSupported()) {
1780 return;
1781 }
1782
1783 auto lc3_codec_configs =
1784 GetUnicastLc3SupportedList(true /* decoding */, true /* supported */);
1785 LeAudioConfiguration le_audio_config = {
1786 .codecType = CodecType::LC3,
1787 .peerDelayUs = 0,
1788 };
1789
1790 for (auto& lc3_config : lc3_codec_configs) {
1791 le_audio_config.leAudioCodecConfig
1792 .set<LeAudioCodecConfiguration::lc3Config>(lc3_config);
1793 DataMQDesc mq_desc;
1794 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001795 audio_port_, AudioConfiguration(le_audio_config), latency_modes,
1796 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001797
1798 ASSERT_TRUE(aidl_retval.isOk());
1799 EXPECT_TRUE(audio_provider_->endSession().isOk());
1800 }
1801}
1802
1803/**
1804 * Test whether each provider of type
1805 * SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be started and
1806 * stopped with Unicast hardware encoding config
1807 *
1808 * Disabled since offload codec checking is not ready
1809 */
1810TEST_P(BluetoothAudioProviderLeAudioInputHardwareAidl,
1811 DISABLED_StartAndEndLeAudioInputSessionWithInvalidAudioConfiguration) {
1812 if (!IsOffloadInputSupported()) {
1813 return;
1814 }
1815
1816 auto lc3_codec_configs =
1817 GetUnicastLc3SupportedList(true /* decoding */, false /* supported */);
1818 LeAudioConfiguration le_audio_config = {
1819 .codecType = CodecType::LC3,
1820 .peerDelayUs = 0,
1821 };
1822
1823 for (auto& lc3_config : lc3_codec_configs) {
1824 le_audio_config.leAudioCodecConfig
1825 .set<LeAudioCodecConfiguration::lc3Config>(lc3_config);
1826
1827 DataMQDesc mq_desc;
1828 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001829 audio_port_, AudioConfiguration(le_audio_config), latency_modes,
1830 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001831
1832 // AIDL call should fail on invalid codec
1833 ASSERT_FALSE(aidl_retval.isOk());
1834 EXPECT_TRUE(audio_provider_->endSession().isOk());
1835 }
1836}
1837
1838/**
1839 * openProvider LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH
1840 */
1841class BluetoothAudioProviderLeAudioBroadcastSoftwareAidl
1842 : public BluetoothAudioProviderFactoryAidl {
1843 public:
1844 virtual void SetUp() override {
1845 BluetoothAudioProviderFactoryAidl::SetUp();
1846 GetProviderCapabilitiesHelper(
1847 SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH);
1848 OpenProviderHelper(
1849 SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH);
1850 ASSERT_NE(audio_provider_, nullptr);
1851 }
1852
1853 virtual void TearDown() override {
1854 audio_port_ = nullptr;
1855 audio_provider_ = nullptr;
1856 BluetoothAudioProviderFactoryAidl::TearDown();
1857 }
1858
1859 static constexpr int32_t le_audio_output_sample_rates_[] = {
1860 0, 8000, 16000, 24000, 32000, 44100, 48000,
1861 };
1862 static constexpr int8_t le_audio_output_bits_per_samples_[] = {0, 16, 24};
1863 static constexpr ChannelMode le_audio_output_channel_modes_[] = {
1864 ChannelMode::UNKNOWN, ChannelMode::MONO, ChannelMode::STEREO};
1865 static constexpr int32_t le_audio_output_data_interval_us_[] = {
1866 0 /* Invalid */, 10000 /* Valid 10ms */};
1867};
1868
1869/**
1870 * Test whether each provider of type
1871 * SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH can be started and
1872 * stopped
1873 */
1874TEST_P(BluetoothAudioProviderLeAudioBroadcastSoftwareAidl,
Josh Wu3202eab2022-02-17 18:09:05 -08001875 OpenLeAudioOutputSoftwareProvider) {}
Josh Wu049e2cd2022-01-12 05:42:58 -08001876
1877/**
1878 * Test whether each provider of type
1879 * SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH can be started and
1880 * stopped with different PCM config
1881 */
1882TEST_P(BluetoothAudioProviderLeAudioBroadcastSoftwareAidl,
Josh Wu3202eab2022-02-17 18:09:05 -08001883 StartAndEndLeAudioOutputSessionWithPossiblePcmConfig) {
Josh Wu049e2cd2022-01-12 05:42:58 -08001884 for (auto sample_rate : le_audio_output_sample_rates_) {
1885 for (auto bits_per_sample : le_audio_output_bits_per_samples_) {
1886 for (auto channel_mode : le_audio_output_channel_modes_) {
1887 for (auto data_interval_us : le_audio_output_data_interval_us_) {
1888 PcmConfiguration pcm_config{
1889 .sampleRateHz = sample_rate,
Josh Wu049e2cd2022-01-12 05:42:58 -08001890 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +00001891 .bitsPerSample = bits_per_sample,
Josh Wu049e2cd2022-01-12 05:42:58 -08001892 .dataIntervalUs = data_interval_us,
1893 };
Josh Wu8a1be762022-02-15 09:37:29 -08001894 bool is_codec_config_valid =
1895 IsPcmConfigSupported(pcm_config) && pcm_config.dataIntervalUs > 0;
Josh Wu049e2cd2022-01-12 05:42:58 -08001896 DataMQDesc mq_desc;
1897 auto aidl_retval = audio_provider_->startSession(
Chen Chenc92270e2022-02-14 18:29:52 -08001898 audio_port_, AudioConfiguration(pcm_config), latency_modes,
1899 &mq_desc);
Josh Wu049e2cd2022-01-12 05:42:58 -08001900 DataMQ data_mq(mq_desc);
1901
1902 EXPECT_EQ(aidl_retval.isOk(), is_codec_config_valid);
1903 if (is_codec_config_valid) {
1904 EXPECT_TRUE(data_mq.isValid());
1905 }
1906 EXPECT_TRUE(audio_provider_->endSession().isOk());
1907 }
1908 }
1909 }
1910 }
1911}
1912
Alice Kuo336d90c2022-02-16 09:09:59 +08001913/**
1914 * openProvider LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH
1915 */
1916class BluetoothAudioProviderLeAudioBroadcastHardwareAidl
1917 : public BluetoothAudioProviderFactoryAidl {
1918 public:
1919 virtual void SetUp() override {
1920 BluetoothAudioProviderFactoryAidl::SetUp();
1921 GetProviderCapabilitiesHelper(
1922 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
1923 OpenProviderHelper(
1924 SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
1925 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
1926 audio_provider_ != nullptr);
1927 }
1928
1929 virtual void TearDown() override {
1930 audio_port_ = nullptr;
1931 audio_provider_ = nullptr;
1932 BluetoothAudioProviderFactoryAidl::TearDown();
1933 }
1934
1935 bool IsBroadcastOffloadSupported() {
1936 for (auto& capability : temp_provider_capabilities_) {
1937 if (capability.getTag() != AudioCapabilities::leAudioCapabilities) {
1938 continue;
1939 }
1940 auto& le_audio_capability =
1941 capability.get<AudioCapabilities::leAudioCapabilities>();
1942 if (le_audio_capability.broadcastCapability.codecType !=
1943 CodecType::UNKNOWN)
1944 return true;
1945 }
1946 return false;
1947 }
1948
1949 std::vector<Lc3Configuration> GetBroadcastLc3SupportedList(bool supported) {
1950 std::vector<Lc3Configuration> le_audio_codec_configs;
1951 if (!supported) {
shihchienc3ab9f5e2022-09-23 08:18:05 +00001952 Lc3Configuration lc3_config{.pcmBitDepth = 0, .samplingFrequencyHz = 0};
Alice Kuo336d90c2022-02-16 09:09:59 +08001953 le_audio_codec_configs.push_back(lc3_config);
1954 return le_audio_codec_configs;
1955 }
1956
1957 // There might be more than one LeAudioCodecCapabilitiesSetting
1958 std::vector<Lc3Capabilities> lc3_capabilities;
1959 for (auto& capability : temp_provider_capabilities_) {
1960 if (capability.getTag() != AudioCapabilities::leAudioCapabilities) {
1961 continue;
1962 }
1963 auto& le_audio_capability =
1964 capability.get<AudioCapabilities::leAudioCapabilities>();
1965 auto& broadcast_capability = le_audio_capability.broadcastCapability;
1966 if (broadcast_capability.codecType != CodecType::LC3) {
1967 continue;
1968 }
1969 auto& lc3_capability = broadcast_capability.leAudioCodecCapabilities.get<
1970 BroadcastCapability::LeAudioCodecCapabilities::lc3Capabilities>();
1971 for (int idx = 0; idx < lc3_capability->size(); idx++)
1972 lc3_capabilities.push_back(*lc3_capability->at(idx));
1973 }
1974
1975 // Combine those parameters into one list of LeAudioCodecConfiguration
1976 // This seems horrible, but usually each Lc3Capability only contains a
1977 // single Lc3Configuration, which means every array has a length of 1.
1978 for (auto& lc3_capability : lc3_capabilities) {
1979 for (int32_t samplingFrequencyHz : lc3_capability.samplingFrequencyHz) {
1980 for (int32_t frameDurationUs : lc3_capability.frameDurationUs) {
1981 for (int32_t octetsPerFrame : lc3_capability.octetsPerFrame) {
1982 Lc3Configuration lc3_config = {
1983 .samplingFrequencyHz = samplingFrequencyHz,
1984 .frameDurationUs = frameDurationUs,
1985 .octetsPerFrame = octetsPerFrame,
1986 };
1987 le_audio_codec_configs.push_back(lc3_config);
1988 }
1989 }
1990 }
1991 }
1992
1993 return le_audio_codec_configs;
1994 }
1995
1996 LeAudioCodecCapabilitiesSetting temp_le_audio_capabilities_;
1997};
1998
1999/**
2000 * Test whether each provider of type
2001 * SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be
2002 * started and stopped
2003 */
2004TEST_P(BluetoothAudioProviderLeAudioBroadcastHardwareAidl,
2005 OpenLeAudioOutputHardwareProvider) {}
2006
2007/**
2008 * Test whether each provider of type
2009 * SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be
2010 * started and stopped with broadcast hardware encoding config
2011 */
2012TEST_P(BluetoothAudioProviderLeAudioBroadcastHardwareAidl,
2013 StartAndEndLeAudioBroadcastSessionWithPossibleBroadcastConfig) {
2014 if (!IsBroadcastOffloadSupported()) {
2015 return;
2016 }
2017
2018 auto lc3_codec_configs = GetBroadcastLc3SupportedList(true /* supported */);
2019 LeAudioBroadcastConfiguration le_audio_broadcast_config = {
2020 .codecType = CodecType::LC3,
2021 .streamMap = {},
2022 };
2023
2024 for (auto& lc3_config : lc3_codec_configs) {
Patty Huangac077ef2022-11-23 14:45:15 +08002025 le_audio_broadcast_config.streamMap.resize(1);
Alice Kuo336d90c2022-02-16 09:09:59 +08002026 le_audio_broadcast_config.streamMap[0]
2027 .leAudioCodecConfig.set<LeAudioCodecConfiguration::lc3Config>(
2028 lc3_config);
Rongxuan Liuc1aea322023-01-26 17:14:54 +00002029 le_audio_broadcast_config.streamMap[0].streamHandle = 0x0;
2030 le_audio_broadcast_config.streamMap[0].pcmStreamId = 0x0;
2031 le_audio_broadcast_config.streamMap[0].audioChannelAllocation = 0x1 << 0;
2032
Alice Kuo336d90c2022-02-16 09:09:59 +08002033 DataMQDesc mq_desc;
2034 auto aidl_retval = audio_provider_->startSession(
Chen Chen60d52e42022-02-16 12:19:12 -08002035 audio_port_, AudioConfiguration(le_audio_broadcast_config),
2036 latency_modes, &mq_desc);
Alice Kuo336d90c2022-02-16 09:09:59 +08002037
2038 ASSERT_TRUE(aidl_retval.isOk());
2039 EXPECT_TRUE(audio_provider_->endSession().isOk());
2040 }
2041}
2042
2043/**
2044 * Test whether each provider of type
2045 * SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH can be
2046 * started and stopped with Broadcast hardware encoding config
2047 *
2048 * Disabled since offload codec checking is not ready
2049 */
2050TEST_P(
2051 BluetoothAudioProviderLeAudioBroadcastHardwareAidl,
2052 DISABLED_StartAndEndLeAudioBroadcastSessionWithInvalidAudioConfiguration) {
2053 if (!IsBroadcastOffloadSupported()) {
2054 return;
2055 }
2056
2057 auto lc3_codec_configs = GetBroadcastLc3SupportedList(false /* supported */);
2058 LeAudioBroadcastConfiguration le_audio_broadcast_config = {
2059 .codecType = CodecType::LC3,
2060 .streamMap = {},
2061 };
2062
2063 for (auto& lc3_config : lc3_codec_configs) {
2064 le_audio_broadcast_config.streamMap[0]
2065 .leAudioCodecConfig.set<LeAudioCodecConfiguration::lc3Config>(
2066 lc3_config);
2067 DataMQDesc mq_desc;
2068 auto aidl_retval = audio_provider_->startSession(
Chen Chen60d52e42022-02-16 12:19:12 -08002069 audio_port_, AudioConfiguration(le_audio_broadcast_config),
2070 latency_modes, &mq_desc);
Alice Kuo336d90c2022-02-16 09:09:59 +08002071
2072 // AIDL call should fail on invalid codec
2073 ASSERT_FALSE(aidl_retval.isOk());
2074 EXPECT_TRUE(audio_provider_->endSession().isOk());
2075 }
2076}
2077
Alice Kuoadcceec2022-03-28 13:28:43 +08002078/**
2079 * openProvider A2DP_SOFTWARE_DECODING_DATAPATH
2080 */
2081class BluetoothAudioProviderA2dpDecodingSoftwareAidl
2082 : public BluetoothAudioProviderFactoryAidl {
2083 public:
2084 virtual void SetUp() override {
2085 BluetoothAudioProviderFactoryAidl::SetUp();
2086 GetProviderCapabilitiesHelper(SessionType::A2DP_SOFTWARE_DECODING_DATAPATH);
2087 OpenProviderHelper(SessionType::A2DP_SOFTWARE_DECODING_DATAPATH);
2088 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
2089 audio_provider_ != nullptr);
2090 }
2091
2092 virtual void TearDown() override {
2093 audio_port_ = nullptr;
2094 audio_provider_ = nullptr;
2095 BluetoothAudioProviderFactoryAidl::TearDown();
2096 }
2097};
2098
2099/**
2100 * Test whether we can open a provider of type
2101 */
2102TEST_P(BluetoothAudioProviderA2dpDecodingSoftwareAidl,
2103 OpenA2dpDecodingSoftwareProvider) {}
2104
2105/**
2106 * Test whether each provider of type
2107 * SessionType::A2DP_SOFTWARE_DECODING_DATAPATH can be started and stopped with
2108 * different PCM config
2109 */
2110TEST_P(BluetoothAudioProviderA2dpDecodingSoftwareAidl,
2111 StartAndEndA2dpDecodingSoftwareSessionWithPossiblePcmConfig) {
2112 for (auto sample_rate : a2dp_sample_rates) {
2113 for (auto bits_per_sample : a2dp_bits_per_samples) {
2114 for (auto channel_mode : a2dp_channel_modes) {
2115 PcmConfiguration pcm_config{
2116 .sampleRateHz = sample_rate,
Alice Kuoadcceec2022-03-28 13:28:43 +08002117 .channelMode = channel_mode,
shihchienc3ab9f5e2022-09-23 08:18:05 +00002118 .bitsPerSample = bits_per_sample,
Alice Kuoadcceec2022-03-28 13:28:43 +08002119 };
2120 bool is_codec_config_valid = IsPcmConfigSupported(pcm_config);
2121 DataMQDesc mq_desc;
2122 auto aidl_retval = audio_provider_->startSession(
2123 audio_port_, AudioConfiguration(pcm_config), latency_modes,
2124 &mq_desc);
2125 DataMQ data_mq(mq_desc);
2126
2127 EXPECT_EQ(aidl_retval.isOk(), is_codec_config_valid);
2128 if (is_codec_config_valid) {
2129 EXPECT_TRUE(data_mq.isValid());
2130 }
2131 EXPECT_TRUE(audio_provider_->endSession().isOk());
2132 }
2133 }
2134 }
2135}
2136
2137/**
2138 * openProvider A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH
2139 */
2140class BluetoothAudioProviderA2dpDecodingHardwareAidl
2141 : public BluetoothAudioProviderFactoryAidl {
2142 public:
2143 virtual void SetUp() override {
2144 BluetoothAudioProviderFactoryAidl::SetUp();
2145 GetProviderCapabilitiesHelper(
2146 SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH);
2147 OpenProviderHelper(SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH);
2148 ASSERT_TRUE(temp_provider_capabilities_.empty() ||
2149 audio_provider_ != nullptr);
2150 }
2151
2152 virtual void TearDown() override {
2153 audio_port_ = nullptr;
2154 audio_provider_ = nullptr;
2155 BluetoothAudioProviderFactoryAidl::TearDown();
2156 }
2157
2158 bool IsOffloadSupported() { return (temp_provider_capabilities_.size() > 0); }
2159};
2160
2161/**
2162 * Test whether we can open a provider of type
2163 */
2164TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
2165 OpenA2dpDecodingHardwareProvider) {}
2166
2167/**
2168 * Test whether each provider of type
2169 * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
2170 * SBC hardware encoding config
2171 */
2172TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
2173 StartAndEndA2dpSbcDecodingHardwareSession) {
2174 if (!IsOffloadSupported()) {
2175 return;
2176 }
2177
2178 CodecConfiguration codec_config = {
2179 .codecType = CodecType::SBC,
2180 .encodedAudioBitrate = 328000,
2181 .peerMtu = 1005,
2182 .isScmstEnabled = false,
2183 };
2184 auto sbc_codec_specifics = GetSbcCodecSpecificSupportedList(true);
2185
2186 for (auto& codec_specific : sbc_codec_specifics) {
2187 copy_codec_specific(codec_config.config, codec_specific);
2188 DataMQDesc mq_desc;
2189 auto aidl_retval = audio_provider_->startSession(
2190 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
2191
2192 ASSERT_TRUE(aidl_retval.isOk());
2193 EXPECT_TRUE(audio_provider_->endSession().isOk());
2194 }
2195}
2196
2197/**
2198 * Test whether each provider of type
2199 * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
2200 * AAC hardware encoding config
2201 */
2202TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
2203 StartAndEndA2dpAacDecodingHardwareSession) {
2204 if (!IsOffloadSupported()) {
2205 return;
2206 }
2207
2208 CodecConfiguration codec_config = {
2209 .codecType = CodecType::AAC,
2210 .encodedAudioBitrate = 320000,
2211 .peerMtu = 1005,
2212 .isScmstEnabled = false,
2213 };
2214 auto aac_codec_specifics = GetAacCodecSpecificSupportedList(true);
2215
2216 for (auto& codec_specific : aac_codec_specifics) {
2217 copy_codec_specific(codec_config.config, codec_specific);
2218 DataMQDesc mq_desc;
2219 auto aidl_retval = audio_provider_->startSession(
2220 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
2221
2222 ASSERT_TRUE(aidl_retval.isOk());
2223 EXPECT_TRUE(audio_provider_->endSession().isOk());
2224 }
2225}
2226
2227/**
2228 * Test whether each provider of type
2229 * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
2230 * LDAC hardware encoding config
2231 */
2232TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
2233 StartAndEndA2dpLdacDecodingHardwareSession) {
2234 if (!IsOffloadSupported()) {
2235 return;
2236 }
2237
2238 CodecConfiguration codec_config = {
2239 .codecType = CodecType::LDAC,
2240 .encodedAudioBitrate = 990000,
2241 .peerMtu = 1005,
2242 .isScmstEnabled = false,
2243 };
2244 auto ldac_codec_specifics = GetLdacCodecSpecificSupportedList(true);
2245
2246 for (auto& codec_specific : ldac_codec_specifics) {
2247 copy_codec_specific(codec_config.config, codec_specific);
2248 DataMQDesc mq_desc;
2249 auto aidl_retval = audio_provider_->startSession(
2250 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
2251
2252 ASSERT_TRUE(aidl_retval.isOk());
2253 EXPECT_TRUE(audio_provider_->endSession().isOk());
2254 }
2255}
2256
2257/**
2258 * Test whether each provider of type
2259 * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
Omer Osmana2587da2022-05-01 03:54:11 +00002260 * Opus hardware encoding config
Alice Kuoadcceec2022-03-28 13:28:43 +08002261 */
2262TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
Omer Osmana2587da2022-05-01 03:54:11 +00002263 StartAndEndA2dpOpusDecodingHardwareSession) {
Alice Kuoadcceec2022-03-28 13:28:43 +08002264 if (!IsOffloadSupported()) {
2265 return;
2266 }
2267
2268 CodecConfiguration codec_config = {
Omer Osmana2587da2022-05-01 03:54:11 +00002269 .codecType = CodecType::OPUS,
Alice Kuoadcceec2022-03-28 13:28:43 +08002270 .encodedAudioBitrate = 990000,
2271 .peerMtu = 1005,
2272 .isScmstEnabled = false,
2273 };
Omer Osmana2587da2022-05-01 03:54:11 +00002274 auto opus_codec_specifics = GetOpusCodecSpecificSupportedList(true);
Alice Kuoadcceec2022-03-28 13:28:43 +08002275
Omer Osmana2587da2022-05-01 03:54:11 +00002276 for (auto& codec_specific : opus_codec_specifics) {
Alice Kuoadcceec2022-03-28 13:28:43 +08002277 copy_codec_specific(codec_config.config, codec_specific);
2278 DataMQDesc mq_desc;
2279 auto aidl_retval = audio_provider_->startSession(
2280 audio_port_, AudioConfiguration(codec_config), latency_modes, &mq_desc);
2281
2282 ASSERT_TRUE(aidl_retval.isOk());
2283 EXPECT_TRUE(audio_provider_->endSession().isOk());
2284 }
2285}
2286
2287/**
2288 * Test whether each provider of type
2289 * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
2290 * AptX hardware encoding config
2291 */
2292TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
2293 StartAndEndA2dpAptxDecodingHardwareSession) {
2294 if (!IsOffloadSupported()) {
2295 return;
2296 }
2297
2298 for (auto codec_type : {CodecType::APTX, CodecType::APTX_HD}) {
2299 CodecConfiguration codec_config = {
2300 .codecType = codec_type,
2301 .encodedAudioBitrate =
2302 (codec_type == CodecType::APTX ? 352000 : 576000),
2303 .peerMtu = 1005,
2304 .isScmstEnabled = false,
2305 };
2306
2307 auto aptx_codec_specifics = GetAptxCodecSpecificSupportedList(
2308 (codec_type == CodecType::APTX_HD ? true : false), true);
2309
2310 for (auto& codec_specific : aptx_codec_specifics) {
2311 copy_codec_specific(codec_config.config, codec_specific);
2312 DataMQDesc mq_desc;
2313 auto aidl_retval = audio_provider_->startSession(
2314 audio_port_, AudioConfiguration(codec_config), latency_modes,
2315 &mq_desc);
2316
2317 ASSERT_TRUE(aidl_retval.isOk());
2318 EXPECT_TRUE(audio_provider_->endSession().isOk());
2319 }
2320 }
2321}
2322
2323/**
2324 * Test whether each provider of type
2325 * SessionType::A2DP_HARDWARE_DECODING_DATAPATH can be started and stopped with
2326 * an invalid codec config
2327 */
2328TEST_P(BluetoothAudioProviderA2dpDecodingHardwareAidl,
2329 StartAndEndA2dpDecodingHardwareSessionInvalidCodecConfig) {
2330 if (!IsOffloadSupported()) {
2331 return;
2332 }
2333 ASSERT_NE(audio_provider_, nullptr);
2334
2335 std::vector<CodecConfiguration::CodecSpecific> codec_specifics;
Sagar Verma62df9102022-12-07 17:56:04 +05302336 for (auto codec_type : ndk::enum_range<CodecType>()) {
Alice Kuoadcceec2022-03-28 13:28:43 +08002337 switch (codec_type) {
2338 case CodecType::SBC:
2339 codec_specifics = GetSbcCodecSpecificSupportedList(false);
2340 break;
2341 case CodecType::AAC:
2342 codec_specifics = GetAacCodecSpecificSupportedList(false);
2343 break;
2344 case CodecType::LDAC:
2345 codec_specifics = GetLdacCodecSpecificSupportedList(false);
2346 break;
2347 case CodecType::APTX:
2348 codec_specifics = GetAptxCodecSpecificSupportedList(false, false);
2349 break;
2350 case CodecType::APTX_HD:
2351 codec_specifics = GetAptxCodecSpecificSupportedList(true, false);
2352 break;
Omer Osmana2587da2022-05-01 03:54:11 +00002353 case CodecType::OPUS:
2354 codec_specifics = GetOpusCodecSpecificSupportedList(false);
Alice Kuoadcceec2022-03-28 13:28:43 +08002355 continue;
2356 case CodecType::APTX_ADAPTIVE:
Sagar Verma62df9102022-12-07 17:56:04 +05302357 case CodecType::APTX_ADAPTIVE_LE:
2358 case CodecType::APTX_ADAPTIVE_LEX:
Omer Osmana2587da2022-05-01 03:54:11 +00002359 case CodecType::LC3:
Alice Kuoadcceec2022-03-28 13:28:43 +08002360 case CodecType::VENDOR:
2361 case CodecType::UNKNOWN:
2362 codec_specifics.clear();
2363 break;
2364 }
2365 if (codec_specifics.empty()) {
2366 continue;
2367 }
2368
2369 CodecConfiguration codec_config = {
2370 .codecType = codec_type,
2371 .encodedAudioBitrate = 328000,
2372 .peerMtu = 1005,
2373 .isScmstEnabled = false,
2374 };
2375 for (auto codec_specific : codec_specifics) {
2376 copy_codec_specific(codec_config.config, codec_specific);
2377 DataMQDesc mq_desc;
2378 auto aidl_retval = audio_provider_->startSession(
2379 audio_port_, AudioConfiguration(codec_config), latency_modes,
2380 &mq_desc);
2381
2382 // AIDL call should fail on invalid codec
2383 ASSERT_FALSE(aidl_retval.isOk());
2384 EXPECT_TRUE(audio_provider_->endSession().isOk());
2385 }
2386 }
2387}
2388
Josh Wu049e2cd2022-01-12 05:42:58 -08002389GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2390 BluetoothAudioProviderFactoryAidl);
2391INSTANTIATE_TEST_SUITE_P(PerInstance, BluetoothAudioProviderFactoryAidl,
2392 testing::ValuesIn(android::getAidlHalInstanceNames(
2393 IBluetoothAudioProviderFactory::descriptor)),
2394 android::PrintInstanceNameToString);
2395
2396GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
Alice Kuoadcceec2022-03-28 13:28:43 +08002397 BluetoothAudioProviderA2dpEncodingSoftwareAidl);
2398INSTANTIATE_TEST_SUITE_P(PerInstance,
2399 BluetoothAudioProviderA2dpEncodingSoftwareAidl,
Josh Wu049e2cd2022-01-12 05:42:58 -08002400 testing::ValuesIn(android::getAidlHalInstanceNames(
2401 IBluetoothAudioProviderFactory::descriptor)),
2402 android::PrintInstanceNameToString);
2403
2404GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
Alice Kuoadcceec2022-03-28 13:28:43 +08002405 BluetoothAudioProviderA2dpEncodingHardwareAidl);
2406INSTANTIATE_TEST_SUITE_P(PerInstance,
2407 BluetoothAudioProviderA2dpEncodingHardwareAidl,
Josh Wu049e2cd2022-01-12 05:42:58 -08002408 testing::ValuesIn(android::getAidlHalInstanceNames(
2409 IBluetoothAudioProviderFactory::descriptor)),
2410 android::PrintInstanceNameToString);
2411
2412GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2413 BluetoothAudioProviderHearingAidSoftwareAidl);
2414INSTANTIATE_TEST_SUITE_P(PerInstance,
2415 BluetoothAudioProviderHearingAidSoftwareAidl,
2416 testing::ValuesIn(android::getAidlHalInstanceNames(
2417 IBluetoothAudioProviderFactory::descriptor)),
2418 android::PrintInstanceNameToString);
2419
2420GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2421 BluetoothAudioProviderLeAudioOutputSoftwareAidl);
2422INSTANTIATE_TEST_SUITE_P(PerInstance,
2423 BluetoothAudioProviderLeAudioOutputSoftwareAidl,
2424 testing::ValuesIn(android::getAidlHalInstanceNames(
2425 IBluetoothAudioProviderFactory::descriptor)),
2426 android::PrintInstanceNameToString);
2427
2428GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2429 BluetoothAudioProviderLeAudioInputSoftwareAidl);
2430INSTANTIATE_TEST_SUITE_P(PerInstance,
2431 BluetoothAudioProviderLeAudioInputSoftwareAidl,
2432 testing::ValuesIn(android::getAidlHalInstanceNames(
2433 IBluetoothAudioProviderFactory::descriptor)),
2434 android::PrintInstanceNameToString);
2435
2436GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2437 BluetoothAudioProviderLeAudioOutputHardwareAidl);
2438INSTANTIATE_TEST_SUITE_P(PerInstance,
2439 BluetoothAudioProviderLeAudioOutputHardwareAidl,
2440 testing::ValuesIn(android::getAidlHalInstanceNames(
2441 IBluetoothAudioProviderFactory::descriptor)),
2442 android::PrintInstanceNameToString);
2443
2444GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2445 BluetoothAudioProviderLeAudioInputHardwareAidl);
2446INSTANTIATE_TEST_SUITE_P(PerInstance,
2447 BluetoothAudioProviderLeAudioInputHardwareAidl,
2448 testing::ValuesIn(android::getAidlHalInstanceNames(
2449 IBluetoothAudioProviderFactory::descriptor)),
2450 android::PrintInstanceNameToString);
2451
2452GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2453 BluetoothAudioProviderLeAudioBroadcastSoftwareAidl);
2454INSTANTIATE_TEST_SUITE_P(PerInstance,
2455 BluetoothAudioProviderLeAudioBroadcastSoftwareAidl,
2456 testing::ValuesIn(android::getAidlHalInstanceNames(
2457 IBluetoothAudioProviderFactory::descriptor)),
2458 android::PrintInstanceNameToString);
2459
Alice Kuo336d90c2022-02-16 09:09:59 +08002460GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2461 BluetoothAudioProviderLeAudioBroadcastHardwareAidl);
2462INSTANTIATE_TEST_SUITE_P(PerInstance,
2463 BluetoothAudioProviderLeAudioBroadcastHardwareAidl,
2464 testing::ValuesIn(android::getAidlHalInstanceNames(
2465 IBluetoothAudioProviderFactory::descriptor)),
2466 android::PrintInstanceNameToString);
Josh Wu049e2cd2022-01-12 05:42:58 -08002467
Alice Kuoadcceec2022-03-28 13:28:43 +08002468GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2469 BluetoothAudioProviderA2dpDecodingSoftwareAidl);
2470INSTANTIATE_TEST_SUITE_P(PerInstance,
2471 BluetoothAudioProviderA2dpDecodingSoftwareAidl,
2472 testing::ValuesIn(android::getAidlHalInstanceNames(
2473 IBluetoothAudioProviderFactory::descriptor)),
2474 android::PrintInstanceNameToString);
2475
2476GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2477 BluetoothAudioProviderA2dpDecodingHardwareAidl);
2478INSTANTIATE_TEST_SUITE_P(PerInstance,
2479 BluetoothAudioProviderA2dpDecodingHardwareAidl,
2480 testing::ValuesIn(android::getAidlHalInstanceNames(
2481 IBluetoothAudioProviderFactory::descriptor)),
2482 android::PrintInstanceNameToString);
2483
Bao Do72399432023-11-09 08:13:05 +00002484GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2485 BluetoothAudioProviderHfpHardwareAidl);
2486INSTANTIATE_TEST_SUITE_P(PerInstance, BluetoothAudioProviderHfpHardwareAidl,
2487 testing::ValuesIn(android::getAidlHalInstanceNames(
2488 IBluetoothAudioProviderFactory::descriptor)),
2489 android::PrintInstanceNameToString);
2490
2491GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2492 BluetoothAudioProviderHfpSoftwareDecodingAidl);
2493INSTANTIATE_TEST_SUITE_P(PerInstance,
2494 BluetoothAudioProviderHfpSoftwareDecodingAidl,
2495 testing::ValuesIn(android::getAidlHalInstanceNames(
2496 IBluetoothAudioProviderFactory::descriptor)),
2497 android::PrintInstanceNameToString);
2498
2499GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(
2500 BluetoothAudioProviderHfpSoftwareEncodingAidl);
2501INSTANTIATE_TEST_SUITE_P(PerInstance,
2502 BluetoothAudioProviderHfpSoftwareEncodingAidl,
2503 testing::ValuesIn(android::getAidlHalInstanceNames(
2504 IBluetoothAudioProviderFactory::descriptor)),
2505 android::PrintInstanceNameToString);
2506
Josh Wu049e2cd2022-01-12 05:42:58 -08002507int main(int argc, char** argv) {
2508 ::testing::InitGoogleTest(&argc, argv);
2509 ABinderProcess_setThreadPoolMaxThreadCount(1);
2510 ABinderProcess_startThreadPool();
2511 return RUN_ALL_TESTS();
2512}