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 95b0bed518a3fc5d02abe7b3fa59736eb5b9eae9..fd40095bbb8b5c8c4f7891357e21bfbdc630c392 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 28c188a78d7c3c0857be4e27c1ddb1690c1d8869..f416eef0f2b0ab91c255c07f68b9162b960e4c66 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 11f58493510f3fa3c24e14ebb89c11d110ac98f7..cf87475d166e1a0978bc6bbcda78635f8c04e252 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 c37004fda9ba486b45953d2e117a46e1d071be6d..7f87ffeb15d0e163d6dc41f2a788c9a69eb0c573 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 75ed8cc239a1473b82bd79ab0fbe1ccfa8f4af54..76daa7ffa76a95932bb93582ce4337c8746e62d0 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 52f14e75bbd15a0243a26a28e97261fcb0c09e4e..cf3e878e094e400ffae593d725dd31ec8e1b87a9 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 1b128364269c4d1bc18b380601745d75ae9ae53e..16456f22939620adb8b97c34a94387e598734073 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 bc0deb19687be7804612323fab047075607a30f3..ce6db2d9d089713e5264ac41881a7c34f2cae7d4 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 b1e7804ad9d4bbdcfe4d8e4d7746cf7f82dd72c3..2e38a01a8490a187375f03c1eb35b8e53ceba176 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 b8bc147d1dc8b829299064bfe058967519a1ffd3..abf89ad8558ceffd6466201073e67b0d2e3b9bf4 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 82f13efaa734fd035305940bfafb2ea73d14d200..f5dedaed45350563969fa2aab9295530a6245c0a 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 2539988b01a8193abb3a132cbb7684f54ab2a2a8..83e9f788b9b215c8becab36a73ae7e20b187dc1e 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