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

Commit 98abea7c authored by Raj Goparaju's avatar Raj Goparaju Committed by Android (Google) Code Review
Browse files

Merge changes from topic "feature_audioCrossover" into main

* changes:
  Update fade event logging to clarify the event type
  Ensure smoother transitions during fade in
parents 2b816bda 2c799a10
Loading
Loading
Loading
Loading
+41 −10
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.util.Slog;
import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.server.utils.EventLogger;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -345,7 +346,8 @@ public final class FadeOutManager {
            }
            if (apc.getPlayerProxy() != null) {
                applyVolumeShaperInternal(apc, piid, volShaper,
                        skipRamp ? PLAY_SKIP_RAMP : PLAY_CREATE_IF_NEEDED);
                        skipRamp ? PLAY_SKIP_RAMP : PLAY_CREATE_IF_NEEDED, skipRamp,
                        PlaybackActivityMonitor.EVENT_TYPE_FADE_OUT);
                mFadedPlayers.put(piid, volShaper);
            } else {
                if (DEBUG) {
@@ -361,7 +363,8 @@ public final class FadeOutManager {
                final AudioPlaybackConfiguration apc = players.get(piid);
                if ((apc != null) && (apc.getPlayerProxy() != null)) {
                    applyVolumeShaperInternal(apc, piid, /* volShaperConfig= */ null,
                            VolumeShaper.Operation.REVERSE);
                            VolumeShaper.Operation.REVERSE, /* skipRamp= */ false,
                            PlaybackActivityMonitor.EVENT_TYPE_FADE_IN);
                } else {
                    // this piid was in the list of faded players, but wasn't found
                    if (DEBUG) {
@@ -373,6 +376,7 @@ public final class FadeOutManager {
            mFadedPlayers.clear();
        }

        @GuardedBy("mLock")
        void fadeInPlayer(@NonNull AudioPlaybackConfiguration apc,
                @Nullable VolumeShaper.Configuration config) {
            int piid = Integer.valueOf(apc.getPlayerInterfaceId());
@@ -385,10 +389,17 @@ public final class FadeOutManager {
                return;
            }

            VolumeShaper.Operation operation = VolumeShaper.Operation.REVERSE;
            if (config != null) {
                // replace and join the volumeshapers with (possibly) in progress fade out operation
                // for a smoother fade in
                operation = new VolumeShaper.Operation.Builder()
                        .replace(mFadedPlayers.get(piid).getId(), /* join= */ true).build();
            }
            mFadedPlayers.remove(piid);
            if (apc.getPlayerProxy() != null) {
                applyVolumeShaperInternal(apc, piid, config,
                        config != null ? PLAY_CREATE_IF_NEEDED : VolumeShaper.Operation.REVERSE);
                applyVolumeShaperInternal(apc, piid, config, operation, /* skipRamp= */ false,
                        PlaybackActivityMonitor.EVENT_TYPE_FADE_IN);
            } else {
                if (DEBUG) {
                    Slog.v(TAG, "Error fading in player piid:" + piid
@@ -397,6 +408,7 @@ public final class FadeOutManager {
            }
        }

        @GuardedBy("mLock")
        void clear() {
            if (mFadedPlayers.size() > 0) {
                if (DEBUG) {
@@ -413,21 +425,40 @@ public final class FadeOutManager {
        }

        private void applyVolumeShaperInternal(AudioPlaybackConfiguration apc, int piid,
                VolumeShaper.Configuration volShaperConfig, VolumeShaper.Operation operation) {
                VolumeShaper.Configuration volShaperConfig, VolumeShaper.Operation operation,
                boolean skipRamp, String eventType) {
            VolumeShaper.Configuration config = volShaperConfig;
            // when operation is reverse, use the fade out volume shaper config instead
            if (operation.equals(VolumeShaper.Operation.REVERSE)) {
                config = mFadedPlayers.get(piid);
            }
            try {
                PlaybackActivityMonitor.sEventLogger.enqueue(
                        (new PlaybackActivityMonitor.FadeEvent(apc, config, operation))
                                .printLog(TAG));
                logFadeEvent(apc, piid, volShaperConfig, operation, skipRamp, eventType);
                apc.getPlayerProxy().applyVolumeShaper(config, operation);
            } catch (Exception e) {
                Slog.e(TAG, "Error fading player piid:" + piid + " uid:" + mUid
                        + " operation:" + operation, e);
                Slog.e(TAG, "Error " + eventType + " piid:" + piid + " uid:" + mUid, e);
            }
        }

        private void logFadeEvent(AudioPlaybackConfiguration apc, int piid,
                VolumeShaper.Configuration config, VolumeShaper.Operation operation,
                boolean skipRamp, String eventType) {
            if (eventType.equals(PlaybackActivityMonitor.EVENT_TYPE_FADE_OUT)) {
                PlaybackActivityMonitor.sEventLogger.enqueue(
                        (new PlaybackActivityMonitor.FadeOutEvent(apc, skipRamp, config, operation))
                                .printLog(TAG));
                return;
            }

            if (eventType.equals(PlaybackActivityMonitor.EVENT_TYPE_FADE_IN)) {
                PlaybackActivityMonitor.sEventLogger.enqueue(
                        (new PlaybackActivityMonitor.FadeInEvent(apc, skipRamp, config, operation))
                                .printLog(TAG));
                return;
            }

            PlaybackActivityMonitor.sEventLogger.enqueue(
                    (new EventLogger.StringEvent(eventType + " piid:" + piid)).printLog(TAG));
        }
    }
}
+45 −44
Original line number Diff line number Diff line
@@ -84,6 +84,8 @@ public final class PlaybackActivityMonitor
    /*package*/ static final int VOLUME_SHAPER_SYSTEM_FADEOUT_ID = 2;
    /*package*/ static final int VOLUME_SHAPER_SYSTEM_MUTE_AWAIT_CONNECTION_ID = 3;
    /*package*/ static final int VOLUME_SHAPER_SYSTEM_STRONG_DUCK_ID = 4;
    /*package*/ static final String EVENT_TYPE_FADE_OUT = "fading out";
    /*package*/ static final String EVENT_TYPE_FADE_IN = "fading in";

    // ducking settings for a "normal duck" at -14dB
    private static final VolumeShaper.Configuration DUCK_VSHAPE =
@@ -1204,11 +1206,13 @@ public final class PlaybackActivityMonitor
                    return;
                }
                try {
                    sEventLogger.enqueue((new DuckEvent(apc, skipRamp, mUseStrongDuck))
                            .printLog(TAG));
                    apc.getPlayerProxy().applyVolumeShaper(
                            mUseStrongDuck ? STRONG_DUCK_VSHAPE : DUCK_VSHAPE,
                            skipRamp ? PLAY_SKIP_RAMP : PLAY_CREATE_IF_NEEDED);
                    VolumeShaper.Configuration config =
                            mUseStrongDuck ? STRONG_DUCK_VSHAPE : DUCK_VSHAPE;
                    VolumeShaper.Operation operation =
                            skipRamp ? PLAY_SKIP_RAMP : PLAY_CREATE_IF_NEEDED;
                    sEventLogger.enqueue((new DuckEvent(apc, skipRamp, mUseStrongDuck, config,
                            operation)).printLog(TAG));
                    apc.getPlayerProxy().applyVolumeShaper(config, operation);
                    mDuckedPlayers.add(piid);
                } catch (Exception e) {
                    Log.e(TAG, "Error ducking player piid:" + piid + " uid:" + mUid, e);
@@ -1363,58 +1367,41 @@ public final class PlaybackActivityMonitor
        }
    }

    static final class FadeEvent extends EventLogger.Event {
    private abstract static class VolumeShaperEvent extends EventLogger.Event {
        private final int mPlayerIId;
        private final int mPlayerType;
        private final boolean mSkipRamp;
        private final int mClientUid;
        private final int mClientPid;
        private final int mPlayerType;
        private final AudioAttributes mPlayerAttr;
        private final VolumeShaper.Configuration mVShaper;
        private final VolumeShaper.Operation mVOperation;
        private final VolumeShaper.Configuration mConfig;
        private final VolumeShaper.Operation mOperation;

        FadeEvent(AudioPlaybackConfiguration apc, VolumeShaper.Configuration vShaper,
                VolumeShaper.Operation vOperation) {
        abstract String getVSAction();

        VolumeShaperEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp,
                VolumeShaper.Configuration config, VolumeShaper.Operation operation) {
            mPlayerIId = apc.getPlayerInterfaceId();
            mSkipRamp = skipRamp;
            mClientUid = apc.getClientUid();
            mClientPid = apc.getClientPid();
            mPlayerAttr = apc.getAudioAttributes();
            mPlayerType = apc.getPlayerType();
            mVShaper = vShaper;
            mVOperation = vOperation;
            mConfig = config;
            mOperation = operation;
        }

        @Override
        public String eventToString() {
            return "Fade Event:" + " player piid:" + mPlayerIId
            return getVSAction()
                    + " player piid:" + mPlayerIId
                    + " uid/pid:" + mClientUid + "/" + mClientPid
                    + " skip ramp:" + mSkipRamp
                    + " player type:"
                    + AudioPlaybackConfiguration.toLogFriendlyPlayerType(mPlayerType)
                    + " attr:" + mPlayerAttr
                    + " volume shaper:" + mVShaper
                    + " volume operation:" + mVOperation;
        }
    }

    private abstract static class VolumeShaperEvent extends EventLogger.Event {
        private final int mPlayerIId;
        private final boolean mSkipRamp;
        private final int mClientUid;
        private final int mClientPid;

        abstract String getVSAction();

        VolumeShaperEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp) {
            mPlayerIId = apc.getPlayerInterfaceId();
            mSkipRamp = skipRamp;
            mClientUid = apc.getClientUid();
            mClientPid = apc.getClientPid();
        }

        @Override
        public String eventToString() {
            return new StringBuilder(getVSAction()).append(" player piid:").append(mPlayerIId)
                    .append(" uid/pid:").append(mClientUid).append("/").append(mClientPid)
                    .append(" skip ramp:").append(mSkipRamp).toString();
                    + " config:" + mConfig
                    + " operation:" + mOperation;
        }
    }

@@ -1426,9 +1413,10 @@ public final class PlaybackActivityMonitor
            return mUseStrongDuck ? "ducking (strong)" : "ducking";
        }

        DuckEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp, boolean useStrongDuck)
        DuckEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp, boolean useStrongDuck,
                VolumeShaper.Configuration config, VolumeShaper.Operation operation)
        {
            super(apc, skipRamp);
            super(apc, skipRamp, config, operation);
            mUseStrongDuck = useStrongDuck;
        }
    }
@@ -1436,11 +1424,24 @@ public final class PlaybackActivityMonitor
    static final class FadeOutEvent extends VolumeShaperEvent {
        @Override
        String getVSAction() {
            return "fading out";
            return EVENT_TYPE_FADE_OUT;
        }

        FadeOutEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp,
                VolumeShaper.Configuration config, VolumeShaper.Operation operation) {
            super(apc, skipRamp, config, operation);
        }
    }

    static final class FadeInEvent extends VolumeShaperEvent {
        @Override
        String getVSAction() {
            return EVENT_TYPE_FADE_IN;
        }

        FadeOutEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp) {
            super(apc, skipRamp);
        FadeInEvent(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp,
                VolumeShaper.Configuration config, VolumeShaper.Operation operation) {
            super(apc, skipRamp, config, operation);
        }
    }