150a07fd2Sopenharmony_ci/*
250a07fd2Sopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
350a07fd2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
450a07fd2Sopenharmony_ci * you may not use this file except in compliance with the License.
550a07fd2Sopenharmony_ci * You may obtain a copy of the License at
650a07fd2Sopenharmony_ci *
750a07fd2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
850a07fd2Sopenharmony_ci *
950a07fd2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1050a07fd2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1150a07fd2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1250a07fd2Sopenharmony_ci * See the License for the specific language governing permissions and
1350a07fd2Sopenharmony_ci * limitations under the License.
1450a07fd2Sopenharmony_ci */
1550a07fd2Sopenharmony_ci
1650a07fd2Sopenharmony_ci#include "daudio_handler.h"
1750a07fd2Sopenharmony_ci
1850a07fd2Sopenharmony_ci#include <vector>
1950a07fd2Sopenharmony_ci
2050a07fd2Sopenharmony_ci#include "audio_system_manager.h"
2150a07fd2Sopenharmony_ci#include "string_ex.h"
2250a07fd2Sopenharmony_ci
2350a07fd2Sopenharmony_ci#include "daudio_constants.h"
2450a07fd2Sopenharmony_ci#include "daudio_errorcode.h"
2550a07fd2Sopenharmony_ci#include "daudio_log.h"
2650a07fd2Sopenharmony_ci#include "daudio_util.h"
2750a07fd2Sopenharmony_ci
2850a07fd2Sopenharmony_ci#undef DH_LOG_TAG
2950a07fd2Sopenharmony_ci#define DH_LOG_TAG "DAudioHandler"
3050a07fd2Sopenharmony_ci
3150a07fd2Sopenharmony_cinamespace OHOS {
3250a07fd2Sopenharmony_cinamespace DistributedHardware {
3350a07fd2Sopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(DAudioHandler);
3450a07fd2Sopenharmony_ci
3550a07fd2Sopenharmony_ciDAudioHandler::DAudioHandler()
3650a07fd2Sopenharmony_ci{
3750a07fd2Sopenharmony_ci    DHLOGD("Distributed audio handler constructed.");
3850a07fd2Sopenharmony_ci}
3950a07fd2Sopenharmony_ci
4050a07fd2Sopenharmony_ciDAudioHandler::~DAudioHandler()
4150a07fd2Sopenharmony_ci{
4250a07fd2Sopenharmony_ci    DHLOGD("Distributed audio handler deconstructed.");
4350a07fd2Sopenharmony_ci}
4450a07fd2Sopenharmony_ci
4550a07fd2Sopenharmony_ciint32_t DAudioHandler::Initialize()
4650a07fd2Sopenharmony_ci{
4750a07fd2Sopenharmony_ci    DHLOGI("Distributed audio handler initialize.");
4850a07fd2Sopenharmony_ci    return QueryAudioInfo();
4950a07fd2Sopenharmony_ci}
5050a07fd2Sopenharmony_ci
5150a07fd2Sopenharmony_cibool DAudioHandler::AddItemsToObject(DHItem &dhItem, cJSON* infoJson, const int32_t &dhId)
5250a07fd2Sopenharmony_ci{
5350a07fd2Sopenharmony_ci    DHLOGD("Get dhId and then add other items into cjson object");
5450a07fd2Sopenharmony_ci    int32_t deviceType = GetDevTypeByDHId(dhId);
5550a07fd2Sopenharmony_ci    if (deviceType == AUDIO_DEVICE_TYPE_MIC) {
5650a07fd2Sopenharmony_ci        dhItem.subtype = "mic";
5750a07fd2Sopenharmony_ci        cJSON *sampleArray = cJSON_CreateArray();
5850a07fd2Sopenharmony_ci        CHECK_NULL_RETURN(sampleArray, false);
5950a07fd2Sopenharmony_ci        cJSON_AddItemToObject(infoJson, "SampleRates", sampleArray);
6050a07fd2Sopenharmony_ci        for (const auto &value : micInfos_.sampleRates) {
6150a07fd2Sopenharmony_ci            cJSON_AddItemToArray(sampleArray, cJSON_CreateNumber(static_cast<uint32_t>(value)));
6250a07fd2Sopenharmony_ci        }
6350a07fd2Sopenharmony_ci
6450a07fd2Sopenharmony_ci        cJSON *channelArray = cJSON_CreateArray();
6550a07fd2Sopenharmony_ci        CHECK_NULL_RETURN(channelArray, false);
6650a07fd2Sopenharmony_ci        cJSON_AddItemToObject(infoJson, "ChannelMasks", channelArray);
6750a07fd2Sopenharmony_ci        for (const auto &value : micInfos_.channels) {
6850a07fd2Sopenharmony_ci            cJSON_AddItemToArray(channelArray, cJSON_CreateNumber(static_cast<uint32_t>(value)));
6950a07fd2Sopenharmony_ci        }
7050a07fd2Sopenharmony_ci
7150a07fd2Sopenharmony_ci        cJSON *formatsArray = cJSON_CreateArray();
7250a07fd2Sopenharmony_ci        CHECK_NULL_RETURN(formatsArray, false);
7350a07fd2Sopenharmony_ci        cJSON_AddItemToObject(infoJson, "Formats", formatsArray);
7450a07fd2Sopenharmony_ci        for (const auto &value : micInfos_.formats) {
7550a07fd2Sopenharmony_ci            cJSON_AddItemToArray(formatsArray, cJSON_CreateNumber(static_cast<uint32_t>(value)));
7650a07fd2Sopenharmony_ci        }
7750a07fd2Sopenharmony_ci    } else if (deviceType == AUDIO_DEVICE_TYPE_SPEAKER) {
7850a07fd2Sopenharmony_ci        dhItem.subtype = "speaker";
7950a07fd2Sopenharmony_ci        cJSON *sampleArray = cJSON_CreateArray();
8050a07fd2Sopenharmony_ci        CHECK_NULL_RETURN(sampleArray, false);
8150a07fd2Sopenharmony_ci        cJSON_AddItemToObject(infoJson, "SampleRates", sampleArray);
8250a07fd2Sopenharmony_ci        for (const auto &value : spkInfos_.sampleRates) {
8350a07fd2Sopenharmony_ci            cJSON_AddItemToArray(sampleArray, cJSON_CreateNumber(static_cast<uint32_t>(value)));
8450a07fd2Sopenharmony_ci        }
8550a07fd2Sopenharmony_ci
8650a07fd2Sopenharmony_ci        cJSON *channelArray = cJSON_CreateArray();
8750a07fd2Sopenharmony_ci        CHECK_NULL_RETURN(channelArray, false);
8850a07fd2Sopenharmony_ci        cJSON_AddItemToObject(infoJson, "ChannelMasks", channelArray);
8950a07fd2Sopenharmony_ci        for (const auto &value : spkInfos_.channels) {
9050a07fd2Sopenharmony_ci            cJSON_AddItemToArray(channelArray, cJSON_CreateNumber(static_cast<uint32_t>(value)));
9150a07fd2Sopenharmony_ci        }
9250a07fd2Sopenharmony_ci
9350a07fd2Sopenharmony_ci        cJSON *formatsArray = cJSON_CreateArray();
9450a07fd2Sopenharmony_ci        CHECK_NULL_RETURN(formatsArray, false);
9550a07fd2Sopenharmony_ci        cJSON_AddItemToObject(infoJson, "Formats", formatsArray);
9650a07fd2Sopenharmony_ci        for (const auto &value : spkInfos_.formats) {
9750a07fd2Sopenharmony_ci            cJSON_AddItemToArray(formatsArray, cJSON_CreateNumber(static_cast<uint32_t>(value)));
9850a07fd2Sopenharmony_ci        }
9950a07fd2Sopenharmony_ci    }
10050a07fd2Sopenharmony_ci    return true;
10150a07fd2Sopenharmony_ci}
10250a07fd2Sopenharmony_ci
10350a07fd2Sopenharmony_cistd::vector<DHItem> DAudioHandler::QueryMeta()
10450a07fd2Sopenharmony_ci{
10550a07fd2Sopenharmony_ci    DHLOGI("Query meta distributed hardware information.");
10650a07fd2Sopenharmony_ci    return RealQuery(KEY_TYPE_META);
10750a07fd2Sopenharmony_ci}
10850a07fd2Sopenharmony_ci
10950a07fd2Sopenharmony_cistd::vector<DHItem> DAudioHandler::Query()
11050a07fd2Sopenharmony_ci{
11150a07fd2Sopenharmony_ci    DHLOGI("Query full distributed hardware information.");
11250a07fd2Sopenharmony_ci    return RealQuery(KEY_TYPE_FULL);
11350a07fd2Sopenharmony_ci}
11450a07fd2Sopenharmony_ci
11550a07fd2Sopenharmony_cistd::vector<DHItem> DAudioHandler::RealQuery(const std::string &dataType)
11650a07fd2Sopenharmony_ci{
11750a07fd2Sopenharmony_ci    auto audioSrv = AudioStandard::AudioSystemManager::GetInstance();
11850a07fd2Sopenharmony_ci    std::vector<DHItem> dhItemVec;
11950a07fd2Sopenharmony_ci    CHECK_AND_RETURN_RET_LOG(audioSrv == nullptr, dhItemVec, "Unable to get audio system manager.");
12050a07fd2Sopenharmony_ci    auto audioDevices = audioSrv->GetDevices(AudioStandard::DeviceFlag::ALL_DEVICES_FLAG);
12150a07fd2Sopenharmony_ci    for (auto dev : audioDevices) {
12250a07fd2Sopenharmony_ci        if (dev == nullptr) {
12350a07fd2Sopenharmony_ci            continue;
12450a07fd2Sopenharmony_ci        }
12550a07fd2Sopenharmony_ci        auto dhId = audioSrv->GetPinValueFromType(dev->deviceType_, dev->deviceRole_);
12650a07fd2Sopenharmony_ci        if (dhId != DEFAULT_RENDER_ID && dhId != DEFAULT_CAPTURE_ID) {
12750a07fd2Sopenharmony_ci            continue;
12850a07fd2Sopenharmony_ci        }
12950a07fd2Sopenharmony_ci
13050a07fd2Sopenharmony_ci        cJSON* infoJson = cJSON_CreateObject();
13150a07fd2Sopenharmony_ci        if (infoJson == nullptr) {
13250a07fd2Sopenharmony_ci            DHLOGE("Failed to create cJSON object.");
13350a07fd2Sopenharmony_ci            return dhItemVec;
13450a07fd2Sopenharmony_ci        }
13550a07fd2Sopenharmony_ci        DHItem dhItem;
13650a07fd2Sopenharmony_ci        if (!AddItemsToObject(dhItem, infoJson, dhId)) {
13750a07fd2Sopenharmony_ci            cJSON_Delete(infoJson);
13850a07fd2Sopenharmony_ci            return dhItemVec;
13950a07fd2Sopenharmony_ci        }
14050a07fd2Sopenharmony_ci        cJSON_AddNumberToObject(infoJson, INTERRUPT_GROUP_ID, dev->interruptGroupId_);
14150a07fd2Sopenharmony_ci        cJSON_AddNumberToObject(infoJson, VOLUME_GROUP_ID, dev->volumeGroupId_);
14250a07fd2Sopenharmony_ci        cJSON_AddStringToObject(infoJson, KEY_DATATYPE, dataType.c_str());
14350a07fd2Sopenharmony_ci        dhItem.dhId = std::to_string(dhId);
14450a07fd2Sopenharmony_ci        char *jsonInfo = cJSON_Print(infoJson);
14550a07fd2Sopenharmony_ci        if (jsonInfo == NULL) {
14650a07fd2Sopenharmony_ci            DHLOGE("Failed to create JSON data.");
14750a07fd2Sopenharmony_ci            cJSON_Delete(infoJson);
14850a07fd2Sopenharmony_ci            return dhItemVec;
14950a07fd2Sopenharmony_ci        }
15050a07fd2Sopenharmony_ci        dhItem.attrs = jsonInfo;
15150a07fd2Sopenharmony_ci        dhItemVec.push_back(dhItem);
15250a07fd2Sopenharmony_ci        DHLOGD("Query result: dhId: %{public}d, subtype: %{public}s, attrs: %{public}s.",
15350a07fd2Sopenharmony_ci            dhId, dhItem.subtype.c_str(), jsonInfo);
15450a07fd2Sopenharmony_ci        if (dhId == DEFAULT_RENDER_ID) {
15550a07fd2Sopenharmony_ci            dhItem.dhId = std::to_string(LOW_LATENCY_RENDER_ID);
15650a07fd2Sopenharmony_ci            dhItemVec.push_back(dhItem);
15750a07fd2Sopenharmony_ci            DHLOGD("Query result: dhId: %{public}d, attrs: %{public}s.", LOW_LATENCY_RENDER_ID, jsonInfo);
15850a07fd2Sopenharmony_ci        }
15950a07fd2Sopenharmony_ci        cJSON_Delete(infoJson);
16050a07fd2Sopenharmony_ci        cJSON_free(jsonInfo);
16150a07fd2Sopenharmony_ci    }
16250a07fd2Sopenharmony_ci    DHLOGD("Query result: size: (%{public}zu).", dhItemVec.size());
16350a07fd2Sopenharmony_ci    ablityForDumpVec_ = dhItemVec;
16450a07fd2Sopenharmony_ci    return dhItemVec;
16550a07fd2Sopenharmony_ci}
16650a07fd2Sopenharmony_ci
16750a07fd2Sopenharmony_cistd::vector<DHItem> DAudioHandler::ablityForDump()
16850a07fd2Sopenharmony_ci{
16950a07fd2Sopenharmony_ci    DHLOGD("Get audio ablity for dump.");
17050a07fd2Sopenharmony_ci    if (ablityForDumpVec_.size() > 0) {
17150a07fd2Sopenharmony_ci        return ablityForDumpVec_;
17250a07fd2Sopenharmony_ci    }
17350a07fd2Sopenharmony_ci    Initialize();
17450a07fd2Sopenharmony_ci    Query();
17550a07fd2Sopenharmony_ci    return ablityForDumpVec_;
17650a07fd2Sopenharmony_ci}
17750a07fd2Sopenharmony_ci
17850a07fd2Sopenharmony_ciint32_t DAudioHandler::QueryAudioInfo()
17950a07fd2Sopenharmony_ci{
18050a07fd2Sopenharmony_ci    DHLOGD("Start to query codec information.");
18150a07fd2Sopenharmony_ci    micInfos_.sampleRates = OHOS::AudioStandard::AudioCapturer::GetSupportedSamplingRates();
18250a07fd2Sopenharmony_ci    micInfos_.formats = OHOS::AudioStandard::AudioCapturer::GetSupportedFormats();
18350a07fd2Sopenharmony_ci    micInfos_.channels = OHOS::AudioStandard::AudioCapturer::GetSupportedChannels();
18450a07fd2Sopenharmony_ci    spkInfos_.sampleRates = OHOS::AudioStandard::AudioRenderer::GetSupportedSamplingRates();
18550a07fd2Sopenharmony_ci    spkInfos_.formats = OHOS::AudioStandard::AudioRenderer::GetSupportedFormats();
18650a07fd2Sopenharmony_ci    spkInfos_.channels = OHOS::AudioStandard::AudioRenderer::GetSupportedChannels();
18750a07fd2Sopenharmony_ci    return DH_SUCCESS;
18850a07fd2Sopenharmony_ci}
18950a07fd2Sopenharmony_ci
19050a07fd2Sopenharmony_cistd::map<std::string, std::string> DAudioHandler::QueryExtraInfo()
19150a07fd2Sopenharmony_ci{
19250a07fd2Sopenharmony_ci    DHLOGD("Query extra information");
19350a07fd2Sopenharmony_ci    std::map<std::string, std::string> extraInfo;
19450a07fd2Sopenharmony_ci    return extraInfo;
19550a07fd2Sopenharmony_ci}
19650a07fd2Sopenharmony_ci
19750a07fd2Sopenharmony_cibool DAudioHandler::IsSupportPlugin()
19850a07fd2Sopenharmony_ci{
19950a07fd2Sopenharmony_ci    DHLOGD("Is support plug in");
20050a07fd2Sopenharmony_ci    return false;
20150a07fd2Sopenharmony_ci}
20250a07fd2Sopenharmony_ci
20350a07fd2Sopenharmony_civoid DAudioHandler::RegisterPluginListener(std::shared_ptr<PluginListener> listener)
20450a07fd2Sopenharmony_ci{
20550a07fd2Sopenharmony_ci    DHLOGI("Register plugin listener");
20650a07fd2Sopenharmony_ci    CHECK_NULL_VOID(listener);
20750a07fd2Sopenharmony_ci    listener_ = listener;
20850a07fd2Sopenharmony_ci}
20950a07fd2Sopenharmony_ci
21050a07fd2Sopenharmony_civoid DAudioHandler::UnRegisterPluginListener()
21150a07fd2Sopenharmony_ci{
21250a07fd2Sopenharmony_ci    DHLOGI("UnRegister plugin listener");
21350a07fd2Sopenharmony_ci    listener_ = nullptr;
21450a07fd2Sopenharmony_ci}
21550a07fd2Sopenharmony_ci
21650a07fd2Sopenharmony_ciIHardwareHandler* GetHardwareHandler()
21750a07fd2Sopenharmony_ci{
21850a07fd2Sopenharmony_ci    return &DAudioHandler::GetInstance();
21950a07fd2Sopenharmony_ci}
22050a07fd2Sopenharmony_ci} // namespace DistributedHardware
22150a07fd2Sopenharmony_ci} // namespace OHOS
222