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