diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h index 569bbbf55592c41971fdb638b711649ceca9e95a..43948eb446f63325472cd2ba1df96c3df335dcc4 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_adapter_interface_impl.h @@ -155,6 +155,14 @@ private: const std::string NOT_MUTE_STATUS = "0"; const std::string IS_MUTE_STATUS = "1"; + + AudioCaptureInterfaceImplBase *(*GetExternCaptureImpl_)() = nullptr; + AudioRenderInterfaceImplBase *(*GetExternRenderImpl_)() = nullptr; +#ifdef __aarch64__ + char resolvedPath_[100] = "/system/lib64/libdaudio_extern_hdf_service.z.so"; +#else + char resolvedPath_[100] = "/system/lib/libdaudio_extern_hdf_service.z.so"; +#endif }; } // V1_0 } // Audio diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h index 12df1f6213ab3ca12e789cecf58cda43e018256c..e11c2a8ace8176e95054cced19c189214632b3e5 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl.h @@ -73,6 +73,8 @@ public: int32_t AudioDevDump(int32_t range, int32_t fd) override; int32_t IsSupportsPauseAndResume(bool &supportPause, bool &supportResume) override; const AudioDeviceDescriptor &GetCaptureDesc() override; + void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, + const AudioSampleAttributes &attrs, const sptr &callback) override; private: static constexpr int64_t AUDIO_OFFSET_FRAME_NUM = 10; diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h index d705eae390aaf69f0db00f11726ecb7734a2b77f..4e3c4912fca9871b713a1e4fb5b01f7b61db36e7 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_capture_interface_impl_base.h @@ -43,6 +43,8 @@ public: virtual ~AudioCaptureInterfaceImplBase() = default; virtual const AudioDeviceDescriptor &GetCaptureDesc() = 0; + virtual void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, + const AudioSampleAttributes &attrs, const sptr &callback) = 0; }; } // V1_0 } // Audio diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h index c1536720a9ab95865605126589fbede0e21b0e64..8b92112f2a74452435ee40da77f3042743eb72dc 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl.h @@ -91,6 +91,8 @@ public: uint32_t GetVolumeInner() override; uint32_t GetMaxVolumeInner() override; uint32_t GetMinVolumeInner() override; + void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, + const AudioSampleAttributes &attrs, const sptr &callback) override; private: float GetFadeRate(uint32_t currentIndex, const uint32_t durationIndex); diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h index dea8aa2b077daba96b368c493b39198b341f3cd6..5929d137f2c6e9c169fbdb2c9e0f160530d6845a 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/include/audio_render_interface_impl_base.h @@ -29,6 +29,9 @@ namespace HDI { namespace DistributedAudio { namespace Audio { namespace V1_0 { +using OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioData; +using OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioParameter; +using OHOS::HDI::DistributedAudio::Audioext::V1_0::IDAudioCallback; typedef enum { RENDER_STATUS_OPEN = 0, RENDER_STATUS_CLOSE, @@ -48,6 +51,8 @@ public: virtual uint32_t GetVolumeInner() = 0; virtual uint32_t GetMaxVolumeInner() = 0; virtual uint32_t GetMinVolumeInner() = 0; + virtual void SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, + const AudioSampleAttributes &attrs, const sptr &callback) = 0; }; } // V1_0 } // Audio diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp index b993d2f85be96414b9e8f8fff10222354b9f61df..3bac9205bf3ca012cc7228370cbd2d7a9e91a7d4 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_adapter_interface_impl.cpp @@ -15,6 +15,7 @@ #include "audio_adapter_interface_impl.h" +#include #include #include @@ -86,6 +87,18 @@ int32_t AudioAdapterInterfaceImpl::CreateRender(const AudioDeviceDescriptor &des } renderFlags_ = Audioext::V1_0::NORMAL_MODE; audioRender_ = new AudioRenderInterfaceImpl(adpDescriptor_.adapterName, desc, attrs, extSpkCallback_); + void *handle = dlopen(resolvedPath_, RTLD_LAZY); + if (attrs.type == AUDIO_MMAP_NOIRQ && handle != nullptr) { + DHLOGI("Try to mmap mode."); + GetExternRenderImpl_ = (AudioRenderInterfaceImplBase *(*)())(dlsym(handle, "GetExternRenderImpl")); + if (GetExternRenderImpl_ == nullptr) { + DHLOGE("Dlsym GetExternRenderImpl error."); + return HDF_FAILURE; + } + audioRender_ = GetExternRenderImpl_(); + audioRender_->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extSpkCallback_); + renderFlags_ = Audioext::V1_0::MMAP_MODE; + } if (audioRender_ == nullptr) { DHLOGE("Create render failed."); return HDF_FAILURE; @@ -138,6 +151,18 @@ int32_t AudioAdapterInterfaceImpl::CreateCapture(const AudioDeviceDescriptor &de } capturerFlags_ = Audioext::V1_0::NORMAL_MODE; audioCapture_ = new AudioCaptureInterfaceImpl(adpDescriptor_.adapterName, desc, attrs, extMicCallback_); + void *handle = dlopen(resolvedPath_, RTLD_LAZY); + if (attrs.type == AUDIO_MMAP_NOIRQ && handle != nullptr) { + DHLOGI("Try to mmap mode."); + GetExternCaptureImpl_ = (AudioCaptureInterfaceImplBase *(*)())(dlsym(handle, "GetExternCaptureImpl")); + if (GetExternCaptureImpl_ == nullptr) { + DHLOGE("Dlsym GetExternCaptureImpl error."); + return HDF_FAILURE; + } + audioCapture_ = GetExternCaptureImpl_(); + audioCapture_->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extMicCallback_); + capturerFlags_ = Audioext::V1_0::MMAP_MODE; + } if (audioCapture_ == nullptr) { DHLOGE("Create capture failed."); return HDF_FAILURE; diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp index bbfcabba248d6eca9721c60c0884f9cd5b754fd4..39b830a374e8b96e374e71782abf16778102ba4e 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_capture_interface_impl.cpp @@ -321,6 +321,12 @@ int32_t AudioCaptureInterfaceImpl::GetFrameBufferSize(uint64_t &bufferSize) return HDF_SUCCESS; } +void AudioCaptureInterfaceImpl::SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, + const AudioSampleAttributes &attrs, const sptr &callback) +{ + DHLOGI("Set attrs, not support yet."); +} + const AudioDeviceDescriptor &AudioCaptureInterfaceImpl::GetCaptureDesc() { return devDesc_; diff --git a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp index f8478f10a21c1747156dfc4dd557c98f5983fee5..0c40c09982db97c090c774e9bc18d56506428a86 100644 --- a/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp +++ b/hdf_service/distributed_audio/hdi_service/audio/v1_0/src/audio_render_interface_impl.cpp @@ -435,6 +435,12 @@ uint32_t AudioRenderInterfaceImpl::GetMinVolumeInner() std::lock_guard volLck(volMtx_); return volMin_; } + +void AudioRenderInterfaceImpl::SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc, + const AudioSampleAttributes &attrs, const sptr &callback) +{ + DHLOGI("Set attrs, not support yet."); +} } // V1_0 } // Audio } // Distributedaudio diff --git a/services/audioclient/interface/imic_client.h b/services/audioclient/interface/imic_client.h index 91feb930227447349f7e4c0f0cb1dca8cda4d075..7546355e7ef1f8dd4bdd8ebe4a47d7314b7b2660 100644 --- a/services/audioclient/interface/imic_client.h +++ b/services/audioclient/interface/imic_client.h @@ -31,6 +31,7 @@ public: virtual int32_t Release() = 0; virtual int32_t StartCapture() = 0; virtual int32_t StopCapture() = 0; + virtual void SetAttrs(const std::string &devId, const std::shared_ptr &callback) = 0; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audioclient/interface/ispk_client.h b/services/audioclient/interface/ispk_client.h index a6c03854068859dd2ae679704e144a7fd17bfaf2..f28c313eeb7af47261077af552e664b4a62e2caa 100644 --- a/services/audioclient/interface/ispk_client.h +++ b/services/audioclient/interface/ispk_client.h @@ -34,6 +34,7 @@ public: virtual int32_t SetMute(const AudioEvent &event) = 0; 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; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/audioclient/micclient/include/dmic_client.h b/services/audioclient/micclient/include/dmic_client.h index 0e1313090ac682ab053509c42465db58f4f17695..b9f68de4e547bd9912a1e017e4293bb4e7b9e9d6 100644 --- a/services/audioclient/micclient/include/dmic_client.h +++ b/services/audioclient/micclient/include/dmic_client.h @@ -54,6 +54,7 @@ public: int32_t Release() override; int32_t StartCapture() override; int32_t StopCapture() override; + void SetAttrs(const std::string &devId, const std::shared_ptr &callback) override; private: void CaptureThreadRunning(); diff --git a/services/audioclient/micclient/src/dmic_client.cpp b/services/audioclient/micclient/src/dmic_client.cpp index a854c35eab2437f61af827aa4e97bba5bf4caf82..107530e2d96b5f11057d68d7bb11726a443acfa3 100644 --- a/services/audioclient/micclient/src/dmic_client.cpp +++ b/services/audioclient/micclient/src/dmic_client.cpp @@ -234,5 +234,10 @@ int32_t DMicClient::StopCapture() } return DH_SUCCESS; } + +void DMicClient::SetAttrs(const std::string &devId, const std::shared_ptr &callback) +{ + DHLOGE("Set attrs, not support yet."); +} } // DistributedHardware } // OHOS diff --git a/services/audioclient/spkclient/include/dspeaker_client.h b/services/audioclient/spkclient/include/dspeaker_client.h index bce42c9480b19098c317a404eab5fba863fd568a..5738f18ea68226963d4691fe2ebc7e69c8462b28 100644 --- a/services/audioclient/spkclient/include/dspeaker_client.h +++ b/services/audioclient/spkclient/include/dspeaker_client.h @@ -66,6 +66,7 @@ public: int32_t SetMute(const AudioEvent &event) override; 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; private: std::string GetVolumeLevel(); diff --git a/services/audioclient/spkclient/src/dspeaker_client.cpp b/services/audioclient/spkclient/src/dspeaker_client.cpp index b9e5315ebc3385534cd3f09653d9ea75cde647ff..c0685be15243e7671b618f4f4bd6445be86c17c0 100644 --- a/services/audioclient/spkclient/src/dspeaker_client.cpp +++ b/services/audioclient/spkclient/src/dspeaker_client.cpp @@ -462,5 +462,10 @@ void DSpeakerClient::PlayStatusChange(const std::string &args) DHLOGE("Play status error."); } } + +void DSpeakerClient::SetAttrs(const std::string &devId, const std::shared_ptr &callback) +{ + DHLOGE("Set attrs, not support yet."); +} } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersink/include/daudio_sink_dev.h b/services/audiomanager/managersink/include/daudio_sink_dev.h index 282f2b37d312fa7ad76feb968a184cafea963fc7..10ad859c2e3afd11d46e8e1dd1a4d2345f640d49 100644 --- a/services/audiomanager/managersink/include/daudio_sink_dev.h +++ b/services/audiomanager/managersink/include/daudio_sink_dev.h @@ -96,6 +96,14 @@ private: using DAudioSinkDevFunc = int32_t (DAudioSinkDev::*)(const AudioEvent &audioEvent); std::map memberFuncMap_; + + ISpkClient *(*GetDirectSpkClient_)() = nullptr; + IMicClient *(*GetDirectMicClient_)() = nullptr; +#ifdef __aarch64__ + char resolvedPath_[100] = "/system/lib64/libdistributed_direct_client.z.so"; +#else + char resolvedPath_[100] = "/system/lib/libdistributed_direct_client.z.so"; +#endif }; } // DistributedHardware } // OHOS diff --git a/services/audiomanager/managersink/src/daudio_sink_dev.cpp b/services/audiomanager/managersink/src/daudio_sink_dev.cpp index e2787d2bdeaa4e8924189fb1bde77528c327878d..14aefed6ec0528f0e6914d8fcdca58fdee9a082b 100644 --- a/services/audiomanager/managersink/src/daudio_sink_dev.cpp +++ b/services/audiomanager/managersink/src/daudio_sink_dev.cpp @@ -15,6 +15,7 @@ #include "daudio_sink_dev.h" +#include #include #include "daudio_constants.h" @@ -390,15 +391,20 @@ int32_t DAudioSinkDev::TaskOpenDSpeaker(const std::string &args) return ret; } - if (speakerClient_ == nullptr) { - if (audioParam.renderOpts.renderFlags == NORMAL_MODE) { - speakerClient_ = std::make_shared(devId_, shared_from_this()); - } - } - if (speakerClient_ == nullptr) { speakerClient_ = std::make_shared(devId_, shared_from_this()); } + void *handle = dlopen(resolvedPath_, RTLD_LAZY); + if (audioParam.renderOpts.renderFlags == MMAP_MODE && handle != nullptr) { + DHLOGI("Try to mmap mode."); + GetDirectSpkClient_ = (ISpkClient *(*)())(dlsym(handle, "GetDirectSpkClient")); + if (GetDirectSpkClient_ == nullptr) { + DHLOGE("Dlsym GetDirectSpkClient error."); + return ERR_DH_AUDIO_FAILED; + } + speakerClient_ = std::shared_ptr(GetDirectSpkClient_()); + speakerClient_->SetAttrs(devId_, shared_from_this()); + } ret = speakerClient_->SetUp(audioParam); if (ret != DH_SUCCESS) { DHLOGE("Setup speaker failed, ret: %d.", ret); @@ -460,9 +466,18 @@ int32_t DAudioSinkDev::TaskOpenDMic(const std::string &args) do { if (micClient_ == nullptr) { - if (audioParam.captureOpts.capturerFlags == NORMAL_MODE) { - micClient_ = std::make_shared(devId_, shared_from_this()); + micClient_ = std::make_shared(devId_, shared_from_this()); + } + void *handle = dlopen(resolvedPath_, RTLD_LAZY); + if (audioParam.captureOpts.capturerFlags == MMAP_MODE && handle != nullptr) { + DHLOGI("Try to mmap mode."); + GetDirectMicClient_ = (IMicClient *(*)())(dlsym(handle, "GetDirectMicClient")); + if (GetDirectMicClient_ == nullptr) { + DHLOGE("Dlsym GetDirectMicClient error."); + return ERR_DH_AUDIO_FAILED; } + micClient_ = std::shared_ptr(GetDirectMicClient_()); + micClient_->SetAttrs(devId_, shared_from_this()); } ret = micClient_->SetUp(audioParam); if (ret != DH_SUCCESS) {