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

Commit 74a5596a authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

AudioService: log ducking and incall muting of audio players

Event logger: add support for logging the text of the event in
  the logcat at the same time to avoid having the duplicate the
  logcat entry and the logger event. See printLog() method.
AudioPlaybackMonitor: log ducking and incall muting.

Test: play media and notification, verify logs appear in logcat and dumpsys audio
Bug:65363602
Change-Id: I2af0c2bbd2fde428f07761ca45e7950a16843604
parent 683064f6
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.audio;

import android.util.Log;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -46,6 +48,22 @@ public class AudioEventLogger {
                    .append(" ").append(eventToString()).toString();
        }

        /**
         * Causes the string message for the event to appear in the verbose logcat.
         * Here is an example of how to create a new event (a StringEvent), adding it to the logger
         * (an instance of AudioEventLogger) while also making it show in the verbose logcat:
         * <pre>
         *     myLogger.log(
         *         (new StringEvent("something for logcat and logger")).printLog(MyClass.TAG) );
         * </pre>
         * @param tag the tag for the android.util.Log.v
         * @return the same instance of the event
         */
        public Event printLog(String tag) {
            Log.v(tag, eventToString());
            return this;
        }

        /**
         * Convert event to String.
         * This method is only called when the logger history is about to the dumped,
+39 −16
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ public final class PlaybackActivityMonitor
            if (index >= 0) {
                if (!disable) {
                    if (DEBUG) { // hidden behind DEBUG, too noisy otherwise
                        mEventLogger.log(new AudioEventLogger.StringEvent("unbanning uid:" + uid));
                        sEventLogger.log(new AudioEventLogger.StringEvent("unbanning uid:" + uid));
                    }
                    mBannedUids.remove(index);
                    // nothing else to do, future playback requests from this uid are ok
@@ -116,7 +116,7 @@ public final class PlaybackActivityMonitor
                        checkBanPlayer(apc, uid);
                    }
                    if (DEBUG) { // hidden behind DEBUG, too noisy otherwise
                        mEventLogger.log(new AudioEventLogger.StringEvent("banning uid:" + uid));
                        sEventLogger.log(new AudioEventLogger.StringEvent("banning uid:" + uid));
                    }
                    mBannedUids.add(new Integer(uid));
                } // no else to handle, uid already not in list, so enabling again is no-op
@@ -151,7 +151,7 @@ public final class PlaybackActivityMonitor
                new AudioPlaybackConfiguration(pic, newPiid,
                        Binder.getCallingUid(), Binder.getCallingPid());
        apc.init();
        mEventLogger.log(new NewPlayerEvent(apc));
        sEventLogger.log(new NewPlayerEvent(apc));
        synchronized(mPlayerLock) {
            mPlayers.put(newPiid, apc);
        }
@@ -163,7 +163,7 @@ public final class PlaybackActivityMonitor
        synchronized(mPlayerLock) {
            final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
            if (checkConfigurationCaller(piid, apc, binderUid)) {
                mEventLogger.log(new AudioAttrEvent(piid, attr));
                sEventLogger.log(new AudioAttrEvent(piid, attr));
                change = apc.handleAudioAttributesEvent(attr);
            } else {
                Log.e(TAG, "Error updating audio attributes");
@@ -183,12 +183,12 @@ public final class PlaybackActivityMonitor
            if (apc == null) {
                return;
            }
            mEventLogger.log(new PlayerEvent(piid, event));
            sEventLogger.log(new PlayerEvent(piid, event));
            if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) {
                for (Integer uidInteger: mBannedUids) {
                    if (checkBanPlayer(apc, uidInteger.intValue())) {
                        // player was banned, do not update its state
                        mEventLogger.log(new AudioEventLogger.StringEvent(
                        sEventLogger.log(new AudioEventLogger.StringEvent(
                                "not starting piid:" + piid + " ,is banned"));
                        return;
                    }
@@ -216,7 +216,7 @@ public final class PlaybackActivityMonitor

    public void playerHasOpPlayAudio(int piid, boolean hasOpPlayAudio, int binderUid) {
        // no check on UID yet because this is only for logging at the moment
        mEventLogger.log(new PlayerOpPlayAudioEvent(piid, hasOpPlayAudio, binderUid));
        sEventLogger.log(new PlayerOpPlayAudioEvent(piid, hasOpPlayAudio, binderUid));
    }

    public void releasePlayer(int piid, int binderUid) {
@@ -224,7 +224,7 @@ public final class PlaybackActivityMonitor
        synchronized(mPlayerLock) {
            final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid));
            if (checkConfigurationCaller(piid, apc, binderUid)) {
                mEventLogger.log(new AudioEventLogger.StringEvent(
                sEventLogger.log(new AudioEventLogger.StringEvent(
                        "releasing player piid:" + piid));
                mPlayers.remove(new Integer(piid));
                mDuckingManager.removeReleased(apc);
@@ -278,7 +278,7 @@ public final class PlaybackActivityMonitor
            }
            pw.println("\n");
            // log
            mEventLogger.dump(pw);
            sEventLogger.dump(pw);
        }
    }

@@ -456,7 +456,8 @@ public final class PlaybackActivityMonitor
                }
                if (mute) {
                    try {
                        Log.v(TAG, "call: muting player" + piid + " uid:" + apc.getClientUid());
                        sEventLogger.log((new AudioEventLogger.StringEvent("call: muting piid:"
                                + piid + " uid:" + apc.getClientUid())).printLog(TAG));
                        apc.getPlayerProxy().setVolume(0.0f);
                        mMutedPlayers.add(new Integer(piid));
                    } catch (Exception e) {
@@ -480,7 +481,8 @@ public final class PlaybackActivityMonitor
                final AudioPlaybackConfiguration apc = mPlayers.get(piid);
                if (apc != null) {
                    try {
                        Log.v(TAG, "call: unmuting player" + piid + " uid:" + apc.getClientUid());
                        sEventLogger.log(new AudioEventLogger.StringEvent("call: unmuting piid:"
                                + piid).printLog(TAG));
                        apc.getPlayerProxy().setVolume(1.0f);
                    } catch (Exception e) {
                        Log.e(TAG, "call: error unmuting player " + piid + " uid:"
@@ -669,8 +671,7 @@ public final class PlaybackActivityMonitor
                    return;
                }
                try {
                    Log.v(TAG, "ducking (skipRamp=" + skipRamp + ") player piid:"
                            + apc.getPlayerInterfaceId() + " uid:" + mUid);
                    sEventLogger.log((new DuckEvent(apc, skipRamp)).printLog(TAG));
                    apc.getPlayerProxy().applyVolumeShaper(
                            DUCK_VSHAPE,
                            skipRamp ? PLAY_SKIP_RAMP : PLAY_CREATE_IF_NEEDED);
@@ -685,7 +686,8 @@ public final class PlaybackActivityMonitor
                    final AudioPlaybackConfiguration apc = players.get(piid);
                    if (apc != null) {
                        try {
                            Log.v(TAG, "unducking player " + piid + " uid:" + mUid);
                            sEventLogger.log((new AudioEventLogger.StringEvent("unducking piid:"
                                    + piid)).printLog(TAG));
                            apc.getPlayerProxy().applyVolumeShaper(
                                    DUCK_ID,
                                    VolumeShaper.Operation.REVERSE);
@@ -772,7 +774,28 @@ public final class PlaybackActivityMonitor
        }
    }

    private final static class AudioAttrEvent extends AudioEventLogger.Event {
    private static final class DuckEvent extends AudioEventLogger.Event {
        private final int mPlayerIId;
        private final boolean mSkipRamp;
        private final int mClientUid;
        private final int mClientPid;

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

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

    private static final class AudioAttrEvent extends AudioEventLogger.Event {
        private final int mPlayerIId;
        private final AudioAttributes mPlayerAttr;

@@ -787,6 +810,6 @@ public final class PlaybackActivityMonitor
        }
    }

    private final AudioEventLogger mEventLogger = new AudioEventLogger(100,
    private static final AudioEventLogger sEventLogger = new AudioEventLogger(100,
            "playback activity as reported through PlayerBase");
}