blob: 510833de9f9784a1c8abeb77371e00b8d0ce232e [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
23#include "BluetoothAudioSupportedCodecsDB_2_1.h"
24
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;
101 case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
102 provider = &leaudio_offload_output_provider_instance_;
103 break;
104 case V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
105 provider = &leaudio_input_provider_instance_;
106 break;
107 case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH:
108 provider = &leaudio_offload_input_provider_instance_;
109 break;
110 default:
111 status = BluetoothAudioStatus::FAILURE;
112 }
113
114 if (provider == nullptr || !provider->isValid(sessionType)) {
115 provider = nullptr;
116 status = BluetoothAudioStatus::FAILURE;
117 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
118 << ", status=" << toString(status);
119 }
120
121 _hidl_cb(status, provider);
122 return Void();
123}
124
Alice Kuo95ba6a22021-11-04 19:28:10 +0800125Return<void> BluetoothAudioProvidersFactory::openProvider_2_2(
126 const V2_1::SessionType sessionType, openProvider_2_2_cb _hidl_cb) {
127 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
128 BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
129 BluetoothAudioProvider* provider = nullptr;
130
131 switch (sessionType) {
132 case V2_1::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
133 provider = &a2dp_software_provider_instance_;
134 break;
135 case V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
136 provider = &a2dp_offload_provider_instance_;
137 break;
138 case V2_1::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
139 provider = &hearing_aid_provider_instance_;
140 break;
141 case V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
142 provider = &leaudio_output_provider_instance_;
143 break;
144 case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
145 provider = &leaudio_offload_output_provider_instance_;
146 break;
147 case V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
148 provider = &leaudio_input_provider_instance_;
149 break;
150 case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH:
151 provider = &leaudio_offload_input_provider_instance_;
152 break;
153 default:
154 status = BluetoothAudioStatus::FAILURE;
155 }
156
157 if (provider == nullptr || !provider->isValid(sessionType)) {
158 provider = nullptr;
159 status = BluetoothAudioStatus::FAILURE;
160 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
161 << ", status=" << toString(status);
162 }
163
164 _hidl_cb(status, provider);
165 return Void();
166}
167
Alice Kuo84e87672021-10-28 12:53:38 +0800168Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities(
169 const V2_0::SessionType sessionType, getProviderCapabilities_cb _hidl_cb) {
170 hidl_vec<V2_0::AudioCapabilities> audio_capabilities =
171 hidl_vec<V2_0::AudioCapabilities>(0);
172 if (sessionType == V2_0::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
173 std::vector<CodecCapabilities> db_codec_capabilities =
174 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
175 if (db_codec_capabilities.size()) {
176 audio_capabilities.resize(db_codec_capabilities.size());
177 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
178 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
179 }
180 }
181 } else if (sessionType != V2_0::SessionType::UNKNOWN) {
182 std::vector<::android::hardware::bluetooth::audio::V2_0::PcmParameters>
183 db_pcm_capabilities =
184 android::bluetooth::audio::GetSoftwarePcmCapabilities();
185 if (db_pcm_capabilities.size() == 1) {
186 audio_capabilities.resize(1);
187 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
188 }
189 }
190 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
191 << " supports " << audio_capabilities.size() << " codecs";
192 _hidl_cb(audio_capabilities);
193 return Void();
194}
195
196Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_1(
197 const V2_1::SessionType sessionType,
198 getProviderCapabilities_2_1_cb _hidl_cb) {
199 hidl_vec<V2_1::AudioCapabilities> audio_capabilities =
200 hidl_vec<V2_1::AudioCapabilities>(0);
201 if (sessionType == V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
202 std::vector<CodecCapabilities> db_codec_capabilities =
203 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
204 if (db_codec_capabilities.size()) {
205 audio_capabilities.resize(db_codec_capabilities.size());
206 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
207 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
208 }
209 }
210 } else if (sessionType != V2_1::SessionType::UNKNOWN) {
211 std::vector<V2_1::PcmParameters> db_pcm_capabilities =
212 android::bluetooth::audio::GetSoftwarePcmCapabilities_2_1();
213 if (db_pcm_capabilities.size() == 1) {
214 audio_capabilities.resize(1);
215 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
216 }
217 }
218 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
219 << " supports " << audio_capabilities.size() << " codecs";
220 _hidl_cb(audio_capabilities);
221 return Void();
222}
223
224IBluetoothAudioProvidersFactory* HIDL_FETCH_IBluetoothAudioProvidersFactory(
225 const char* /* name */) {
226 return new BluetoothAudioProvidersFactory();
227}
228
229} // namespace implementation
230} // namespace V2_2
231} // namespace audio
232} // namespace bluetooth
233} // namespace hardware
234} // namespace android