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

Commit e2f5aef5 authored by Vlad Popa's avatar Vlad Popa
Browse files

Report client volume mute events

The audio server now reports the client volume mute/unmute events that are read from the audio track proxy object.

Test: dumpsys audio
Bug: 235521198
Change-Id: I04b1e7a99b33156310b9a8fc2c88ca54a2ff3290
parent bf620125
Loading
Loading
Loading
Loading
+31 −19
Original line number Diff line number Diff line
@@ -5376,12 +5376,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
                    volume = masterVolume * mStreamTypes[track->streamType()].volume;
                }

                track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(),
                    /*muteState=*/{masterVolume == 0.f,
                                   mStreamTypes[track->streamType()].volume == 0.f,
                                   mStreamTypes[track->streamType()].mute,
                                   track->isPlaybackRestricted()});

                handleVoipVolume_l(&volume);

                // cache the combined master volume and stream type volume for fast mixer; this
@@ -5391,8 +5385,18 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
                volume *= vh;
                track->mCachedVolume = volume;
                gain_minifloat_packed_t vlr = proxy->getVolumeLR();
                float vlf = volume * float_from_gain(gain_minifloat_unpack_left(vlr));
                float vrf = volume * float_from_gain(gain_minifloat_unpack_right(vlr));
                float vlf = float_from_gain(gain_minifloat_unpack_left(vlr));
                float vrf = float_from_gain(gain_minifloat_unpack_right(vlr));

                track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(),
                    /*muteState=*/{masterVolume == 0.f,
                                   mStreamTypes[track->streamType()].volume == 0.f,
                                   mStreamTypes[track->streamType()].mute,
                                   track->isPlaybackRestricted(),
                                   vlf == 0.f && vrf == 0.f});

                vlf *= volume;
                vrf *= volume;

                track->setFinalVolume((vlf + vrf) / 2.f);
                ++fastTracks;
@@ -5546,12 +5550,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
                v = 0;
            }

            track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(),
                /*muteState=*/{masterVolume == 0.f,
                               mStreamTypes[track->streamType()].volume == 0.f,
                               mStreamTypes[track->streamType()].mute,
                               track->isPlaybackRestricted()});

            handleVoipVolume_l(&v);

            if (track->isPausing()) {
@@ -5571,6 +5569,14 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac
                    ALOGV("Track right volume out of range: %.3g", vrf);
                    vrf = GAIN_FLOAT_UNITY;
                }

                track->processMuteEvent_l(mAudioFlinger->getOrCreateAudioManager(),
                    /*muteState=*/{masterVolume == 0.f,
                                   mStreamTypes[track->streamType()].volume == 0.f,
                                   mStreamTypes[track->streamType()].mute,
                                   track->isPlaybackRestricted(),
                                   vlf == 0.f && vrf == 0.f});

                // now apply the master volume and stream type volume and shaper volume
                vlf *= v * vh;
                vrf *= v * vh;
@@ -6157,28 +6163,33 @@ void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTr
{
    float left, right;


    // Ensure volumeshaper state always advances even when muted.
    const sp<AudioTrackServerProxy> proxy = track->mAudioTrackServerProxy;
    const auto [shaperVolume, shaperActive] = track->getVolumeHandler()->getVolume(
            proxy->framesReleased());
    mVolumeShaperActive = shaperActive;

    gain_minifloat_packed_t vlr = proxy->getVolumeLR();
    left = float_from_gain(gain_minifloat_unpack_left(vlr));
    right = float_from_gain(gain_minifloat_unpack_right(vlr));

    const bool clientVolumeMute = (left == 0.f && right == 0.f);

    if (mMasterMute || mStreamTypes[track->streamType()].mute || track->isPlaybackRestricted()) {
        left = right = 0;
    } else {
        float typeVolume = mStreamTypes[track->streamType()].volume;
        const float v = mMasterVolume * typeVolume * shaperVolume;

        gain_minifloat_packed_t vlr = proxy->getVolumeLR();
        left = float_from_gain(gain_minifloat_unpack_left(vlr));
        if (left > GAIN_FLOAT_UNITY) {
            left = GAIN_FLOAT_UNITY;
        }
        left *= v * mMasterBalanceLeft; // DirectOutputThread balance applied as track volume
        right = float_from_gain(gain_minifloat_unpack_right(vlr));
        if (right > GAIN_FLOAT_UNITY) {
            right = GAIN_FLOAT_UNITY;
        }

        left *= v * mMasterBalanceLeft; // DirectOutputThread balance applied as track volume
        right *= v * mMasterBalanceRight;
    }

@@ -6186,7 +6197,8 @@ void AudioFlinger::DirectOutputThread::processVolume_l(Track *track, bool lastTr
        /*muteState=*/{mMasterMute,
                       mStreamTypes[track->streamType()].volume == 0.f,
                       mStreamTypes[track->streamType()].mute,
                       track->isPlaybackRestricted()});
                       track->isPlaybackRestricted(),
                       clientVolumeMute});

    if (lastTrack) {
        track->setFinalVolume((left + right) / 2.f);