1/* 2 * Copyright (c) 2021 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 <hdf_log.h> 16#include "audio_adapter_info_common.h" 17#include "audio_internal.h" 18#include "audio_bluetooth_manager.h" 19#include "fast_audio_render.h" 20namespace OHOS::HDI::Audio_Bluetooth { 21int32_t AudioManagerGetAllAdapters(struct AudioManager *manager, 22 struct AudioAdapterDescriptor **descs, 23 int *size) 24{ 25 int32_t ret; 26 HDF_LOGD("%s", __func__); 27 if (manager == NULL || descs == NULL || size == NULL) { 28 return AUDIO_HAL_ERR_INVALID_PARAM; 29 } 30 ret = AudioAdaptersForUser(descs, size); 31 if (ret < 0) { 32 HDF_LOGE("AudioAdaptersForUser FAIL!"); 33 return AUDIO_HAL_ERR_NOTREADY; // Failed to read sound card configuration file 34 } 35 return AUDIO_HAL_SUCCESS; 36} 37 38int32_t AudioManagerLoadAdapter(struct AudioManager *manager, const struct AudioAdapterDescriptor *desc, 39 struct AudioAdapter **adapter) 40{ 41 HDF_LOGD("%s", __func__); 42 if (manager == NULL || desc == NULL || desc->adapterName == NULL || desc->ports == NULL || adapter == NULL) { 43 return AUDIO_HAL_ERR_INVALID_PARAM; 44 } 45 HDF_LOGI("%s: adapter name %s", __func__, desc->adapterName); 46 if (AudioAdapterExist(desc->adapterName)) { 47 HDF_LOGE("%s: not supported this adapter %s", __func__, desc->adapterName); 48 return AUDIO_HAL_ERR_INTERNAL; 49 } 50 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(calloc(1, sizeof(*hwAdapter))); 51 if (hwAdapter == NULL) { 52 HDF_LOGE("%s: calloc AudioHwAdapter failed", __func__); 53 return AUDIO_HAL_ERR_MALLOC_FAIL; 54 } 55 hwAdapter->common.InitAllPorts = AudioAdapterInitAllPorts; 56 hwAdapter->common.CreateRender = AudioAdapterCreateRender; 57 hwAdapter->common.DestroyRender = AudioAdapterDestroyRender; 58 hwAdapter->common.GetPortCapability = AudioAdapterGetPortCapability; 59 hwAdapter->common.SetPassthroughMode = AudioAdapterSetPassthroughMode; 60 hwAdapter->common.GetPassthroughMode = AudioAdapterGetPassthroughMode; 61 hwAdapter->common.SetExtraParams = AudioAdapterSetExtraParams; 62 hwAdapter->common.GetExtraParams = AudioAdapterGetExtraParams; 63 *adapter = &hwAdapter->common; 64 hwAdapter->adapterDescriptor = *desc; 65 hwAdapter->adapterMgrRenderFlag = 0; // The adapterMgrRenderFlag init is zero 66 67 HDF_LOGI("%s call bluetooth RegisterObserver interface", __func__); 68#ifndef A2DP_HDI_SERVICE 69 OHOS::Bluetooth::GetProxy(); 70 OHOS::Bluetooth::RegisterObserver(); 71#else 72 bool ret = false; 73 if (strcmp(desc->adapterName, "bt_a2dp_fast") == 0) { 74 HDF_LOGI("%{public}s, fast set up", __func__); 75 ret = OHOS::Bluetooth::FastSetUp(); 76 } else { 77 HDF_LOGI("%{public}s, normal set up", __func__); 78 ret = OHOS::Bluetooth::SetUp(); 79 } 80 if (!ret) { 81 return AUDIO_HAL_ERR_INTERNAL; 82 } 83#endif 84 85 return AUDIO_HAL_SUCCESS; 86} 87 88void AudioManagerUnloadAdapter(struct AudioManager *manager, struct AudioAdapter *adapter) 89{ 90 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter); 91 if (manager == NULL || hwAdapter == NULL) { 92 return; 93 } 94#ifdef A2DP_HDI_SERVICE 95 bool isFastAdapter = (strcmp(hwAdapter->adapterDescriptor.adapterName, "bt_a2dp_fast") == 0); 96#endif 97 if (hwAdapter->portCapabilitys != NULL) { 98 int32_t portNum = hwAdapter->adapterDescriptor.portNum; 99 int32_t i = 0; 100 while (i < portNum) { 101 if (&hwAdapter->portCapabilitys[i] != NULL) { 102 AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts); 103 } 104 i++; 105 } 106 AudioMemFree(reinterpret_cast<void **>(&hwAdapter->portCapabilitys)); 107 } 108 AudioMemFree(reinterpret_cast<void **>(&adapter)); 109 110 HDF_LOGI("%s call bluetooth DeRegisterObserver interface", __func__); 111#ifndef A2DP_HDI_SERVICE 112 OHOS::Bluetooth::DeRegisterObserver(); 113#else 114 if (isFastAdapter) { 115 OHOS::Bluetooth::FastTearDown(); 116 } else { 117 OHOS::Bluetooth::TearDown(); 118 } 119#endif 120} 121 122static struct AudioManager g_audioManagerFuncs = { 123 .GetAllAdapters = AudioManagerGetAllAdapters, 124 .LoadAdapter = AudioManagerLoadAdapter, 125 .UnloadAdapter = AudioManagerUnloadAdapter, 126}; 127 128struct AudioManager *GetAudioManagerFuncs(void) 129{ 130 return &g_audioManagerFuncs; 131} 132}