blob: b0d171a7ba68937e2ae1473432f457c297807b0a [file] [log] [blame]
Grzegorz Kolodziejczykb5f2d232019-10-24 12:31:20 +02001/*
2 * Copyright 2020 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
Jakub Pawlowski3c8dc612021-02-03 20:43:20 +010023#include "BluetoothAudioSupportedCodecsDB_2_1.h"
Grzegorz Kolodziejczykb5f2d232019-10-24 12:31:20 +020024
25namespace android {
26namespace hardware {
27namespace bluetooth {
28namespace audio {
29namespace V2_1 {
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_;
Jakub Pawlowskic8861ec2021-06-02 12:50:41 +020044LeAudioOffloadOutputAudioProvider
45 BluetoothAudioProvidersFactory::leaudio_offload_output_provider_instance_;
Grzegorz Kolodziejczykb5f2d232019-10-24 12:31:20 +020046LeAudioInputAudioProvider
47 BluetoothAudioProvidersFactory::leaudio_input_provider_instance_;
Jakub Pawlowskic8861ec2021-06-02 12:50:41 +020048LeAudioOffloadInputAudioProvider
49 BluetoothAudioProvidersFactory::leaudio_offload_input_provider_instance_;
Grzegorz Kolodziejczykb5f2d232019-10-24 12:31:20 +020050
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 switch (sessionType) {
57 case V2_0::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
58 provider = &a2dp_software_provider_instance_;
59 break;
60 case V2_0::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
61 provider = &a2dp_offload_provider_instance_;
62 break;
63 case V2_0::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
64 provider = &hearing_aid_provider_instance_;
65 break;
66 default:
67 status = BluetoothAudioStatus::FAILURE;
68 }
69 if (provider == nullptr || !provider->isValid(sessionType)) {
70 provider = nullptr;
71 status = BluetoothAudioStatus::FAILURE;
72 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
73 << ", status=" << toString(status);
74 }
75 _hidl_cb(status, provider);
76 return Void();
77}
78
79Return<void> BluetoothAudioProvidersFactory::openProvider_2_1(
80 const SessionType sessionType, openProvider_2_1_cb _hidl_cb) {
81 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
82 BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
83 BluetoothAudioProvider* provider = nullptr;
84 switch (sessionType) {
85 case SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
86 provider = &a2dp_software_provider_instance_;
87 break;
88 case SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
89 provider = &a2dp_offload_provider_instance_;
90 break;
91 case SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
92 provider = &hearing_aid_provider_instance_;
93 break;
94 case SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
95 provider = &leaudio_output_provider_instance_;
96 break;
Jakub Pawlowskic8861ec2021-06-02 12:50:41 +020097 case SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
98 provider = &leaudio_offload_output_provider_instance_;
99 break;
Grzegorz Kolodziejczykb5f2d232019-10-24 12:31:20 +0200100 case SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
101 provider = &leaudio_input_provider_instance_;
102 break;
Jakub Pawlowskic8861ec2021-06-02 12:50:41 +0200103 case SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH:
104 provider = &leaudio_offload_input_provider_instance_;
105 break;
Grzegorz Kolodziejczykb5f2d232019-10-24 12:31:20 +0200106 default:
107 status = BluetoothAudioStatus::FAILURE;
108 }
109 if (provider == nullptr || !provider->isValid(sessionType)) {
110 provider = nullptr;
111 status = BluetoothAudioStatus::FAILURE;
112 LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
113 << ", status=" << toString(status);
114 }
115 _hidl_cb(status, provider);
116 return Void();
117}
118
119Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities(
120 const V2_0::SessionType sessionType, getProviderCapabilities_cb _hidl_cb) {
121 hidl_vec<V2_0::AudioCapabilities> audio_capabilities =
122 hidl_vec<V2_0::AudioCapabilities>(0);
123 if (sessionType == V2_0::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
124 std::vector<CodecCapabilities> db_codec_capabilities =
125 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
126 if (db_codec_capabilities.size()) {
127 audio_capabilities.resize(db_codec_capabilities.size());
128 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
129 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
130 }
131 }
132 } else if (sessionType != V2_0::SessionType::UNKNOWN) {
133 std::vector<::android::hardware::bluetooth::audio::V2_0::PcmParameters>
134 db_pcm_capabilities =
135 android::bluetooth::audio::GetSoftwarePcmCapabilities();
136 if (db_pcm_capabilities.size() == 1) {
137 audio_capabilities.resize(1);
138 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
139 }
140 }
141 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
142 << " supports " << audio_capabilities.size() << " codecs";
143 _hidl_cb(audio_capabilities);
144 return Void();
145}
146
147Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_1(
148 const SessionType sessionType, getProviderCapabilities_2_1_cb _hidl_cb) {
149 hidl_vec<AudioCapabilities> audio_capabilities =
150 hidl_vec<AudioCapabilities>(0);
151 if (sessionType == SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
152 std::vector<CodecCapabilities> db_codec_capabilities =
153 android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
154 if (db_codec_capabilities.size()) {
155 audio_capabilities.resize(db_codec_capabilities.size());
156 for (int i = 0; i < db_codec_capabilities.size(); ++i) {
157 audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
158 }
159 }
160 } else if (sessionType != SessionType::UNKNOWN) {
161 std::vector<PcmParameters> db_pcm_capabilities =
162 android::bluetooth::audio::GetSoftwarePcmCapabilities_2_1();
163 if (db_pcm_capabilities.size() == 1) {
164 audio_capabilities.resize(1);
165 audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
166 }
167 }
168 LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
169 << " supports " << audio_capabilities.size() << " codecs";
170 _hidl_cb(audio_capabilities);
171 return Void();
172}
173
174IBluetoothAudioProvidersFactory* HIDL_FETCH_IBluetoothAudioProvidersFactory(
175 const char* /* name */) {
176 return new BluetoothAudioProvidersFactory();
177}
178
179} // namespace implementation
180} // namespace V2_1
181} // namespace audio
182} // namespace bluetooth
183} // namespace hardware
184} // namespace android