From 9bceab629d1bf18edcb92e220b6693c0a9a73606 Mon Sep 17 00:00:00 2001 From: hwwuhaobo Date: Sun, 25 Jun 2023 14:40:56 +0800 Subject: [PATCH] daudio use avtrans Signed-off-by: hwwuhaobo --- bundle.json | 12 - common/dfx_utils/test/unittest/BUILD.gn | 2 + common/include/daudio_constants.h | 2 + common/include/daudio_errorcode.h | 13 + common/include/daudio_util.h | 4 + common/src/daudio_util.cpp | 38 +++ distributedaudio.gni | 1 - .../BUILD.gn | 4 +- .../BUILD.gn | 4 +- services/audioclient/BUILD.gn | 91 ------- services/audioclient/interface/imic_client.h | 3 + services/audioclient/interface/ispk_client.h | 3 + .../micclient/include/dmic_client.h | 8 +- .../audioclient/micclient/src/dmic_client.cpp | 68 +++++- .../spkclient/include/dspeaker_client.h | 10 +- .../spkclient/src/dspeaker_client.cpp | 73 +++++- .../include/daudio_test_utils.h | 15 ++ .../test/unittest/micclient/BUILD.gn | 2 +- .../test/unittest/spkclient/BUILD.gn | 4 +- .../managersink/include/daudio_sink_dev.h | 13 +- .../managersink/include/daudio_sink_manager.h | 30 ++- .../managersink/src/daudio_sink_dev.cpp | 100 ++++++-- .../managersink/src/daudio_sink_manager.cpp | 151 +++++++++++- .../managersource/include/daudio_source_dev.h | 4 +- .../include/daudio_source_manager.h | 11 + .../managersource/include/dmic_dev.h | 12 +- .../managersource/include/dspeaker_dev.h | 13 +- .../managersource/src/daudio_source_dev.cpp | 88 +++++-- .../src/daudio_source_manager.cpp | 127 +++++++++- .../managersource/src/dmic_dev.cpp | 74 +++++- .../managersource/src/dspeaker_dev.cpp | 65 ++++- services/audiomanager/servicesink/BUILD.gn | 30 ++- services/audiomanager/servicesource/BUILD.gn | 7 + .../include/audio_manager_test_utils.h | 15 ++ .../test/unittest/managersink/BUILD.gn | 4 +- .../test/unittest/servicesink/BUILD.gn | 2 + .../test/unittest/servicesource/BUILD.gn | 2 + .../test/unittest/sourcedevice/BUILD.gn | 2 + .../audiotransport/decodetransport/BUILD.gn | 26 +- .../include/audio_decode_transport.h | 3 + .../src/audio_decode_transport.cpp | 21 ++ .../audiotransport/encodetransport/BUILD.gn | 22 +- .../include/audio_encode_transport.h | 3 + .../src/audio_encode_transport.cpp | 21 ++ .../interface/iaudio_data_transport.h | 4 + .../include/av_receiver_engine_adapter.h | 70 ++++++ .../include/av_receiver_engine_transport.h | 79 ++++++ .../src/av_receiver_engine_adapter.cpp | 208 ++++++++++++++++ .../src/av_receiver_engine_transport.cpp | 212 ++++++++++++++++ .../include/av_sender_engine_adapter.h | 77 ++++++ .../include/av_sender_engine_transport.h | 78 ++++++ .../src/av_sender_engine_adapter.cpp | 229 ++++++++++++++++++ .../src/av_sender_engine_transport.cpp | 201 +++++++++++++++ services/common/BUILD.gn | 3 +- 54 files changed, 2154 insertions(+), 210 deletions(-) delete mode 100644 services/audioclient/BUILD.gn create mode 100644 services/audiotransport/receiverengine/include/av_receiver_engine_adapter.h create mode 100644 services/audiotransport/receiverengine/include/av_receiver_engine_transport.h create mode 100644 services/audiotransport/receiverengine/src/av_receiver_engine_adapter.cpp create mode 100644 services/audiotransport/receiverengine/src/av_receiver_engine_transport.cpp create mode 100644 services/audiotransport/senderengine/include/av_sender_engine_adapter.h create mode 100644 services/audiotransport/senderengine/include/av_sender_engine_transport.h create mode 100644 services/audiotransport/senderengine/src/av_sender_engine_adapter.cpp create mode 100644 services/audiotransport/senderengine/src/av_sender_engine_transport.cpp diff --git a/bundle.json b/bundle.json index 7d9f88dc..4137a6c8 100755 --- a/bundle.json +++ b/bundle.json @@ -61,7 +61,6 @@ "//foundation/distributedhardware/distributed_audio/services/common:distributed_audio_utils", "//foundation/distributedhardware/distributed_audio/services/hdfaudioclient:daudio_client", - "//foundation/distributedhardware/distributed_audio/services/audioclient:distributed_audio_sink_client", "//foundation/distributedhardware/distributed_audio/services/audiomanager/servicesource:distributed_audio_source", "//foundation/distributedhardware/distributed_audio/services/audiomanager/servicesink:distributed_audio_sink", @@ -95,17 +94,6 @@ ] } }, - { - "type": "so", - "name": "//foundation/distributedhardware/distributed_audio/services/audioclient:distributed_audio_sink_client", - "header": { - "header_base": "//foundation/distributedhardware/distributed_audio/services/audioclient", - "header_files": [ - "interface/imic_client.h", - "interface/ispk_client.h" - ] - } - }, { "type": "so", "name": "//foundation/distributedhardware/distributed_audio/services/audiotransport/decodetransport:distributed_audio_decode_transport", diff --git a/common/dfx_utils/test/unittest/BUILD.gn b/common/dfx_utils/test/unittest/BUILD.gn index cbabb0e2..9eb5d261 100644 --- a/common/dfx_utils/test/unittest/BUILD.gn +++ b/common/dfx_utils/test/unittest/BUILD.gn @@ -31,6 +31,8 @@ config("module_private_config") { "${audio_transport_path}/interface", "${audio_transport_path}/encodetransport/include", "${audio_transport_path}/decodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${audio_transport_path}/audioctrltransport/include", "${audio_transport_path}/audioctrltransport/interface", "${audio_transport_path}/audiochannel/interface", diff --git a/common/include/daudio_constants.h b/common/include/daudio_constants.h index 5b84d568..56e88412 100644 --- a/common/include/daudio_constants.h +++ b/common/include/daudio_constants.h @@ -94,6 +94,8 @@ const std::string VOLUME_LEVEL = "VOLUME_LEVEL"; const std::string AUDIO_EVENT_RESTART = "restart"; const std::string AUDIO_EVENT_PAUSE = "pause"; +const std::string AUDIO_ENGINE_FLAG = "persist.distributedhardware.distributedaudio.engine.enable"; + constexpr const char *KEY_TYPE = "type"; constexpr const char *KEY_EVENT_CONTENT = "content"; constexpr const char *KEY_DH_ID = "dhId"; diff --git a/common/include/daudio_errorcode.h b/common/include/daudio_errorcode.h index b494a128..5a141af8 100644 --- a/common/include/daudio_errorcode.h +++ b/common/include/daudio_errorcode.h @@ -133,6 +133,19 @@ enum DAudioErrorCode { ERR_DH_AUDIO_HDI_NULLPTR = -45005, ERR_DH_AUDIO_CTRL_CHANNEL_SEND_MSG_FAIL = -46001, + + // AV Transport component error code + ERR_DH_AV_TRANS_NULL_VALUE = -47000, + ERR_DH_AV_TRANS_ILLEGAL_PARAM = -47001, + ERR_DH_AV_TRANS_TIMEOUT = -47002, + ERR_DH_AV_TRANS_LOAD_ERROR = -47003, + ERR_DH_AV_TRANS_INIT_FAILED = -47004, + ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED = -47005, + ERR_DH_AV_TRANS_SETUP_FAILED = -47006, + ERR_DH_AV_TRANS_START_FAILED = -47007, + ERR_DH_AV_TRANS_STOP_FAILED = -47008, + ERR_DH_AV_TRANS_FEED_DATA_FAILED = -47009, + ERR_DH_AV_TRANS_SEND_MSG_FAILED = -47010, }; } // namespace DistributedHardware } // namespace OHOS diff --git a/common/include/daudio_util.h b/common/include/daudio_util.h index 186d8c71..93933ee9 100644 --- a/common/include/daudio_util.h +++ b/common/include/daudio_util.h @@ -47,6 +47,10 @@ int64_t UpdateTimeOffset(const int64_t frameIndex, const int64_t framePeriodNs, void GetCurrentTime(int64_t &tvSec, int64_t &tvNSec); bool CheckIsNum(const std::string &jsonString); bool CheckDevIdIsLegal(const std::string &devId); + +template +bool GetSysPara(const char *key, T &value); +bool IsParamEnabled(std::string key, bool &isEnabled); } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DAUDIO_UTIL_H diff --git a/common/src/daudio_util.cpp b/common/src/daudio_util.cpp index 84419659..9fd86ce3 100644 --- a/common/src/daudio_util.cpp +++ b/common/src/daudio_util.cpp @@ -28,6 +28,7 @@ #include "daudio_constants.h" #include "daudio_errorcode.h" #include "daudio_log.h" +#include "parameter.h" #undef DH_LOG_TAG #define DH_LOG_TAG "DAudioUtils" @@ -310,5 +311,42 @@ bool CheckDevIdIsLegal(const std::string &devId) } return true; } + +template +bool GetSysPara(const char *key, T &value) +{ + if (key == nullptr) { + DHLOGE("GetSysPara: key is nullptr"); + return false; + } + char paraValue[20] = {0}; // 20 for system parameter + auto res = GetParameter(key, "-1", paraValue, sizeof(paraValue)); + if (res <= 0) { + DHLOGD("GetSysPara fail, key:%{public}s res:%{public}d", key, res); + return false; + } + DHLOGI("GetSysPara: key:%{public}s value:%{public}s", key, paraValue); + std::stringstream valueStr; + valueStr << paraValue; + valueStr >> value; + return true; +} + +template bool GetSysPara(const char *key, int32_t &value); +template bool GetSysPara(const char *key, uint32_t &value); +template bool GetSysPara(const char *key, int64_t &value); +template bool GetSysPara(const char *key, std::string &value); + +bool IsParamEnabled(std::string key, bool &isEnabled) +{ + // todo 当前默认是engine, 如果要默认为老的trans通路,需要把true / false 颠倒 + int32_t policyFlag = 0; + if (GetSysPara(key.c_str(), policyFlag) && policyFlag == 1) { + isEnabled = false; + return false; + } + isEnabled = true; + return true; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/distributedaudio.gni b/distributedaudio.gni index 9ce5fe6a..a39e5b3f 100644 --- a/distributedaudio.gni +++ b/distributedaudio.gni @@ -40,7 +40,6 @@ hdf_ser_aud_ext_path = "${hdf_service_path}/hdi_service/audio_ext/v1_0" fwk_utils_path = "${distributedhardwarefwk_path}/utils" fwk_common_path = "${distributedhardwarefwk_path}/common" -fwk_services_path = "${distributedhardwarefwk_path}/services" innerkits_path = "${distributedaudio_path}/interfaces/inner_kits" build_flags = [ "-Werror" ] diff --git a/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerregisterdistributedhardware_fuzzer/BUILD.gn b/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerregisterdistributedhardware_fuzzer/BUILD.gn index 073c3393..e30bf6cd 100755 --- a/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerregisterdistributedhardware_fuzzer/BUILD.gn +++ b/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerregisterdistributedhardware_fuzzer/BUILD.gn @@ -40,17 +40,15 @@ ohos_fuzztest("SourceHandlerRegisterDistributedHardwareFuzzTest") { "include", "${common_path}/include", "${innerkits_path}/native_cpp/audio_source/include", - "${fwk_services_path}/distributedhardwarefwkservice/include", - "${fwk_services_path}/distributedhardwarefwkservice/include/componentmanager", ] deps = [ - "${fwk_services_path}/distributedhardwarefwkservice:distributedhardwarefwksvr", "${innerkits_path}/native_cpp/audio_source:distributed_audio_source_sdk", ] external_deps = [ "c_utils:utils", + "distributed_hardware_fwk:libdhfwk_sdk", "ipc:ipc_core", ] diff --git a/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerunregisterdistributedhardware_fuzzer/BUILD.gn b/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerunregisterdistributedhardware_fuzzer/BUILD.gn index 9e16e368..fd585c0f 100755 --- a/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerunregisterdistributedhardware_fuzzer/BUILD.gn +++ b/interfaces/inner_kits/native_cpp/test/fuzztest/sourcehandlerunregisterdistributedhardware_fuzzer/BUILD.gn @@ -41,17 +41,15 @@ ohos_fuzztest("SourceHandlerUnregisterDistributedHardwareFuzzTest") { "include", "${common_path}/include", "${innerkits_path}/native_cpp/audio_source/include", - "${fwk_services_path}/distributedhardwarefwkservice/include", - "${fwk_services_path}/distributedhardwarefwkservice/include/componentmanager", ] deps = [ - "${fwk_services_path}/distributedhardwarefwkservice:distributedhardwarefwksvr", "${innerkits_path}/native_cpp/audio_source:distributed_audio_source_sdk", ] external_deps = [ "c_utils:utils", + "distributed_hardware_fwk:libdhfwk_sdk", "ipc:ipc_core", ] diff --git a/services/audioclient/BUILD.gn b/services/audioclient/BUILD.gn deleted file mode 100644 index 0cdba272..00000000 --- a/services/audioclient/BUILD.gn +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) 2022 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 -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//build/ohos.gni") -import("//build/ohos_var.gni") -import("../../distributedaudio.gni") - -config("daudio_client_pub_config") { - include_dirs = [ "interface" ] -} - -ohos_shared_library("distributed_audio_sink_client") { - include_dirs = [ "//third_party/json/include" ] - - include_dirs += [ - "${audio_client_path}/interface", - "${audio_client_path}/micclient/include", - "${audio_client_path}/spkclient/include", - "${audio_processor_path}/encodeprocessor/include", - "${audio_processor_path}/decodeprocessor/include", - "${audio_processor_path}/interface", - "${audio_transport_path}/audiochannel/interface", - "${audio_transport_path}/audiochannel/audiodatachannel/include", - "${audio_transport_path}/decodetransport/include", - "${audio_transport_path}/encodetransport/include", - "${audio_transport_path}/interface", - "${common_path}/dfx_utils/include", - "${common_path}/include", - "${fwk_common_path}/utils/include", - "${services_path}/common/audioeventcallback", - "${services_path}/common/audiodata/include", - "${services_path}/common/audioparam", - ] - - if (distributed_audio_extension) { - include_dirs += [ - "${distributedaudio_ext_path}/services/audioclient/directmicclient/include", - "${distributedaudio_ext_path}/services/audioclient/directspkclient/include", - ] - } - - public_configs = [ ":daudio_client_pub_config" ] - - sources = [ - "${audio_client_path}/micclient/src/dmic_client.cpp", - "${audio_client_path}/spkclient/src/dspeaker_client.cpp", - ] - - if (distributed_audio_extension) { - sources += [ - "${distributedaudio_ext_path}/services/audioclient/directmicclient/src/direct_dmic_client.cpp", - "${distributedaudio_ext_path}/services/audioclient/directspkclient/src/direct_dspeaker_client.cpp", - ] - } - - deps = [ - "${audio_transport_path}/decodetransport:distributed_audio_decode_transport", - "${audio_transport_path}/encodetransport:distributed_audio_encode_transport", - "${services_path}/common:distributed_audio_utils", - ] - - external_deps = [ - "audio_framework:audio_capturer", - "audio_framework:audio_client", - "audio_framework:audio_renderer", - "c_utils:utils", - "drivers_interface_audio:libaudio_proxy_1.0", - "hdf_core:libhdf_ipc_adapter", - "hdf_core:libhdi", - "hisysevent_native:libhisysevent", - "hitrace_native:hitrace_meter", - ] - - defines = [ - "HI_LOG_ENABLE", - "LOG_DOMAIN=0xD004100", - ] - - subsystem_name = "distributedhardware" - part_name = "distributed_audio" -} diff --git a/services/audioclient/interface/imic_client.h b/services/audioclient/interface/imic_client.h index 7546355e..7247a5e7 100644 --- a/services/audioclient/interface/imic_client.h +++ b/services/audioclient/interface/imic_client.h @@ -19,6 +19,7 @@ #include #include "audio_param.h" +#include "i_av_engine_provider.h" namespace OHOS { namespace DistributedHardware { @@ -32,6 +33,8 @@ public: virtual int32_t StartCapture() = 0; virtual int32_t StopCapture() = 0; virtual void SetAttrs(const std::string &devId, const std::shared_ptr &callback) = 0; + virtual int32_t InitSenderEngine(IAVEngineProvider *providerPtr) = 0; + virtual int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audioclient/interface/ispk_client.h b/services/audioclient/interface/ispk_client.h index f28c313e..662dcea3 100644 --- a/services/audioclient/interface/ispk_client.h +++ b/services/audioclient/interface/ispk_client.h @@ -19,6 +19,7 @@ #include #include "audio_param.h" +#include "i_av_engine_provider.h" namespace OHOS { namespace DistributedHardware { @@ -35,6 +36,8 @@ public: virtual int32_t SetAudioParameters(const AudioEvent &event) = 0; virtual void PlayStatusChange(const std::string &args) = 0; virtual void SetAttrs(const std::string &devId, const std::shared_ptr &callback) = 0; + virtual int32_t InitReceiverEngine(IAVEngineProvider *providerPtr) = 0; + virtual int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audioclient/micclient/include/dmic_client.h b/services/audioclient/micclient/include/dmic_client.h index b9f68de4..fd9d1b98 100644 --- a/services/audioclient/micclient/include/dmic_client.h +++ b/services/audioclient/micclient/include/dmic_client.h @@ -32,6 +32,7 @@ #include "audio_event.h" #include "audio_param.h" #include "audio_status.h" +#include "av_sender_engine_transport.h" #include "daudio_errorcode.h" #include "daudio_log.h" #include "iaudio_data_transport.h" @@ -42,7 +43,7 @@ namespace OHOS { namespace DistributedHardware { class DMicClient : public IAudioDataTransCallback, - public IMicClient, + public IMicClient, public AVSenderTransportCallback, public std::enable_shared_from_this { public: DMicClient(const std::string &devId, const std::shared_ptr &callback) @@ -50,11 +51,15 @@ public: ~DMicClient() override; int32_t OnStateChange(const AudioEventType type) override; int32_t OnDecodeTransDataDone(const std::shared_ptr &audioData) override; + void OnEngineTransEvent(const AVTransEvent &event) override; + void OnEngineTransMessage(const std::shared_ptr &message) override; + int32_t InitSenderEngine(IAVEngineProvider *providerPtr) override; int32_t SetUp(const AudioParam ¶m) override; int32_t Release() override; int32_t StartCapture() override; int32_t StopCapture() override; void SetAttrs(const std::string &devId, const std::shared_ptr &callback) override; + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override; private: void CaptureThreadRunning(); @@ -74,6 +79,7 @@ private: std::weak_ptr eventCallback_; std::unique_ptr audioCapturer_ = nullptr; std::shared_ptr micTrans_ = nullptr; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audioclient/micclient/src/dmic_client.cpp b/services/audioclient/micclient/src/dmic_client.cpp index 010044e0..19b7d8c2 100644 --- a/services/audioclient/micclient/src/dmic_client.cpp +++ b/services/audioclient/micclient/src/dmic_client.cpp @@ -19,6 +19,7 @@ #include "daudio_constants.h" #include "daudio_hisysevent.h" +#include "daudio_sink_manager.h" #undef DH_LOG_TAG #define DH_LOG_TAG "DMicClient" @@ -33,6 +34,45 @@ DMicClient::~DMicClient() } } +void DMicClient::OnEngineTransEvent(const AVTransEvent &event) +{ + if (event.type == EventType::EVENT_START_SUCCESS) { + OnStateChange(DATA_OPENED); + } else if ((event.type == EventType::EVENT_STOP_SUCCESS) || + (event.type == EventType::EVENT_CHANNEL_CLOSED) || + (event.type == EventType::EVENT_START_FAIL)) { + OnStateChange(DATA_CLOSED); + } +} + +void DMicClient::OnEngineTransMessage(const std::shared_ptr &message) +{ + DHLOGI("On Engine message"); + if (message == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + DAudioSinkManager::GetInstance().HandleDAudioNotify(message->dstDevId_, message->dstDevId_, + static_cast(message->type_), message->content_); +} + +int32_t DMicClient::InitSenderEngine(IAVEngineProvider *providerPtr) +{ + DHLOGI("Init SenderEngine"); + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); + if (engineFlag_ == true) { + if (micTrans_ == nullptr) { + micTrans_ = std::make_shared(devId_, shared_from_this()); + } + int32_t ret = micTrans_->InitEngine(providerPtr); + if (ret != DH_SUCCESS) { + DHLOGE("Initialize av sender adapter failed. micclient"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + } + return DH_SUCCESS; +} + int32_t DMicClient::OnStateChange(const AudioEventType type) { DHLOGD("On state change type: %d.", type); @@ -89,8 +129,14 @@ int32_t DMicClient::SetUp(const AudioParam ¶m) DHLOGE("Audio capturer create failed."); return ERR_DH_AUDIO_CLIENT_CREATE_CAPTURER_FAILED; } - - micTrans_ = std::make_shared(devId_); + // old new 方式归一 + if (engineFlag_ == false) { + micTrans_ = std::make_shared(devId_); + } + if (micTrans_ == nullptr) { + DHLOGE("mic trans in engine should be init by dev."); + return ERR_DH_AUDIO_NULLPTR; + } int32_t ret = micTrans_->SetUp(audioParam_, audioParam_, shared_from_this(), CAP_MIC); if (ret != DH_SUCCESS) { DHLOGE("Mic trans setup failed."); @@ -100,6 +146,22 @@ int32_t DMicClient::SetUp(const AudioParam ¶m) return DH_SUCCESS; } +int32_t DMicClient::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + DHLOGI("Send message to remote."); + if (type != static_cast(NOTIFY_OPEN_MIC_RESULT) && + type != static_cast(NOTIFY_CLOSE_MIC_RESULT)) { + DHLOGE("event type is not NOTIFY_OPEN_MIC or NOTIFY_CLOSE_MIC. type: %u", type); + return ERR_DH_AUDIO_NULLPTR; + } + if (micTrans_ == nullptr) { + DHLOGE("mic trans is null."); + return ERR_DH_AUDIO_NULLPTR; + } + micTrans_->SendMessage(type, content, dstDevId); + return DH_SUCCESS; +} + int32_t DMicClient::Release() { DHLOGI("Release mic client."); @@ -145,7 +207,6 @@ int32_t DMicClient::StartCapture() "daudio capturer start failed."); return ERR_DH_AUDIO_CLIENT_CAPTURER_START_FAILED; } - int32_t ret = micTrans_->Start(); if (ret != DH_SUCCESS) { DHLOGE("Mic trans start failed."); @@ -181,7 +242,6 @@ void DMicClient::CaptureThreadRunning() DHLOGE("Bytes read failed."); break; } - int32_t ret = micTrans_->FeedAudioData(audioData); if (ret != DH_SUCCESS) { DHLOGE("Failed to send data."); diff --git a/services/audioclient/spkclient/include/dspeaker_client.h b/services/audioclient/spkclient/include/dspeaker_client.h index 5738f18e..0ad96f12 100644 --- a/services/audioclient/spkclient/include/dspeaker_client.h +++ b/services/audioclient/spkclient/include/dspeaker_client.h @@ -34,6 +34,7 @@ #include "audio_status.h" #include "audio_decode_transport.h" #include "audio_event.h" +#include "av_receiver_engine_transport.h" #include "daudio_errorcode.h" #include "daudio_log.h" #include "iaudio_data_transport.h" @@ -44,7 +45,7 @@ namespace OHOS { namespace DistributedHardware { class DSpeakerClient : public IAudioDataTransCallback, - public ISpkClient, + public ISpkClient, public AVReceiverTransportCallback, public AudioStandard::VolumeKeyEventCallback, public AudioStandard::AudioRendererCallback, public std::enable_shared_from_this { @@ -59,6 +60,7 @@ public: int32_t OnDecodeTransDataDone(const std::shared_ptr &audioData) override; void OnVolumeKeyEvent(AudioStandard::VolumeEvent volumeEvent) override; void OnInterrupt(const AudioStandard::InterruptEvent &interruptEvent) override; + int32_t InitReceiverEngine(IAVEngineProvider *providerPtr) override; int32_t SetUp(const AudioParam ¶m) override; int32_t Release() override; int32_t StartRender() override; @@ -67,6 +69,11 @@ public: int32_t SetAudioParameters(const AudioEvent &event) override; void PlayStatusChange(const std::string &args) override; void SetAttrs(const std::string &devId, const std::shared_ptr &callback) override; + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override; + + void OnEngineTransEvent(const AVTransEvent &event) override; + void OnEngineTransMessage(const std::shared_ptr &message) override; + void OnEngineTransDataAvailable(const std::shared_ptr &audioData) override; private: std::string GetVolumeLevel(); @@ -96,6 +103,7 @@ private: std::unique_ptr audioRenderer_ = nullptr; std::shared_ptr speakerTrans_ = nullptr; std::weak_ptr eventCallback_; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audioclient/spkclient/src/dspeaker_client.cpp b/services/audioclient/spkclient/src/dspeaker_client.cpp index fa1101a1..d0056339 100644 --- a/services/audioclient/spkclient/src/dspeaker_client.cpp +++ b/services/audioclient/spkclient/src/dspeaker_client.cpp @@ -18,6 +18,7 @@ #include "daudio_constants.h" #include "daudio_hisysevent.h" #include "daudio_util.h" +#include "daudio_sink_manager.h" #undef DH_LOG_TAG #define DH_LOG_TAG "DSpeakerClient" @@ -29,6 +30,50 @@ DSpeakerClient::~DSpeakerClient() DHLOGD("Release speaker client."); } +void DSpeakerClient::OnEngineTransEvent(const AVTransEvent &event) +{ + if (event.type == EventType::EVENT_START_SUCCESS) { + OnStateChange(DATA_OPENED); + } else if ((event.type == EventType::EVENT_STOP_SUCCESS) || + (event.type == EventType::EVENT_CHANNEL_CLOSED) || + (event.type == EventType::EVENT_START_FAIL)) { + OnStateChange(DATA_CLOSED); + } +} + +void DSpeakerClient::OnEngineTransMessage(const std::shared_ptr &message) +{ + if (message == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + DAudioSinkManager::GetInstance().HandleDAudioNotify(message->dstDevId_, message->dstDevId_, + static_cast(message->type_), message->content_); +} + +void DSpeakerClient::OnEngineTransDataAvailable(const std::shared_ptr &audioData) +{ + DHLOGE("On Engine Data available"); + OnDecodeTransDataDone(audioData); +} + +int32_t DSpeakerClient::InitReceiverEngine(IAVEngineProvider *providerPtr) +{ + DHLOGI("InitReceiverEngine enter."); + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); + if (engineFlag_ == true) { + if (speakerTrans_ == nullptr) { + speakerTrans_ = std::make_shared(devId_, shared_from_this()); + } + int32_t ret = speakerTrans_->InitEngine(providerPtr); + if (ret != DH_SUCCESS) { + DHLOGE("Initialize av receiver adapter failed spkclient."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + } + return DH_SUCCESS; +} + int32_t DSpeakerClient::SetUp(const AudioParam ¶m) { DHLOGD("Set up spk client: {sampleRate: %d, bitFormat: %d, channelMask: %d," + @@ -57,7 +102,13 @@ int32_t DSpeakerClient::SetUp(const AudioParam ¶m) } audioRenderer_ ->SetRendererCallback(shared_from_this()); - speakerTrans_ = std::make_shared(devId_); + if (engineFlag_ == false) { + speakerTrans_ = std::make_shared(devId_); + } + if (speakerTrans_ == nullptr) { + DHLOGE("Speaker trans should be init by dev."); + return ERR_DH_AUDIO_NULLPTR; + } int32_t ret = speakerTrans_->SetUp(audioParam_, audioParam_, shared_from_this(), CAP_SPK); if (ret != DH_SUCCESS) { DHLOGE("Speaker trans setup failed."); @@ -68,7 +119,6 @@ int32_t DSpeakerClient::SetUp(const AudioParam ¶m) DHLOGE("Speaker trans start failed."); return ret; } - auto pid = getpid(); ret = AudioStandard::AudioSystemManager::GetInstance()->RegisterVolumeKeyEventCallback(pid, shared_from_this()); if (ret != DH_SUCCESS) { @@ -429,10 +479,10 @@ void DSpeakerClient::Pause() if (renderDataThread_.joinable()) { renderDataThread_.join(); } + // wuhaobo todo 这里确认下pause的实现 engine 改如何pause if (speakerTrans_ == nullptr || speakerTrans_->Pause() != DH_SUCCESS) { DHLOGE("Speaker trans Pause failed."); } - if (audioRenderer_ != nullptr) { audioRenderer_->Flush(); } @@ -443,6 +493,7 @@ void DSpeakerClient::Pause() void DSpeakerClient::ReStart() { DHLOGI("ReStart"); + // wuhaobo todo 这里确认下restart的实现 engine 改如何restart if (speakerTrans_ == nullptr || speakerTrans_->Restart(audioParam_, audioParam_) != DH_SUCCESS) { DHLOGE("Speaker trans Restart failed."); } @@ -451,6 +502,22 @@ void DSpeakerClient::ReStart() clientStatus_ = AudioStatus::STATUS_START; } +int32_t DSpeakerClient::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + DHLOGI("Send message to remote."); + if (type != static_cast(NOTIFY_OPEN_SPEAKER_RESULT) && + type != static_cast(NOTIFY_CLOSE_SPEAKER_RESULT)) { + DHLOGE("event type is not NOTIFY_OPEN_SPK or NOTIFY_CLOSE_SPK. type:%u", type); + return ERR_DH_AUDIO_NULLPTR; + } + if (speakerTrans_ == nullptr) { + DHLOGE("speaker trans is null."); + return ERR_DH_AUDIO_NULLPTR; + } + speakerTrans_->SendMessage(type, content, dstDevId); + return DH_SUCCESS; +} + void DSpeakerClient::PlayStatusChange(const std::string &args) { DHLOGD("Play status change, args: %s.", args.c_str()); diff --git a/services/audioclient/test/unittest/audioclienttestutils/include/daudio_test_utils.h b/services/audioclient/test/unittest/audioclienttestutils/include/daudio_test_utils.h index b492aecd..e172743a 100644 --- a/services/audioclient/test/unittest/audioclienttestutils/include/daudio_test_utils.h +++ b/services/audioclient/test/unittest/audioclienttestutils/include/daudio_test_utils.h @@ -63,6 +63,21 @@ public: { return 0; } + + int32_t InitEngine(IAVEngineProvider *providerPtr) override + { + return 0; + } + + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override + { + return 0; + } + + int32_t CreateCtrl() override + { + return 0; + } }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audioclient/test/unittest/micclient/BUILD.gn b/services/audioclient/test/unittest/micclient/BUILD.gn index 7a247d82..c1440eaf 100644 --- a/services/audioclient/test/unittest/micclient/BUILD.gn +++ b/services/audioclient/test/unittest/micclient/BUILD.gn @@ -56,7 +56,7 @@ ohos_unittest("MicClientTest") { configs = [ ":module_private_config" ] deps = [ - "${services_path}/audioclient:distributed_audio_sink_client", + "${services_path}/audiomanager/servicesink:distributed_audio_sink", "//third_party/googletest:gmock", "//third_party/googletest:gtest_main", ] diff --git a/services/audioclient/test/unittest/spkclient/BUILD.gn b/services/audioclient/test/unittest/spkclient/BUILD.gn index db812ce5..7971a784 100644 --- a/services/audioclient/test/unittest/spkclient/BUILD.gn +++ b/services/audioclient/test/unittest/spkclient/BUILD.gn @@ -40,6 +40,8 @@ config("module_private_config") { "${audio_transport_path}/audiotransportstatus/include", "${audio_transport_path}/audiotransportstatus/interface", "${audio_transport_path}/decodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${audio_transport_path}/interface", "${common_path}/include", "${fwk_common_path}/utils/include", @@ -61,7 +63,7 @@ ohos_unittest("SpeakerClientTest") { configs = [ ":module_private_config" ] deps = [ - "${services_path}/audioclient:distributed_audio_sink_client", + "${services_path}/audiomanager/servicesink:distributed_audio_sink", "${services_path}/common:distributed_audio_utils", "//third_party/googletest:gmock", "//third_party/googletest:gtest_main", diff --git a/services/audiomanager/managersink/include/daudio_sink_dev.h b/services/audiomanager/managersink/include/daudio_sink_dev.h index eac0f378..63a76e13 100644 --- a/services/audiomanager/managersink/include/daudio_sink_dev.h +++ b/services/audiomanager/managersink/include/daudio_sink_dev.h @@ -21,14 +21,16 @@ #include #include "nlohmann/json.hpp" - #include "daudio_sink_dev_ctrl_manager.h" #include "dmic_client.h" #include "dspeaker_client.h" -#include "task_queue.h" +#include "iaudio_event_callback.h" #include "imic_client.h" #include "ispk_client.h" -#include "iaudio_event_callback.h" +#include "i_av_engine_provider.h" +#include "i_av_receiver_engine_callback.h" +#include "task_queue.h" + #ifdef DAUDIO_SUPPORT_DIRECT #include "direct_dmic_client.h" #include "direct_dspeaker_client.h" @@ -45,8 +47,8 @@ public: int32_t AwakeAudioDev(); void SleepAudioDev(); - void NotifyEvent(const AudioEvent &audioEvent) override; + int32_t InitAVTransEngines(IAVEngineProvider *senderPtr, IAVEngineProvider *receiverPtr); private: int32_t TaskOpenCtrlChannel(const std::string &args); @@ -85,6 +87,8 @@ private: int32_t NotifyPlayStatusChange(const AudioEvent &audioEvent); void NotifySourceDev(const AudioEventType type, const std::string dhId, const int32_t result); int32_t from_json(const json &j, AudioParam &audioParam); + int32_t HandleEngineMessage(uint32_t type, std::string content, std::string devId); + int32_t SendAudioEventToRemote(const AudioEvent &event); private: std::mutex taskQueueMutex_; @@ -100,6 +104,7 @@ private: using DAudioSinkDevFunc = int32_t (DAudioSinkDev::*)(const AudioEvent &audioEvent); std::map memberFuncMap_; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersink/include/daudio_sink_manager.h b/services/audiomanager/managersink/include/daudio_sink_manager.h index 6edc7a72..571e4fe7 100644 --- a/services/audiomanager/managersink/include/daudio_sink_manager.h +++ b/services/audiomanager/managersink/include/daudio_sink_manager.h @@ -23,9 +23,18 @@ #include "daudio_sink_dev.h" #include "idaudio_source.h" +#include "i_av_engine_provider_callback.h" namespace OHOS { namespace DistributedHardware { +class EngineProviderListener : public IAVEngineProviderCallback { +public: + EngineProviderListener() {}; + ~EngineProviderListener() override {}; + + int32_t OnProviderEvent(const AVTransEvent &event) override; +}; + class DAudioSinkManager { DECLARE_SINGLE_INSTANCE_BASE(DAudioSinkManager); public: @@ -36,22 +45,31 @@ public: int32_t DAudioNotify(const std::string &devId, const std::string &dhId, const int32_t eventType, const std::string &eventContent); void OnSinkDevReleased(const std::string &devId); - void NotifyEvent(const std::string &devId, const int32_t eventType, const std::string &eventContent); - + void ClearAudioDev(const std::string &devId); + int32_t CreateAudioDevice(const std::string &devId); private: - static constexpr const char* DEVCLEAR_THREAD = "sinkClearTh"; - DAudioSinkManager(); ~DAudioSinkManager(); - void ClearAudioDev(const std::string &devId); - int32_t CreateAudioDevice(const std::string &devId); + int32_t LoadAVSenderEngineProvider(); + int32_t UnloadAVSenderEngineProvider(); + int32_t LoadAVReceiverEngineProvider(); + int32_t UnloadAVReceiverEngineProvider(); + +private: + static constexpr const char* DEVCLEAR_THREAD = "sinkClearTh"; std::mutex devMapMutex_; std::unordered_map> audioDevMap_; std::mutex remoteSvrMutex_; std::map> sourceServiceMap_; std::thread devClearThread_; std::string localNetworkId_; + + IAVEngineProvider *sendProviderPtr_ = nullptr; + IAVEngineProvider *rcvProviderPtr_ = nullptr; + void *pSHandler_ = nullptr; + void *pRHandler_ = nullptr; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersink/src/daudio_sink_dev.cpp b/services/audiomanager/managersink/src/daudio_sink_dev.cpp index bb0b6cc4..e31fedc3 100644 --- a/services/audiomanager/managersink/src/daudio_sink_dev.cpp +++ b/services/audiomanager/managersink/src/daudio_sink_dev.cpp @@ -52,6 +52,7 @@ DAudioSinkDev::DAudioSinkDev(const std::string &devId) : devId_(devId) memberFuncMap_[VOLUME_MUTE_SET] = &DAudioSinkDev::NotifySetMute; memberFuncMap_[VOLUME_CHANGE] = &DAudioSinkDev::NotifyVolumeChange; memberFuncMap_[CHANGE_PLAY_STATUS] = &DAudioSinkDev::NotifyPlayStatusChange; + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); } DAudioSinkDev::~DAudioSinkDev() @@ -77,6 +78,22 @@ void DAudioSinkDev::SleepAudioDev() taskQueue_ = nullptr; } +int32_t DAudioSinkDev::InitAVTransEngines(IAVEngineProvider *senderPtr, IAVEngineProvider *receiverPtr) +{ + DHLOGI("Init InitAVTransEngines"); + if (engineFlag_ == true) { + // new 模式下只支持普通通路;后期音频框架支持后,全部支持 + micClient_ = std::make_shared(devId_, shared_from_this()); + micClient_->InitSenderEngine(senderPtr); + } + + if (engineFlag_ == true) { + speakerClient_ = std::make_shared(devId_, shared_from_this()); + speakerClient_->InitReceiverEngine(receiverPtr); + } + return DH_SUCCESS; +} + void DAudioSinkDev::NotifyEvent(const AudioEvent &audioEvent) { DHLOGD("Notify event, eventType: %d.", (int32_t)audioEvent.type); @@ -390,8 +407,12 @@ int32_t DAudioSinkDev::TaskOpenDSpeaker(const std::string &args) DHLOGE("Get audio param from json failed, error code %d.", ret); return ret; } - - if (speakerClient_ == nullptr) { + // new mode 下 spkclient应该在初始化就做 + if (engineFlag_ == true && speakerClient_ == nullptr) { + DHLOGE("speaker client should be init by dev."); + return ERR_DH_AUDIO_NULLPTR; + } + if (engineFlag_ == false && speakerClient_ == nullptr) { #ifdef DAUDIO_SUPPORT_DIRECT if (audioParam.renderOpts.renderFlags == MMAP_MODE) { DHLOGI("Try to mmap mode."); @@ -405,6 +426,7 @@ int32_t DAudioSinkDev::TaskOpenDSpeaker(const std::string &args) speakerClient_ = std::make_shared(devId_, shared_from_this()); #endif } + DHLOGI("Open speaker device."); ret = speakerClient_->SetUp(audioParam); if (ret != DH_SUCCESS) { DHLOGE("Setup speaker failed, ret: %d.", ret); @@ -439,7 +461,6 @@ int32_t DAudioSinkDev::TaskCloseDSpeaker(const std::string &args) closeStatus = false; } speakerClient_ = nullptr; - closeStatus ? NotifySourceDev(NOTIFY_CLOSE_SPEAKER_RESULT, spkDhId_, DH_SUCCESS) : NotifySourceDev(NOTIFY_CLOSE_SPEAKER_RESULT, spkDhId_, ERR_DH_AUDIO_FAILED); DHLOGI("Close speaker device task excute success."); @@ -463,9 +484,11 @@ int32_t DAudioSinkDev::TaskOpenDMic(const std::string &args) DHLOGE("Get audio param from json failed, error code %d.", ret); return ret; } - - do { - if (micClient_ == nullptr) { + if (engineFlag_ == true && micClient_ == nullptr) { + DHLOGE("Mic client should be init by dev."); + return ERR_DH_AUDIO_NULLPTR; + } + if (engineFlag_ == false && micClient_ == nullptr) { #ifdef DAUDIO_SUPPORT_DIRECT if (audioParam.captureOpts.capturerFlags == MMAP_MODE) { DHLOGI("Try to mmap mode."); @@ -476,9 +499,10 @@ int32_t DAudioSinkDev::TaskOpenDMic(const std::string &args) micClient_ = std::make_shared(devId_, shared_from_this()); } #else - micClient_ = std::make_shared(devId_, shared_from_this()); + micClient_ = std::make_shared(devId_, shared_from_this()); #endif - } + } + do { ret = micClient_->SetUp(audioParam); if (ret != DH_SUCCESS) { DHLOGE("Set up mic failed, ret: %d.", ret); @@ -517,7 +541,6 @@ int32_t DAudioSinkDev::TaskCloseDMic(const std::string &args) closeStatus = false; } micClient_ = nullptr; - closeStatus ? NotifySourceDev(NOTIFY_CLOSE_MIC_RESULT, micDhId_, DH_SUCCESS) : NotifySourceDev(NOTIFY_CLOSE_MIC_RESULT, micDhId_, ERR_DH_AUDIO_FAILED); DHLOGI("Close mic device task excute success."); @@ -576,7 +599,7 @@ int32_t DAudioSinkDev::TaskVolumeChange(const std::string &args) if (audioCtrlMgr_ == nullptr) { return ERR_DH_AUDIO_SA_SINKCTRLMGR_NOT_INIT; } - return audioCtrlMgr_->SendAudioEvent(event); + return SendAudioEventToRemote(event); } int32_t DAudioSinkDev::TaskFocusChange(const std::string &args) @@ -586,7 +609,7 @@ int32_t DAudioSinkDev::TaskFocusChange(const std::string &args) if (audioCtrlMgr_ == nullptr) { return ERR_DH_AUDIO_SA_SINKCTRLMGR_NOT_INIT; } - return audioCtrlMgr_->SendAudioEvent(event); + return SendAudioEventToRemote(event); } int32_t DAudioSinkDev::TaskRenderStateChange(const std::string &args) @@ -596,7 +619,7 @@ int32_t DAudioSinkDev::TaskRenderStateChange(const std::string &args) if (audioCtrlMgr_ == nullptr) { return ERR_DH_AUDIO_SA_SINKCTRLMGR_NOT_INIT; } - return audioCtrlMgr_->SendAudioEvent(event); + return SendAudioEventToRemote(event); } int32_t DAudioSinkDev::TaskPlayStatusChange(const std::string &args) @@ -611,6 +634,35 @@ int32_t DAudioSinkDev::TaskPlayStatusChange(const std::string &args) return DH_SUCCESS; } +int32_t DAudioSinkDev::SendAudioEventToRemote(const AudioEvent &event) +{ + if (engineFlag_ == false) { + if (audioCtrlMgr_ == nullptr) { + DHLOGE("Audio ctrl mgr not init."); + return ERR_DH_AUDIO_NULLPTR; + } + int32_t ret = audioCtrlMgr_->SendAudioEvent(event); + if (ret != DH_SUCCESS) { + DHLOGE("Task send audio event to remote failed."); + return ERR_DH_AUDIO_NULLPTR; + } + } else { + // because: type: VOLUME_CHANGE / AUDIO_FOCUS_CHANGE / AUDIO_RENDER_STATE_CHANGE + // so speakerClient + if (speakerClient_ == nullptr) { + DHLOGE("Audio ctrl mgr not init."); + return ERR_DH_AUDIO_NULLPTR; + } + int32_t ret = speakerClient_->SendMessage(static_cast(event.type), + event.content, devId_); + if (ret != DH_SUCCESS) { + DHLOGE("Task send message to remote failed."); + return ERR_DH_AUDIO_NULLPTR; + } + } + return DH_SUCCESS; +} + void DAudioSinkDev::OnTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName) { (void)resultCode; @@ -629,8 +681,22 @@ void DAudioSinkDev::NotifySourceDev(const AudioEventType type, const std::string jEvent[KEY_EVENT_TYPE] = type; jEvent[KEY_RANDOM_TASK_CODE] = std::to_string(randomTaskCode); - DHLOGD("notify source dev, random task code: %s", std::to_string(randomTaskCode).c_str()); - DAudioSinkManager::GetInstance().DAudioNotify(devId_, dhId, type, jEvent.dump()); + if (engineFlag_ == false) { + DHLOGD("notify source dev, random task code: %s", std::to_string(randomTaskCode).c_str()); + DAudioSinkManager::GetInstance().DAudioNotify(devId_, dhId, type, jEvent.dump()); + } else { + DHLOGD("Notify source dev, new engine, random task code:%s", std::to_string(randomTaskCode).c_str()); + if (speakerClient_ == nullptr || micClient_ == nullptr) { + DHLOGE("speaker client or mic client is null."); + return; + } + if (type == NOTIFY_OPEN_CTRL_RESULT || type == NOTIFY_CLOSE_CTRL_RESULT) { + DHLOGE("In new engine mode, ctrl is not allowed."); + return; + } + speakerClient_->SendMessage(static_cast(type), jEvent.dump(), devId_); + micClient_->SendMessage(static_cast(type), jEvent.dump(), devId_); + } } int32_t DAudioSinkDev::from_json(const json &j, AudioParam &audioParam) @@ -650,5 +716,11 @@ int32_t DAudioSinkDev::from_json(const json &j, AudioParam &audioParam) j.at(KEY_CAPTURE_FLAGS).get_to(audioParam.captureOpts.capturerFlags); return DH_SUCCESS; } + +int32_t DAudioSinkDev::HandleEngineMessage(uint32_t type, std::string content, std::string devId) +{ + DHLOGI("HandleEngineMessage enter."); + return DAudioSinkManager::GetInstance().HandleDAudioNotify(devId, devId, static_cast(type), content); +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audiomanager/managersink/src/daudio_sink_manager.cpp b/services/audiomanager/managersink/src/daudio_sink_manager.cpp index 1dce0c3b..a0f240d3 100644 --- a/services/audiomanager/managersink/src/daudio_sink_manager.cpp +++ b/services/audiomanager/managersink/src/daudio_sink_manager.cpp @@ -15,6 +15,7 @@ #include "daudio_sink_manager.h" +#include #include "if_system_ability_manager.h" #include "iservice_registry.h" @@ -29,6 +30,17 @@ namespace OHOS { namespace DistributedHardware { IMPLEMENT_SINGLE_INSTANCE(DAudioSinkManager); +using AVTransProviderClass = IAVEngineProvider *(*)(const std::string &); + +const std::string SENDER_SO_NAME = "libdistributed_av_sender.z.so"; +const std::string GET_SENDER_PROVIDER_FUNC = "GetAVSenderEngineProvider"; +const std::string RECEIVER_SO_NAME = "libdistributed_av_receiver.z.so"; +const std::string GET_RECEIVER_PROVIDER_FUNC = "GetAVReceiverEngineProvider"; +#ifdef __LP64__ +const std::string LIB_LOAD_PATH = "/system/lib64/"; +#else +const std::string LIB_LOAD_PATH = "/system/lib/"; +#endif DAudioSinkManager::DAudioSinkManager() { DHLOGD("Distributed audio sink manager constructed."); @@ -50,12 +62,43 @@ int32_t DAudioSinkManager::Init() DHLOGE("Get local network id failed, ret: %d.", ret); return ret; } + // new 方式 + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); + if (engineFlag_ == true) { + ret = LoadAVReceiverEngineProvider(); + if (ret != DH_SUCCESS || rcvProviderPtr_ == nullptr) { + DHLOGE("Load av transport receiver engine provider failed."); + return ERR_DH_AUDIO_FAILED; + } + ret = rcvProviderPtr_->RegisterProviderCallback(std::make_shared()); + if (ret != DH_SUCCESS) { + DHLOGE("Register av transport receiver Provider Callback failed."); + return ERR_DH_AUDIO_FAILED; + } + DHLOGI("LoadAVReceiverEngineProvider success."); + + ret = LoadAVSenderEngineProvider(); + if (ret != DH_SUCCESS || sendProviderPtr_ == nullptr) { + DHLOGI("Load av transport sender engine provider failed."); + return ERR_DH_AUDIO_FAILED; + } + ret = sendProviderPtr_->RegisterProviderCallback(std::make_shared()); + if (ret != DH_SUCCESS) { + DHLOGE("Register av transport sender Provider Callback failed."); + return ERR_DH_AUDIO_FAILED; + } + DHLOGE("LoadAVSenderEngineProvider success."); + } return DH_SUCCESS; } int32_t DAudioSinkManager::UnInit() { DHLOGI("UnInit audio sink manager."); + if (engineFlag_ == true) { + UnloadAVSenderEngineProvider(); + UnloadAVReceiverEngineProvider(); + } { std::lock_guard remoteSvrLock(remoteSvrMutex_); sourceServiceMap_.clear(); @@ -90,13 +133,15 @@ void DAudioSinkManager::OnSinkDevReleased(const std::string &devId) int32_t DAudioSinkManager::HandleDAudioNotify(const std::string &devId, const std::string &dhId, const int32_t eventType, const std::string &eventContent) { - DHLOGD("Receive audio event from devId: %s, event type: %d.", GetAnonyString(devId).c_str(), eventType); + DHLOGD("Receive audio event from devId: %s, event type: %d. event content: %s.", + GetAnonyString(devId).c_str(), eventType, eventContent.c_str()); - if (eventContent.length() > DAUDIO_MAX_JSON_LEN || eventContent.empty() || !CheckIsNum(dhId) + if (eventContent.length() > DAUDIO_MAX_JSON_LEN || eventContent.empty() || !CheckDevIdIsLegal(devId) || eventType < 0 || eventType > MAX_EVENT_TYPE_NUM) { return ERR_DH_AUDIO_FAILED; } + // now ctrl channel is also goto here, please sure here not crash. json jParam = json::parse(eventContent, nullptr, false); if (JsonParamCheck(jParam, { KEY_RANDOM_TASK_CODE })) { DHLOGD("Receive audio notify from source, random task code: %s", @@ -115,11 +160,22 @@ int32_t DAudioSinkManager::HandleDAudioNotify(const std::string &devId, const st int32_t DAudioSinkManager::CreateAudioDevice(const std::string &devId) { DHLOGI("Create audio sink dev."); + std::lock_guard lock(devMapMutex_); + if (audioDevMap_.find(devId) != audioDevMap_.end()) { + DHLOGI("Audio sink dev in map. devId: %s.", GetAnonyString(devId).c_str()); + return DH_SUCCESS; + } auto dev = std::make_shared(devId); if (dev->AwakeAudioDev() != DH_SUCCESS) { DHLOGE("Awake audio dev failed."); return ERR_DH_AUDIO_FAILED; } + // wuhaobo zhushi 不论old 还是new 都需要调用init + int32_t ret = dev->InitAVTransEngines(sendProviderPtr_, rcvProviderPtr_); + if (ret != DH_SUCCESS) { + DHLOGE("Init av transport sender engine failed."); + return ERR_DH_AUDIO_FAILED; + } audioDevMap_.emplace(devId, dev); return DH_SUCCESS; } @@ -185,5 +241,96 @@ void DAudioSinkManager::ClearAudioDev(const std::string &devId) dev->second->SleepAudioDev(); audioDevMap_.erase(devId); } + +int32_t DAudioSinkManager::LoadAVReceiverEngineProvider() +{ + DHLOGI("LoadAVReceiverEngineProvider enter"); + char path[PATH_MAX + 1] = {0x00}; + if ((LIB_LOAD_PATH.length() + RECEIVER_SO_NAME.length()) > PATH_MAX || + realpath((LIB_LOAD_PATH + RECEIVER_SO_NAME).c_str(), path) == nullptr) { + DHLOGE("File open failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + pRHandler_ = dlopen(path, RTLD_LAZY | RTLD_NODELETE); + if (pRHandler_ == nullptr) { + DHLOGE("%s handler load failed, failed reason : %s", path, dlerror()); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pRHandler_, + GET_RECEIVER_PROVIDER_FUNC.c_str()); + if (getEngineFactoryFunc == nullptr) { + DHLOGE("av transport engine factory function handler is null, failed reason : %s", dlerror()); + dlclose(pRHandler_); + pRHandler_ = nullptr; + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + rcvProviderPtr_ = getEngineFactoryFunc(OWNER_NAME_D_SPEAKER); + DHLOGE("LoadAVReceiverEngineProvider success"); + return DH_SUCCESS; +} + +int32_t DAudioSinkManager::UnloadAVReceiverEngineProvider() +{ + DHLOGI("UnloadAVReceiverEngineProvider"); + if (pRHandler_ != nullptr) { + dlclose(pRHandler_); + pRHandler_ = nullptr; + } + return DH_SUCCESS; +} + +int32_t DAudioSinkManager::LoadAVSenderEngineProvider() +{ + DHLOGI("LoadAVSenderEngineProvider enter"); + char path[PATH_MAX + 1] = {0x00}; + if ((LIB_LOAD_PATH.length() + SENDER_SO_NAME.length()) > PATH_MAX || + realpath((LIB_LOAD_PATH + SENDER_SO_NAME).c_str(), path) == nullptr) { + DHLOGE("File open failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + pSHandler_ = dlopen(path, RTLD_LAZY | RTLD_NODELETE); + if (pSHandler_ == nullptr) { + DHLOGE("%s handler load failed, failed reason : %s", path, dlerror()); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pSHandler_, + GET_SENDER_PROVIDER_FUNC.c_str()); + if (getEngineFactoryFunc == nullptr) { + DHLOGE("av transport engine factory function handler is null, failed reason : %s", dlerror()); + dlclose(pSHandler_); + pSHandler_ = nullptr; + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + sendProviderPtr_ = getEngineFactoryFunc(OWNER_NAME_D_MIC); + return DH_SUCCESS; +} + +int32_t DAudioSinkManager::UnloadAVSenderEngineProvider() +{ + DHLOGI("UnloadAVSenderEngineProvider enter"); + if (pSHandler_ != nullptr) { + dlclose(pSHandler_); + pSHandler_ = nullptr; + } + return DH_SUCCESS; +} + +int32_t EngineProviderListener::OnProviderEvent(const AVTransEvent &event) +{ + DHLOGI("On provider event :%d", event.type); + // wuhaobo zhushi 这里等source要求打开后才会回调上来;创建设备 + if (event.type == EventType::EVENT_CHANNEL_OPENED) { + DHLOGI("CreateAudioDevice enter"); + DAudioSinkManager::GetInstance().CreateAudioDevice(event.peerDevId); + DHLOGI("CreateAudioDevice end"); + } else if (event.type == EventType::EVENT_CHANNEL_CLOSED) { + DHLOGI("CreateAudioDevice enter"); + DAudioSinkManager::GetInstance().ClearAudioDev(event.peerDevId); + DHLOGI("CreateAudioDevice end"); + } else { + DHLOGE("Invaild event type."); + } + return DH_SUCCESS; +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audiomanager/managersource/include/daudio_source_dev.h b/services/audiomanager/managersource/include/daudio_source_dev.h index 632cf843..34c8d281 100644 --- a/services/audiomanager/managersource/include/daudio_source_dev.h +++ b/services/audiomanager/managersource/include/daudio_source_dev.h @@ -26,8 +26,8 @@ #include "dmic_dev.h" #include "dspeaker_dev.h" #include "iaudio_event_callback.h" -#include "iaudio_datatrans_callback.h" #include "iaudio_data_transport.h" +#include "iaudio_datatrans_callback.h" #include "idaudio_ipc_callback.h" #include "idaudio_hdi_callback.h" #include "task_queue.h" @@ -105,6 +105,7 @@ private: int32_t CloseCtrlTrans(const AudioEvent &event, bool isSpk); AudioEventType getEventTypeFromArgs(const std::string &args); void to_json(json &j, const AudioParam ¶m); + int32_t SendAudioEventToRemote(const AudioEvent &event); private: static constexpr uint8_t RPC_WAIT_SECONDS = 2; @@ -133,6 +134,7 @@ private: using DAudioSourceDevFunc = int32_t (DAudioSourceDev::*)(const AudioEvent &audioEvent); std::map memberFuncMap_; std::map eventNotifyMap_; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersource/include/daudio_source_manager.h b/services/audiomanager/managersource/include/daudio_source_manager.h index 74ffe3c4..d56c6840 100644 --- a/services/audiomanager/managersource/include/daudio_source_manager.h +++ b/services/audiomanager/managersource/include/daudio_source_manager.h @@ -43,6 +43,12 @@ public: const std::string &eventContent); int32_t OnEnableDAudio(const std::string &devId, const std::string &dhId, const int32_t result); int32_t OnDisableDAudio(const std::string &devId, const std::string &dhId, const int32_t result); + int32_t LoadAVSenderEngineProvider(); + int32_t UnloadAVSenderEngineProvider(); + int32_t LoadAVReceiverEngineProvider(); + int32_t UnloadAVReceiverEngineProvider(); + IAVEngineProvider *getSenderProvider(); + IAVEngineProvider *getReceiverProvider(); private: DAudioSourceManager(); @@ -69,6 +75,11 @@ private: sptr ipcCallback_ = nullptr; std::shared_ptr daudioMgrCallback_ = nullptr; std::thread devClearThread_; + IAVEngineProvider *sendProviderPtr_ = nullptr; + IAVEngineProvider *rcvProviderPtr_ = nullptr; + void *pSHandler_ = nullptr; + void *pRHandler_ = nullptr; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersource/include/dmic_dev.h b/services/audiomanager/managersource/include/dmic_dev.h index 45772bd0..406db781 100644 --- a/services/audiomanager/managersource/include/dmic_dev.h +++ b/services/audiomanager/managersource/include/dmic_dev.h @@ -23,10 +23,11 @@ #include "audio_param.h" #include "audio_status.h" +#include "av_receiver_engine_transport.h" #include "ashmem.h" #include "daudio_hdi_handler.h" -#include "iaudio_datatrans_callback.h" #include "iaudio_data_transport.h" +#include "iaudio_datatrans_callback.h" #include "iaudio_event_callback.h" #include "idaudio_hdi_callback.h" @@ -36,12 +37,18 @@ namespace OHOS { namespace DistributedHardware { class DMicDev : public IDAudioHdiCallback, public IAudioDataTransCallback, + public AVReceiverTransportCallback, public std::enable_shared_from_this { public: DMicDev(const std::string &devId, std::shared_ptr callback) : devId_(devId), audioEventCallback_(callback) {}; ~DMicDev() override = default; + void OnEngineTransEvent(const AVTransEvent &event) override; + void OnEngineTransMessage(const std::shared_ptr &message) override; + void OnEngineTransDataAvailable(const std::shared_ptr &audioData) override; + int32_t InitReceiverEngine(IAVEngineProvider *providerPtr); + int32_t EnableDMic(const int32_t dhId, const std::string &capability); int32_t DisableDMic(const int32_t dhId); @@ -63,6 +70,7 @@ public: int32_t Stop(); int32_t Release(); bool IsOpened(); + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId); AudioParam GetAudioParam() const; int32_t NotifyHdfAudioEvent(const AudioEvent &event); @@ -96,7 +104,6 @@ private: std::queue> dataQueue_; std::set enabledPorts_; AudioStatus curStatus_ = AudioStatus::STATUS_IDLE; - // Mic capture parameters AudioParamHDF paramHDF_; AudioParam param_; @@ -118,6 +125,7 @@ private: std::thread enqueueDataThread_; std::mutex writeAshmemMutex_; std::condition_variable dataQueueCond_; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersource/include/dspeaker_dev.h b/services/audiomanager/managersource/include/dspeaker_dev.h index 401d37cf..c8b909d8 100644 --- a/services/audiomanager/managersource/include/dspeaker_dev.h +++ b/services/audiomanager/managersource/include/dspeaker_dev.h @@ -23,11 +23,12 @@ #include "audio_param.h" #include "ashmem.h" -#include "idaudio_hdi_callback.h" +#include "av_sender_engine_transport.h" #include "daudio_hdi_handler.h" -#include "iaudio_data_transport.h" #include "iaudio_event_callback.h" +#include "iaudio_data_transport.h" #include "iaudio_datatrans_callback.h" +#include "idaudio_hdi_callback.h" using json = nlohmann::json; @@ -35,11 +36,15 @@ namespace OHOS { namespace DistributedHardware { class DSpeakerDev : public IDAudioHdiCallback, public IAudioDataTransCallback, + public AVSenderTransportCallback, public std::enable_shared_from_this { public: DSpeakerDev(const std::string &devId, std::shared_ptr callback) : devId_(devId), audioEventCallback_(callback) {}; ~DSpeakerDev() override = default; + void OnEngineTransEvent(const AVTransEvent &event) override; + void OnEngineTransMessage(const std::shared_ptr &message) override; + int32_t InitSenderEngine(IAVEngineProvider *providerPtr); int32_t EnableDSpeaker(const int32_t dhId, const std::string& capability); int32_t DisableDSpeaker(const int32_t dhId); @@ -67,6 +72,7 @@ public: bool IsOpened(); int32_t Pause(); int32_t Restart(); + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId); AudioParam GetAudioParam() const; int32_t NotifyHdfAudioEvent(const AudioEvent &event); @@ -92,7 +98,7 @@ private: // Speaker render parameters AudioParamHDF paramHDF_; AudioParam param_; - + uint32_t timeInterval_ = 5; sptr ashmem_ = nullptr; std::atomic isEnqueueRunning_ = false; @@ -105,6 +111,7 @@ private: int64_t readTvSec_ = 0; int64_t readTvNSec_ = 0; std::thread enqueueDataThread_; + bool engineFlag_ = true; }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersource/src/daudio_source_dev.cpp b/services/audiomanager/managersource/src/daudio_source_dev.cpp index aa89bbf7..b2bb14b8 100644 --- a/services/audiomanager/managersource/src/daudio_source_dev.cpp +++ b/services/audiomanager/managersource/src/daudio_source_dev.cpp @@ -65,6 +65,7 @@ DAudioSourceDev::DAudioSourceDev(const std::string &devId, const std::shared_ptr eventNotifyMap_[NOTIFY_CLOSE_MIC_RESULT] = EVENT_NOTIFY_CLOSE_MIC; eventNotifyMap_[NOTIFY_OPEN_CTRL_RESULT] = EVENT_NOTIFY_OPEN_CTRL; eventNotifyMap_[NOTIFY_CLOSE_CTRL_RESULT] = EVENT_NOTIFY_CLOSE_CTRL; + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); } int32_t DAudioSourceDev::AwakeAudioDev() @@ -134,11 +135,12 @@ int32_t DAudioSourceDev::HandleOpenDSpeaker(const AudioEvent &event) DHLOGE("Task queue is null."); return ERR_DH_AUDIO_NULLPTR; } - int32_t ret = OpenCtrlTrans(event); - if (ret != DH_SUCCESS) { - return ret; + if (engineFlag_ == false) { + int32_t ret = OpenCtrlTrans(event); + if (ret != DH_SUCCESS) { + return ret; + } } - auto task = GenerateTask(this, &DAudioSourceDev::TaskOpenDSpeaker, event.content, "Open Spk Device", &DAudioSourceDev::OnTaskResult); return taskQueue_->Produce(task); @@ -182,11 +184,12 @@ int32_t DAudioSourceDev::HandleOpenDMic(const AudioEvent &event) DHLOGE("Task queue is null."); return ERR_DH_AUDIO_NULLPTR; } - int32_t ret = OpenCtrlTrans(event); - if (ret != DH_SUCCESS) { - return ret; + if (engineFlag_ == false) { + int32_t ret = OpenCtrlTrans(event); + if (ret != DH_SUCCESS) { + return ret; + } } - auto task = GenerateTask(this, &DAudioSourceDev::TaskOpenDMic, event.content, "Open Mic Device", &DAudioSourceDev::OnTaskResult); return taskQueue_->Produce(task); @@ -199,7 +202,6 @@ int32_t DAudioSourceDev::HandleCloseDMic(const AudioEvent &event) DHLOGE("Task queue is null."); return ERR_DH_AUDIO_NULLPTR; } - auto task = GenerateTask(this, &DAudioSourceDev::TaskCloseDMic, event.content, "Close Mic Device", &DAudioSourceDev::OnTaskResult); taskQueue_->Produce(task); @@ -600,6 +602,14 @@ int32_t DAudioSourceDev::TaskOpenDSpeaker(const std::string &args) return ERR_DH_AUDIO_FAILED; } + if (engineFlag_ == true) { + int32_t ret = speaker_->InitSenderEngine(DAudioSourceManager::GetInstance().getSenderProvider()); + if (ret != DH_SUCCESS) { + DHLOGE("Speaker init sender Engine, error code %d.", ret); + return ret; + } + } + json jAudioParam; to_json(jAudioParam, speaker_->GetAudioParam()); int32_t ret = NotifySinkDev(OPEN_SPEAKER, jAudioParam, jParam[KEY_DH_ID]); @@ -607,6 +617,7 @@ int32_t DAudioSourceDev::TaskOpenDSpeaker(const std::string &args) DHLOGE("Notify sink open speaker failed, error code %d.", ret); return ret; } + ret = speaker_->SetUp(); if (ret != DH_SUCCESS) { DHLOGE("Speaker setup failed, error code %d.", ret); @@ -634,7 +645,6 @@ int32_t DAudioSourceDev::TaskCloseDSpeaker(const std::string &args) if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) { return ERR_DH_AUDIO_SA_PARAM_INVALID; } - bool closeStatus = true; int32_t ret = speaker_->Stop(); if (ret != DH_SUCCESS) { @@ -669,6 +679,13 @@ int32_t DAudioSourceDev::TaskOpenDMic(const std::string &args) DHLOGE("Mic device not init"); return ERR_DH_AUDIO_SA_MIC_DEVICE_NOT_INIT; } + if (engineFlag_ == true) { + int32_t ret = mic_->InitReceiverEngine(DAudioSourceManager::GetInstance().getReceiverProvider()); + if (ret != DH_SUCCESS) { + DHLOGE("Init receiver engine failed."); + return ret; + } + } if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) { return ERR_DH_AUDIO_SA_PARAM_INVALID; } @@ -683,7 +700,6 @@ int32_t DAudioSourceDev::TaskOpenDMic(const std::string &args) if (!JsonParamCheck(jParam, { KEY_DH_ID })) { return ERR_DH_AUDIO_FAILED; } - to_json(jAudioParam, mic_->GetAudioParam()); ret = NotifySinkDev(OPEN_MIC, jAudioParam, jParam[KEY_DH_ID]); if (ret != DH_SUCCESS) { @@ -699,7 +715,6 @@ int32_t DAudioSourceDev::TaskOpenDMic(const std::string &args) mic_->Release(); return ret; } - NotifyHDF(NOTIFY_OPEN_MIC_RESULT, HDF_EVENT_RESULT_SUCCESS); return DH_SUCCESS; } @@ -715,7 +730,6 @@ int32_t DAudioSourceDev::TaskCloseDMic(const std::string &args) if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) { return ERR_DH_AUDIO_SA_PARAM_INVALID; } - bool closeStatus = true; int32_t ret = mic_->Stop(); if (ret != DH_SUCCESS) { @@ -820,7 +834,7 @@ int32_t DAudioSourceDev::TaskSetVolume(const std::string &args) return ERR_DH_AUDIO_NULLPTR; } AudioEvent event(getEventTypeFromArgs(args), args); - return audioCtrlMgr_->SendAudioEvent(event); + return SendAudioEventToRemote(event); } int32_t DAudioSourceDev::TaskChangeVolume(const std::string &args) @@ -849,7 +863,7 @@ int32_t DAudioSourceDev::TaskPlayStatusChange(const std::string &args) return ERR_DH_AUDIO_NULLPTR; } AudioEvent audioEvent(CHANGE_PLAY_STATUS, args); - int32_t ret = audioCtrlMgr_->SendAudioEvent(audioEvent); + int32_t ret = SendAudioEventToRemote(audioEvent); if (ret != DH_SUCCESS) { DHLOGE("Task Play status change failed."); } @@ -872,6 +886,34 @@ int32_t DAudioSourceDev::TaskPlayStatusChange(const std::string &args) } } +int32_t DAudioSourceDev::SendAudioEventToRemote(const AudioEvent &event) +{ + if (engineFlag_ == false) { + if (audioCtrlMgr_ == nullptr) { + DHLOGE("Audio ctrl mgr not init."); + return ERR_DH_AUDIO_NULLPTR; + } + int32_t ret = audioCtrlMgr_->SendAudioEvent(event); + if (ret != DH_SUCCESS) { + DHLOGE("Task send audio event to remote failed."); + return ERR_DH_AUDIO_NULLPTR; + } + } else { + // because: type: CHANGE_PLAY_STATUS / VOLUME_MUTE_SET / VOLUME_SET, so speaker + if (speaker_ == nullptr) { + DHLOGE("Audio ctrl mgr not init."); + return ERR_DH_AUDIO_NULLPTR; + } + int32_t ret = speaker_->SendMessage(static_cast(event.type), + event.content, devId_); + if (ret != DH_SUCCESS) { + DHLOGE("Task send message to remote failed."); + return ERR_DH_AUDIO_NULLPTR; + } + } + return DH_SUCCESS; +} + int32_t DAudioSourceDev::TaskSpkMmapStart(const std::string &args) { DHLOGI("Task spk mmap start, content: %s.", args.c_str()); @@ -947,7 +989,21 @@ int32_t DAudioSourceDev::NotifySinkDev(const AudioEventType type, const json Par { KEY_AUDIO_PARAM, Param }, { KEY_RANDOM_TASK_CODE, std::to_string(randomTaskCode) } }; DHLOGD("Notify sink dev, random task code: %s", std::to_string(randomTaskCode).c_str()); - DAudioSourceManager::GetInstance().DAudioNotify(devId_, dhId, type, jParam.dump()); + if (engineFlag_ == false) { + DAudioSourceManager::GetInstance().DAudioNotify(devId_, dhId, type, jParam.dump()); + } else { + DHLOGD("Notify sink dev, new engine, random task code:%s", std::to_string(randomTaskCode).c_str()); + if (speaker_ == nullptr || mic_ == nullptr) { + DHLOGE("speaker or mic dev is null."); + return ERR_DH_AUDIO_NULLPTR; + } + if (type == OPEN_CTRL || type == CLOSE_CTRL) { + DHLOGE("In new engine mode, ctrl is not allowed."); + return ERR_DH_AUDIO_NULLPTR; + } + speaker_->SendMessage(static_cast(type), jParam.dump(), devId_); + mic_->SendMessage(static_cast(type), jParam.dump(), devId_); + } return WaitForRPC(static_cast(static_cast(type) + eventOffset)); } diff --git a/services/audiomanager/managersource/src/daudio_source_manager.cpp b/services/audiomanager/managersource/src/daudio_source_manager.cpp index 8eede272..0c074e4b 100644 --- a/services/audiomanager/managersource/src/daudio_source_manager.cpp +++ b/services/audiomanager/managersource/src/daudio_source_manager.cpp @@ -15,6 +15,7 @@ #include "daudio_source_manager.h" +#include #include "if_system_ability_manager.h" #include "iservice_registry.h" @@ -30,10 +31,21 @@ namespace OHOS { namespace DistributedHardware { namespace { constexpr uint32_t MAX_DEVICE_ID_LENGTH = 200; -constexpr uint32_t MAX_DISTRIBUTED_HAREWARE_ID_LENGTH = 100; +constexpr uint32_t MAX_DISTRIBUTED_HARDWARE_ID_LENGTH = 100; } - IMPLEMENT_SINGLE_INSTANCE(DAudioSourceManager); +using AVTransProviderClass = IAVEngineProvider *(*)(const std::string &); + +const std::string SENDER_SO_NAME = "libdistributed_av_sender.z.so"; +const std::string GET_SENDER_PROVIDER_FUNC = "GetAVSenderEngineProvider"; +const std::string RECEIVER_SO_NAME = "libdistributed_av_receiver.z.so"; +const std::string GET_RECEIVER_PROVIDER_FUNC = "GetAVReceiverEngineProvider"; +#ifdef __LP64__ +const std::string LIB_LOAD_PATH = "/system/lib64/"; +#else +const std::string LIB_LOAD_PATH = "/system/lib/"; +#endif + DAudioSourceManager::DAudioSourceManager() { DHLOGD("Distributed audio source manager constructed."); @@ -65,12 +77,29 @@ int32_t DAudioSourceManager::Init(const sptr &callback) ipcCallback_ = callback; daudioMgrCallback_ = std::make_shared(); + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); + if (engineFlag_ == true) { + int32_t ret = LoadAVSenderEngineProvider(); + if (ret != DH_SUCCESS) { + DHLOGE("load av transport sender engine provider failed"); + return ERR_DH_AUDIO_FAILED; + } + ret = LoadAVReceiverEngineProvider(); + if (ret != DH_SUCCESS) { + DHLOGE("load av transport receiver engine provider failed."); + return ERR_DH_AUDIO_FAILED; + } + } return DH_SUCCESS; } int32_t DAudioSourceManager::UnInit() { DHLOGI("Uninit audio source manager."); + if (engineFlag_ == true) { + UnloadAVReceiverEngineProvider(); + UnloadAVSenderEngineProvider(); + } { std::lock_guard lock(devMapMtx_); for (auto iter = audioDevMap_.begin(); iter != audioDevMap_.end(); iter++) { @@ -96,9 +125,9 @@ int32_t DAudioSourceManager::UnInit() static bool CheckParams(const std::string &devId, const std::string &dhId) { - DHLOGD("Checking oarams of daudio."); + DHLOGD("Checking params of daudio."); if (devId.empty() || dhId.empty() || - devId.size() > MAX_DEVICE_ID_LENGTH || dhId.size() > MAX_DISTRIBUTED_HAREWARE_ID_LENGTH) { + devId.size() > MAX_DEVICE_ID_LENGTH || dhId.size() > MAX_DISTRIBUTED_HARDWARE_ID_LENGTH) { return false; } return true; @@ -149,12 +178,13 @@ int32_t DAudioSourceManager::DisableDAudio(const std::string &devId, const std:: int32_t DAudioSourceManager::HandleDAudioNotify(const std::string &devId, const std::string &dhId, const int32_t eventType, const std::string &eventContent) { - DHLOGD("Handle distributed audio notify, devId: %s, dhId: %s, eventType: %d.", GetAnonyString(devId).c_str(), - dhId.c_str(), eventType); + DHLOGD("Receive audio event from devId: %s, event type: %d. event content: %s.", + GetAnonyString(devId).c_str(), eventType, eventContent.c_str()); if (eventContent.length() > DAUDIO_MAX_JSON_LEN || eventContent.empty()) { return ERR_DH_AUDIO_FAILED; } + // now ctrl channel is also goto here, please sure here not crash. json jParam = json::parse(eventContent, nullptr, false); if (JsonParamCheck(jParam, { KEY_RANDOM_TASK_CODE })) { DHLOGD("Receive audio notify from sink, random task code: %s", @@ -304,5 +334,90 @@ void DAudioSourceManager::ClearAudioDev(const std::string &devId) audioDevMap_.erase(devId); } } + +int32_t DAudioSourceManager::LoadAVSenderEngineProvider() +{ + DHLOGI("LoadAVSenderEngineProvider enter"); + char path[PATH_MAX + 1] = {0x00}; + if ((LIB_LOAD_PATH.length() + SENDER_SO_NAME.length()) > PATH_MAX || + realpath((LIB_LOAD_PATH + SENDER_SO_NAME).c_str(), path) == nullptr) { + DHLOGE("File open failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + pSHandler_ = dlopen(path, RTLD_LAZY | RTLD_NODELETE); + if (pSHandler_ == nullptr) { + DHLOGE("%s handler load failed, failed reason : %s", path, dlerror()); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pSHandler_, + GET_SENDER_PROVIDER_FUNC.c_str()); + if (getEngineFactoryFunc == nullptr) { + DHLOGE("av transport engine factory function handler is null, failed reason : %s", dlerror()); + dlclose(pSHandler_); + pSHandler_ = nullptr; + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + sendProviderPtr_ = getEngineFactoryFunc(OWNER_NAME_D_SPEAKER); + DHLOGI("LoadAVSenderEngineProvider exit"); + return DH_SUCCESS; +} + +int32_t DAudioSourceManager::UnloadAVSenderEngineProvider() +{ + DHLOGI("UnloadAVSenderEngineProvider enter"); + if (pSHandler_ != nullptr) { + dlclose(pSHandler_); + pSHandler_ = nullptr; + } + sendProviderPtr_ = nullptr; + return DH_SUCCESS; +} + +int32_t DAudioSourceManager::LoadAVReceiverEngineProvider() +{ + DHLOGI("LoadAVReceiverEngineProvider enter"); + char path[PATH_MAX + 1] = {0x00}; + if ((LIB_LOAD_PATH.length() + RECEIVER_SO_NAME.length()) > PATH_MAX || + realpath((LIB_LOAD_PATH + RECEIVER_SO_NAME).c_str(), path) == nullptr) { + DHLOGE("File canonicalization failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + pRHandler_ = dlopen(path, RTLD_LAZY | RTLD_NODELETE); + if (pRHandler_ == nullptr) { + DHLOGE("%s handler load failed, failed reason : %s", path, dlerror()); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + AVTransProviderClass getEngineFactoryFunc = (AVTransProviderClass)dlsym(pRHandler_, + GET_RECEIVER_PROVIDER_FUNC.c_str()); + if (getEngineFactoryFunc == nullptr) { + DHLOGE("av transport engine factory function handler is null, failed reason : %s", dlerror()); + dlclose(pRHandler_); + pRHandler_ = nullptr; + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + rcvProviderPtr_ = getEngineFactoryFunc(OWNER_NAME_D_MIC); + DHLOGE("LoadAVReceiverEngineProvider success"); + return DH_SUCCESS; +} + +int32_t DAudioSourceManager::UnloadAVReceiverEngineProvider() +{ + DHLOGI("UnloadAVReceiverEngineProvider"); + if (pRHandler_ != nullptr) { + dlclose(pRHandler_); + pRHandler_ = nullptr; + } + return DH_SUCCESS; +} + +IAVEngineProvider *DAudioSourceManager::getSenderProvider() +{ + return sendProviderPtr_; +} + +IAVEngineProvider *DAudioSourceManager::getReceiverProvider() +{ + return rcvProviderPtr_; +} } // DistributedHardware } // OHOS \ No newline at end of file diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index 705496af..ed56171a 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -26,6 +26,7 @@ #include "daudio_hisysevent.h" #include "daudio_hitrace.h" #include "daudio_log.h" +#include "daudio_source_manager.h" #include "daudio_util.h" #undef DH_LOG_TAG @@ -34,6 +35,56 @@ namespace OHOS { namespace DistributedHardware { static constexpr size_t DATA_QUEUE_EXT_SIZE = 20; +void DMicDev::OnEngineTransEvent(const AVTransEvent &event) +{ + if (event.type == EventType::EVENT_START_SUCCESS) { + OnStateChange(DATA_OPENED); + } else if ((event.type == EventType::EVENT_STOP_SUCCESS) || + (event.type == EventType::EVENT_CHANNEL_CLOSED) || + (event.type == EventType::EVENT_START_FAIL)) { + OnStateChange(DATA_CLOSED); + } +} + +void DMicDev::OnEngineTransMessage(const std::shared_ptr &message) +{ + DHLOGI("On Engine message"); + if (message == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + DAudioSourceManager::GetInstance().HandleDAudioNotify(message->dstDevId_, message->dstDevId_, + message->type_, message->content_); +} + +void DMicDev::OnEngineTransDataAvailable(const std::shared_ptr &audioData) +{ + DHLOGE("On Engine Data available"); + OnDecodeTransDataDone(audioData); +} + +int32_t DMicDev::InitReceiverEngine(IAVEngineProvider *providerPtr) +{ + DHLOGI("InitReceiverEngine enter."); + // new 方式 + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); + if (engineFlag_ == true) { + if (micTrans_ == nullptr) { + micTrans_ = std::make_shared(devId_, shared_from_this()); + } + int32_t ret = micTrans_->InitEngine(providerPtr); + if (ret != DH_SUCCESS) { + DHLOGE("Initialize av receiver adapter failed. micdev"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + ret = micTrans_->CreateCtrl(); + if (ret != DH_SUCCESS) { + DHLOGE("Create ctrl channel failed. micdev"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + } + return DH_SUCCESS; +} int32_t DMicDev::EnableDMic(const int32_t dhId, const std::string &capability) { @@ -183,8 +234,13 @@ int32_t DMicDev::NotifyEvent(const std::string &devId, const int32_t dhId, const int32_t DMicDev::SetUp() { DHLOGI("Set up mic device."); - if (micTrans_ == nullptr) { + if (engineFlag_ == false) { micTrans_ = std::make_shared(devId_); + } else { + if (micTrans_ == nullptr) { + DHLOGE("mic trans should be init by dev."); + return ERR_DH_AUDIO_NULLPTR; + } } int32_t ret = micTrans_->SetUp(param_, param_, shared_from_this(), CAP_MIC); if (ret != DH_SUCCESS) { @@ -206,7 +262,6 @@ int32_t DMicDev::Start() DHLOGE("Mic trans start failed, ret: %d.", ret); return ret; } - std::unique_lock lck(channelWaitMutex_); auto status = channelWaitCond_.wait_for(lck, std::chrono::seconds(CHANNEL_WAIT_SECONDS), [this]() { return isTransReady_.load(); }); @@ -448,6 +503,21 @@ int32_t DMicDev::OnStateChange(const AudioEventType type) return DH_SUCCESS; } +int32_t DMicDev::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + DHLOGI("Send message to remote."); + if (type != static_cast(OPEN_MIC) && type != static_cast(CLOSE_MIC)) { + DHLOGE("Send message to remote. not OPEN_MIC or CLOSE_MIC. type: %u", type); + return ERR_DH_AUDIO_NULLPTR; + } + if (micTrans_ == nullptr) { + DHLOGE("mic trans is null."); + return ERR_DH_AUDIO_NULLPTR; + } + micTrans_->SendMessage(type, content, dstDevId); + return DH_SUCCESS; +} + int32_t DMicDev::OnDecodeTransDataDone(const std::shared_ptr &audioData) { if (audioData == nullptr) { diff --git a/services/audiomanager/managersource/src/dspeaker_dev.cpp b/services/audiomanager/managersource/src/dspeaker_dev.cpp index ab05dbc5..ebb36136 100644 --- a/services/audiomanager/managersource/src/dspeaker_dev.cpp +++ b/services/audiomanager/managersource/src/dspeaker_dev.cpp @@ -28,6 +28,7 @@ #include "daudio_hisysevent.h" #include "daudio_hitrace.h" #include "daudio_log.h" +#include "daudio_source_manager.h" #include "daudio_util.h" #undef DH_LOG_TAG @@ -100,6 +101,51 @@ int32_t DSpeakerDev::DisableDevice(const int32_t dhId) return DH_SUCCESS; } +int32_t DSpeakerDev::InitSenderEngine(IAVEngineProvider *providerPtr) +{ + DHLOGI("InitSenderEngine enter"); + // new 方式 + IsParamEnabled(AUDIO_ENGINE_FLAG, engineFlag_); + if (engineFlag_ == true) { + if (speakerTrans_ == nullptr) { + speakerTrans_ = std::make_shared(devId_, shared_from_this()); + } + int32_t ret = speakerTrans_->InitEngine(providerPtr); + if (ret != DH_SUCCESS) { + DHLOGE("Initialize av sender adapter failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + ret = speakerTrans_->CreateCtrl(); + if (ret != DH_SUCCESS) { + DHLOGE("Create ctrl channel failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + } + return DH_SUCCESS; +} + +void DSpeakerDev::OnEngineTransEvent(const AVTransEvent &event) +{ + if (event.type == EventType::EVENT_START_SUCCESS) { + OnStateChange(DATA_OPENED); + } else if ((event.type == EventType::EVENT_STOP_SUCCESS) || + (event.type == EventType::EVENT_CHANNEL_CLOSED) || + (event.type == EventType::EVENT_START_FAIL)) { + OnStateChange(DATA_CLOSED); + } +} + +void DSpeakerDev::OnEngineTransMessage(const std::shared_ptr &message) +{ + DHLOGI("On Engine message"); + if (message == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + DAudioSourceManager::GetInstance().HandleDAudioNotify(message->dstDevId_, message->dstDevId_, + message->type_, message->content_); +} + int32_t DSpeakerDev::OpenDevice(const std::string &devId, const int32_t dhId) { DHLOGI("Open speaker device devId: %s, dhId: %d.", GetAnonyString(devId).c_str(), dhId); @@ -196,7 +242,6 @@ int32_t DSpeakerDev::Start() DHLOGE("Speaker trans start failed, ret: %d.", ret); return ret; } - std::unique_lock lck(channelWaitMutex_); auto status = channelWaitCond_.wait_for(lck, std::chrono::seconds(CHANNEL_WAIT_SECONDS), [this]() { return isTransReady_.load(); }); @@ -299,7 +344,7 @@ int32_t DSpeakerDev::WriteStreamData(const std::string &devId, const int32_t dhI { DHLOGD("Write stream data, dhId:%d", dhId); if (speakerTrans_ == nullptr) { - DHLOGE("Read stream data, speaker trans is null."); + DHLOGE("Write stream data, speaker trans is null."); return ERR_DH_AUDIO_SA_SPEAKER_TRANS_NULL; } int32_t ret = speakerTrans_->FeedAudioData(data); @@ -320,6 +365,7 @@ int32_t DSpeakerDev::ReadMmapPosition(const std::string &devId, const int32_t dh time.tvNSec = readTvNSec_; return DH_SUCCESS; } + int32_t DSpeakerDev::RefreshAshmemInfo(const std::string &devId, const int32_t dhId, int32_t fd, int32_t ashmemLength, int32_t lengthPerTrans) { @@ -409,6 +455,21 @@ AudioParam DSpeakerDev::GetAudioParam() const return param_; } +int32_t DSpeakerDev::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + DHLOGI("Send message to remote."); + if (type != static_cast(OPEN_SPEAKER)&& type != static_cast(CLOSE_SPEAKER)) { + DHLOGE("Send message to remote. not OPEN_SPK or CLOSE_SPK. type: %u", type); + return ERR_DH_AUDIO_NULLPTR; + } + if (speakerTrans_ == nullptr) { + DHLOGE("speaker trans is null."); + return ERR_DH_AUDIO_NULLPTR; + } + speakerTrans_->SendMessage(type, content, dstDevId); + return DH_SUCCESS; +} + int32_t DSpeakerDev::NotifyHdfAudioEvent(const AudioEvent &event) { int32_t ret = DAudioHdiHandler::GetInstance().NotifyEvent(devId_, curPort_, event); diff --git a/services/audiomanager/servicesink/BUILD.gn b/services/audiomanager/servicesink/BUILD.gn index b8d9dd43..e290f3c9 100755 --- a/services/audiomanager/servicesink/BUILD.gn +++ b/services/audiomanager/servicesink/BUILD.gn @@ -23,14 +23,15 @@ ohos_shared_library("distributed_audio_sink") { include_dirs += [ "include", + "${audio_client_path}/interface", "${audio_client_path}/micclient/include", "${audio_client_path}/spkclient/include", "${audio_control_path}/controlsink/include", "${audio_processor_path}/encodeprocessor/include", "${audio_processor_path}/decodeprocessor/include", "${audio_processor_path}/interface", - "${audio_transport_path}/audiochannel/interface", "${audio_transport_path}/audiochannel/audiodatachannel/include", + "${audio_transport_path}/audiochannel/interface", "${audio_transport_path}/audioctrltransport/include", "${audio_transport_path}/audioctrltransport/interface", "${audio_transport_path}/audiotransportstatus/include", @@ -38,17 +39,17 @@ ohos_shared_library("distributed_audio_sink") { "${audio_transport_path}/decodetransport/include", "${audio_transport_path}/encodetransport/include", "${audio_transport_path}/interface", - "${common_path}/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${common_path}/dfx_utils/include", - "${fwk_common_path}/utils/include", - "${fwk_utils_path}/include", + "${common_path}/include", "${innerkits_path}/native_cpp/audio_sink/include", "${innerkits_path}/native_cpp/audio_source/include", - "${services_path}/common/taskProcessor/include", - "${services_path}/common/audioparam", + "${services_path}/audiomanager/managersink/include", "${services_path}/common/audioeventcallback", "${services_path}/common/audiodata/include", - "${services_path}/audiomanager/managersink/include", + "${services_path}/common/audioparam", + "${services_path}/common/taskProcessor/include", "${softbusadapter_path}/include", ] @@ -60,6 +61,8 @@ ohos_shared_library("distributed_audio_sink") { } sources = [ + "${audio_client_path}/micclient/src/dmic_client.cpp", + "${audio_client_path}/spkclient/src/dspeaker_client.cpp", "${audio_control_path}/controlsink/src/daudio_sink_dev_ctrl_manager.cpp", "${innerkits_path}/native_cpp/audio_sink/src/daudio_sink_handler.cpp", "${innerkits_path}/native_cpp/audio_sink/src/daudio_sink_load_callback.cpp", @@ -71,11 +74,17 @@ ohos_shared_library("distributed_audio_sink") { "src/daudio_sink_stub.cpp", ] + if (distributed_audio_extension) { + sources += [ + "${distributedaudio_ext_path}/services/audioclient/directmicclient/src/direct_dmic_client.cpp", + "${distributedaudio_ext_path}/services/audioclient/directspkclient/src/direct_dspeaker_client.cpp", + ] + } + deps = [ "${audio_transport_path}/audioctrltransport:distributed_audio_control", "${audio_transport_path}/decodetransport:distributed_audio_decode_transport", "${audio_transport_path}/encodetransport:distributed_audio_encode_transport", - "${services_path}/audioclient:distributed_audio_sink_client", "${services_path}/common:distributed_audio_utils", ] @@ -84,8 +93,13 @@ ohos_shared_library("distributed_audio_sink") { "audio_framework:audio_client", "audio_framework:audio_renderer", "c_utils:utils", + "distributed_hardware_fwk:distributed_av_receiver", + "distributed_hardware_fwk:distributed_av_sender", + "distributed_hardware_fwk:libdhfwk_sdk", "drivers_interface_audio:libaudio_proxy_1.0", "dsoftbus:softbus_client", + "hdf_core:libhdf_ipc_adapter", + "hdf_core:libhdi", "hisysevent_native:libhisysevent", "hitrace_native:hitrace_meter", "ipc:ipc_core", diff --git a/services/audiomanager/servicesource/BUILD.gn b/services/audiomanager/servicesource/BUILD.gn index fcdf1476..a5f069a0 100755 --- a/services/audiomanager/servicesource/BUILD.gn +++ b/services/audiomanager/servicesource/BUILD.gn @@ -35,6 +35,8 @@ ohos_shared_library("distributed_audio_source") { "${audio_transport_path}/interface", "${audio_transport_path}/encodetransport/include", "${audio_transport_path}/decodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${audio_transport_path}/audioctrltransport/include", "${audio_transport_path}/audioctrltransport/interface", "${audio_transport_path}/audiochannel/interface", @@ -56,6 +58,9 @@ ohos_shared_library("distributed_audio_source") { "${services_path}/common/audioeventcallback", "${services_path}/audiomanager/managersource/include", "${softbusadapter_path}/include", + "${services_path}/audiomanager/common/include", + "${audio_client_path}/micclient/include", + "${audio_client_path}/spkclient/include", ] sources = [ @@ -88,6 +93,8 @@ ohos_shared_library("distributed_audio_source") { external_deps = [ "c_utils:utils", + "distributed_hardware_fwk:distributed_av_sender", + "distributed_hardware_fwk:distributed_av_receiver", "drivers_interface_audio:libaudio_proxy_1.0", "dsoftbus:softbus_client", "hdf_core:libhdi", diff --git a/services/audiomanager/test/unittest/audiomanagertestutils/include/audio_manager_test_utils.h b/services/audiomanager/test/unittest/audiomanagertestutils/include/audio_manager_test_utils.h index d3b28863..65119d11 100644 --- a/services/audiomanager/test/unittest/audiomanagertestutils/include/audio_manager_test_utils.h +++ b/services/audiomanager/test/unittest/audiomanagertestutils/include/audio_manager_test_utils.h @@ -73,6 +73,21 @@ public: { return DH_SUCCESS; } + + int32_t InitEngine(IAVEngineProvider *providerPtr) override + { + return DH_SUCCESS; + } + + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override + { + return 0; + } + + int32_t CreateCtrl() override + { + return 0; + } }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audiomanager/test/unittest/managersink/BUILD.gn b/services/audiomanager/test/unittest/managersink/BUILD.gn index 7b91891b..06835980 100644 --- a/services/audiomanager/test/unittest/managersink/BUILD.gn +++ b/services/audiomanager/test/unittest/managersink/BUILD.gn @@ -49,6 +49,8 @@ config("module_private_config") { "${audio_transport_path}/audiotransportstatus/interface", "${audio_transport_path}/decodetransport/include", "${audio_transport_path}/encodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${audio_transport_path}/interface", "${common_path}/include", "${innerkits_path}/native_cpp/audio_source/include", @@ -70,7 +72,6 @@ ohos_unittest("DaudioSinkDevTest") { configs = [ ":module_private_config" ] deps = [ - "${services_path}/audioclient:distributed_audio_sink_client", "${services_path}/audiomanager/servicesink:distributed_audio_sink", "//third_party/googletest:gmock", "//third_party/googletest:gtest_main", @@ -101,7 +102,6 @@ ohos_unittest("DAudioSinkManagerTest") { configs = [ ":module_private_config" ] deps = [ - "${services_path}/audioclient:distributed_audio_sink_client", "${services_path}/audiomanager/servicesink:distributed_audio_sink", "//third_party/googletest:gmock", "//third_party/googletest:gtest_main", diff --git a/services/audiomanager/test/unittest/servicesink/BUILD.gn b/services/audiomanager/test/unittest/servicesink/BUILD.gn index 3adbfa4c..06b73e6e 100644 --- a/services/audiomanager/test/unittest/servicesink/BUILD.gn +++ b/services/audiomanager/test/unittest/servicesink/BUILD.gn @@ -48,6 +48,8 @@ config("module_private_config") { "${audio_transport_path}/audiotransportstatus/interface", "${audio_transport_path}/decodetransport/include", "${audio_transport_path}/encodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${audio_transport_path}/interface", "${common_path}/include", "${innerkits_path}/native_cpp/audio_sink/include", diff --git a/services/audiomanager/test/unittest/servicesource/BUILD.gn b/services/audiomanager/test/unittest/servicesource/BUILD.gn index 42461e9e..fa87bb3f 100644 --- a/services/audiomanager/test/unittest/servicesource/BUILD.gn +++ b/services/audiomanager/test/unittest/servicesource/BUILD.gn @@ -46,6 +46,8 @@ config("module_private_config") { "${audio_transport_path}/audiotransportstatus/interface", "${audio_transport_path}/decodetransport/include", "${audio_transport_path}/encodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${audio_transport_path}/interface", "${common_path}/include", "${common_path}/dfx_utils/include", diff --git a/services/audiomanager/test/unittest/sourcedevice/BUILD.gn b/services/audiomanager/test/unittest/sourcedevice/BUILD.gn index 87165b53..4628c2d0 100644 --- a/services/audiomanager/test/unittest/sourcedevice/BUILD.gn +++ b/services/audiomanager/test/unittest/sourcedevice/BUILD.gn @@ -40,6 +40,8 @@ config("module_private_config") { "${audio_transport_path}/audiotransportstatus/interface", "${audio_transport_path}/encodetransport/include", "${audio_transport_path}/decodetransport/include", + "${audio_transport_path}/receiverengine/include", + "${audio_transport_path}/senderengine/include", "${common_path}/include", "${common_path}/dfx_utils/include", "${distributedaudio_path}/audiohandler/include", diff --git a/services/audiotransport/decodetransport/BUILD.gn b/services/audiotransport/decodetransport/BUILD.gn index 146fe608..86f6316c 100644 --- a/services/audiotransport/decodetransport/BUILD.gn +++ b/services/audiotransport/decodetransport/BUILD.gn @@ -18,38 +18,39 @@ import("../../../distributedaudio.gni") config("decode_transport_pub_config") { include_dirs = [ "include", + "../audiochannel/audiodatachannel/include", + "../audiochannel/interface", "../audiotransportstatus/include", "../audiotransportstatus/interface", "../interface", - "../audiochannel/interface", - "../audiochannel/audiodatachannel/include", "../../audioprocessor/interface", ] } ohos_shared_library("distributed_audio_decode_transport") { include_dirs = [ - "${fwk_common_path}/utils/include", - "${mediastandard_path}/interfaces/innerkits/native/media/include", - "${mediastandardfwk_path}/audiocommon/include", + # 这里需要确认下是否可以屏蔽 + # "${mediastandard_path}/interfaces/innerkits/native/media/include", + # "${mediastandardfwk_path}/audiocommon/include", "//third_party/json/include", ] include_dirs += [ "include", - "${common_path}/include", - "${common_path}/dfx_utils/include", - "${audio_processor_path}/decoder/include", "${audio_processor_path}/decodeprocessor/include", + "${audio_processor_path}/decoder/include", "${audio_processor_path}/directprocessor/include", "${audio_processor_path}/interface", - "${audio_transport_path}/audiochannel/interface", "${audio_transport_path}/audiochannel/audiodatachannel/include", - "${audio_transport_path}/interface", + "${audio_transport_path}/audiochannel/interface", "${audio_transport_path}/audiotransportstatus/include", "${audio_transport_path}/audiotransportstatus/interface", - "${services_path}/common/audioparam", + "${audio_transport_path}/interface", + "${audio_transport_path}/receiverengine/include", + "${common_path}/include", + "${common_path}/dfx_utils/include", "${services_path}/common/audiodata/include", + "${services_path}/common/audioparam", "${softbusadapter_path}/include", ] @@ -60,6 +61,8 @@ ohos_shared_library("distributed_audio_decode_transport") { "${audio_processor_path}/decoder/src/audio_decoder.cpp", "${audio_processor_path}/decoder/src/audio_decoder_callback.cpp", "${audio_processor_path}/directprocessor/src/audio_direct_processor.cpp", + "${audio_transport_path}/receiverengine/src/av_receiver_engine_adapter.cpp", + "${audio_transport_path}/receiverengine/src/av_receiver_engine_transport.cpp", "${services_path}/common/audiodata/src/audio_data.cpp", "src/audio_decode_transport.cpp", ] @@ -72,6 +75,7 @@ ohos_shared_library("distributed_audio_decode_transport") { external_deps = [ "c_utils:utils", + "distributed_hardware_fwk:distributed_av_receiver", "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", "hitrace_native:hitrace_meter", diff --git a/services/audiotransport/decodetransport/include/audio_decode_transport.h b/services/audiotransport/decodetransport/include/audio_decode_transport.h index 1ff3e779..1b675a1b 100644 --- a/services/audiotransport/decodetransport/include/audio_decode_transport.h +++ b/services/audiotransport/decodetransport/include/audio_decode_transport.h @@ -52,6 +52,9 @@ public: int32_t Pause() override; int32_t Restart(const AudioParam &localParam, const AudioParam &remoteParam) override; int32_t FeedAudioData(std::shared_ptr &audioData) override; + int32_t CreateCtrl() override; + int32_t InitEngine(IAVEngineProvider *providerPtr) override; + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override; void OnSessionOpened() override; void OnSessionClosed() override; diff --git a/services/audiotransport/decodetransport/src/audio_decode_transport.cpp b/services/audiotransport/decodetransport/src/audio_decode_transport.cpp index c1b4da3d..83fd3809 100644 --- a/services/audiotransport/decodetransport/src/audio_decode_transport.cpp +++ b/services/audiotransport/decodetransport/src/audio_decode_transport.cpp @@ -138,6 +138,27 @@ int32_t AudioDecodeTransport::FeedAudioData(std::shared_ptr &audioDat return DH_SUCCESS; } +int32_t AudioDecodeTransport::CreateCtrl() +{ + DHLOGI("create ctrl not support."); + return DH_SUCCESS; +} + +int32_t AudioDecodeTransport::InitEngine(IAVEngineProvider *providerPtr) +{ + (void)providerPtr; + return DH_SUCCESS; +} + +int32_t AudioDecodeTransport::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + (void)type; + (void)content; + (void)dstDevId; + DHLOGI("Send message not support."); + return DH_SUCCESS; +} + void AudioDecodeTransport::OnSessionOpened() { DHLOGI("On channel session opened."); diff --git a/services/audiotransport/encodetransport/BUILD.gn b/services/audiotransport/encodetransport/BUILD.gn index e1e62db6..91be7ffe 100644 --- a/services/audiotransport/encodetransport/BUILD.gn +++ b/services/audiotransport/encodetransport/BUILD.gn @@ -18,10 +18,10 @@ import("../../../distributedaudio.gni") config("encode_transport_pub_config") { include_dirs = [ "include", - "../audiotransportstatus/include", - "../audiotransportstatus/interface", "../audiochannel/audiodatachannel/include", "../audiochannel/interface", + "../audiotransportstatus/include", + "../audiotransportstatus/interface", "../interface", "../../audioprocessor/interface", ] @@ -29,18 +29,16 @@ config("encode_transport_pub_config") { ohos_shared_library("distributed_audio_encode_transport") { include_dirs = [ - "${fwk_common_path}/utils/include", - "${mediastandard_path}/interfaces/innerkits/native/media/include", - "${mediastandardfwk_path}/audiocommon/include", + # 这里确认下是否可以屏蔽 + # "${mediastandard_path}/interfaces/innerkits/native/media/include", + # "${mediastandardfwk_path}/audiocommon/include", "//third_party/json/include", ] include_dirs += [ "include", - "${common_path}/include", - "${common_path}/dfx_utils/include", - "${audio_processor_path}/encodeprocessor/include", "${audio_processor_path}/directprocessor/include", + "${audio_processor_path}/encodeprocessor/include", "${audio_processor_path}/encoder/include", "${audio_processor_path}/interface", "${audio_transport_path}/audiochannel/interface", @@ -48,8 +46,11 @@ ohos_shared_library("distributed_audio_encode_transport") { "${audio_transport_path}/audiotransportstatus/include", "${audio_transport_path}/audiotransportstatus/interface", "${audio_transport_path}/interface", - "${services_path}/common/audioparam", + "${audio_transport_path}/senderengine/include", + "${common_path}/dfx_utils/include", + "${common_path}/include", "${services_path}/common/audiodata/include", + "${services_path}/common/audioparam", "${softbusadapter_path}/include", ] @@ -60,6 +61,8 @@ ohos_shared_library("distributed_audio_encode_transport") { "${audio_processor_path}/encodeprocessor/src/audio_encoder_processor.cpp", "${audio_processor_path}/encoder/src/audio_encoder.cpp", "${audio_processor_path}/encoder/src/audio_encoder_callback.cpp", + "${audio_transport_path}/senderengine/src/av_sender_engine_adapter.cpp", + "${audio_transport_path}/senderengine/src/av_sender_engine_transport.cpp", "${services_path}/common/audiodata/src/audio_data.cpp", "src/audio_encode_transport.cpp", ] @@ -72,6 +75,7 @@ ohos_shared_library("distributed_audio_encode_transport") { external_deps = [ "c_utils:utils", + "distributed_hardware_fwk:distributed_av_sender", "dsoftbus:softbus_client", "hisysevent_native:libhisysevent", "hitrace_native:hitrace_meter", diff --git a/services/audiotransport/encodetransport/include/audio_encode_transport.h b/services/audiotransport/encodetransport/include/audio_encode_transport.h index 7616081c..3aabe6b8 100644 --- a/services/audiotransport/encodetransport/include/audio_encode_transport.h +++ b/services/audiotransport/encodetransport/include/audio_encode_transport.h @@ -47,6 +47,9 @@ public: int32_t Pause() override; int32_t Restart(const AudioParam &localParam, const AudioParam &remoteParam) override; int32_t FeedAudioData(std::shared_ptr &audioData) override; + int32_t CreateCtrl() override; + int32_t InitEngine(IAVEngineProvider *providerPtr) override; + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override; void OnSessionOpened() override; void OnSessionClosed() override; diff --git a/services/audiotransport/encodetransport/src/audio_encode_transport.cpp b/services/audiotransport/encodetransport/src/audio_encode_transport.cpp index ec7bd07d..84256beb 100644 --- a/services/audiotransport/encodetransport/src/audio_encode_transport.cpp +++ b/services/audiotransport/encodetransport/src/audio_encode_transport.cpp @@ -146,6 +146,27 @@ int32_t AudioEncodeTransport::FeedAudioData(std::shared_ptr &audioDat } return DH_SUCCESS; } +int32_t AudioEncodeTransport::CreateCtrl() +{ + DHLOGI("create ctrl not support."); + return DH_SUCCESS; +} + +int32_t AudioEncodeTransport::InitEngine(IAVEngineProvider *providerPtr) +{ + (void)providerPtr; + DHLOGI("Init engine not support."); + return DH_SUCCESS; +} + +int32_t AudioEncodeTransport::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + (void)type; + (void)content; + (void)dstDevId; + DHLOGI("Send message not support."); + return DH_SUCCESS; +} int32_t AudioEncodeTransport::InitAudioEncodeTrans(const AudioParam &localParam, const AudioParam &remoteParam, const PortCapType capType) diff --git a/services/audiotransport/interface/iaudio_data_transport.h b/services/audiotransport/interface/iaudio_data_transport.h index 7850e840..c90ccf1c 100644 --- a/services/audiotransport/interface/iaudio_data_transport.h +++ b/services/audiotransport/interface/iaudio_data_transport.h @@ -19,6 +19,7 @@ #include "audio_data.h" #include "audio_param.h" #include "iaudio_datatrans_callback.h" +#include "i_av_engine_provider.h" namespace OHOS { namespace DistributedHardware { @@ -34,6 +35,9 @@ public: virtual int32_t Pause() = 0; virtual int32_t Restart(const AudioParam &localParam, const AudioParam &remoteParam) = 0; virtual int32_t FeedAudioData(std::shared_ptr &audioData) = 0; + virtual int32_t CreateCtrl() = 0; + virtual int32_t InitEngine(IAVEngineProvider *providerPtr) = 0; + virtual int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audiotransport/receiverengine/include/av_receiver_engine_adapter.h b/services/audiotransport/receiverengine/include/av_receiver_engine_adapter.h new file mode 100644 index 00000000..43b34149 --- /dev/null +++ b/services/audiotransport/receiverengine/include/av_receiver_engine_adapter.h @@ -0,0 +1,70 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AV_TRANS_RECEIVER_ADAPTER_H +#define OHOS_AV_TRANS_RECEIVER_ADAPTER_H + +#include +#include +#include +#include + +#include "i_av_receiver_engine_callback.h" +#include "i_av_receiver_engine.h" +#include "i_av_engine_provider.h" + +namespace OHOS { +namespace DistributedHardware { +class AVReceiverAdapterCallback { +public: + AVReceiverAdapterCallback() {}; + virtual ~AVReceiverAdapterCallback() = default; + virtual void OnEngineEvent(const AVTransEvent &event) = 0; + virtual void OnEngineMessage(const std::shared_ptr &message) = 0; + virtual void OnEngineDataAvailable(const std::shared_ptr &buffer) = 0; +}; + +class AVTransReceiverAdapter : public IAVReceiverEngineCallback, + public std::enable_shared_from_this { +public: + AVTransReceiverAdapter() {}; + ~AVTransReceiverAdapter() override {}; + + int32_t Initialize(IAVEngineProvider *providerPtr, const std::string &peerDevId); + int32_t Start(); + int32_t Stop(); + int32_t Release(); + int32_t SetParameter(const AVTransTag &tag, const std::string &value); + int32_t SendMessageToRemote(const std::shared_ptr &message); + int32_t CreateControlChannel(const std::string &peerDevId); + int32_t RegisterAdapterCallback(const std::shared_ptr &callback); + + int32_t OnReceiverEvent(const AVTransEvent &event) override; + int32_t OnMessageReceived(const std::shared_ptr &message) override; + int32_t OnDataAvailable(const std::shared_ptr &buffer) override; + +private: + int32_t WaitForChannelCreated(); +private: + std::atomic initialized_ = false; + std::mutex chnCreatedMtx_; + std::shared_ptr receiverEngine_; + std::shared_ptr adapterCallback_; + std::atomic chnCreateSuccess_ = false; + std::condition_variable chnCreatedCondVar_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/audiotransport/receiverengine/include/av_receiver_engine_transport.h b/services/audiotransport/receiverengine/include/av_receiver_engine_transport.h new file mode 100644 index 00000000..a52c941b --- /dev/null +++ b/services/audiotransport/receiverengine/include/av_receiver_engine_transport.h @@ -0,0 +1,79 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AV_TRANS_RECEIVER_TRANS_H +#define OHOS_AV_TRANS_RECEIVER_TRANS_H + +#include +#include +#include + +#include "audio_data.h" +#include "audio_param.h" +#include "av_receiver_engine_adapter.h" +#include "iaudio_data_transport.h" +#include "iaudio_datatrans_callback.h" +#include "i_av_receiver_engine_callback.h" +#include "i_av_receiver_engine.h" +#include "i_av_engine_provider.h" + +namespace OHOS { +namespace DistributedHardware { +class AVReceiverTransportCallback { +public: + AVReceiverTransportCallback() {}; + virtual ~AVReceiverTransportCallback() = default; + virtual void OnEngineTransEvent(const AVTransEvent &event) = 0; + virtual void OnEngineTransMessage(const std::shared_ptr &message) = 0; + virtual void OnEngineTransDataAvailable(const std::shared_ptr &audioData) = 0; +}; + +class AVTransReceiverTransport : public IAudioDataTransport, + public AVReceiverAdapterCallback, + public std::enable_shared_from_this { +public: + AVTransReceiverTransport(const std::string &devId, + const std::shared_ptr &callback) + : transCallback_(callback), devId_(devId) {}; + ~AVTransReceiverTransport() override {}; + + int32_t SetUp(const AudioParam &localParam, const AudioParam &remoteParam, + const std::shared_ptr &callback, const PortCapType capType) override; + int32_t Start() override; + int32_t Stop() override; + int32_t Release() override; + int32_t Pause() override; + int32_t Restart(const AudioParam &localParam, const AudioParam &remoteParam) override; + int32_t FeedAudioData(std::shared_ptr &audioData) override; + int32_t CreateCtrl() override; + int32_t InitEngine(IAVEngineProvider *providerPtr) override; + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override; + + void OnEngineEvent(const AVTransEvent &event) override; + void OnEngineMessage(const std::shared_ptr &message) override; + void OnEngineDataAvailable(const std::shared_ptr &buffer) override; + +private: + int32_t SetParameter(const AudioParam &audioParam); + +private: + std::shared_ptr receiverAdapter_; + std::shared_ptr transCallback_; + std::string devId_; + AudioParam param_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/audiotransport/receiverengine/src/av_receiver_engine_adapter.cpp b/services/audiotransport/receiverengine/src/av_receiver_engine_adapter.cpp new file mode 100644 index 00000000..464d3153 --- /dev/null +++ b/services/audiotransport/receiverengine/src/av_receiver_engine_adapter.cpp @@ -0,0 +1,208 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "av_receiver_engine_adapter.h" + +#include + +#include "daudio_constants.h" +#include "daudio_errorcode.h" +#include "daudio_log.h" +#include "daudio_util.h" + +#undef DH_LOG_TAG +#define DH_LOG_TAG "AVTransReceiverAdapter" + +namespace OHOS { +namespace DistributedHardware { +constexpr int32_t WAIT_TIMEOUT_MS = 5000; +int32_t AVTransReceiverAdapter::Initialize(IAVEngineProvider *providerPtr, const std::string &peerDevId) +{ + DHLOGI("Initialize!"); + if (initialized_.load()) { + return DH_SUCCESS; + } + if (providerPtr == nullptr) { + return ERR_DH_AV_TRANS_NULL_VALUE; + } + receiverEngine_ = providerPtr->CreateAVReceiverEngine(peerDevId); + if (receiverEngine_ == nullptr) { + return ERR_DH_AV_TRANS_NULL_VALUE; + } + receiverEngine_->RegisterReceiverCallback(shared_from_this()); + initialized_ = true; + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::Release() +{ + DHLOGI("Release!"); + if (receiverEngine_ != nullptr) { + if (!receiverEngine_->Release()) { + DHLOGE("Release av transport receiver engine failed"); + } + } + initialized_ = false; + receiverEngine_ = nullptr; + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::Start() +{ + DHLOGI("Start enter"); + if (receiverEngine_ == nullptr) { + DHLOGE("Av transport receiver engine is null."); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + return receiverEngine_->Start(); +} + +int32_t AVTransReceiverAdapter::Stop() +{ + DHLOGI("Stop!"); + if (receiverEngine_ == nullptr) { + return ERR_DH_AV_TRANS_NULL_VALUE; + } + int32_t ret = receiverEngine_->Stop(); + if (ret != DH_SUCCESS) { + return ERR_DH_AV_TRANS_STOP_FAILED; + } + DHLOGI("Stop success!"); + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::SetParameter(const AVTransTag &tag, const std::string ¶m) +{ + DHLOGI("SetParameter!"); + if (receiverEngine_ == nullptr) { + DHLOGE("av transport receiver engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + int32_t ret = receiverEngine_->SetParameter(tag, param); + if (ret != DH_SUCCESS) { + DHLOGE("Set av transport receiver parameter failed, ret: %d.", ret); + return ERR_DH_AV_TRANS_SETUP_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::CreateControlChannel(const std::string &peerDevId) +{ + DHLOGI("CreateControlChannel enter, peerDevId:%s", GetAnonyString(peerDevId).c_str()); + if (chnCreateSuccess_.load()) { + DHLOGI("Av transport receiver channel already created"); + return DH_SUCCESS; + } + + if (receiverEngine_ == nullptr) { + DHLOGE("Av transport receiver engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + std::vector dstDevIds = {peerDevId}; + int32_t ret = receiverEngine_->CreateControlChannel(dstDevIds, + ChannelAttribute{TransStrategy::LOW_LATANCY_STRATEGY }); + if (ret != DH_SUCCESS) { + DHLOGE("Create av transport receiver channel failed, ret: %d", ret); + return ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED; + } + ret = WaitForChannelCreated(); + if (ret != DH_SUCCESS) { + DHLOGE("Wait for create av transport sender channel failed, ret: %d", ret); + return ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::SendMessageToRemote(const std::shared_ptr &message) +{ + DHLOGI("Send message to remote."); + if (receiverEngine_ == nullptr) { + return ERR_DH_AV_TRANS_NULL_VALUE; + } + int32_t ret = receiverEngine_->SendMessage(message); + if (ret != DH_SUCCESS) { + DHLOGE("Send meassage to remote sender engine failed, ret: %d.", ret); + return ERR_DH_AV_TRANS_SEND_MSG_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::RegisterAdapterCallback(const std::shared_ptr &callback) +{ + if (callback == nullptr) { + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + adapterCallback_ = callback; + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::WaitForChannelCreated() +{ + std::unique_lock lock(chnCreatedMtx_); + auto status = chnCreatedCondVar_.wait_for(lock, std::chrono::milliseconds(WAIT_TIMEOUT_MS)); + if (status == std::cv_status::timeout) { + DHLOGI("Wait for av transport receiver channel created timeout"); + return ERR_DH_AV_TRANS_TIMEOUT; + } + if (!chnCreateSuccess_.load()) { + DHLOGE("Create av transport receiver channel failed"); + return ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::OnReceiverEvent(const AVTransEvent &event) +{ + DHLOGI("On Receiver event, type: %d", event.type); + switch (event.type) { + case EventType::EVENT_CHANNEL_OPENED: { + chnCreateSuccess_ = (event.type == EventType::EVENT_CHANNEL_OPENED); + chnCreatedCondVar_.notify_one(); + break; + } + case EventType::EVENT_CHANNEL_CLOSED: + case EventType::EVENT_START_SUCCESS: + case EventType::EVENT_STOP_SUCCESS: + case EventType::EVENT_ENGINE_ERROR: + case EventType::EVENT_REMOTE_ERROR: + if (adapterCallback_ != nullptr) { + DHLOGI("callback on engine event."); + adapterCallback_->OnEngineEvent(event); + } + break; + default: + DHLOGI("Invaild event type"); + break; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::OnMessageReceived(const std::shared_ptr &message) +{ + if (adapterCallback_ != nullptr) { + adapterCallback_->OnEngineMessage(message); + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverAdapter::OnDataAvailable(const std::shared_ptr &buffer) +{ + if (adapterCallback_ != nullptr) { + adapterCallback_->OnEngineDataAvailable(buffer); + } + return DH_SUCCESS; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/audiotransport/receiverengine/src/av_receiver_engine_transport.cpp b/services/audiotransport/receiverengine/src/av_receiver_engine_transport.cpp new file mode 100644 index 00000000..84c95735 --- /dev/null +++ b/services/audiotransport/receiverengine/src/av_receiver_engine_transport.cpp @@ -0,0 +1,212 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "av_receiver_engine_transport.h" + +#include +#include "daudio_constants.h" +#include "daudio_errorcode.h" +#include "daudio_log.h" +#include "daudio_util.h" + +#undef DH_LOG_TAG +#define DH_LOG_TAG "AVTransReceiverTransport" + +namespace OHOS { +namespace DistributedHardware { +int32_t AVTransReceiverTransport::InitEngine(IAVEngineProvider *providerPtr) +{ + DHLOGI("InitReceiverEngine enter."); + if (receiverAdapter_ == nullptr) { + receiverAdapter_ = std::make_shared(); + } + int32_t ret = receiverAdapter_->Initialize(providerPtr, devId_); + if (ret != DH_SUCCESS) { + DHLOGE("initialize av receiver adapter failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + ret = receiverAdapter_->RegisterAdapterCallback(shared_from_this()); + if (ret != DH_SUCCESS) { + DHLOGE("InitReceiverEngine register callback error."); + } + return ret; +} + +int32_t AVTransReceiverTransport::SetUp(const AudioParam &localParam, const AudioParam &remoteParam, + const std::shared_ptr &callback, const PortCapType capType) +{ + (void)remoteParam; + (void)callback; + (void)capType; + param_ = localParam; + return DH_SUCCESS; +} + +int32_t AVTransReceiverTransport::CreateCtrl() +{ + DHLOGI("Create ctrl enter."); + if (receiverAdapter_ == nullptr) { + DHLOGE("av transport receiver adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = receiverAdapter_->CreateControlChannel(devId_); + if (ret != DH_SUCCESS) { + DHLOGE("create av receiver control channel failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverTransport::Start() +{ + DHLOGI("StartReceiverEngine enter."); + if (receiverAdapter_ == nullptr) { + DHLOGE("av transport receiver adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = SetParameter(param_); + if (ret != DH_SUCCESS) { + DHLOGE("Set parameter failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + ret = receiverAdapter_->Start(); + if (ret != DH_SUCCESS) { + DHLOGE("start av receiver engine failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverTransport::Stop() +{ + DHLOGI("StopReceiverEngine enter."); + if (receiverAdapter_ == nullptr) { + DHLOGE("StopReceiverEngine adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = receiverAdapter_->Stop(); + if (ret != DH_SUCCESS) { + DHLOGE("StopReceiveEngine error."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransReceiverTransport::Release() +{ + DHLOGI("ReleaseReceiverEngine enter."); + if (receiverAdapter_ == nullptr) { + DHLOGE("ReleaseReceiverEngine adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = receiverAdapter_->Release(); + if (ret != DH_SUCCESS) { + DHLOGE("ReleaseReceiverEngine error."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +// wuhaobo todo pause 待实现 +int32_t AVTransReceiverTransport::Pause() +{ + DHLOGI("Pause ReceiverEngine enter."); + return DH_SUCCESS; +} + +// wuhaobo todo restart 待实现 +int32_t AVTransReceiverTransport::Restart(const AudioParam &localParam, const AudioParam &remoteParam) +{ + DHLOGI("ReStart ReceiverEngine enter."); + return DH_SUCCESS; +} + +int32_t AVTransReceiverTransport::FeedAudioData(std::shared_ptr &audioData) +{ + DHLOGI("ReceiverEngine feed audiodata not support."); + (void)audioData; + return DH_SUCCESS; +} + +int32_t AVTransReceiverTransport::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + DHLOGI("Send message to remote. type: %u, content: %s.", type, content.c_str()); + if (receiverAdapter_ == nullptr) { + DHLOGE("FeedAudioData receiver adapter is null."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + auto message = std::make_shared(type, content, dstDevId); + int32_t ret = receiverAdapter_->SendMessageToRemote(message); + if (ret != DH_SUCCESS) { + DHLOGE("Send message to remote engine failed"); + return ret; + } + return DH_SUCCESS; +} + +void AVTransReceiverTransport::OnEngineEvent(const AVTransEvent &event) +{ + if (transCallback_ == nullptr) { + DHLOGE("Trans callback is nullptr."); + return; + } + transCallback_->OnEngineTransEvent(event); +} + +void AVTransReceiverTransport::OnEngineMessage(const std::shared_ptr &message) +{ + if (message == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + if (transCallback_ == nullptr) { + DHLOGE("Event callback is nullptr."); + return; + } + transCallback_->OnEngineTransMessage(message); +} + +void AVTransReceiverTransport::OnEngineDataAvailable(const std::shared_ptr &buffer) +{ + DHLOGE("On Engine Data available"); + if (buffer == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + auto bufferData = buffer->GetBufferData(0); + std::shared_ptr audioData = std::make_shared(bufferData->GetSize()); + int32_t ret = memcpy_s(audioData->Data(), audioData->Capacity(), bufferData->GetAddress(), bufferData->GetSize()); + if (ret != EOK) { + DHLOGE("Copy audio data failed, error code %d.", ret); + return; + } + transCallback_->OnEngineTransDataAvailable(audioData); +} + +int32_t AVTransReceiverTransport::SetParameter(const AudioParam &audioParam) +{ + DHLOGI("SetParameter."); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_SAMPLE_RATE, std::to_string(audioParam.comParam.sampleRate)); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_SAMPLE_FORMAT, std::to_string(AudioSampleFormat::SAMPLE_F32LE)); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_CHANNEL_MASK, std::to_string(audioParam.comParam.channelMask)); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_CHANNEL_LAYOUT, std::to_string(audioParam.comParam.channelMask)); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_BIT_RATE, std::to_string(1536000)); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_FRAME_SIZE, std::to_string(audioParam.comParam.frameSize)); + receiverAdapter_->SetParameter(AVTransTag::AUDIO_CODEC_TYPE, std::to_string(audioParam.comParam.codecType)); + receiverAdapter_->SetParameter(AVTransTag::ENGINE_READY, OWNER_NAME_D_SPEAKER); + return DH_SUCCESS; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/audiotransport/senderengine/include/av_sender_engine_adapter.h b/services/audiotransport/senderengine/include/av_sender_engine_adapter.h new file mode 100644 index 00000000..a838688e --- /dev/null +++ b/services/audiotransport/senderengine/include/av_sender_engine_adapter.h @@ -0,0 +1,77 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AV_SENDER_ENGINE_ADAPTER_H +#define OHOS_AV_SENDER_ENGINE_ADAPTER_H + +#include +#include +#include + +#include + +#include "daudio_constants.h" +#include "daudio_errorcode.h" +#include "daudio_log.h" +#include "audio_param.h" +#include "audio_data.h" + +#include "i_av_sender_engine_callback.h" +#include "i_av_sender_engine.h" +#include "i_av_engine_provider.h" + +namespace OHOS { +namespace DistributedHardware { +class AVSenderAdapterCallback { +public: + AVSenderAdapterCallback() {}; + virtual ~AVSenderAdapterCallback() = default; + virtual void OnEngineEvent(const AVTransEvent &event) = 0; + virtual void OnEngineMessage(const std::shared_ptr &message) = 0; +}; + +class AVTransSenderAdapter : public IAVSenderEngineCallback, + public std::enable_shared_from_this { +public: + AVTransSenderAdapter() = default; + ~AVTransSenderAdapter() = default; + + int32_t Initialize(IAVEngineProvider *providerPtr, const std::string &peerDevId); + int32_t Release(); + int32_t Start(); + int32_t Stop(); + int32_t SetParameter(const AVTransTag &tag, const std::string ¶m); + int32_t PushData(std::shared_ptr &audioData); + int32_t SendMessageToRemote(const std::shared_ptr &message); + int32_t CreateControlChannel(const std::string &peerDevId); + int32_t RegisterAdapterCallback(const std::shared_ptr &back); + + void SaveFile(std::string fileName, uint8_t *lastFrame, int32_t size); + + int32_t OnSenderEvent(const AVTransEvent &event) override; + int32_t OnMessageReceived(const std::shared_ptr &message) override; +private: + int32_t WaitForChannelCreated(); +private: + std::atomic initialized_ = false; + std::mutex chnCreatedMtx_; + std::condition_variable chnCreatedCondVar_; + std::atomic chnCreateSuccess_ = false; + std::shared_ptr senderEngine_; + std::shared_ptr adapterCallback_; +}; +} // DistributedHardware +} // OHOS +#endif // OHOS_AV_SENDER_ENGINE_ADAPTER_H \ No newline at end of file diff --git a/services/audiotransport/senderengine/include/av_sender_engine_transport.h b/services/audiotransport/senderengine/include/av_sender_engine_transport.h new file mode 100644 index 00000000..5cc393f1 --- /dev/null +++ b/services/audiotransport/senderengine/include/av_sender_engine_transport.h @@ -0,0 +1,78 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_AV_TRANS_SENDER_TRANS_H +#define OHOS_AV_TRANS_SENDER_TRANS_H + +#include +#include +#include + +#include "av_sender_engine_adapter.h" +#include "iaudio_data_transport.h" +#include "iaudio_datatrans_callback.h" +#include "iaudio_data_transport.h" +#include "iaudio_datatrans_callback.h" +#include "i_av_sender_engine_callback.h" +#include "i_av_sender_engine.h" +#include "i_av_engine_provider.h" + +namespace OHOS { +namespace DistributedHardware { +class AVSenderTransportCallback { +public: + AVSenderTransportCallback() {}; + virtual ~AVSenderTransportCallback() = default; + virtual void OnEngineTransEvent(const AVTransEvent &event) = 0; + virtual void OnEngineTransMessage(const std::shared_ptr &message) = 0; +}; + +class AVTransSenderTransport : public IAudioDataTransport, + public AVSenderAdapterCallback, + public std::enable_shared_from_this { +public: + explicit AVTransSenderTransport(const std::string &devId, + const std::shared_ptr &callback) + : transCallback_(callback), devId_(devId) {}; + ~AVTransSenderTransport() override {}; + + int32_t SetUp(const AudioParam &localParam, const AudioParam &remoteParam, + const std::shared_ptr &callback, const PortCapType capType) override; + int32_t Start() override; + int32_t Stop() override; + int32_t Release() override; + int32_t Pause() override; + int32_t Restart(const AudioParam &localParam, const AudioParam &remoteParam) override; + int32_t FeedAudioData(std::shared_ptr &audioData) override; + + int32_t CreateCtrl() override; + int32_t InitEngine(IAVEngineProvider *providerPtr) override; + int32_t SendMessage(uint32_t type, std::string content, std::string dstDevId) override; + + void OnEngineEvent(const AVTransEvent &event) override; + void OnEngineMessage(const std::shared_ptr &message) override; + +private: + int32_t SetParameter(const AudioParam &audioParam); + +private: + std::shared_ptr senderAdapter_; + std::shared_ptr transCallback_; + std::string devId_; + AudioParam param_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/audiotransport/senderengine/src/av_sender_engine_adapter.cpp b/services/audiotransport/senderengine/src/av_sender_engine_adapter.cpp new file mode 100644 index 00000000..5d3450a5 --- /dev/null +++ b/services/audiotransport/senderengine/src/av_sender_engine_adapter.cpp @@ -0,0 +1,229 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "av_sender_engine_adapter.h" +#include + +#include "daudio_constants.h" +#include "daudio_errorcode.h" +#include "daudio_log.h" +#include "daudio_util.h" + +#include "av_trans_types.h" + +#undef DH_LOG_TAG +#define DH_LOG_TAG "AVTransSenderAdapter" + +namespace OHOS { +namespace DistributedHardware { +constexpr int32_t WAIT_TIMEOUT_MS = 5000; + +int32_t AVTransSenderAdapter::Initialize(IAVEngineProvider *providerPtr, const std::string &peerDevId) +{ + DHLOGI("Initialize!"); + if (initialized_.load()) { + return DH_SUCCESS; + } + if (providerPtr == nullptr) { + DHLOGE("Av Transport sender engine provider ptr is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + senderEngine_ = providerPtr->CreateAVSenderEngine(peerDevId); + if (senderEngine_ == nullptr) { + DHLOGE("Create av transport sender engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + senderEngine_->RegisterSenderCallback(shared_from_this()); + initialized_ = true; + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::Release() +{ + DHLOGI("Release!"); + if (senderEngine_ != nullptr) { + int32_t ret = senderEngine_->Release(); + if (ret != DH_SUCCESS) { + DHLOGE("Release av transport sender engine failed"); + } + } + initialized_ = false; + senderEngine_ = nullptr; + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::Start() +{ + DHLOGI("Start!"); + if (senderEngine_ == nullptr) { + DHLOGE("Av transport sender engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + return senderEngine_->Start(); +} + +int32_t AVTransSenderAdapter::Stop() +{ + DHLOGI("Stop"); + if (senderEngine_ == nullptr) { + DHLOGE("Av transport sender engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + int32_t ret = senderEngine_->Stop(); + if (ret != DH_SUCCESS) { + DHLOGE("Stop av transport sender engine failed"); + return ERR_DH_AV_TRANS_STOP_FAILED; + } + DHLOGI("Stop Success"); + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::CreateControlChannel(const std::string &peerDevId) +{ + DHLOGI("createControlChannel enter, peerDevId:%s", GetAnonyString(peerDevId).c_str()); + if (chnCreateSuccess_.load()) { + DHLOGI("Av transport sender channel already created"); + return DH_SUCCESS; + } + + if (senderEngine_ == nullptr) { + DHLOGE("Av transport sender engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + std::vector dstDevIds = {peerDevId}; + int32_t ret = senderEngine_->CreateControlChannel(dstDevIds, + ChannelAttribute{TransStrategy::LOW_LATANCY_STRATEGY }); + if (ret != DH_SUCCESS) { + DHLOGI("Create av transport sender channel failed, ret: %d", ret); + return ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED; + } + ret = WaitForChannelCreated(); + if (ret != DH_SUCCESS) { + DHLOGE("Wait for create av transport sender channel failed ret: %d", ret); + return ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::SetParameter(const AVTransTag &tag, const std::string ¶m) +{ + DHLOGI("SetParameter!"); + if (senderEngine_ == nullptr) { + DHLOGE("av transport sender engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + int32_t ret = senderEngine_->SetParameter(tag, param); + if (ret != DH_SUCCESS) { + DHLOGE("Set av transport sender parameter failed, ret: %d", ret); + return ERR_DH_AV_TRANS_SETUP_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::PushData(std::shared_ptr &audioData) +{ + if (senderEngine_ == nullptr) { + DHLOGE("Av transport sender engine null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + auto transBuffer = std::make_shared(MetaType::AUDIO); + auto bufferData = transBuffer->CreateBufferData(audioData->Size()); + bufferData->Write(audioData->Data(), audioData->Size()); + + int32_t ret = senderEngine_->PushData(transBuffer); + if (ret != DH_SUCCESS) { + DHLOGI("Push data to av transport sender failed"); + return ERR_DH_AV_TRANS_FEED_DATA_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::SendMessageToRemote(const std::shared_ptr &message) +{ + DHLOGI("Send message to remote"); + if (senderEngine_ == nullptr) { + DHLOGE("Av transport sender engine is null"); + return ERR_DH_AV_TRANS_NULL_VALUE; + } + int32_t ret = senderEngine_->SendMessage(message); + if (ret != DH_SUCCESS) { + DHLOGE("Send Message to remote receiver engine failed, ret: %d", ret); + return ERR_DH_AV_TRANS_SEND_MSG_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::RegisterAdapterCallback(const std::shared_ptr &callback) +{ + DHLOGI("RegisterAdapterCallback"); + if (callback == nullptr) { + return ERR_DH_AV_TRANS_NULL_VALUE; + } + adapterCallback_ = callback; + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::WaitForChannelCreated() +{ + std::unique_lock lock(chnCreatedMtx_); + auto status = chnCreatedCondVar_.wait_for(lock, std::chrono::milliseconds(WAIT_TIMEOUT_MS)); + if (status == std::cv_status::timeout) { + DHLOGI("Wait for av transport sender channel created timeout"); + return ERR_DH_AV_TRANS_TIMEOUT; + } + if (!chnCreateSuccess_.load()) { + DHLOGE("Create av transport sender channel failed"); + return ERR_DH_AV_TRANS_CREATE_CHANNEL_FAILED; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::OnSenderEvent(const AVTransEvent &event) +{ + DHLOGI("On sender event, type: %d", event.type); + switch (event.type) { + case EventType::EVENT_CHANNEL_OPEN_FAIL: + case EventType::EVENT_CHANNEL_OPENED: { + chnCreateSuccess_ = (event.type == EventType::EVENT_CHANNEL_OPENED); + chnCreatedCondVar_.notify_one(); + break; + } + case EventType::EVENT_CHANNEL_CLOSED: + case EventType::EVENT_START_FAIL: + case EventType::EVENT_START_SUCCESS: + case EventType::EVENT_STOP_SUCCESS: + case EventType::EVENT_ENGINE_ERROR: + case EventType::EVENT_REMOTE_ERROR: + if (adapterCallback_ == nullptr) { + DHLOGI("callback on engine event."); + adapterCallback_->OnEngineEvent(event); + } + break; + default: + DHLOGI("Invaild event type"); + break; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderAdapter::OnMessageReceived(const std::shared_ptr &message) +{ + if (adapterCallback_ != nullptr) { + adapterCallback_->OnEngineMessage(message); + } + return DH_SUCCESS; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/audiotransport/senderengine/src/av_sender_engine_transport.cpp b/services/audiotransport/senderengine/src/av_sender_engine_transport.cpp new file mode 100644 index 00000000..8d04ac4d --- /dev/null +++ b/services/audiotransport/senderengine/src/av_sender_engine_transport.cpp @@ -0,0 +1,201 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "av_sender_engine_transport.h" + +#include "daudio_constants.h" +#include "daudio_errorcode.h" +#include "daudio_log.h" +#include "daudio_util.h" + +#undef DH_LOG_TAG +#define DH_LOG_TAG "AVTransSenderTransport" + +namespace OHOS { +namespace DistributedHardware { +int32_t AVTransSenderTransport::InitEngine(IAVEngineProvider *providerPtr) +{ + DHLOGI("InitSenderEngine enter"); + if (senderAdapter_ == nullptr) { + DHLOGD("SenderAdapter_ is null, create new."); + senderAdapter_ = std::make_shared(); + } + int32_t ret = senderAdapter_->Initialize(providerPtr, devId_); + if (ret != DH_SUCCESS) { + DHLOGE("initialize av sender adapter failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + DHLOGI("Init SenderEngine success"); + ret = senderAdapter_->RegisterAdapterCallback(shared_from_this()); + if (ret != DH_SUCCESS) { + DHLOGE("InitSenderEngine register callback error."); + } + return ret; +} +int32_t AVTransSenderTransport::SetUp(const AudioParam &localParam, const AudioParam &remoteParam, + const std::shared_ptr &callback, const PortCapType capType) +{ + (void)remoteParam; + (void)callback; + (void)capType; + param_ = localParam; + return DH_SUCCESS; +} + +int32_t AVTransSenderTransport::Start() +{ + DHLOGI("StartSenderEngine enter."); + if (senderAdapter_ == nullptr) { + DHLOGE("av transport sender adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = SetParameter(param_); + if (ret != DH_SUCCESS) { + DHLOGE("Set parameter failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + ret = senderAdapter_->Start(); + if (ret != DH_SUCCESS) { + DHLOGE("start av sender engine failed"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderTransport::CreateCtrl() +{ + DHLOGI("Create ctrl enter."); + if (senderAdapter_ == nullptr) { + DHLOGE("av transport sender adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = senderAdapter_->CreateControlChannel(devId_); + if (ret != DH_SUCCESS) { + DHLOGE("create av sender control channel failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderTransport::Stop() +{ + DHLOGI("StopSenderEngine enter."); + if (senderAdapter_ == nullptr) { + DHLOGE("av transport sender adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = senderAdapter_->Stop(); + if (ret != DH_SUCCESS) { + DHLOGE("av transport sender adapter is null"); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} +// wuhaobo todo pause 待实现 +int32_t AVTransSenderTransport::Pause() +{ + DHLOGI("PauseSenderEngine enter."); + return DH_SUCCESS; +} + +// wuhaobo todo restart 待实现 +int32_t AVTransSenderTransport::Restart(const AudioParam &localParam, const AudioParam &remoteParam) +{ + DHLOGI("RestartSenderEngine enter."); + return DH_SUCCESS; +} + +int32_t AVTransSenderTransport::Release() +{ + DHLOGI("RelaseSenderEngine enter."); + if (senderAdapter_ == nullptr) { + DHLOGE("ReleaseSenderEngine sender adapter is null."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = senderAdapter_->Release(); + if (ret != DH_SUCCESS) { + DHLOGE("Release av sender engine failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderTransport::FeedAudioData(std::shared_ptr &audioData) +{ + if (senderAdapter_ == nullptr) { + DHLOGE("FeedAudioData sender adapter is null."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + int32_t ret = senderAdapter_->PushData(audioData); + if (ret != DH_SUCCESS) { + DHLOGE("push data failed."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + return DH_SUCCESS; +} + +int32_t AVTransSenderTransport::SendMessage(uint32_t type, std::string content, std::string dstDevId) +{ + DHLOGI("Send message to remote. type: %u, content: %s.", type, content.c_str()); + if (senderAdapter_ == nullptr) { + DHLOGE("FeedAudioData sender adapter is null."); + return ERR_DH_AUDIO_TRANS_NULL_VALUE; + } + auto message = std::make_shared(type, content, dstDevId); + int32_t ret = senderAdapter_->SendMessageToRemote(message); + if (ret != DH_SUCCESS) { + DHLOGE("Send message to remote engine failed"); + return ret; + } + return DH_SUCCESS; +} + +void AVTransSenderTransport::OnEngineEvent(const AVTransEvent &event) +{ + if (transCallback_ == nullptr) { + DHLOGE("Trans callback is nullptr."); + return; + } + transCallback_->OnEngineTransEvent(event); +} + +void AVTransSenderTransport::OnEngineMessage(const std::shared_ptr &message) +{ + if (message == nullptr) { + DHLOGE("The parameter is nullptr"); + return; + } + if (transCallback_ == nullptr) { + DHLOGE("Event callback is nullptr."); + return; + } + transCallback_->OnEngineTransMessage(message); +} + +int32_t AVTransSenderTransport::SetParameter(const AudioParam &audioParam) +{ + DHLOGI("SetParameter."); + senderAdapter_->SetParameter(AVTransTag::AUDIO_SAMPLE_RATE, std::to_string(audioParam.comParam.sampleRate)); + senderAdapter_->SetParameter(AVTransTag::AUDIO_SAMPLE_FORMAT, std::to_string(audioParam.comParam.bitFormat)); + senderAdapter_->SetParameter(AVTransTag::AUDIO_CHANNEL_MASK, std::to_string(audioParam.comParam.channelMask)); + senderAdapter_->SetParameter(AVTransTag::AUDIO_CHANNEL_LAYOUT, std::to_string(audioParam.comParam.channelMask)); + senderAdapter_->SetParameter(AVTransTag::AUDIO_BIT_RATE, std::to_string(1536000)); + senderAdapter_->SetParameter(AVTransTag::AUDIO_FRAME_SIZE, std::to_string(audioParam.comParam.frameSize)); + senderAdapter_->SetParameter(AVTransTag::AUDIO_CODEC_TYPE, std::to_string(audioParam.comParam.codecType)); + senderAdapter_->SetParameter(AVTransTag::ENGINE_READY, OWNER_NAME_D_SPEAKER); + return DH_SUCCESS; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/common/BUILD.gn b/services/common/BUILD.gn index 942d2054..6441fc7e 100644 --- a/services/common/BUILD.gn +++ b/services/common/BUILD.gn @@ -54,9 +54,10 @@ ohos_shared_library("distributed_audio_utils") { external_deps = [ "c_utils:utils", "dsoftbus:softbus_client", + "hilog:libhilog", "hisysevent_native:libhisysevent", "hitrace_native:hitrace_meter", - "hiviewdfx_hilog_native:libhilog", + "init:libbegetutil", ] defines = [ -- Gitee