Loading aidl/android/media/IAudioManagerNative.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -45,4 +45,11 @@ interface IAudioManagerNative { * Block until AudioService synchronizes pending permission state with audioserver. */ void permissionUpdateBarrier(); /** * Update mute state event for port * @param portId Port id to update * @param event the mute event containing info about the mute */ void portMuteEvent(in int portId, in int event); } services/audioflinger/IAfTrack.h +2 −4 Original line number Diff line number Diff line Loading @@ -272,11 +272,9 @@ class AfPlaybackCommon : public virtual VolumePortInterface { const AttributionSourceState& attributionSource, bool shouldPlaybackHarden = true); /** * Updates the mute state and notifies the audio service. Call this only when holding player * thread lock. * Updates the mute state and notifies the audio service. */ void processMuteEvent_l( const sp<IAudioManager>& audioManager, mute_state_t muteState); void processMuteEvent(media::IAudioManagerNative& am, mute_state_t muteState); void maybeLogPlaybackHardening(media::IAudioManagerNative& am) const; Loading services/audioflinger/Threads.cpp +100 −90 Original line number Diff line number Diff line Loading @@ -5865,10 +5865,10 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( volume = masterVolume * track->getPortVolume(); } } if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); const auto amn = mAfThreadCallback->getAudioManagerNative(); if (amn) { track->maybeLogPlaybackHardening(*amn); } handleVoipVolume_l(&volume); // cache the combined master volume and stream type volume for fast mixer; this Loading @@ -5880,8 +5880,9 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( gain_minifloat_packed_t vlr = proxy->getVolumeLR(); float vlf = float_from_gain(gain_minifloat_unpack_left(vlr)); float vrf = float_from_gain(gain_minifloat_unpack_right(vlr)); if (amn) { if (!audioserver_flags::portid_volume_management()) { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, Loading @@ -5891,7 +5892,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( /*muteFromPortVolume=*/false, track->isPlaybackRestrictedControl()}); } else { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, Loading @@ -5901,6 +5902,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( track->getPortMute(), track->isPlaybackRestrictedControl()}); } } vlf *= volume; vrf *= volume; Loading Loading @@ -6065,9 +6067,11 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( v = 0; } } handleVoipVolume_l(&v); if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); const auto amn = mAfThreadCallback->getAudioManagerNative(); if (amn) { track->maybeLogPlaybackHardening(*amn); } if (track->isPausing()) { Loading @@ -6087,8 +6091,9 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( ALOGV("Track right volume out of range: %.3g", vrf); vrf = GAIN_FLOAT_UNITY; } if (amn) { if (!audioserver_flags::portid_volume_management()) { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, Loading @@ -6098,7 +6103,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( /*muteFromPortVolume=*/false, track->isPlaybackRestrictedControl()}); } else { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, Loading @@ -6108,6 +6113,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( track->getPortMute(), track->isPlaybackRestrictedControl()}); } } // now apply the master volume and stream type volume and shaper volume vlf *= v * vh; vrf *= v * vh; Loading Loading @@ -6836,6 +6842,7 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) const bool clientVolumeMute = (left == 0.f && right == 0.f); const auto amn = mAfThreadCallback->getAudioManagerNative(); if (!audioserver_flags::portid_volume_management()) { if (mMasterMute || mStreamTypes[track->streamType()].mute || track->isPlaybackRestricted()) { Loading @@ -6858,7 +6865,8 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) right *= mMasterBalanceRight; } } track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), if (amn) { track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, Loading @@ -6867,6 +6875,7 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) shaperVolume == 0.f, /*muteFromPortVolume=*/false, track->isPlaybackRestrictedControl()}); } } else { if (mMasterMute || track->isPlaybackRestricted()) { left = right = 0; Loading @@ -6888,7 +6897,8 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) right *= mMasterBalanceRight; } } track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), if (amn) { track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, Loading @@ -6898,11 +6908,10 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) track->getPortMute(), track->isPlaybackRestrictedControl()}); } if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); } if (amn) { track->maybeLogPlaybackHardening(*amn); } if (lastTrack) { track->setFinalVolume(left, right); if (left != mLeftVolFloat || right != mRightVolFloat) { Loading Loading @@ -11386,7 +11395,7 @@ void MmapPlaybackThread::invalidateTracks(std::set<audio_port_handle_t>& portIds } void MmapPlaybackThread::processVolume_l() NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent_l NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent { float volume = 0; if (!audioserver_flags::portid_volume_management()) { Loading Loading @@ -11449,10 +11458,12 @@ NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent_l } } } const auto amn = mAfThreadCallback->getAudioManagerNative(); for (const sp<IAfMmapTrack>& track : mActiveTracks) { track->setMetadataHasChanged(); if (amn) { if (!audioserver_flags::portid_volume_management()) { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, streamVolume_l() == 0.f, streamMuted_l(), Loading @@ -11463,19 +11474,18 @@ NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent_l false /*muteFromPortVolume*/, shouldMutePlaybackHardening}); } else { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, // TODO(b/241533526): adjust logic to include mute from AppOps // TODO(b/241533526): adjust logic to include mute from AppOp false /*muteFromPlaybackRestricted*/, false /*muteFromClientVolume*/, false /*muteFromVolumeShaper*/, track->getPortMute(), shouldMutePlaybackHardening}); } if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); track->maybeLogPlaybackHardening(*amn); } } } Loading services/audioflinger/Tracks.cpp +7 −17 Original line number Diff line number Diff line Loading @@ -3724,10 +3724,7 @@ void AfPlaybackCommon::maybeLogPlaybackHardening(media::IAudioManagerNative& am) } } // must be called with player thread lock held void AfPlaybackCommon::processMuteEvent_l(const sp< IAudioManager>& audioManager, mute_state_t muteState) { void AfPlaybackCommon::processMuteEvent(media::IAudioManagerNative& am, mute_state_t muteState) { const auto trackId = mSelf.id(); const auto portId = mSelf.portId(); if (mMuteState == muteState) { Loading @@ -3735,23 +3732,16 @@ void AfPlaybackCommon::processMuteEvent_l(const sp< return; } status_t result = UNKNOWN_ERROR; if (audioManager && portId != AUDIO_PORT_HANDLE_NONE) { if (mMuteEventExtras == nullptr) { mMuteEventExtras = std::make_unique<os::PersistableBundle>(); } mMuteEventExtras->putInt(String16(kExtraPlayerEventMuteKey), static_cast<int>(muteState)); result = audioManager->portEvent(portId, PLAYER_UPDATE_MUTED, mMuteEventExtras); } if (result == OK) { const auto result = portId != AUDIO_PORT_HANDLE_NONE ? am.portMuteEvent(portId, static_cast<int>(muteState)) : Status::fromExceptionCode(Status::EX_ILLEGAL_STATE); if (result.isOk()) { ALOGI("%s(%d): processed mute state for port ID %d from %#x to %#x", __func__, trackId, portId, static_cast<int>(mMuteState.load()), static_cast<int>(muteState)); mMuteState = muteState; } else { ALOGW("%s(%d): cannot process mute state for port ID %d, status error %d", __func__, trackId, portId, result); ALOGW("%s(%d): cannot process mute state for port ID %d, status error %s", __func__, trackId, portId, result.toString8().c_str()); } } Loading Loading
aidl/android/media/IAudioManagerNative.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -45,4 +45,11 @@ interface IAudioManagerNative { * Block until AudioService synchronizes pending permission state with audioserver. */ void permissionUpdateBarrier(); /** * Update mute state event for port * @param portId Port id to update * @param event the mute event containing info about the mute */ void portMuteEvent(in int portId, in int event); }
services/audioflinger/IAfTrack.h +2 −4 Original line number Diff line number Diff line Loading @@ -272,11 +272,9 @@ class AfPlaybackCommon : public virtual VolumePortInterface { const AttributionSourceState& attributionSource, bool shouldPlaybackHarden = true); /** * Updates the mute state and notifies the audio service. Call this only when holding player * thread lock. * Updates the mute state and notifies the audio service. */ void processMuteEvent_l( const sp<IAudioManager>& audioManager, mute_state_t muteState); void processMuteEvent(media::IAudioManagerNative& am, mute_state_t muteState); void maybeLogPlaybackHardening(media::IAudioManagerNative& am) const; Loading
services/audioflinger/Threads.cpp +100 −90 Original line number Diff line number Diff line Loading @@ -5865,10 +5865,10 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( volume = masterVolume * track->getPortVolume(); } } if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); const auto amn = mAfThreadCallback->getAudioManagerNative(); if (amn) { track->maybeLogPlaybackHardening(*amn); } handleVoipVolume_l(&volume); // cache the combined master volume and stream type volume for fast mixer; this Loading @@ -5880,8 +5880,9 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( gain_minifloat_packed_t vlr = proxy->getVolumeLR(); float vlf = float_from_gain(gain_minifloat_unpack_left(vlr)); float vrf = float_from_gain(gain_minifloat_unpack_right(vlr)); if (amn) { if (!audioserver_flags::portid_volume_management()) { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, Loading @@ -5891,7 +5892,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( /*muteFromPortVolume=*/false, track->isPlaybackRestrictedControl()}); } else { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, Loading @@ -5901,6 +5902,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( track->getPortMute(), track->isPlaybackRestrictedControl()}); } } vlf *= volume; vrf *= volume; Loading Loading @@ -6065,9 +6067,11 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( v = 0; } } handleVoipVolume_l(&v); if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); const auto amn = mAfThreadCallback->getAudioManagerNative(); if (amn) { track->maybeLogPlaybackHardening(*amn); } if (track->isPausing()) { Loading @@ -6087,8 +6091,9 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( ALOGV("Track right volume out of range: %.3g", vrf); vrf = GAIN_FLOAT_UNITY; } if (amn) { if (!audioserver_flags::portid_volume_management()) { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, Loading @@ -6098,7 +6103,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( /*muteFromPortVolume=*/false, track->isPlaybackRestrictedControl()}); } else { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{masterVolume == 0.f, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, Loading @@ -6108,6 +6113,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l( track->getPortMute(), track->isPlaybackRestrictedControl()}); } } // now apply the master volume and stream type volume and shaper volume vlf *= v * vh; vrf *= v * vh; Loading Loading @@ -6836,6 +6842,7 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) const bool clientVolumeMute = (left == 0.f && right == 0.f); const auto amn = mAfThreadCallback->getAudioManagerNative(); if (!audioserver_flags::portid_volume_management()) { if (mMasterMute || mStreamTypes[track->streamType()].mute || track->isPlaybackRestricted()) { Loading @@ -6858,7 +6865,8 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) right *= mMasterBalanceRight; } } track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), if (amn) { track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, mStreamTypes[track->streamType()].volume == 0.f, mStreamTypes[track->streamType()].mute, Loading @@ -6867,6 +6875,7 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) shaperVolume == 0.f, /*muteFromPortVolume=*/false, track->isPlaybackRestrictedControl()}); } } else { if (mMasterMute || track->isPlaybackRestricted()) { left = right = 0; Loading @@ -6888,7 +6897,8 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) right *= mMasterBalanceRight; } } track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), if (amn) { track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, Loading @@ -6898,11 +6908,10 @@ void DirectOutputThread::processVolume_l(IAfTrack* track, bool lastTrack) track->getPortMute(), track->isPlaybackRestrictedControl()}); } if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); } if (amn) { track->maybeLogPlaybackHardening(*amn); } if (lastTrack) { track->setFinalVolume(left, right); if (left != mLeftVolFloat || right != mRightVolFloat) { Loading Loading @@ -11386,7 +11395,7 @@ void MmapPlaybackThread::invalidateTracks(std::set<audio_port_handle_t>& portIds } void MmapPlaybackThread::processVolume_l() NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent_l NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent { float volume = 0; if (!audioserver_flags::portid_volume_management()) { Loading Loading @@ -11449,10 +11458,12 @@ NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent_l } } } const auto amn = mAfThreadCallback->getAudioManagerNative(); for (const sp<IAfMmapTrack>& track : mActiveTracks) { track->setMetadataHasChanged(); if (amn) { if (!audioserver_flags::portid_volume_management()) { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, streamVolume_l() == 0.f, streamMuted_l(), Loading @@ -11463,19 +11474,18 @@ NO_THREAD_SAFETY_ANALYSIS // access of track->processMuteEvent_l false /*muteFromPortVolume*/, shouldMutePlaybackHardening}); } else { track->processMuteEvent_l(mAfThreadCallback->getOrCreateAudioManager(), track->processMuteEvent(*amn, /*muteState=*/{mMasterMute, track->getPortVolume() == 0.f, /* muteFromStreamMuted= */ false, // TODO(b/241533526): adjust logic to include mute from AppOps // TODO(b/241533526): adjust logic to include mute from AppOp false /*muteFromPlaybackRestricted*/, false /*muteFromClientVolume*/, false /*muteFromVolumeShaper*/, track->getPortMute(), shouldMutePlaybackHardening}); } if (const auto iface = mAfThreadCallback->getAudioManagerNative(); iface) { track->maybeLogPlaybackHardening(*iface); track->maybeLogPlaybackHardening(*amn); } } } Loading
services/audioflinger/Tracks.cpp +7 −17 Original line number Diff line number Diff line Loading @@ -3724,10 +3724,7 @@ void AfPlaybackCommon::maybeLogPlaybackHardening(media::IAudioManagerNative& am) } } // must be called with player thread lock held void AfPlaybackCommon::processMuteEvent_l(const sp< IAudioManager>& audioManager, mute_state_t muteState) { void AfPlaybackCommon::processMuteEvent(media::IAudioManagerNative& am, mute_state_t muteState) { const auto trackId = mSelf.id(); const auto portId = mSelf.portId(); if (mMuteState == muteState) { Loading @@ -3735,23 +3732,16 @@ void AfPlaybackCommon::processMuteEvent_l(const sp< return; } status_t result = UNKNOWN_ERROR; if (audioManager && portId != AUDIO_PORT_HANDLE_NONE) { if (mMuteEventExtras == nullptr) { mMuteEventExtras = std::make_unique<os::PersistableBundle>(); } mMuteEventExtras->putInt(String16(kExtraPlayerEventMuteKey), static_cast<int>(muteState)); result = audioManager->portEvent(portId, PLAYER_UPDATE_MUTED, mMuteEventExtras); } if (result == OK) { const auto result = portId != AUDIO_PORT_HANDLE_NONE ? am.portMuteEvent(portId, static_cast<int>(muteState)) : Status::fromExceptionCode(Status::EX_ILLEGAL_STATE); if (result.isOk()) { ALOGI("%s(%d): processed mute state for port ID %d from %#x to %#x", __func__, trackId, portId, static_cast<int>(mMuteState.load()), static_cast<int>(muteState)); mMuteState = muteState; } else { ALOGW("%s(%d): cannot process mute state for port ID %d, status error %d", __func__, trackId, portId, result); ALOGW("%s(%d): cannot process mute state for port ID %d, status error %s", __func__, trackId, portId, result.toString8().c_str()); } } Loading