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}