blob: 490a436b5eaf8b93529eed3375f8e7c8bd13425e [file] [log] [blame]
Alice Kuo84e87672021-10-28 12:53:38 +08001/*
2 * Copyright 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "BTAudioProvidersFactory"
18
19#include "BluetoothAudioProvidersFactory.h"
20
21#include <android-base/logging.h>
22
Alice Kuo79c02162021-12-16 14:13:25 +080023#include "BluetoothAudioSupportedCodecsDB_2_2.h"
Alice Kuo84e87672021-10-28 12:53:38 +080024
25namespace android {
26namespace hardware {
27namespace bluetooth {
28namespace audio {
29namespace V2_2 {
30namespace implementation {
31
32using ::android::hardware::hidl_vec;
33using ::android::hardware::Void;
34using ::android::hardware::bluetooth::audio::V2_0::CodecCapabilities;
35
36A2dpSoftwareAudioProvider
37 BluetoothAudioProvidersFactory::a2dp_software_provider_instance_;
38A2dpOffloadAudioProvider
39 BluetoothAudioProvidersFactory::a2dp_offload_provider_instance_;
40HearingAidAudioProvider
41 BluetoothAudioProvidersFactory::hearing_aid_provider_instance_;
42LeAudioOutputAudioProvider
43 BluetoothAudioProvidersFactory::leaudio_output_provider_instance_;
44LeAudioOffloadOutputAudioProvider
45 BluetoothAudioProvidersFactory::leaudio_offload_output_provider_instance_;
46LeAudioInputAudioProvider
47 BluetoothAudioProvidersFactory::leaudio_input_provider_instance_;
48LeAudioOffloadInputAudioProvider
49 BluetoothAudioProvidersFactory::leaudio_offload_input_provider_instance_;
50
51Return<void> BluetoothAudioProvidersFactory::openProvider(
52 const V2_0::SessionType sessionType, openProvider_cb _hidl_cb) {
53 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
54 BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
55 BluetoothAudioProvider* provider = nullptr;
56
57 switch (sessionType) {
58 case V2_0::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
59 provider = &a2dp_software_provider_instance_;
60 break;
61 case V2_0::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
62 provider = &a2dp_offload_provider_instance_;
63 break;
64 case V2_0::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
65 provider = &hearing_aid_provider_instance_;
66 break;
67 default:
68 status = BluetoothAudioStatus::FAILURE;
69 }
70
71 if (provider == nullptr || !provider->isValid(sessionType)) {
72 provider = nullptr;
73 status = BluetoothAudioStatus::FAILURE;
74 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
75 << ", status=" << toString(status);
76 }
77
78 _hidl_cb(status, provider);
79 return Void();
80}
81
82Return<void> BluetoothAudioProvidersFactory::openProvider_2_1(
83 const V2_1::SessionType sessionType, openProvider_2_1_cb _hidl_cb) {
84 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
85 BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
86 BluetoothAudioProvider* provider = nullptr;
87
88 switch (sessionType) {
89 case V2_1::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
90 provider = &a2dp_software_provider_instance_;
91 break;
92 case V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
93 provider = &a2dp_offload_provider_instance_;
94 break;
95 case V2_1::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
96 provider = &hearing_aid_provider_instance_;
97 break;
98 case V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
99 provider = &leaudio_output_provider_instance_;
100 break;
Alice Kuo84e87672021-10-28 12:53:38 +0800101 case V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
102 provider = &leaudio_input_provider_instance_;
103 break;
Alice Kuo84e87672021-10-28 12:53:38 +0800104 default:
105 status = BluetoothAudioStatus::FAILURE;
106 }
107
108 if (provider == nullptr || !provider->isValid(sessionType)) {
109 provider = nullptr;
110 status = BluetoothAudioStatus::FAILURE;
111 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
112 << ", status=" << toString(status);
113 }
114
115 _hidl_cb(status, provider);
116 return Void();
117}
118
Alice Kuo95ba6a22021-11-04 19:28:10 +0800119Return<void> BluetoothAudioProvidersFactory::openProvider_2_2(
120 const V2_1::SessionType sessionType, openProvider_2_2_cb _hidl_cb) {
121 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
122 BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
123 BluetoothAudioProvider* provider = nullptr;
124
125 switch (sessionType) {
126 case V2_1::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
127 provider = &a2dp_software_provider_instance_;
128 break;
129 case V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
130 provider = &a2dp_offload_provider_instance_;
131 break;
132 case V2_1::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
133 provider = &hearing_aid_provider_instance_;
134 break;
135 case V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
136 provider = &leaudio_output_provider_instance_;
137 break;
138 case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
139 provider = &leaudio_offload_output_provider_instance_;
140 break;
141 case V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
142 provider = &leaudio_input_provider_instance_;
143 break;
144 case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH:
145 provider = &leaudio_offload_input_provider_instance_;
146 break;
147 default:
148 status = BluetoothAudioStatus::FAILURE;
149 }
150
151 if (provider == nullptr || !provider->isValid(sessionType)) {
152 provider = nullptr;
153 status = BluetoothAudioStatus::FAILURE;
154 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
155 << ", status=" << toString(status);
156 }
157
158 _hidl_cb(status, provider);
159 return Void();
160}
161
Alice Kuo84e87672021-10-28 12:53:38 +0800162Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities(
163 const V2_0::SessionType sessionType, getProviderCapabilities_cb _hidl_cb) {
164 hidl_vec<V2_0::AudioCapabilities> audio_capabilities =
165 hidl_vec<V2_0::AudioCapabilities>(0);
166 if (sessionType == V2_0::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
167 std::vector<CodecCapabilities> db_codec_capabilities =
168 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
169 if (db_codec_capabilities.size()) {
170 audio_capabilities.resize(db_codec_capabilities.size());
171 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
172 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
173 }
174 }
175 } else if (sessionType != V2_0::SessionType::UNKNOWN) {
176 std::vector<::android::hardware::bluetooth::audio::V2_0::PcmParameters>
177 db_pcm_capabilities =
178 android::bluetooth::audio::GetSoftwarePcmCapabilities();
179 if (db_pcm_capabilities.size() == 1) {
180 audio_capabilities.resize(1);
181 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
182 }
183 }
184 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
185 << " supports " << audio_capabilities.size() << " codecs";
186 _hidl_cb(audio_capabilities);
187 return Void();
188}
189
190Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_1(
191 const V2_1::SessionType sessionType,
192 getProviderCapabilities_2_1_cb _hidl_cb) {
193 hidl_vec<V2_1::AudioCapabilities> audio_capabilities =
194 hidl_vec<V2_1::AudioCapabilities>(0);
195 if (sessionType == V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
196 std::vector<CodecCapabilities> db_codec_capabilities =
197 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
198 if (db_codec_capabilities.size()) {
199 audio_capabilities.resize(db_codec_capabilities.size());
200 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
201 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
202 }
203 }
204 } else if (sessionType != V2_1::SessionType::UNKNOWN) {
205 std::vector<V2_1::PcmParameters> db_pcm_capabilities =
206 android::bluetooth::audio::GetSoftwarePcmCapabilities_2_1();
207 if (db_pcm_capabilities.size() == 1) {
208 audio_capabilities.resize(1);
209 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
210 }
211 }
212 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
213 << " supports " << audio_capabilities.size() << " codecs";
214 _hidl_cb(audio_capabilities);
215 return Void();
216}
217
Patty784e4432021-11-24 00:17:41 +0800218Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_2(
219 const V2_1::SessionType sessionType,
220 getProviderCapabilities_2_2_cb _hidl_cb) {
221 hidl_vec<V2_2::AudioCapabilities> audio_capabilities =
222 hidl_vec<V2_2::AudioCapabilities>(0);
223 if (sessionType == V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
224 std::vector<CodecCapabilities> db_codec_capabilities =
225 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
226 if (db_codec_capabilities.size()) {
227 audio_capabilities.resize(db_codec_capabilities.size());
228 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
229 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
230 }
231 }
232 } else if (sessionType == V2_1::SessionType::
233 LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
234 sessionType == V2_1::SessionType::
235 LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
Patty2e64b4d2022-01-06 15:24:01 +0800236 std::vector<LeAudioCodecCapabilitiesSetting> db_codec_capabilities =
Patty784e4432021-11-24 00:17:41 +0800237 android::bluetooth::audio::GetLeAudioOffloadCodecCapabilities(
238 sessionType);
239 if (db_codec_capabilities.size()) {
240 audio_capabilities.resize(db_codec_capabilities.size());
241 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
242 audio_capabilities[i].leAudioCapabilities(db_codec_capabilities[i]);
243 }
244 }
245 } else if (sessionType != V2_1::SessionType::UNKNOWN) {
246 std::vector<V2_1::PcmParameters> db_pcm_capabilities =
247 android::bluetooth::audio::GetSoftwarePcmCapabilities_2_1();
248 if (db_pcm_capabilities.size() == 1) {
249 audio_capabilities.resize(1);
250 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
251 }
252 }
253 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
254 << " supports " << audio_capabilities.size() << " codecs";
255 _hidl_cb(audio_capabilities);
256 return Void();
257}
258
Alice Kuo84e87672021-10-28 12:53:38 +0800259IBluetoothAudioProvidersFactory* HIDL_FETCH_IBluetoothAudioProvidersFactory(
260 const char* /* name */) {
261 return new BluetoothAudioProvidersFactory();
262}
263
264} // namespace implementation
265} // namespace V2_2
266} // namespace audio
267} // namespace bluetooth
268} // namespace hardware
269} // namespace android