Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f89658e authored by Atneya Nair's avatar Atneya Nair
Browse files

[audio] Migrate port mute notifs away from bundles

Port mute events to AudioService currently utilize a bundle. Migrate to
the new IAudioManagerNative mute specific method which just takes an int
arg.

Test: manual, port mute events visible in dumpsys audio
Flag: EXEMPT mechanical refactoring
Bug: 391720112
Change-Id: I6ad113a2e4e80f74d8fbdde18bb6302b8a44b66b
parent 33400d83
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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);
}
+2 −4
Original line number Diff line number Diff line
@@ -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;

+100 −90
Original line number Diff line number Diff line
@@ -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
@@ -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,
@@ -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,
@@ -5901,6 +5902,7 @@ PlaybackThread::mixer_state MixerThread::prepareTracks_l(
                                           track->getPortMute(),
                                           track->isPlaybackRestrictedControl()});
                    }
                }
                vlf *= volume;
                vrf *= volume;

@@ -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()) {
@@ -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,
@@ -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,
@@ -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;
@@ -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()) {
@@ -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,
@@ -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;
@@ -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,
@@ -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) {
@@ -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()) {
@@ -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(),
@@ -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);
            }
        }
    }
+7 −17
Original line number Diff line number Diff line
@@ -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) {
@@ -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());
    }
}