1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci#include <hdf_log.h> 16094332d3Sopenharmony_ci#include "audio_adapter_info_common.h" 17094332d3Sopenharmony_ci#include "audio_internal.h" 18094332d3Sopenharmony_ci#include "audio_bluetooth_manager.h" 19094332d3Sopenharmony_ci#include "fast_audio_render.h" 20094332d3Sopenharmony_cinamespace OHOS::HDI::Audio_Bluetooth { 21094332d3Sopenharmony_ciint32_t AudioManagerGetAllAdapters(struct AudioManager *manager, 22094332d3Sopenharmony_ci struct AudioAdapterDescriptor **descs, 23094332d3Sopenharmony_ci int *size) 24094332d3Sopenharmony_ci{ 25094332d3Sopenharmony_ci int32_t ret; 26094332d3Sopenharmony_ci HDF_LOGD("%s", __func__); 27094332d3Sopenharmony_ci if (manager == NULL || descs == NULL || size == NULL) { 28094332d3Sopenharmony_ci return AUDIO_HAL_ERR_INVALID_PARAM; 29094332d3Sopenharmony_ci } 30094332d3Sopenharmony_ci ret = AudioAdaptersForUser(descs, size); 31094332d3Sopenharmony_ci if (ret < 0) { 32094332d3Sopenharmony_ci HDF_LOGE("AudioAdaptersForUser FAIL!"); 33094332d3Sopenharmony_ci return AUDIO_HAL_ERR_NOTREADY; // Failed to read sound card configuration file 34094332d3Sopenharmony_ci } 35094332d3Sopenharmony_ci return AUDIO_HAL_SUCCESS; 36094332d3Sopenharmony_ci} 37094332d3Sopenharmony_ci 38094332d3Sopenharmony_ciint32_t AudioManagerLoadAdapter(struct AudioManager *manager, const struct AudioAdapterDescriptor *desc, 39094332d3Sopenharmony_ci struct AudioAdapter **adapter) 40094332d3Sopenharmony_ci{ 41094332d3Sopenharmony_ci HDF_LOGD("%s", __func__); 42094332d3Sopenharmony_ci if (manager == NULL || desc == NULL || desc->adapterName == NULL || desc->ports == NULL || adapter == NULL) { 43094332d3Sopenharmony_ci return AUDIO_HAL_ERR_INVALID_PARAM; 44094332d3Sopenharmony_ci } 45094332d3Sopenharmony_ci HDF_LOGI("%s: adapter name %s", __func__, desc->adapterName); 46094332d3Sopenharmony_ci if (AudioAdapterExist(desc->adapterName)) { 47094332d3Sopenharmony_ci HDF_LOGE("%s: not supported this adapter %s", __func__, desc->adapterName); 48094332d3Sopenharmony_ci return AUDIO_HAL_ERR_INTERNAL; 49094332d3Sopenharmony_ci } 50094332d3Sopenharmony_ci struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(calloc(1, sizeof(*hwAdapter))); 51094332d3Sopenharmony_ci if (hwAdapter == NULL) { 52094332d3Sopenharmony_ci HDF_LOGE("%s: calloc AudioHwAdapter failed", __func__); 53094332d3Sopenharmony_ci return AUDIO_HAL_ERR_MALLOC_FAIL; 54094332d3Sopenharmony_ci } 55094332d3Sopenharmony_ci hwAdapter->common.InitAllPorts = AudioAdapterInitAllPorts; 56094332d3Sopenharmony_ci hwAdapter->common.CreateRender = AudioAdapterCreateRender; 57094332d3Sopenharmony_ci hwAdapter->common.DestroyRender = AudioAdapterDestroyRender; 58094332d3Sopenharmony_ci hwAdapter->common.GetPortCapability = AudioAdapterGetPortCapability; 59094332d3Sopenharmony_ci hwAdapter->common.SetPassthroughMode = AudioAdapterSetPassthroughMode; 60094332d3Sopenharmony_ci hwAdapter->common.GetPassthroughMode = AudioAdapterGetPassthroughMode; 61094332d3Sopenharmony_ci hwAdapter->common.SetExtraParams = AudioAdapterSetExtraParams; 62094332d3Sopenharmony_ci hwAdapter->common.GetExtraParams = AudioAdapterGetExtraParams; 63094332d3Sopenharmony_ci *adapter = &hwAdapter->common; 64094332d3Sopenharmony_ci hwAdapter->adapterDescriptor = *desc; 65094332d3Sopenharmony_ci hwAdapter->adapterMgrRenderFlag = 0; // The adapterMgrRenderFlag init is zero 66094332d3Sopenharmony_ci 67094332d3Sopenharmony_ci HDF_LOGI("%s call bluetooth RegisterObserver interface", __func__); 68094332d3Sopenharmony_ci#ifndef A2DP_HDI_SERVICE 69094332d3Sopenharmony_ci OHOS::Bluetooth::GetProxy(); 70094332d3Sopenharmony_ci OHOS::Bluetooth::RegisterObserver(); 71094332d3Sopenharmony_ci#else 72094332d3Sopenharmony_ci bool ret = false; 73094332d3Sopenharmony_ci if (strcmp(desc->adapterName, "bt_a2dp_fast") == 0) { 74094332d3Sopenharmony_ci HDF_LOGI("%{public}s, fast set up", __func__); 75094332d3Sopenharmony_ci ret = OHOS::Bluetooth::FastSetUp(); 76094332d3Sopenharmony_ci } else { 77094332d3Sopenharmony_ci HDF_LOGI("%{public}s, normal set up", __func__); 78094332d3Sopenharmony_ci ret = OHOS::Bluetooth::SetUp(); 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci if (!ret) { 81094332d3Sopenharmony_ci return AUDIO_HAL_ERR_INTERNAL; 82094332d3Sopenharmony_ci } 83094332d3Sopenharmony_ci#endif 84094332d3Sopenharmony_ci 85094332d3Sopenharmony_ci return AUDIO_HAL_SUCCESS; 86094332d3Sopenharmony_ci} 87094332d3Sopenharmony_ci 88094332d3Sopenharmony_civoid AudioManagerUnloadAdapter(struct AudioManager *manager, struct AudioAdapter *adapter) 89094332d3Sopenharmony_ci{ 90094332d3Sopenharmony_ci struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter); 91094332d3Sopenharmony_ci if (manager == NULL || hwAdapter == NULL) { 92094332d3Sopenharmony_ci return; 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci#ifdef A2DP_HDI_SERVICE 95094332d3Sopenharmony_ci bool isFastAdapter = (strcmp(hwAdapter->adapterDescriptor.adapterName, "bt_a2dp_fast") == 0); 96094332d3Sopenharmony_ci#endif 97094332d3Sopenharmony_ci if (hwAdapter->portCapabilitys != NULL) { 98094332d3Sopenharmony_ci int32_t portNum = hwAdapter->adapterDescriptor.portNum; 99094332d3Sopenharmony_ci int32_t i = 0; 100094332d3Sopenharmony_ci while (i < portNum) { 101094332d3Sopenharmony_ci if (&hwAdapter->portCapabilitys[i] != NULL) { 102094332d3Sopenharmony_ci AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts); 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci i++; 105094332d3Sopenharmony_ci } 106094332d3Sopenharmony_ci AudioMemFree(reinterpret_cast<void **>(&hwAdapter->portCapabilitys)); 107094332d3Sopenharmony_ci } 108094332d3Sopenharmony_ci AudioMemFree(reinterpret_cast<void **>(&adapter)); 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_ci HDF_LOGI("%s call bluetooth DeRegisterObserver interface", __func__); 111094332d3Sopenharmony_ci#ifndef A2DP_HDI_SERVICE 112094332d3Sopenharmony_ci OHOS::Bluetooth::DeRegisterObserver(); 113094332d3Sopenharmony_ci#else 114094332d3Sopenharmony_ci if (isFastAdapter) { 115094332d3Sopenharmony_ci OHOS::Bluetooth::FastTearDown(); 116094332d3Sopenharmony_ci } else { 117094332d3Sopenharmony_ci OHOS::Bluetooth::TearDown(); 118094332d3Sopenharmony_ci } 119094332d3Sopenharmony_ci#endif 120094332d3Sopenharmony_ci} 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_cistatic struct AudioManager g_audioManagerFuncs = { 123094332d3Sopenharmony_ci .GetAllAdapters = AudioManagerGetAllAdapters, 124094332d3Sopenharmony_ci .LoadAdapter = AudioManagerLoadAdapter, 125094332d3Sopenharmony_ci .UnloadAdapter = AudioManagerUnloadAdapter, 126094332d3Sopenharmony_ci}; 127094332d3Sopenharmony_ci 128094332d3Sopenharmony_cistruct AudioManager *GetAudioManagerFuncs(void) 129094332d3Sopenharmony_ci{ 130094332d3Sopenharmony_ci return &g_audioManagerFuncs; 131094332d3Sopenharmony_ci} 132094332d3Sopenharmony_ci}