diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h index 087a405fca5d18dd321014f151dc81523ba23634..42eea2824ed10bea8ffc8467015d10324b016431 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h @@ -130,6 +130,7 @@ private: inline bool IsIdValid(const uint32_t id); bool CheckRendersValid(); bool CheckCapsValid(); + bool CheckDevCapability(const AudioDeviceDescriptor &desc); void SetDumpFlag(bool isRender); sptr MatchStreamCallback(const AudioSampleAttributes &attrs, const AudioDeviceDescriptor &desc, int32_t &dhId); diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h index 7056d9b395d1ee849d51bd1e82563dd7ba2e19ce..5bec7a211f856331237df581eb0aed702b216ecc 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h @@ -74,7 +74,7 @@ public: int32_t IsSupportsPauseAndResume(bool &supportPause, bool &supportResume) override; const AudioDeviceDescriptor &GetCaptureDesc() override; void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, - const AudioSampleAttributes &attrs, const sptr &callback) override; + const AudioSampleAttributes &attrs, const sptr &callback, const int32_t dhId) override; void SetDumpFlagInner() override; private: diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h index 8cb3cb3ce96136dbf4eb74ce63fcebf6581eb857..dbd4192712027ed0fe7884d771a7a5fbfb61a716 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h @@ -44,7 +44,7 @@ public: virtual const AudioDeviceDescriptor &GetCaptureDesc() = 0; virtual void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, - const AudioSampleAttributes &attrs, const sptr &callback) = 0; + const AudioSampleAttributes &attrs, const sptr &callback, const int32_t dhId) = 0; virtual void SetDumpFlagInner() = 0; }; } // V1_0 diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h index ff2d77431299bdf17efa319961a857571ef8e8b6..53e90478d61e68df221d0bd100cef391c38246ad 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h @@ -92,7 +92,7 @@ public: uint32_t GetMaxVolumeInner() override; uint32_t GetMinVolumeInner() override; void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, - const AudioSampleAttributes &attrs, const sptr &callback) override; + const AudioSampleAttributes &attrs, const sptr &callback, const int32_t dhId) override; void SetDumpFlagInner() override; private: diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h index 3675951b962af96354848e71ce56aac42dcb29e2..9915b950f508707afdf82f5c1a8e3449b714f4bb 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h @@ -52,7 +52,7 @@ public: virtual uint32_t GetMaxVolumeInner() = 0; virtual uint32_t GetMinVolumeInner() = 0; virtual void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, - const AudioSampleAttributes &attrs, const sptr &callback) = 0; + const AudioSampleAttributes &attrs, const sptr &callback, const int32_t dhId) = 0; virtual void SetDumpFlagInner() = 0; }; } // V1_0 diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp index c3c94e96a5d816d03f9c1a1edb1584d9b6b644b1..bdd6cc0e2b5c628c6f2ff2f264a289ba8d2f2821 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp @@ -97,12 +97,9 @@ int32_t AudioAdapterInterfaceImpl::CreateRender(const AudioDeviceDescriptor &des desc.pins, attrs.sampleRate, attrs.channelCount, attrs.format, static_cast(attrs.type)); render = nullptr; sptr audioRender = nullptr; - { - std::lock_guard devLck(devMapMtx_); - if (mapAudioDevice_.find(desc.pins) == mapAudioDevice_.end()) { - DHLOGE("Can not find device, create render failed."); - return HDF_FAILURE; - } + if (!CheckDevCapability(desc)) { + DHLOGE("Can not find device, create render failed."); + return HDF_FAILURE; } int renderPinId = 0; auto extSpkCallback = MatchStreamCallback(attrs, desc, renderPinId); @@ -110,13 +107,12 @@ int32_t AudioAdapterInterfaceImpl::CreateRender(const AudioDeviceDescriptor &des DHLOGE("Matched callback is null."); return HDF_FAILURE; } - #ifdef DAUDIO_SUPPORT_EXTENSION if (attrs.type == AUDIO_MMAP_NOIRQ) { DHLOGI("Try to mmap mode."); renderFlags_ = Audioext::V1_0::MMAP_MODE; audioRender = new AudioRenderExtImpl(); - audioRender->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extSpkCallback); + audioRender->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extSpkCallback, renderPinId); } else { DHLOGI("Try to normal mode."); renderFlags_ = Audioext::V1_0::NORMAL_MODE; @@ -152,9 +148,6 @@ sptr AudioAdapterInterfaceImpl::MatchStreamCallback(const Audio if (desc.pins == DEFAULT_RENDER_ID && attrs.type == AUDIO_MMAP_NOIRQ) { dhId = LOW_LATENCY_RENDER_ID; } - if (desc.pins == DEFAULT_CAPTURE_ID && attrs.type == AUDIO_MMAP_NOIRQ) { - dhId = DEFAULT_CAPTURE_ID - 1; - } std::lock_guard devLck(extCallbackMtx_); auto iter = extCallbackMap_.find(dhId); @@ -221,6 +214,16 @@ int32_t AudioAdapterInterfaceImpl::DestroyRender(uint32_t renderId) return HDF_SUCCESS; } +bool AudioAdapterInterfaceImpl::CheckDevCapability(const AudioDeviceDescriptor &desc) +{ + std::lock_guard devLck(devMapMtx_); + if (mapAudioDevice_.find(desc.pins) == mapAudioDevice_.end()) { + DHLOGE("Can not find device, create render failed."); + return false; + } + return true; +} + int32_t AudioAdapterInterfaceImpl::CreateCapture(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, sptr &capture, uint32_t &captureId) { @@ -228,12 +231,9 @@ int32_t AudioAdapterInterfaceImpl::CreateCapture(const AudioDeviceDescriptor &de desc.pins, attrs.sampleRate, attrs.channelCount, attrs.format); capture = nullptr; sptr audioCapture(nullptr); - { - std::lock_guard devLck(devMapMtx_); - if (mapAudioDevice_.find(desc.pins) == mapAudioDevice_.end()) { - DHLOGE("Can not find device, create capture failed."); - return HDF_FAILURE; - } + if (!CheckDevCapability(desc)) { + DHLOGE("Can not find device, create capture failed."); + return HDF_FAILURE; } int32_t capPinId = 0; auto extMicCallback = MatchStreamCallback(attrs, desc, capPinId); @@ -241,13 +241,12 @@ int32_t AudioAdapterInterfaceImpl::CreateCapture(const AudioDeviceDescriptor &de DHLOGE("Matched callback is null."); return HDF_FAILURE; } - #ifdef DAUDIO_SUPPORT_EXTENSION if (attrs.type == AUDIO_MMAP_NOIRQ) { DHLOGI("Try to mmap mode."); capturerFlags_ = Audioext::V1_0::MMAP_MODE; audioCapture = new AudioCaptureExtImpl(); - audioCapture->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extMicCallback); + audioCapture->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extMicCallback, desc.pins); } else { DHLOGI("Try to normal mode."); capturerFlags_ = Audioext::V1_0::NORMAL_MODE; diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp index 89962585c9930f5998fa9eca2f35fc71f1888b66..936b3e0548819023f3098ed88a376a816c349e24 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp @@ -364,7 +364,7 @@ int32_t AudioCaptureInterfaceImpl::GetFrameBufferSize(uint64_t &bufferSize) } void AudioCaptureInterfaceImpl::SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, - const AudioSampleAttributes &attrs, const sptr &callback) + const AudioSampleAttributes &attrs, const sptr &callback, const int32_t dhId) { DHLOGI("Set attrs, not support yet."); } diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp index b4747ed0098791244cfe09750c1d9d0f8196a0a8..62136504c55e6e20d7c3a7d5243f36cee34f9480 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp @@ -477,7 +477,7 @@ uint32_t AudioRenderInterfaceImpl::GetMinVolumeInner() } void AudioRenderInterfaceImpl::SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, - const AudioSampleAttributes &attrs, const sptr &callback) + const AudioSampleAttributes &attrs, const sptr &callback, const int32_t dhId) { DHLOGI("Set attrs, not support yet."); } diff --git a/hdf_service/distributed_audio/hdi_service/common/BUILD.gn b/hdf_service/distributed_audio/hdi_service/common/BUILD.gn index 5e5c6f157af6c81d4558ffbec393cd6c587d70d8..f9b893abf3000e9b24991a8328e0a2a052cb328a 100644 --- a/hdf_service/distributed_audio/hdi_service/common/BUILD.gn +++ b/hdf_service/distributed_audio/hdi_service/common/BUILD.gn @@ -19,6 +19,7 @@ ohos_shared_library("libdaudio_hdf_utils") { "include", "log/include", "utils/include", + "//third_party/cJSON", ] sources = [ @@ -26,6 +27,7 @@ ohos_shared_library("libdaudio_hdf_utils") { "utils/src/daudio_utils.cpp", ] + deps = [ "//third_party/cJSON:cjson" ] external_deps = [ "c_utils:utils", "hdf_core:libhdf_utils", diff --git a/hdf_service/distributed_audio/hdi_service/common/include/daudio_constants.h b/hdf_service/distributed_audio/hdi_service/common/include/daudio_constants.h index 563bfb9e56026ce1305ba8685d691f49b8d67af7..d342d62d9d9121942153d5aa938b46f171988f07 100644 --- a/hdf_service/distributed_audio/hdi_service/common/include/daudio_constants.h +++ b/hdf_service/distributed_audio/hdi_service/common/include/daudio_constants.h @@ -76,9 +76,9 @@ constexpr int32_t DAUDIO_MAX_ASHMEM_LEN = 100000; constexpr int32_t DAUDIO_MIN_ASHMEM_LEN = 10; constexpr const char *KEY_DH_ID = "dhId"; -static constexpr int32_t LOW_LATENCY_RENDER_ID = 1 << 1 | 1 << 0; -static constexpr int32_t DEFAULT_RENDER_ID = 1; -static constexpr int32_t DEFAULT_CAPTURE_ID = 1 << 27 | 1 << 0; +constexpr int32_t LOW_LATENCY_RENDER_ID = 1 << 1 | 1 << 0; +constexpr int32_t DEFAULT_RENDER_ID = 1; +constexpr int32_t DEFAULT_CAPTURE_ID = 1 << 27 | 1 << 0; } // DistributeHardware } // OHOS #endif // OHOS_DAUDIO_CONSTANTS_H diff --git a/hdf_service/distributed_audio/hdi_service/common/utils/include/daudio_utils.h b/hdf_service/distributed_audio/hdi_service/common/utils/include/daudio_utils.h index 0bde1ba670c0b7ea7e6230a00d8e4f9b86a4e436..7b842a232eee144c05ed3a9164aa2b03b9c10fd0 100644 --- a/hdf_service/distributed_audio/hdi_service/common/utils/include/daudio_utils.h +++ b/hdf_service/distributed_audio/hdi_service/common/utils/include/daudio_utils.h @@ -56,6 +56,8 @@ int64_t UpdateTimeOffset(const int64_t frameIndex, const int64_t framePeriodNs, bool IsOutDurationRange(int64_t startTime, int64_t endTime, int64_t lastStartTime); void SaveFile(std::string fileName, uint8_t *audioData, int32_t size); + +int32_t WrapCJsonItem(const std::initializer_list> &keys, std::string &content); } // DistributedHardware } // OHOS #endif \ No newline at end of file diff --git a/hdf_service/distributed_audio/hdi_service/common/utils/src/daudio_utils.cpp b/hdf_service/distributed_audio/hdi_service/common/utils/src/daudio_utils.cpp index 0e3c0f61632871efc84025f791171df70bfb33ef..5de3d91c73fb60f8980d641631813fe91fd8e4c7 100644 --- a/hdf_service/distributed_audio/hdi_service/common/utils/src/daudio_utils.cpp +++ b/hdf_service/distributed_audio/hdi_service/common/utils/src/daudio_utils.cpp @@ -17,6 +17,8 @@ #include +#include "cJSON.h" + #include "daudio_constants.h" #include "daudio_errcode.h" @@ -185,5 +187,25 @@ void SaveFile(std::string fileName, uint8_t *audioData, int32_t size) ofs.write(reinterpret_cast(audioData), size); ofs.close(); } + +int32_t WrapCJsonItem(const std::initializer_list> &keys, std::string &content) +{ + cJSON *jParam = cJSON_CreateObject(); + if (jParam == nullptr) { + return ERR_DH_AUDIO_HDF_FAIL; + } + for (auto item : keys) { + cJSON_AddStringToObject(jParam, item.first.c_str(), item.second.c_str()); + } + char *jsonData = cJSON_PrintUnformatted(jParam); + if (jsonData == nullptr) { + cJSON_Delete(jParam); + return ERR_DH_AUDIO_HDF_FAIL; + } + content = std::string(jsonData); + cJSON_Delete(jParam); + cJSON_free(jsonData); + return DH_SUCCESS; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/audiomanager/managersource/include/daudio_io_dev.h b/services/audiomanager/managersource/include/daudio_io_dev.h index 9a2399d96b3a1a7ba54cd1db799cef32b2ef072e..4953afd14e0f721a65e39f016c998f260d750764 100644 --- a/services/audiomanager/managersource/include/daudio_io_dev.h +++ b/services/audiomanager/managersource/include/daudio_io_dev.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Huawei Device Co., Ltd. + * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at