1 /*
2 * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <cinttypes>
16 #include "bluetooth_def.h"
17 #include "bluetooth_errorcode.h"
18 #include "bluetooth_hitrace.h"
19 #include "bluetooth_log.h"
20 #include "bluetooth_utils_server.h"
21 #include "hisysevent.h"
22 #include "interface_profile_manager.h"
23 #include "interface_profile_a2dp_src.h"
24 #include "remote_observer_list.h"
25 #include "interface_adapter_manager.h"
26 #include "permission_utils.h"
27 #include "bluetooth_a2dp_source_server.h"
28
29 namespace OHOS {
30 namespace Bluetooth {
31 class A2dpSourceObserver : public IA2dpObserver {
32 public:
33 A2dpSourceObserver() = default;
34 ~A2dpSourceObserver() override = default;
35
36 void OnConnectionStateChanged(const RawAddress &device, int state) override
37 {
38 HILOGI("addr: %{public}s, state: %{public}d", GET_ENCRYPT_ADDR(device), state);
39 if (state == static_cast<int>(BTConnectState::CONNECTED) ||
40 state == static_cast<int>(BTConnectState::DISCONNECTED)) {
41 HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::BT_SERVICE, "A2DP_CONNECTED_STATE",
42 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, "STATE", state);
43 }
44 observers_->ForEach([device, state](sptr<IBluetoothA2dpSourceObserver> observer) {
45 observer->OnConnectionStateChanged(device, state,
46 static_cast<uint32_t>(ConnChangeCause::CONNECT_CHANGE_COMMON_CAUSE));
47 });
48 }
49
50 void OnPlayingStatusChaned(const RawAddress &device, int playingState, int error) override
51 {
52 HILOGI("addr: %{public}s, state: %{public}d, error: %{public}d",
53 GET_ENCRYPT_ADDR(device), playingState, error);
54 observers_->ForEach([device, playingState, error](sptr<IBluetoothA2dpSourceObserver> observer) {
55 observer->OnPlayingStatusChanged(device, playingState, error);
56 });
57 }
58
59 void OnConfigurationChanged(const RawAddress &device, const A2dpSrcCodecInfo &info, int error) override
60 {
61 HILOGI("addr: %{public}s, error: %{public}d", GET_ENCRYPT_ADDR(device), error);
62 observers_->ForEach([device, info, error](sptr<IBluetoothA2dpSourceObserver> observer) {
63 BluetoothA2dpCodecInfo tmpInfo {};
64 tmpInfo.bitsPerSample = info.bitsPerSample;
65 tmpInfo.channelMode = info.channelMode;
66 tmpInfo.codecPriority = info.codecPriority;
67 tmpInfo.codecType = info.codecType;
68 tmpInfo.sampleRate = info.sampleRate;
69 tmpInfo.codecSpecific1 = info.codecSpecific1;
70 tmpInfo.codecSpecific2 = info.codecSpecific2;
71 tmpInfo.codecSpecific3 = info.codecSpecific3;
72 tmpInfo.codecSpecific4 = info.codecSpecific4;
73
74 observer->OnConfigurationChanged(device, tmpInfo, error);
75 });
76 }
77
78 void OnMediaStackChanged(const RawAddress &device, int action) override
79 {
80 HILOGI("addr: %{public}s, action: %{public}d", GET_ENCRYPT_ADDR(device), action);
81 }
82
SetObserver(RemoteObserverList<IBluetoothA2dpSourceObserver> *observers)83 void SetObserver(RemoteObserverList<IBluetoothA2dpSourceObserver> *observers)
84 {
85 observers_ = observers;
86 }
87
88 private:
89 RemoteObserverList<IBluetoothA2dpSourceObserver> *observers_;
90 };
91
92 struct BluetoothA2dpSourceServer::impl {
93 impl();
94 ~impl();
95
96 /// sys state observer
97 class SystemStateObserver;
98 std::unique_ptr<SystemStateObserver> systemStateObserver_ = nullptr;
99
100 RemoteObserverList<IBluetoothA2dpSourceObserver> observers_;
101 std::unique_ptr<A2dpSourceObserver> observerImp_{std::make_unique<A2dpSourceObserver>()};
102 IProfileA2dpSrc *a2dpSrcService_ = nullptr;
103 };
104
105 class BluetoothA2dpSourceServer::impl::SystemStateObserver : public ISystemStateObserver {
106 public:
SystemStateObserver(BluetoothA2dpSourceServer::impl *pimpl)107 SystemStateObserver(BluetoothA2dpSourceServer::impl *pimpl) : pimpl_(pimpl) {};
108 ~SystemStateObserver() override = default;
109
110 void OnSystemStateChange(const BTSystemState state) override
111 {
112 IProfileManager *serviceMgr = IProfileManager::GetInstance();
113 if (!pimpl_) {
114 HILOGI("failed: pimpl_ is null");
115 return;
116 }
117
118 switch (state) {
119 case BTSystemState::ON:
120 if (serviceMgr != nullptr) {
121 pimpl_->a2dpSrcService_ =
122 (IProfileA2dpSrc *)serviceMgr->GetProfileService(PROFILE_NAME_A2DP_SRC);
123 if (pimpl_->a2dpSrcService_ != nullptr) {
124 pimpl_->a2dpSrcService_->RegisterObserver(pimpl_->observerImp_.get());
125 }
126 }
127 break;
128 case BTSystemState::OFF:
129 pimpl_->a2dpSrcService_ = nullptr;
130 break;
131 default:
132 break;
133 }
134 }
135
136 private:
137 BluetoothA2dpSourceServer::impl *pimpl_ = nullptr;
138 };
139
impl()140 BluetoothA2dpSourceServer::impl::impl()
141 {
142 HILOGI("starts");
143 }
144
~impl()145 BluetoothA2dpSourceServer::impl::~impl()
146 {
147 HILOGI("starts");
148 }
149
BluetoothA2dpSourceServer()150 BluetoothA2dpSourceServer::BluetoothA2dpSourceServer()
151 {
152 HILOGI("starts");
153 pimpl = std::make_unique<impl>();
154 pimpl->observerImp_->SetObserver(&(pimpl->observers_));
155 pimpl->systemStateObserver_ = std::make_unique<impl::SystemStateObserver>(pimpl.get());
156 IAdapterManager::GetInstance()->RegisterSystemStateObserver(*(pimpl->systemStateObserver_));
157
158 IProfileManager *serviceMgr = IProfileManager::GetInstance();
159 if (serviceMgr != nullptr) {
160 pimpl->a2dpSrcService_ = (IProfileA2dpSrc *)serviceMgr->GetProfileService(PROFILE_NAME_A2DP_SRC);
161 if (pimpl->a2dpSrcService_ != nullptr) {
162 pimpl->a2dpSrcService_->RegisterObserver(pimpl->observerImp_.get());
163 }
164 }
165 }
166
~BluetoothA2dpSourceServer()167 BluetoothA2dpSourceServer::~BluetoothA2dpSourceServer()
168 {
169 HILOGI("starts");
170 IAdapterManager::GetInstance()->DeregisterSystemStateObserver(*(pimpl->systemStateObserver_));
171 if (pimpl->a2dpSrcService_ != nullptr) {
172 pimpl->a2dpSrcService_->DeregisterObserver(pimpl->observerImp_.get());
173 }
174 }
175
RegisterObserver(const sptr<IBluetoothA2dpSourceObserver> &observer)176 void BluetoothA2dpSourceServer::RegisterObserver(const sptr<IBluetoothA2dpSourceObserver> &observer)
177 {
178 HILOGI("starts");
179 if (observer == nullptr) {
180 HILOGI("observer is null");
181 return;
182 }
183 auto func = std::bind(&BluetoothA2dpSourceServer::DeregisterObserver, this, std::placeholders::_1);
184 pimpl->observers_.Register(observer, func);
185 if (pimpl->a2dpSrcService_ == nullptr) {
186 return;
187 }
188 // During A2DP HDF Registration, check the current status and callback
189 RawAddress device = GetActiveSinkDevice();
190 int state = static_cast<int>(BTConnectState::DISCONNECTED);
191 GetDeviceState(static_cast<const RawAddress &>(device), state);
192 if (state == static_cast<int>(BTConnectState::CONNECTED)) {
193 HILOGI("onConnectionStateChanged");
194 observer->OnConnectionStateChanged(device, state,
195 static_cast<uint32_t>(ConnChangeCause::CONNECT_CHANGE_COMMON_CAUSE));
196 }
197 }
198
DeregisterObserver(const sptr<IBluetoothA2dpSourceObserver> &observer)199 void BluetoothA2dpSourceServer::DeregisterObserver(const sptr<IBluetoothA2dpSourceObserver> &observer)
200 {
201 HILOGI("starts");
202 if (observer == nullptr) {
203 HILOGE("observer is null");
204 return;
205 }
206
207 if (pimpl != nullptr) {
208 pimpl->observers_.Deregister(observer);
209 }
210 }
211
Connect(const RawAddress &device)212 int32_t BluetoothA2dpSourceServer::Connect(const RawAddress &device)
213 {
214 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
215 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
216 HILOGE("Connect error, check permission failed");
217 return BT_ERR_SYSTEM_PERMISSION_FAILED;
218 }
219 OHOS::Bluetooth::BluetoothHiTrace::BluetoothStartAsyncTrace("A2DP_SRC_CONNECT", 1);
220 int32_t result = pimpl->a2dpSrcService_->Connect(device);
221 OHOS::Bluetooth::BluetoothHiTrace::BluetoothFinishAsyncTrace("A2DP_SRC_CONNECT", 1);
222 return result;
223 }
224
Disconnect(const RawAddress &device)225 int32_t BluetoothA2dpSourceServer::Disconnect(const RawAddress &device)
226 {
227 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
228 if (PermissionUtils::VerifyDiscoverBluetoothPermission() == PERMISSION_DENIED) {
229 HILOGE("Disconnect error, check permission failed");
230 return BT_ERR_SYSTEM_PERMISSION_FAILED;
231 }
232 return pimpl->a2dpSrcService_->Disconnect(device);
233 }
234
GetDeviceState(const RawAddress &device, int &state)235 int BluetoothA2dpSourceServer::GetDeviceState(const RawAddress &device, int &state)
236 {
237 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
238 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
239 HILOGE("false, check permission failed");
240 return RET_NO_SUPPORT;
241 }
242 state = pimpl->a2dpSrcService_->GetDeviceState(device);
243 return NO_ERROR;
244 }
245
GetDevicesByStates(const std::vector<int32_t> &states, std::vector<RawAddress> &rawAddrs)246 int BluetoothA2dpSourceServer::GetDevicesByStates(const std::vector<int32_t> &states, std::vector<RawAddress> &rawAddrs)
247 {
248 HILOGI("starts");
249 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
250 HILOGE("false, check permission failed");
251 return BT_ERR_PERMISSION_FAILED;
252 }
253 std::vector<int> tmpStates;
254 for (int32_t state : states) {
255 HILOGI("state = %{public}d", state);
256 tmpStates.push_back((int)state);
257 }
258
259 rawAddrs = pimpl->a2dpSrcService_->GetDevicesByStates(tmpStates);
260 return NO_ERROR;
261 }
262
GetPlayingState(const RawAddress &device, int &state)263 int32_t BluetoothA2dpSourceServer::GetPlayingState(const RawAddress &device, int &state)
264 {
265 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
266 if (PermissionUtils::VerifyUseBluetoothPermission() == PERMISSION_DENIED) {
267 HILOGE("false, check permission failed");
268 return BT_ERR_SYSTEM_PERMISSION_FAILED;
269 }
270 int ret = pimpl->a2dpSrcService_->GetPlayingState(device, state);
271 if (ret != NO_ERROR) {
272 return BT_ERR_INTERNAL_ERROR;
273 }
274 return NO_ERROR;
275 }
276
SetConnectStrategy(const RawAddress &device, int strategy)277 int BluetoothA2dpSourceServer::SetConnectStrategy(const RawAddress &device, int strategy)
278 {
279 if (!PermissionUtils::CheckSystemHapApp()) {
280 HILOGE("check system api failed.");
281 return BT_ERR_SYSTEM_PERMISSION_FAILED;
282 }
283 HILOGI("addr: %{public}s, strategy: %{public}d", GET_ENCRYPT_ADDR(device), strategy);
284 return pimpl->a2dpSrcService_->SetConnectStrategy(device, strategy);
285 }
286
GetConnectStrategy(const RawAddress &device, int &strategy)287 int BluetoothA2dpSourceServer::GetConnectStrategy(const RawAddress &device, int &strategy)
288 {
289 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
290 strategy = pimpl->a2dpSrcService_->GetConnectStrategy(device);
291 return NO_ERROR;
292 }
293
SetActiveSinkDevice(const RawAddress &device)294 int BluetoothA2dpSourceServer::SetActiveSinkDevice(const RawAddress &device)
295 {
296 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
297 return pimpl->a2dpSrcService_->SetActiveSinkDevice(device);
298 }
299
GetActiveSinkDevice()300 RawAddress BluetoothA2dpSourceServer::GetActiveSinkDevice()
301 {
302 HILOGI("starts");
303 return pimpl->a2dpSrcService_->GetActiveSinkDevice();
304 }
305
GetCodecStatus(const RawAddress &device)306 BluetoothA2dpCodecStatus BluetoothA2dpSourceServer::GetCodecStatus(const RawAddress &device)
307 {
308 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
309 bluetooth::RawAddress addr(device.GetAddress());
310 bluetooth::A2dpSrcCodecStatus ret;
311 BluetoothA2dpCodecStatus codeStatus;
312 BluetoothA2dpCodecInfo serviceInfo;
313 ret = pimpl->a2dpSrcService_->GetCodecStatus(addr);
314
315 codeStatus.codecInfo.codecPriority = ret.codecInfo.codecPriority;
316 codeStatus.codecInfo.codecType = ret.codecInfo.codecType;
317 codeStatus.codecInfo.sampleRate = ret.codecInfo.sampleRate;
318 codeStatus.codecInfo.bitsPerSample = ret.codecInfo.bitsPerSample;
319 codeStatus.codecInfo.channelMode = ret.codecInfo.channelMode;
320 codeStatus.codecInfo.codecSpecific1 = ret.codecInfo.codecSpecific1;
321 codeStatus.codecInfo.codecSpecific2 = ret.codecInfo.codecSpecific2;
322 codeStatus.codecInfo.codecSpecific3 = ret.codecInfo.codecSpecific3;
323 codeStatus.codecInfo.codecSpecific4 = ret.codecInfo.codecSpecific4;
324
325 for (auto it = ret.codecInfoConfirmedCap.begin(); it != ret.codecInfoConfirmedCap.end(); it++) {
326 serviceInfo.codecPriority = it->codecPriority;
327 serviceInfo.codecType = it->codecType;
328 serviceInfo.sampleRate = it->sampleRate;
329 serviceInfo.bitsPerSample = it->bitsPerSample;
330 serviceInfo.channelMode = it->channelMode;
331 serviceInfo.codecSpecific1 = it->codecSpecific1;
332 serviceInfo.codecSpecific2 = it->codecSpecific2;
333 serviceInfo.codecSpecific3 = it->codecSpecific3;
334 serviceInfo.codecSpecific4 = it->codecSpecific4;
335 codeStatus.codecInfoConfirmCap.push_back(serviceInfo);
336 }
337
338 for (auto it = ret.codecInfoLocalCap.begin(); it != ret.codecInfoLocalCap.end(); it++) {
339 serviceInfo.codecPriority = it->codecPriority;
340 serviceInfo.codecType = it->codecType;
341 serviceInfo.sampleRate = it->sampleRate;
342 serviceInfo.bitsPerSample = it->bitsPerSample;
343 serviceInfo.channelMode = it->channelMode;
344 serviceInfo.codecSpecific1 = it->codecSpecific1;
345 serviceInfo.codecSpecific2 = it->codecSpecific2;
346 serviceInfo.codecSpecific3 = it->codecSpecific3;
347 serviceInfo.codecSpecific4 = it->codecSpecific4;
348 codeStatus.codecInfoLocalCap.push_back(serviceInfo);
349 }
350
351 return codeStatus;
352 }
353
GetCodecPreference(const RawAddress &device, BluetoothA2dpCodecInfo &info)354 int BluetoothA2dpSourceServer::GetCodecPreference(const RawAddress &device, BluetoothA2dpCodecInfo &info)
355 {
356 return NO_ERROR;
357 }
358
SetCodecPreference(const RawAddress &device, const BluetoothA2dpCodecInfo &info)359 int BluetoothA2dpSourceServer::SetCodecPreference(const RawAddress &device, const BluetoothA2dpCodecInfo &info)
360 {
361 HILOGI("BluetoothA2dpSourceServer::SetCodecPreference starts, codecPriority = %{public}u,"
362 "codecPriority = %{public}u, sampleRate = %{public}u, bitsPerSample = %{public}d, "
363 "channelMode = %{public}d, codecSpecific1 = %{public}llu, codecSpecific2 = %{public}llu, "
364 "codecSpecific3 = %{public}llu, codecSpecific4 = %{public}llu",
365 info.codecPriority, info.codecType, info.sampleRate, info.bitsPerSample, info.channelMode,
366 (unsigned long long)info.codecSpecific1, (unsigned long long)info.codecSpecific2,
367 (unsigned long long)info.codecSpecific3, (unsigned long long)info.codecSpecific4);
368 bluetooth::A2dpSrcCodecInfo setInfo;
369
370 setInfo.bitsPerSample = info.bitsPerSample;
371 setInfo.channelMode = info.channelMode;
372 setInfo.codecPriority = info.codecPriority;
373 setInfo.codecType = info.codecType;
374 setInfo.sampleRate = info.sampleRate;
375 setInfo.codecSpecific1 = info.codecSpecific1;
376 setInfo.codecSpecific2 = info.codecSpecific2;
377 setInfo.codecSpecific3 = info.codecSpecific3;
378 setInfo.codecSpecific4 = info.codecSpecific4;
379
380 return pimpl->a2dpSrcService_->SetCodecPreference(device, setInfo);
381 }
382
SwitchOptionalCodecs(const RawAddress &device, bool isEnable)383 void BluetoothA2dpSourceServer::SwitchOptionalCodecs(const RawAddress &device, bool isEnable)
384 {
385 HILOGI("addr: %{public}s, isEnable = %{public}d", GET_ENCRYPT_ADDR(device), isEnable);
386 pimpl->a2dpSrcService_->SwitchOptionalCodecs(device, isEnable);
387 }
388
GetOptionalCodecsSupportState(const RawAddress &device)389 int BluetoothA2dpSourceServer::GetOptionalCodecsSupportState(const RawAddress &device)
390 {
391 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
392 return pimpl->a2dpSrcService_->GetOptionalCodecsSupportState(device);
393 }
394
StartPlaying(const RawAddress &device)395 int BluetoothA2dpSourceServer::StartPlaying(const RawAddress &device)
396 {
397 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
398 return pimpl->a2dpSrcService_->StartPlaying(device);
399 }
400
SuspendPlaying(const RawAddress &device)401 int BluetoothA2dpSourceServer::SuspendPlaying(const RawAddress &device)
402 {
403 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
404 return pimpl->a2dpSrcService_->SuspendPlaying(device);
405 }
406
StopPlaying(const RawAddress &device)407 int BluetoothA2dpSourceServer::StopPlaying(const RawAddress &device)
408 {
409 HILOGI("addr: %{public}s", GET_ENCRYPT_ADDR(device));
410 return pimpl->a2dpSrcService_->StopPlaying(device);
411 }
412
WriteFrame(const uint8_t *data, uint32_t size)413 int BluetoothA2dpSourceServer::WriteFrame(const uint8_t *data, uint32_t size)
414 {
415 HILOGI("size = %{public}u", size);
416 return pimpl->a2dpSrcService_->WriteFrame(data, size);
417 }
418
GetRenderPosition(const RawAddress &device, uint32_t &delayValue, uint64_t &sendDataSize, uint32_t &timeStamp)419 int BluetoothA2dpSourceServer::GetRenderPosition(const RawAddress &device, uint32_t &delayValue, uint64_t &sendDataSize,
420 uint32_t &timeStamp)
421 {
422 HILOGI("starts");
423 int ret = pimpl->a2dpSrcService_->GetRenderPosition(device, delayValue, sendDataSize, timeStamp);
424 HILOGI("delayValue = %{public}u, sendDataSize = %{public}" PRIu64 ", timeStamp = %{public}u", delayValue,
425 sendDataSize, timeStamp);
426 return ret;
427 }
428
OffloadStartPlaying(const RawAddress &device, const std::vector<int32_t> &sessionsId)429 int BluetoothA2dpSourceServer::OffloadStartPlaying(const RawAddress &device, const std::vector<int32_t> &sessionsId)
430 {
431 return BT_ERR_API_NOT_SUPPORT;
432 }
433
OffloadStopPlaying(const RawAddress &device, const std::vector<int32_t> &sessionsId)434 int BluetoothA2dpSourceServer::OffloadStopPlaying(const RawAddress &device, const std::vector<int32_t> &sessionsId)
435 {
436 return BT_ERR_API_NOT_SUPPORT;
437 }
A2dpOffloadSessionPathRequest(const RawAddress &device, const std::vector<BluetoothA2dpStreamInfo> &info)438 int BluetoothA2dpSourceServer::A2dpOffloadSessionPathRequest(const RawAddress &device,
439 const std::vector<BluetoothA2dpStreamInfo> &info)
440 {
441 return BT_ERR_API_NOT_SUPPORT;
442 }
443
GetOffloadCodecStatus(const RawAddress &device)444 BluetoothA2dpOffloadCodecStatus BluetoothA2dpSourceServer::GetOffloadCodecStatus(const RawAddress &device)
445 {
446 BluetoothA2dpOffloadCodecStatus ret;
447 HILOGI("enter");
448 return ret;
449 }
450
EnableAutoPlay(const RawAddress &device)451 int BluetoothA2dpSourceServer::EnableAutoPlay(const RawAddress &device)
452 {
453 return BT_ERR_API_NOT_SUPPORT;
454 }
455
DisableAutoPlay(const RawAddress &device, const int duration)456 int BluetoothA2dpSourceServer::DisableAutoPlay(const RawAddress &device, const int duration)
457 {
458 return BT_ERR_API_NOT_SUPPORT;
459 }
460
GetAutoPlayDisabledDuration(const RawAddress &device, int &duration)461 int BluetoothA2dpSourceServer::GetAutoPlayDisabledDuration(const RawAddress &device, int &duration)
462 {
463 return BT_ERR_API_NOT_SUPPORT;
464 }
465
GetVirtualDeviceList(std::vector<std::string> &devices)466 void BluetoothA2dpSourceServer::GetVirtualDeviceList(std::vector<std::string> &devices)
467 {
468 return;
469 }
470
UpdateVirtualDevice(int32_t action, const std::string &address)471 void BluetoothA2dpSourceServer::UpdateVirtualDevice(int32_t action, const std::string &address)
472 {
473 return;
474 }
475 } // namespace Bluetooth
476 } // namespace OHOS
477