/* * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "bluetooth_a2dp_impl.h" #include "bluetooth_a2dp_src.h" #include "bluetooth_a2dp_utils.h" #include "bluetooth_errorcode.h" #include "cj_lambda.h" #include "napi_bluetooth_utils.h" namespace OHOS { namespace Bluetooth { std::shared_ptr A2dpSourceProfileImpl::observer_ = std::make_shared(); bool A2dpSourceProfileImpl::isRegistered_ = false; int32_t A2dpSourceProfileImpl::GetPlayingState(char* deviceId, int32_t* errCode) { int32_t state = PlayingState::STATE_NOT_PLAYING; std::string remoteAddr = deviceId; if (!IsValidAddress(remoteAddr)) { *errCode = BT_ERR_INVALID_PARAM; return state; } int transport = BT_TRANSPORT_BREDR; BluetoothRemoteDevice remoteDevice = BluetoothRemoteDevice(remoteAddr, transport); A2dpSource* profile = A2dpSource::GetProfile(); *errCode = profile->GetPlayingState(remoteDevice, state); return state; } CArrString A2dpSourceProfileImpl::GetConnectionDevices(int32_t* errCode) { HILOGI("enter"); A2dpSource* profile = A2dpSource::GetProfile(); std::vector states; states.push_back(1); std::vector devices; int errorCode = profile->GetDevicesByStates(states, devices); if (errorCode != BT_NO_ERROR) { *errCode = static_cast(errorCode); return CArrString { 0 }; } if (devices.size() <= 0) { return CArrString { 0 }; } char** deviceVector = static_cast(malloc(sizeof(char*) * devices.size())); if (deviceVector == nullptr) { return CArrString { 0 }; } int64_t i = 0; for (auto& device : devices) { deviceVector[i] = MallocCString(device.GetDeviceAddr()); if (deviceVector[i] == nullptr) { for (int64_t j = 0; j < i; j++) { free(deviceVector[j]); } free(deviceVector); *errCode = static_cast(BT_ERR_BASE_SYSCAP); return CArrString { 0 }; } i++; } CArrString ret = CArrString { .head = deviceVector, .size = i }; return ret; } int32_t A2dpSourceProfileImpl::GetConnectionState(char* device, int32_t* errCode) { HILOGI("enter"); std::string deviceId = device; A2dpSource* profile = A2dpSource::GetProfile(); BluetoothRemoteDevice remoteDevice(deviceId, 1); int btConnectState = static_cast(BTConnectState::DISCONNECTED); int errorCode = profile->GetDeviceState(remoteDevice, btConnectState); if (errorCode != BT_NO_ERROR) { *errCode = static_cast(errorCode); return ProfileConnectionState::STATE_DISCONNECTED; } return GetProfileConnectionState(btConnectState); } void A2dpSourceProfileImpl::On(int32_t type, int64_t id, int32_t* errCode) { if (observer_) { auto observerFunc = CJLambda::Create(reinterpret_cast(id)); if (!observerFunc) { HILOGD("Register state change event failed"); *errCode = BT_ERR_INVALID_PARAM; return; } observer_->RegisterStateChangeFunc(observerFunc); } if (!isRegistered_) { A2dpSource* profile = A2dpSource::GetProfile(); profile->RegisterObserver(observer_); isRegistered_ = true; } } } // namespace Bluetooth } // namespace OHOS