From 598552f4cbcb2632ea771dcfb4105c3059a703f5 Mon Sep 17 00:00:00 2001 From: ZhengYong21 Date: Mon, 11 Aug 2025 23:55:39 +0800 Subject: [PATCH] monitor renderer volume Signed-off-by: ZhengYong21 --- .../include/audio_system_manager_ext.h | 2 + .../client/include/audio_manager_base.h | 3 + .../audio_manager_listener_stub_impl.h | 1 + .../src/audio_manager_listener_stub_impl.cpp | 15 ++++ .../common/include/audio_stream_checker.h | 5 ++ .../common/include/audio_stream_monitor.h | 5 ++ .../common/include/volume_tools.h | 1 + .../common/src/audio_stream_checker.cpp | 37 +++++++++ .../common/src/audio_stream_monitor.cpp | 25 +++++- .../audio_service/common/src/audio_volume.cpp | 5 +- .../audio_service/common/src/volume_tools.cpp | 8 ++ .../IStandardAudioServerManagerListener.idl | 1 + .../server/include/audio_manager_listener.h | 2 + .../server/include/audio_server.h | 4 + .../server/src/audio_endpoint.cpp | 2 + .../server/src/audio_manager_listener.cpp | 7 ++ .../audio_service/server/src/audio_server.cpp | 14 ++++ .../src/audio_server_unit_test.cpp | 51 ++++++++++++ .../audio_stream_checker_unit_test.cpp | 31 ++++++++ .../audio_stream_monitor_unit_test.cpp | 78 +++++++++++++++++++ .../client/audio_system_manager_unit_test.cpp | 1 + .../test/unittest/volume_tools_unit_test.cpp | 14 ++++ .../audio_server_fuzzer.cpp | 19 ++++- 23 files changed, 326 insertions(+), 5 deletions(-) diff --git a/interfaces/inner_api/native/audiomanager/include/audio_system_manager_ext.h b/interfaces/inner_api/native/audiomanager/include/audio_system_manager_ext.h index 60ba33870d..6631180e65 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_system_manager_ext.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_system_manager_ext.h @@ -360,6 +360,8 @@ public: virtual ~AudioRendererDataTransferStateChangeCallback() = default; virtual void OnDataTransferStateChange(const AudioRendererDataTransferStateChangeInfo &info) = 0; + + virtual void OnMuteStateChange(const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) = 0; }; class AudioWorkgroupChangeCallback { diff --git a/services/audio_service/client/include/audio_manager_base.h b/services/audio_service/client/include/audio_manager_base.h index 4e2a00e5c2..e1732fc2e1 100644 --- a/services/audio_service/client/include/audio_manager_base.h +++ b/services/audio_service/client/include/audio_manager_base.h @@ -29,6 +29,9 @@ public: virtual void OnDataTransferStateChange(const int32_t &callbackId, const AudioRendererDataTransferStateChangeInfo &info) = 0; + + virtual void OnMuteStateChange(const int32_t &callbackId, const int32_t &uid, + const uint32_t &sessionId, const bool &isMuted) = 0; }; } // namespace AudioStandard diff --git a/services/audio_service/client/include/audio_manager_listener_stub_impl.h b/services/audio_service/client/include/audio_manager_listener_stub_impl.h index 570edd488d..68964df202 100755 --- a/services/audio_service/client/include/audio_manager_listener_stub_impl.h +++ b/services/audio_service/client/include/audio_manager_listener_stub_impl.h @@ -32,6 +32,7 @@ public: int32_t OnWakeupClose() override; int32_t OnDataTransferStateChange(int32_t callbackId, const AudioRendererDataTransferStateChangeInfo &info) override; + int32_t OnMuteStateChange(int32_t callbackId, int32_t uid, uint32_t sessionId, bool isMuted) override; void SetParameterCallback(const std::weak_ptr& callback); void SetWakeupSourceCallback(const std::weak_ptr& callback); diff --git a/services/audio_service/client/src/audio_manager_listener_stub_impl.cpp b/services/audio_service/client/src/audio_manager_listener_stub_impl.cpp index b60db53b64..c1e3ad4086 100755 --- a/services/audio_service/client/src/audio_manager_listener_stub_impl.cpp +++ b/services/audio_service/client/src/audio_manager_listener_stub_impl.cpp @@ -87,6 +87,21 @@ int32_t AudioManagerListenerStubImpl::OnDataTransferStateChange(int32_t callback return SUCCESS; } +int32_t AudioManagerListenerStubImpl::OnMuteStateChange(int32_t callbackId, int32_t uid, + uint32_t sessionId, bool isMuted) +{ + std::shared_ptr callback = nullptr; + std::unique_lock lock(stateChangeMutex_); + auto it = stateChangeCallbackMap_.find(callbackId); + CHECK_AND_RETURN_RET(it != stateChangeCallbackMap_.end(), SUCCESS); + callback = stateChangeCallbackMap_[callbackId].second; + lock.unlock(); + CHECK_AND_RETURN_RET(callback != nullptr, SUCCESS); + callback->OnMuteStateChange(uid, sessionId, isMuted); + + return SUCCESS; +} + int32_t AudioManagerListenerStubImpl::AddDataTransferStateChangeCallback(const DataTransferMonitorParam ¶m, std::shared_ptr cb) { diff --git a/services/audio_service/common/include/audio_stream_checker.h b/services/audio_service/common/include/audio_stream_checker.h index 6d87ece7ca..160fd4197d 100644 --- a/services/audio_service/common/include/audio_stream_checker.h +++ b/services/audio_service/common/include/audio_stream_checker.h @@ -62,6 +62,7 @@ public: void OnRemoteAppDied(const int32_t pid); void RecordStandbyTime(bool isStart); void UpdateAppState(bool isBackground); + void SetVolume(float volume); private: bool IsMonitorMuteFrame(const CheckerParam ¶); bool IsMonitorNoDataFrame(const CheckerParam ¶); @@ -69,6 +70,7 @@ private: void CheckStreamThread(); void MonitorCheckFrameAction(CheckerParam ¶, int64_t abnormalFrameNum, float badFrameRatio); void CalculateFrameAfterStandby(CheckerParam ¶, int64_t &abnormalFrameNum); + void CheckVolume(); std::vector checkParaVector_; bool monitorSwitch_ = false; bool isBackground_ = false; @@ -78,6 +80,9 @@ private: std::thread checkThread_; std::atomic isKeepCheck_ = false; std::atomic isNeedCreateThread_ = true; + std::mutex volumeLock_; + float curVolume_ = 1.0f; + float preVolume_ = 1.0f; }; } diff --git a/services/audio_service/common/include/audio_stream_monitor.h b/services/audio_service/common/include/audio_stream_monitor.h index a5adefa3ad..2ca07a10fc 100644 --- a/services/audio_service/common/include/audio_stream_monitor.h +++ b/services/audio_service/common/include/audio_stream_monitor.h @@ -29,6 +29,8 @@ public: virtual ~DataTransferStateChangeCallbackForMonitor() = default; virtual void OnDataTransferStateChange(const int32_t &pid, const int32_t & callbackId, const AudioRendererDataTransferStateChangeInfo& info) = 0; + virtual void OnMuteStateChange(const int32_t &pid, const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) = 0; }; class AudioStreamMonitor { @@ -38,12 +40,15 @@ public: const int32_t pid, const int32_t callbackId); int32_t UnregisterAudioRendererDataTransferStateListener(const int32_t pid, const int32_t callbackId); void OnCallback(int32_t pid, int32_t callbackId, const AudioRendererDataTransferStateChangeInfo &info); + void OnMuteCallback(const int32_t &pid, const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted); void ReportStreamFreezen(int64_t intervalTime); void AddCheckForMonitor(uint32_t sessionId, std::shared_ptr &checker); void DeleteCheckForMonitor(uint32_t sessionId); void SetAudioServerPtr(DataTransferStateChangeCallbackForMonitor *ptr); void OnCallbackAppDied(const int32_t pid); void NotifyAppStateChange(const int32_t uid, bool isBackground); + void UpdateMonitorVolume(const uint32_t &sessionId, const float &volume); private: AudioStreamMonitor() {} ~AudioStreamMonitor() {} diff --git a/services/audio_service/common/include/volume_tools.h b/services/audio_service/common/include/volume_tools.h index 6273cd33ed..b62fa81dc0 100644 --- a/services/audio_service/common/include/volume_tools.h +++ b/services/audio_service/common/include/volume_tools.h @@ -50,6 +50,7 @@ public: static void CalcMuteFrame(BufferDesc &buffer, AudioStreamInfo streamInfo, std::string logTag, int64_t &volumeDataCount, int64_t &muteFrameCnt, size_t split = 1); + static bool IsZeroVolume(float volume); }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/common/src/audio_stream_checker.cpp b/services/audio_service/common/src/audio_stream_checker.cpp index 6e76291584..5dd822e8ac 100644 --- a/services/audio_service/common/src/audio_stream_checker.cpp +++ b/services/audio_service/common/src/audio_stream_checker.cpp @@ -17,6 +17,7 @@ #include "audio_renderer_log.h" #include "audio_utils.h" #include "audio_stream_monitor.h" +#include "volume_tools.h" namespace OHOS { namespace AudioStandard { @@ -157,11 +158,38 @@ void AudioStreamChecker::CheckStreamThread() AUDIO_INFO_LOG("In"); while (isKeepCheck_.load()) { MonitorCheckFrame(); + CheckVolume(); ClockTime::RelativeSleep(STREAM_CHECK_INTERVAL_TIME); } AUDIO_INFO_LOG("Out"); } +void AudioStreamChecker::CheckVolume() +{ + std::lock_guard lock(volumeLock_); + if (VolumeTools::IsZeroVolume(curVolume_) && !VolumeTools::IsZeroVolume(preVolume_)) { + AUDIO_INFO_LOG("sessionId %{public}u change to mute", streamConfig_.originalSessionId); + std::unique_lock lock(checkLock_); + for (size_t index = 0; index < checkParaVector_.size(); index++) { + AudioStreamMonitor::GetInstance().OnMuteCallback(checkParaVector_[index].pid, + checkParaVector_[index].callbackId, streamConfig_.appInfo.appUid, + streamConfig_.originalSessionId, true); + } + lock.unlock(); + } + if (!VolumeTools::IsZeroVolume(curVolume_) && VolumeTools::IsZeroVolume(preVolume_)) { + AUDIO_INFO_LOG("sessionId %{public}u change to unmute", streamConfig_.originalSessionId); + std::unique_lock lock(checkLock_); + for (size_t index = 0; index < checkParaVector_.size(); index++) { + AudioStreamMonitor::GetInstance().OnMuteCallback(checkParaVector_[index].pid, + checkParaVector_[index].callbackId, streamConfig_.appInfo.appUid, + streamConfig_.originalSessionId, false); + } + lock.unlock(); + } + preVolume_ = curVolume_; +} + void AudioStreamChecker::MonitorCheckFrame() { if (!monitorSwitch_) { @@ -387,5 +415,14 @@ void AudioStreamChecker::UpdateAppState(bool isBackground) isBackground_ = isBackground; } } + +void AudioStreamChecker::SetVolume(float volume) +{ + std::lock_guard lock(volumeLock_); + CHECK_AND_RETURN(curVolume_ != volume); + AUDIO_INFO_LOG("sessionId:%{public}u volume change from %{public}f to %{public}f", + streamConfig_.originalSessionId, curVolume_, volume); + curVolume_ = volume; +} } } diff --git a/services/audio_service/common/src/audio_stream_monitor.cpp b/services/audio_service/common/src/audio_stream_monitor.cpp index 2e9f933db6..b76ba05fda 100644 --- a/services/audio_service/common/src/audio_stream_monitor.cpp +++ b/services/audio_service/common/src/audio_stream_monitor.cpp @@ -100,11 +100,23 @@ void AudioStreamMonitor::OnCallback(int32_t pid, int32_t callbackId, if (audioServer_ == nullptr) { return; } - AUDIO_INFO_LOG("Stream callback, pid = %{public}d, callbackid = %{public}d, type = %{public}d", - pid, callbackId, info.stateChangeType); + AUDIO_INFO_LOG("pid = %{public}d, callbackid = %{public}d, sessionId = %{public}d, type = %{public}d", + pid, callbackId, info.sessionId, info.stateChangeType); audioServer_->OnDataTransferStateChange(pid, callbackId, info); } +void AudioStreamMonitor::OnMuteCallback(const int32_t &pid, const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) +{ + std::lock_guard lock(regStatusMutex_); + if (audioServer_ == nullptr) { + return; + } + AUDIO_INFO_LOG("pid = %{public}d, uid = %{public}d, sessionId = %{public}d, isMuted = %{public}d", + pid, uid, sessionId, isMuted); + audioServer_->OnMuteStateChange(pid, callbackId, uid, sessionId, isMuted); +} + void AudioStreamMonitor::SetAudioServerPtr(DataTransferStateChangeCallbackForMonitor *ptr) { std::lock_guard lock(regStatusMutex_); @@ -175,5 +187,14 @@ void AudioStreamMonitor::NotifyAppStateChange(const int32_t uid, bool isBackgrou iter++; } } + +void AudioStreamMonitor::UpdateMonitorVolume(const uint32_t &sessionId, const float &volume) +{ + std::lock_guard lock(regStatusMutex_); + auto iter = audioStreamCheckers_.find(sessionId); + if (iter != audioStreamCheckers_.end()) { + iter->second->SetVolume(volume); + } +} } } \ No newline at end of file diff --git a/services/audio_service/common/src/audio_volume.cpp b/services/audio_service/common/src/audio_volume.cpp index a732aee768..e74d53571b 100644 --- a/services/audio_service/common/src/audio_volume.cpp +++ b/services/audio_service/common/src/audio_volume.cpp @@ -24,6 +24,7 @@ #include "audio_utils_c.h" #include "audio_stream_info.h" #include "media_monitor_manager.h" +#include "audio_stream_monitor.h" namespace OHOS { namespace AudioStandard { @@ -113,8 +114,7 @@ float AudioVolume::GetVolume(uint32_t sessionId, int32_t streamType, const std:: volumes->volumeSystem = 1.0f; } } else { - AUDIO_ERR_LOG("system volume not exist, volumeType:%{public}d, deviceClass%{public}s", - volumeType, deviceClass.c_str()); + AUDIO_ERR_LOG("no system volume, volumeType:%{public}d deviceClass%{public}s", volumeType, deviceClass.c_str()); } float sysVolume = volumes->volumeSystem; if (it != streamVolume_.end() && it->second.IsVirtualKeyboard() && itSV != systemVolume_.end()) { @@ -131,6 +131,7 @@ float AudioVolume::GetVolume(uint32_t sessionId, int32_t streamType, const std:: volumes->volumeSystem, volumes->volumeStream, volumes->volumeApp, it->second.IsVirtualKeyboard(), itSV != systemVolume_.end() ? (itSV->second.isMuted_ ? "T" : "F") : "null", doNotDisturbStatusVolume); } + AudioStreamMonitor::GetInstance().UpdateMonitorVolume(sessionId, volumes->volume); return volumes->volume; } diff --git a/services/audio_service/common/src/volume_tools.cpp b/services/audio_service/common/src/volume_tools.cpp index f12ac81163..333c0a232d 100644 --- a/services/audio_service/common/src/volume_tools.cpp +++ b/services/audio_service/common/src/volume_tools.cpp @@ -597,6 +597,14 @@ void VolumeTools::CalcMuteFrame(BufferDesc &buffer, AudioStreamInfo streamInfo, Trace::Count(logTag, minVolume); } +bool VolumeTools::IsZeroVolume(float volume) +{ + float d = volume - 0.0f; + if ((d >= 0 && d <= FLOAT_EPS) || (d <= 0 && d >= -FLOAT_EPS)) { + return true; + } + return false; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/idl/IStandardAudioServerManagerListener.idl b/services/audio_service/idl/IStandardAudioServerManagerListener.idl index 7551ed5a36..148fb00beb 100644 --- a/services/audio_service/idl/IStandardAudioServerManagerListener.idl +++ b/services/audio_service/idl/IStandardAudioServerManagerListener.idl @@ -21,4 +21,5 @@ interface IStandardAudioServerManagerListener { void OnCapturerState([in] boolean isActive); void OnWakeupClose(); [oneway] void OnDataTransferStateChange([in] int callbackId, [in] AudioRendererDataTransferStateChangeInfo info); + [oneway] void OnMuteStateChange([in] int callbackId, [in] int uid, [in] unsigned int sessionId, [in] boolean isMuted); } diff --git a/services/audio_service/server/include/audio_manager_listener.h b/services/audio_service/server/include/audio_manager_listener.h index 273a841ed1..ffc318682a 100755 --- a/services/audio_service/server/include/audio_manager_listener.h +++ b/services/audio_service/server/include/audio_manager_listener.h @@ -35,6 +35,8 @@ public: void TrigerFirstOnCapturerStateCallback(bool isActive); void OnDataTransferStateChange(const int32_t &callbackId, const AudioRendererDataTransferStateChangeInfo &info) override; + void OnMuteStateChange(const int32_t &callbackId, const int32_t &uid, + const uint32_t &sessionId, const bool &isMuted) override; private: sptr listener_ = nullptr; std::atomic isFirstOnCapturerStateCallbackSent_ = false; diff --git a/services/audio_service/server/include/audio_server.h b/services/audio_service/server/include/audio_server.h index a7f7260fd3..d282d6000d 100644 --- a/services/audio_service/server/include/audio_server.h +++ b/services/audio_service/server/include/audio_server.h @@ -264,6 +264,8 @@ public: int32_t UnregisterDataTransferMonitorParam(int32_t callbackId) override; void OnDataTransferStateChange(const int32_t &pid, const int32_t &callbackId, const AudioRendererDataTransferStateChangeInfo &info) override; + void OnMuteStateChange(const int32_t &pid, const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) override; int32_t SetBtHdiInvalidState() override; protected: void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; @@ -413,6 +415,8 @@ public: virtual ~DataTransferStateChangeCallbackInnerImpl() = default; void OnDataTransferStateChange(const int32_t &callbackId, const AudioRendererDataTransferStateChangeInfo &info) override; + void OnMuteStateChange(const int32_t &callbackId, const int32_t &uid, + const uint32_t &sessionId, const bool &isMuted) override {} void SetDataTransferMonitorParam(const DataTransferMonitorParam ¶m); private: void ReportEvent(const AudioRendererDataTransferStateChangeInfo &info); diff --git a/services/audio_service/server/src/audio_endpoint.cpp b/services/audio_service/server/src/audio_endpoint.cpp index 56f88e98fa..56569cce13 100644 --- a/services/audio_service/server/src/audio_endpoint.cpp +++ b/services/audio_service/server/src/audio_endpoint.cpp @@ -38,6 +38,7 @@ #include "res_sched_client.h" #endif #include "audio_volume.h" +#include "audio_stream_monitor.h" namespace OHOS { namespace AudioStandard { @@ -1404,6 +1405,7 @@ AudioEndpointInner::VolumeResult AudioEndpointInner::CalculateVolume(size_t i) result.muteFlag = processList_[i]->GetMuteState(); result.volumeEnd = volumeFromOhaudioBuffer; result.volumeHap = result.muteFlag ? 0 : volumeFromOhaudioBuffer; + AudioStreamMonitor::GetInstance().UpdateMonitorVolume(processList_[i]->GetAudioSessionId(), result.volumeStart); return result; } diff --git a/services/audio_service/server/src/audio_manager_listener.cpp b/services/audio_service/server/src/audio_manager_listener.cpp index dba580d78b..878a653850 100644 --- a/services/audio_service/server/src/audio_manager_listener.cpp +++ b/services/audio_service/server/src/audio_manager_listener.cpp @@ -68,5 +68,12 @@ void AudioManagerListenerCallback::OnDataTransferStateChange(const int32_t &call listener_->OnDataTransferStateChange(callbackId, info); } } + +void AudioManagerListenerCallback::OnMuteStateChange(const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) +{ + CHECK_AND_RETURN(listener_ != nullptr); + listener_->OnMuteStateChange(callbackId, uid, sessionId, isMuted); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index ce5c8875bd..81ae3981a0 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -526,6 +526,20 @@ void AudioServer::OnDataTransferStateChange(const int32_t &pid, const int32_t &c callback->OnDataTransferStateChange(callbackId, info); } +void AudioServer::OnMuteStateChange(const int32_t &pid, const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) +{ + std::shared_ptr callback = nullptr; + { + std::lock_guard lock(audioDataTransferMutex_); + CHECK_AND_RETURN_LOG(audioDataTransferCbMap_.find(pid) != audioDataTransferCbMap_.end(), + "pid:%{public}d no callback in CbMap", pid); + callback = audioDataTransferCbMap_[pid]; + } + CHECK_AND_RETURN_LOG(callback != nullptr, "callback is null"); + callback->OnMuteStateChange(callbackId, uid, sessionId, isMuted); +} + void AudioServer::RegisterDataTransferStateChangeCallback() { DataTransferMonitorParam param; diff --git a/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp b/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp index 6927131812..86494a5d3c 100644 --- a/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp @@ -67,6 +67,15 @@ enum PermissionStatus { PERMISSION_UNKNOWN = 2, }; +class DataTransferStateChangeCallbackInnerTest : public DataTransferStateChangeCallbackInner { +public: + void OnDataTransferStateChange(const int32_t &callbackId, + const AudioRendererDataTransferStateChangeInfo &info) override {} + + void OnMuteStateChange(const int32_t &callbackId, const int32_t &uid, + const uint32_t &sessionId, const bool &isMuted) override {} +}; + class WakeUpSourceCallbackTest : public WakeUpSourceCallback { public: void OnCapturerState(bool isActive) override {} @@ -2486,5 +2495,47 @@ HWTEST_F(AudioServerUnitTest, SetAsrVoiceMuteMode_001, TestSize.Level1) bool on = true; EXPECT_EQ(audioServer->SetAsrVoiceMuteMode(asrVoiceMuteMode, on), ERR_SYSTEM_PERMISSION_DENIED); } + +/** + * @tc.name : Test OnMuteStateChange API + * @tc.type : FUNC + * @tc.number: OnMuteStateChange_001 + * @tc.desc : Test OnMuteStateChange interface. + */ +HWTEST_F(AudioServerUnitTest, OnMuteStateChange_001, TestSize.Level1) +{ + EXPECT_NE(nullptr, audioServer); + int32_t uid = 0; + uint32_t sessionId = 0; + bool isMuted = true; + + audioServer->audioDataTransferCbMap_.clear(); + audioServer->OnMuteStateChange(0, 0, uid, sessionId, isMuted); + EXPECT_EQ(audioServer->audioDataTransferCbMap_.size(), 0); +} + +/** + * @tc.name : Test OnMuteStateChange API + * @tc.type : FUNC + * @tc.number: OnMuteStateChange_002 + * @tc.desc : Test OnMuteStateChange interface. + */ +HWTEST_F(AudioServerUnitTest, OnMuteStateChange_002, TestSize.Level1) +{ + EXPECT_NE(nullptr, audioServer); + int32_t callbackId = 1; + int32_t uid = 0; + uint32_t sessionId = 0; + bool isMuted = true; + + audioServer->audioDataTransferCbMap_.clear(); + std::shared_ptr callback = + std::make_shared(); + int32_t pid = IPCSkeleton::GetCallingPid(); + audioServer->audioDataTransferCbMap_[pid] = callback; + audioServer->OnMuteStateChange(pid, callbackId, uid, sessionId, isMuted); + audioServer->audioDataTransferCbMap_.clear(); + EXPECT_EQ(audioServer->audioDataTransferCbMap_.size(), 0); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/test/unittest/audio_stream_checker_unit_test.cpp b/services/audio_service/test/unittest/audio_stream_checker_unit_test.cpp index 0108b6fdd7..5db3cfa5c9 100644 --- a/services/audio_service/test/unittest/audio_stream_checker_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_stream_checker_unit_test.cpp @@ -1530,5 +1530,36 @@ HWTEST(AudioStreamCheckerTest, MonitorOnAllCallback_010, TestSize.Level1) checker->MonitorOnAllCallback(DATA_TRANS_RESUME, false); EXPECT_TRUE(checker->monitorSwitch_); } + +/** + * @tc.name : Test CheckVolume API + * @tc.type : FUNC + * @tc.number: CheckVolume_001 + */ +HWTEST(AudioStreamCheckerTest, CheckVolume_001, TestSize.Level1) +{ + AudioProcessConfig cfg; + std::shared_ptr checker = std::make_shared(cfg); + + checker->curVolume_ = 0.0f; + checker->preVolume_ = 0.0f; + checker->CheckVolume(); + EXPECT_EQ(checker->curVolume_, checker->preVolume_); + + checker->curVolume_ = 0.0f; + checker->preVolume_ = 1.0f; + checker->CheckVolume(); + EXPECT_EQ(checker->curVolume_, checker->preVolume_); + + checker->curVolume_ = 1.0f; + checker->preVolume_ = 0.0f; + checker->CheckVolume(); + EXPECT_EQ(checker->curVolume_, checker->preVolume_); + + checker->curVolume_ = 1.0f; + checker->preVolume_ = 1.0f; + checker->CheckVolume(); + EXPECT_EQ(checker->curVolume_, checker->preVolume_); +} } } \ No newline at end of file diff --git a/services/audio_service/test/unittest/audio_stream_monitor_unit_test.cpp b/services/audio_service/test/unittest/audio_stream_monitor_unit_test.cpp index bfce59bfc6..fd9e49efb0 100644 --- a/services/audio_service/test/unittest/audio_stream_monitor_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_stream_monitor_unit_test.cpp @@ -22,6 +22,30 @@ using namespace testing::ext; namespace OHOS { namespace AudioStandard { +class DataTransferStateChangeCallbackForMonitorTest : public DataTransferStateChangeCallbackForMonitor { +public: + void OnDataTransferStateChange(const int32_t &pid, const int32_t & callbackId, + const AudioRendererDataTransferStateChangeInfo& info) override {} + void OnMuteStateChange(const int32_t &pid, const int32_t &callbackId, + const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) override; + + int32_t pid_ = 0; + int32_t callbackId_ = 0; + int32_t uid_ = 0; + uint32_t sessionId_ = 0; + bool isMuted_ = false; +}; + +void DataTransferStateChangeCallbackForMonitorTest::OnMuteStateChange(const int32_t &pid, + const int32_t &callbackId, const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) +{ + pid_ = pid; + callbackId_ = callbackId; + uid_ = uid; + sessionId_ = sessionId; + isMuted_ = isMuted; +} + class AudioStreamMonitorTest : public testing::Test { public: static void SetUpTestCase(void); @@ -181,5 +205,59 @@ HWTEST(AudioStreamMonitorTest, UnregisterAudioRendedData_002, TestSize.Level1) AudioStreamMonitor::GetInstance().UnregisterAudioRendererDataTransferStateListener(pid, callbackId); EXPECT_EQ(result, SUCCESS); } + +/** + * @tc.name : Test UpdateMonitorVolume API + * @tc.type : FUNC + * @tc.number: UpdateMonitorVolume_001 + */ +HWTEST(AudioStreamMonitorTest, UpdateMonitorVolume_001, TestSize.Level1) +{ + DataTransferMonitorParam para; + para.clientUID = 20002000; + AudioStreamMonitor::GetInstance().RegisterAudioRendererDataTransferStateListener(para, 10000, 10000); + AudioProcessConfig cfg; + cfg.originalSessionId = 0; + std::shared_ptr checker = std::make_shared(cfg); + AudioStreamMonitor::GetInstance().AddCheckForMonitor(cfg.originalSessionId, checker); + AudioStreamMonitor::GetInstance().UpdateMonitorVolume(0, 0.5f); + AudioStreamMonitor::GetInstance().UpdateMonitorVolume(1, 0.5f); + AudioStreamMonitor::GetInstance().DeleteCheckForMonitor(0); + int32_t size = AudioStreamMonitor::GetInstance().audioStreamCheckers_.size(); + EXPECT_EQ(size, 0); +} + +/** + * @tc.name : Test OnMuteStateChange API + * @tc.type : FUNC + * @tc.number: OnMuteStateChange_001 + */ +HWTEST(AudioStreamMonitorTest, OnMuteStateChange_001, TestSize.Level1) +{ + std::shared_ptr monitor = std::make_shared(); + DataTransferStateChangeCallbackForMonitorTest *test = + new DataTransferStateChangeCallbackForMonitorTest(); + + int32_t pid = 1; + int32_t callbackId = 1; + int32_t uid = 1; + uint32_t sessionId = 1; + bool isMuted = true; + monitor->OnMuteCallback(pid, callbackId, uid, sessionId, isMuted); + EXPECT_EQ(test->pid_, 0); + EXPECT_EQ(test->callbackId_, 0); + EXPECT_EQ(test->uid_, 0); + EXPECT_EQ(test->sessionId_, 0); + EXPECT_EQ(test->isMuted_, false); + + monitor->SetAudioServerPtr(test); + monitor->OnMuteCallback(pid, callbackId, uid, sessionId, isMuted); + EXPECT_EQ(test->pid_, pid); + EXPECT_EQ(test->callbackId_, callbackId); + EXPECT_EQ(test->uid_, uid); + EXPECT_EQ(test->sessionId_, sessionId); + EXPECT_EQ(test->isMuted_, isMuted); + delete test; +} } } \ No newline at end of file diff --git a/services/audio_service/test/unittest/client/audio_system_manager_unit_test.cpp b/services/audio_service/test/unittest/client/audio_system_manager_unit_test.cpp index 952692c9cd..a6d5a9fd42 100644 --- a/services/audio_service/test/unittest/client/audio_system_manager_unit_test.cpp +++ b/services/audio_service/test/unittest/client/audio_system_manager_unit_test.cpp @@ -46,6 +46,7 @@ public: class DataTransferStateChangeCallbackTest : public AudioRendererDataTransferStateChangeCallback { public: void OnDataTransferStateChange(const AudioRendererDataTransferStateChangeInfo &info) override {} + void OnMuteStateChange(const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) override {} }; class SystemVolumeChangeCallbackTest : public SystemVolumeChangeCallback { diff --git a/services/audio_service/test/unittest/volume_tools_unit_test.cpp b/services/audio_service/test/unittest/volume_tools_unit_test.cpp index 21cdd5972a..202a6f685f 100644 --- a/services/audio_service/test/unittest/volume_tools_unit_test.cpp +++ b/services/audio_service/test/unittest/volume_tools_unit_test.cpp @@ -266,5 +266,19 @@ HWTEST_F(VolumeToolsUnitTest, VolumeTools_013, TestSize.Level1) EXPECT_EQ(ret, SUCCESS); delete[] buffer; } + +/** + * @tc.name : Test IsZeroVolume. + * @tc.type : FUNC + * @tc.number: VolumeTools_014 + * @tc.desc : Test IsZeroVolume. + */ +HWTEST_F(VolumeToolsUnitTest, VolumeTools_014, TestSize.Level1) +{ + EXPECT_EQ(VolumeTools::IsZeroVolume(1e-10f), true); + EXPECT_EQ(VolumeTools::IsZeroVolume(-1e-10f), true); + EXPECT_EQ(VolumeTools::IsZeroVolume(0.5f), true); + EXPECT_EQ(VolumeTools::IsZeroVolume(-0.5f), true); +} } } diff --git a/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp b/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp index f36470c7cd..b17b3a1f0f 100644 --- a/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp +++ b/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp @@ -103,6 +103,8 @@ class DataTransferStateChangeCallbackInnerFuzzTest : public DataTransferStateCha public: void OnDataTransferStateChange(const int32_t &callbackId, const AudioRendererDataTransferStateChangeInfo &info) override {} + void OnMuteStateChange(const int32_t &callbackId, const int32_t &uid, + const uint32_t &sessionId, const bool &isMuted) override {} }; template uint32_t GetArrLength(T& arr) @@ -1192,6 +1194,20 @@ void AudioServerOnDataTransferStateChangeFuzzTest(const uint8_t *rawData, size_t audioServerPtr->OnDataTransferStateChange(testPid, testCallbackId, info); } +void AudioServerOnMuteStateChangeFuzzTest(const uint8_t *rawData, size_t size) +{ + if (rawData == nullptr || size < LIMITSIZE) { + return; + } + int32_t testPid = *reinterpret_cast(rawData); + int32_t testCallbackId = *reinterpret_cast(rawData); + int32_t testUid = *reinterpret_cast(rawData); + int32_t testSessionId = *reinterpret_cast(rawData); + bool testIsMuted = *reinterpret_cast(rawData); + std::shared_ptr audioServerPtr = std::make_shared(SYSTEM_ABILITY_ID, RUN_ON_CREATE); + audioServerPtr->OnMuteStateChange(testPid, testCallbackId, testUid, testSessionId, testIsMuted); +} + void AudioServerRegisterDataTransferStateChangeCallbackFuzzTest(const uint8_t *rawData, size_t size) { if (rawData == nullptr || size < LIMITSIZE) { @@ -1967,7 +1983,8 @@ OHOS::AudioStandard::TestPtr g_testPtrs[] = { OHOS::AudioStandard::AudioServerForceStopAudioStreamFuzzTest, OHOS::AudioStandard::AudioServerStartGroupFuzzTest, OHOS::AudioStandard::AudioServerStopGroupFuzzTest, - OHOS::AudioStandard::AudioServerSetActiveOutputDeviceFuzzTest + OHOS::AudioStandard::AudioServerSetActiveOutputDeviceFuzzTest, + OHOS::AudioStandard::AudioServerOnMuteStateChangeFuzzTest }; /* Fuzzer entry point */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -- Gitee