diff --git a/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h b/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h index e42c36c7e098d323ca11ee6324524666fdd50865..204a1deddec6dfd0c3f1704576b7cb0e639194cb 100644 --- a/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h +++ b/services/audio_policy/server/domain/interrupt/include/audio_interrupt_service.h @@ -366,6 +366,7 @@ private: AudioStreamType defaultVolumeType_ = STREAM_MUSIC; std::mutex audioServerProxyMutex_; + std::unordered_set mutedGameSessionId_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp b/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp index 3796a938da8762cdd0ab399403fa86e2380dd9e0..29c9ba7d00f5202f21dde80cd6a156a2657b2a9d 100644 --- a/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp +++ b/services/audio_policy/server/domain/interrupt/src/audio_interrupt_service.cpp @@ -847,6 +847,16 @@ bool AudioInterruptService::AudioInterruptIsActiveInFocusList(const int32_t zone if (iter != audioFocusInfoList.end()) { return true; } + auto isPresentPause = [incomingStreamId] (const std::pair &pair) { + return pair.first.streamId == incomingStreamId && (pair.second == PAUSE); + }; + if (mutedGameSessionId_.find(incomingStreamId) != mutedGameSessionId_.end()) { + auto iter = std::find_if(audioFocusInfoList.begin(), audioFocusInfoList.end(), isPresentPause); + if (iter != audioFocusInfoList.end()) { + return true; + } + } + return false; } @@ -1010,6 +1020,9 @@ void AudioInterruptService::ResetNonInterruptControl(AudioInterrupt audioInterru if (!IsGameAvoidCallbackCase(audioInterrupt)) { return; } + if (mutedGameSessionId_.find(audioInterrupt.streamId) != mutedGameSessionId_.end()) { + mutedGameSessionId_.erase(audioInterrupt.streamId); + } AUDIO_INFO_LOG("Reset non-interrupt control for %{public}u", audioInterrupt.streamId); const sptr gsp = GetAudioServerProxy(); std::string identity = IPCSkeleton::ResetCallingIdentity(); @@ -2874,6 +2887,13 @@ bool AudioInterruptService::ShouldCallbackToClient(uint32_t uid, int32_t streamI std::string identity = IPCSkeleton::ResetCallingIdentity(); CHECK_AND_RETURN_RET_LOG(gsp != nullptr, true, "error for g_adProxy null"); AUDIO_INFO_LOG("mute flag is: %{public}d", muteFlag); + if (muteFlag) { + mutedGameSessionId_.insert(streamId); + } else { + if (mutedGameSessionId_.find(streamId) != mutedGameSessionId_.end()) { + mutedGameSessionId_.erase(streamId); + } + } gsp->SetNonInterruptMute(streamId, muteFlag); IPCSkeleton::SetCallingIdentity(identity); return false; diff --git a/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_service_second_unit_test.cpp b/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_service_second_unit_test.cpp index 1cfb39971ddb1fdc4b4ad125b13ffb91d24e0068..3e82cff0cc204f81ad6f7228a310a1506541c105 100644 --- a/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_service_second_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_interrupt_service_test/src/audio_interrupt_service_second_unit_test.cpp @@ -1808,6 +1808,10 @@ HWTEST(AudioInterruptServiceSecondUnitTest, AudioInterruptService_064, TestSize. ret = audioInterruptService->ShouldCallbackToClient(uid, streamId, interruptEvent); EXPECT_EQ(false, ret); + interruptEvent.hintType = INTERRUPT_HINT_RESUME; + ret = audioInterruptService->ShouldCallbackToClient(uid, streamId, interruptEvent); + EXPECT_EQ(false, ret); + interruptEvent.hintType = INTERRUPT_HINT_MUTE; ret = audioInterruptService->ShouldCallbackToClient(uid, streamId, interruptEvent); EXPECT_EQ(false, ret); @@ -1862,5 +1866,38 @@ HWTEST(AudioInterruptServiceSecondUnitTest, AudioInterruptService_066, TestSize. audioInterruptService->RemoveClient(zoneId, streamId); EXPECT_EQ(false, audioInterrupt.isAudioSessionInterrupt); } + +/** + * @tc.name : Test AudioInterruptService + * @tc.number: AudioInterruptService_071 + * @tc.desc : Test AudioInterruptIsActiveInFocusList +*/ +HWTEST(AudioInterruptServiceSecondUnitTest, AudioInterruptService_071, TestSize.Level1) +{ + auto audioInterruptService = std::make_shared(); + ASSERT_NE(audioInterruptService, nullptr); + uint32_t streamId = 1; + int32_t zoneId = 0; + auto ret = audioInterruptService->AudioInterruptIsActiveInFocusList(zoneId, streamId); + EXPECT_EQ(ret, false); + auto audioInterruptZone = make_shared(); + AudioInterrupt audioInterrupt; + audioInterrupt.streamId = streamId; + audioInterruptZone->audioFocusInfoList.push_back({audioInterrupt, ACTIVE}); + audioInterruptService->zonesMap_[0] = audioInterruptZone; + ret = audioInterruptService->AudioInterruptIsActiveInFocusList(zoneId, streamId); + EXPECT_EQ(ret, true); + audioInterruptService->mutedGameSessionId_.insert(streamId); + audioInterruptZone->audioFocusInfoList.clear(); + audioInterruptZone->audioFocusInfoList.push_back({audioInterrupt, PAUSE}); + audioInterruptService->zonesMap_[0] = audioInterruptZone; + ret = audioInterruptService->AudioInterruptIsActiveInFocusList(zoneId, streamId); + EXPECT_EQ(ret, true); + audioInterruptZone->audioFocusInfoList.clear(); + audioInterruptService->mutedGameSessionId_.clear(); + audioInterruptService->zonesMap_[0] = audioInterruptZone; + ret = audioInterruptService->AudioInterruptIsActiveInFocusList(zoneId, streamId); + EXPECT_EQ(ret, false); +} } // namespace AudioStandard } // namespace OHOS