From 5140ec8e8ecd9db70678c2f8fe593a58f3552414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E9=98=94?= Date: Tue, 22 Jul 2025 20:54:21 +0800 Subject: [PATCH] =?UTF-8?q?DSP=E7=BB=B4=E6=B5=8B=E9=80=9A=E8=B7=AF?= =?UTF-8?q?=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 杨阔 --- .../include/audio_policy_interface.h | 7 +++++ .../sle_audio_operation_callback_stub_impl.h | 1 + ...sle_audio_operation_callback_stub_impl.cpp | 9 +++++++ .../IStandardSleAudioOperationCallback.idl | 1 + .../device/src/pnp/audio_socket_thread.cpp | 27 ++++++++++++++++++- .../device/src/pnp/audio_socket_thread.h | 2 +- .../src/sle/sle_audio_device_manager.cpp | 6 +++++ .../device/src/sle/sle_audio_device_manager.h | 1 + .../audio_policy_service_second_unit_test.h | 5 ++++ .../src/audio_socket_thread_test.cpp | 24 +++++++++++++++++ .../sle_audio_device_manager_unit_test.h | 5 ++++ .../sle_audio_device_manager_unit_test.cpp | 19 +++++++++++++ 12 files changed, 105 insertions(+), 2 deletions(-) diff --git a/interfaces/inner_api/native/audiomanager/include/audio_policy_interface.h b/interfaces/inner_api/native/audiomanager/include/audio_policy_interface.h index 95b0bed518..fd40095bbb 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_policy_interface.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_policy_interface.h @@ -339,6 +339,13 @@ public: * @return int32_t */ virtual int32_t GetRenderPosition(const std::string &device, uint32_t &delayValue) = 0; + + /** + * @brief Send chr data of dsp to nearlink service. + * @param sleChrDspData chr data of dsp. + * @param len length of sleChrDspData. + */ + virtual void OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) = 0; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/client/stub/include/sle_audio_operation_callback_stub_impl.h b/services/audio_policy/client/stub/include/sle_audio_operation_callback_stub_impl.h index 28c188a78d..f416eef0f2 100644 --- a/services/audio_policy/client/stub/include/sle_audio_operation_callback_stub_impl.h +++ b/services/audio_policy/client/stub/include/sle_audio_operation_callback_stub_impl.h @@ -40,6 +40,7 @@ public: int32_t& ret) override; int32_t SendUserSelection(const std::string &device, uint32_t streamType, int32_t& ret) override; int32_t GetRenderPosition(const std::string &device, uint32_t &delayValue) override; + int32_t OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) override; private: std::mutex sleAudioOperationCallbackMutex_; std::weak_ptr sleAudioOperationCallback_; diff --git a/services/audio_policy/client/stub/src/sle_audio_operation_callback_stub_impl.cpp b/services/audio_policy/client/stub/src/sle_audio_operation_callback_stub_impl.cpp index 11f5849351..cf87475d16 100644 --- a/services/audio_policy/client/stub/src/sle_audio_operation_callback_stub_impl.cpp +++ b/services/audio_policy/client/stub/src/sle_audio_operation_callback_stub_impl.cpp @@ -171,5 +171,14 @@ int32_t SleAudioOperationCallbackStubImpl::GetRenderPosition(const std::string & return sleAudioOperationCallback->GetRenderPosition(device, delayValue); } +int32_t SleAudioOperationCallbackStubImpl::OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) +{ + std::unique_lock lock(sleAudioOperationCallbackMutex_); + std::shared_ptr sleAudioOperationCallback = sleAudioOperationCallback_.lock(); + CHECK_AND_RETURN_RET_LOG(sleAudioOperationCallback != nullptr, ERROR, "sleAudioOperationCallback_ is nullptr"); + lock.unlock(); + sleAudioOperationCallback->OnSleDspChrDataSend(sleChrDspData, len); + return SUCCESS; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/idl/IStandardSleAudioOperationCallback.idl b/services/audio_policy/idl/IStandardSleAudioOperationCallback.idl index c37004fda9..7f87ffeb15 100644 --- a/services/audio_policy/idl/IStandardSleAudioOperationCallback.idl +++ b/services/audio_policy/idl/IStandardSleAudioOperationCallback.idl @@ -29,4 +29,5 @@ interface IStandardSleAudioOperationCallback { void SetDeviceAbsVolume([in] String remoteAddr, [in] unsigned int volume, [in] unsigned int streamType, [out] int ret); void SendUserSelection([in] String device, [in] unsigned int streamType, [out] int ret); void GetRenderPosition([in] String device, [out] unsigned int delayValue); + void OnSleDspChrDataSend([in] String sleChrDspData, [in] unsigned int len); } \ No newline at end of file diff --git a/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.cpp b/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.cpp index 75ed8cc239..76daa7ffa7 100644 --- a/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.cpp +++ b/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.cpp @@ -32,6 +32,11 @@ #include "audio_policy_log.h" #include "audio_pnp_server.h" #include "audio_policy_server_handler.h" +#include "sle_audio_device_manager.h" + +namespace { + #include "v5_0/audio_types.h" +} namespace OHOS { namespace AudioStandard { @@ -423,6 +428,25 @@ int32_t AudioSocketThread::AudioHDMIDetectDevice(struct AudioPnpUevent *audioPnp return SUCCESS; } +int32_t AudioSocketThread::AudioSendSleChrDspData(struct AudioPnpUevent *audioPnpUevent) +{ + if (audioPnpUevent == nullptr || audioPnpUevent->name == nullptr) { + return HDF_ERR_INVALID_PARAM; + } + + if (strncmp(audioPnpUevent->name, "sle_dsp_data", strlen("sle_dsp_data")) != 0) { + return HDF_ERR_INVALID_PARAM; + } + + std::string ueventStr = audioPnpUevent->name; + auto state = ueventStr.substr(ueventStr.find("sle_dsp_data") + strlen("sle_dsp_data") + 1); + + AUDIO_INFO_LOG("SleDspChrData:[%{public}s] len:[%{public}zu]", state.c_str(), state.length()); + // callback of sle + SleAudioDeviceManager::GetInstance().OnSleDspChrDataSend(state, static_cast(state.length())); + return SUCCESS; +} + bool AudioSocketThread::AudioPnpUeventParse(const char *msg, const ssize_t strLength) { struct AudioPnpUevent audioPnpUevent = {"", "", "", "", "", "", "", "", "", ""}; @@ -468,7 +492,8 @@ bool AudioSocketThread::AudioPnpUeventParse(const char *msg, const ssize_t strLe (AudioDpDetectDevice(&audioPnpUevent) == SUCCESS) || (AudioAnahsDetectDevice(&audioPnpUevent) == SUCCESS) || (AudioNnDetectDevice(&audioPnpUevent) == SUCCESS) || - (AudioMicBlockDevice(&audioPnpUevent) == SUCCESS)) { + (AudioMicBlockDevice(&audioPnpUevent) == SUCCESS) || + (AudioSendSleChrDspData(&audioPnpUevent) == SUCCESS)) { return true; } diff --git a/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.h b/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.h index 52f14e75bb..cf3e878e09 100644 --- a/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.h +++ b/services/audio_policy/server/domain/device/src/pnp/audio_socket_thread.h @@ -20,7 +20,6 @@ #include "hdf_device_desc.h" #include "hdf_types.h" -#include "v5_0/audio_types.h" #include "audio_pnp_param.h" namespace OHOS { @@ -50,6 +49,7 @@ private: static int32_t ReadAndScanDpName(const std::string &path, std::string &name); static int32_t AudioNnDetectDevice(struct AudioPnpUevent *audioPnpUevent); static int32_t AudioMicBlockDevice(struct AudioPnpUevent *audioPnpUevent); + static int32_t AudioSendSleChrDspData(struct AudioPnpUevent *audioPnpUevent); }; } // namespace AudioStandard diff --git a/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.cpp b/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.cpp index 1b12836426..16456f2293 100644 --- a/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.cpp +++ b/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.cpp @@ -149,6 +149,12 @@ int32_t SleAudioDeviceManager::GetRenderPosition(const std::string &device, uint return callback_->GetRenderPosition(device, delayValue); } +void SleAudioDeviceManager::OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) +{ + CHECK_AND_RETURN_LOG(callback_ != nullptr, "callback is nullptr"); + callback_->OnSleDspChrDataSend(sleChrDspData, len); +} + uint32_t SleAudioDeviceManager::GetSleStreamTypeByStreamUsage(StreamUsage streamUsage) const { for (const auto &pair : STREAM_USAGE_TO_SLE_STREAM_TYPE) { diff --git a/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.h b/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.h index bc0deb1968..ce6db2d9d0 100644 --- a/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.h +++ b/services/audio_policy/server/domain/device/src/sle/sle_audio_device_manager.h @@ -69,6 +69,7 @@ public: int32_t SetDeviceAbsVolume(const std::string &remoteAddr, uint32_t volume, uint32_t streamType) override; int32_t SendUserSelection(const std::string &device, uint32_t streamType) override; int32_t GetRenderPosition(const std::string &device, uint32_t &delayValue) override; + void OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) override; // Parameter Conversion Interface int32_t SetActiveDevice(const std::string &device, StreamUsage streamUsage); diff --git a/services/audio_policy/test/unittest/audio_policy_service_unit_test/include/audio_policy_service_second_unit_test.h b/services/audio_policy/test/unittest/audio_policy_service_unit_test/include/audio_policy_service_second_unit_test.h index b1e7804ad9..2e38a01a84 100644 --- a/services/audio_policy/test/unittest/audio_policy_service_unit_test/include/audio_policy_service_second_unit_test.h +++ b/services/audio_policy/test/unittest/audio_policy_service_unit_test/include/audio_policy_service_second_unit_test.h @@ -95,6 +95,11 @@ public: { return SUCCESS; } + + int32_t OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) override + { + return SUCCESS; + } }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/test/unittest/audio_socket_thread_test/src/audio_socket_thread_test.cpp b/services/audio_policy/test/unittest/audio_socket_thread_test/src/audio_socket_thread_test.cpp index b8bc147d1d..abf89ad855 100644 --- a/services/audio_policy/test/unittest/audio_socket_thread_test/src/audio_socket_thread_test.cpp +++ b/services/audio_policy/test/unittest/audio_socket_thread_test/src/audio_socket_thread_test.cpp @@ -1226,6 +1226,30 @@ HWTEST_F(AudioSocketThreadUnitTest, AudioNnDetectDevice_SendNnStateChangeCallbac EXPECT_EQ(audioSocketThread_.AudioNnDetectDevice(&audioPnpUevent), HDF_ERR_INVALID_PARAM); } +/** + * @tc.name : AudioSendSleChrDspData_InvalidParam_Test + * @tc.number: Audio_AudioSocketThread_AudioSendSleChrDspData_001 + * @tc.desc : Test AudioSendSleChrDspData function with invalid parameters. + */ +HWTEST_F(AudioSocketThreadUnitTest, AudioSendSleChrDspData_InvalidParam_Test, TestSize.Level2) +{ + struct AudioPnpUevent audioPnpUevent; + audioPnpUevent.name = "nearlink_dsp_data"; + EXPECT_EQ(audioSocketThread_.AudioSendSleChrDspData(&audioPnpUevent), HDF_ERR_INVALID_PARAM); +} + +/** + * @tc.name : AudioSendSleChrDspData_ValidParam_Test + * @tc.number: Audio_AudioSocketThread_AudioSendSleChrDspData_002 + * @tc.desc : Test AudioSendSleChrDspData function with valid parameters. + */ +HWTEST_F(AudioSocketThreadUnitTest, AudioSendSleChrDspData_ValidParam_Test, TestSize.Level2) +{ + struct AudioPnpUevent audioPnpUevent; + audioPnpUevent.name = "sle_dsp_data600"; + EXPECT_EQ(audioSocketThread_.AudioSendSleChrDspData(&audioPnpUevent), SUCCESS); +} + /** * @tc.name : AudioPnpUeventParse_Test_01 * @tc.number: Audio_AudioPnpUeventParse_001 diff --git a/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/include/sle_audio_device_manager_unit_test.h b/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/include/sle_audio_device_manager_unit_test.h index 82f13efaa7..f5dedaed45 100644 --- a/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/include/sle_audio_device_manager_unit_test.h +++ b/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/include/sle_audio_device_manager_unit_test.h @@ -97,6 +97,11 @@ public: { return SUCCESS; } + + int32_t OnSleDspChrDataSend(const std::string &sleChrDspData, uint32_t len) override + { + return SUCCESS; + } }; } // namespace AudioStandard diff --git a/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/src/sle_audio_device_manager_unit_test.cpp b/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/src/sle_audio_device_manager_unit_test.cpp index 2539988b01..83e9f788b9 100644 --- a/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/src/sle_audio_device_manager_unit_test.cpp +++ b/services/audio_policy/test/unittest/sle_audio_device_manager_unit_test/src/sle_audio_device_manager_unit_test.cpp @@ -1219,5 +1219,24 @@ HWTEST(SleAudioDeviceManagerUnitTest, GetVolumeLevelByVolumeType_003, TestSize.L EXPECT_EQ(ret, -1); } +/** + * @tc.name : Test OnSleDspChrDataSend + * @tc.number: OnSleDspChrDataSend_001 + * @tc.desc : Test SleAudioDeviceManager::OnSleDspChrDataSend + */ +HWTEST(SleAudioDeviceManagerUnitTest, OnSleDspChrDataSend_001, TestSize.Level1) +{ + std::shared_ptr sleAudioDeviceManager_ = + std::make_shared(); + sptr callback = + new(std::nothrow) IStandardSleAudioOperationCallbackTest(); + sleAudioDeviceManager_->SetSleAudioOperationCallback(callback); + std::string data = "DspChrData"; + uint32_t len = data.size(); + + sleAudioDeviceManager_->OnSleDspChrDataSend(data, len); + EXPECT_EQ(0, SUCCESS); +} + } // namespace AudioStandard } // namespace OHOS \ No newline at end of file -- Gitee