diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 3c1f2d42707a6..0bc20a2e65783 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -2546,13 +2546,15 @@ public class AudioService extends IAudioService.Stub } } int status = AudioSystem.AUDIO_STATUS_OK; + int actualMode; do { + actualMode = mode; if (mode == AudioSystem.MODE_NORMAL) { // get new mode from client at top the list if any if (!mSetModeDeathHandlers.isEmpty()) { hdlr = mSetModeDeathHandlers.get(0); cb = hdlr.getBinder(); - mode = hdlr.getMode(); + actualMode = hdlr.getMode(); if (DEBUG_MODE) { Log.w(TAG, " using mode=" + mode + " instead due to death hdlr at pid=" + hdlr.mPid); @@ -2576,12 +2578,11 @@ public class AudioService extends IAudioService.Stub hdlr.setMode(mode); } - if (mode != mMode) { - status = AudioSystem.setPhoneState(mode); + if (actualMode != mMode) { + status = AudioSystem.setPhoneState(actualMode); if (status == AudioSystem.AUDIO_STATUS_OK) { - if (DEBUG_MODE) { Log.v(TAG, " mode successfully set to " + mode); } - mMode = mode; - mModeLogger.log(new PhoneStateEvent(caller, pid, mode)); + if (DEBUG_MODE) { Log.v(TAG, " mode successfully set to " + actualMode); } + mMode = actualMode; } else { if (hdlr != null) { mSetModeDeathHandlers.remove(hdlr); @@ -2597,13 +2598,16 @@ public class AudioService extends IAudioService.Stub } while (status != AudioSystem.AUDIO_STATUS_OK && !mSetModeDeathHandlers.isEmpty()); if (status == AudioSystem.AUDIO_STATUS_OK) { - if (mode != AudioSystem.MODE_NORMAL) { + if (actualMode != AudioSystem.MODE_NORMAL) { if (mSetModeDeathHandlers.isEmpty()) { Log.e(TAG, "setMode() different from MODE_NORMAL with empty mode client stack"); } else { newModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); } } + // Note: newModeOwnerPid is always 0 when actualMode is MODE_NORMAL + mModeLogger.log( + new PhoneStateEvent(caller, pid, mode, newModeOwnerPid, actualMode)); int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE); int device = getDeviceForStream(streamType); int index = mStreamStates[mStreamVolumeAlias[streamType]].getIndex(device); diff --git a/services/core/java/com/android/server/audio/AudioServiceEvents.java b/services/core/java/com/android/server/audio/AudioServiceEvents.java index 634c8c27a3ccb..9d9e35bdf2b22 100644 --- a/services/core/java/com/android/server/audio/AudioServiceEvents.java +++ b/services/core/java/com/android/server/audio/AudioServiceEvents.java @@ -26,20 +26,27 @@ public class AudioServiceEvents { final static class PhoneStateEvent extends AudioEventLogger.Event { final String mPackage; - final int mPid; - final int mMode; + final int mOwnerPid; + final int mRequesterPid; + final int mRequestedMode; + final int mActualMode; - PhoneStateEvent(String callingPackage, int pid, int mode) { + PhoneStateEvent(String callingPackage, int requesterPid, int requestedMode, + int ownerPid, int actualMode) { mPackage = callingPackage; - mPid = pid; - mMode = mode; + mRequesterPid = requesterPid; + mRequestedMode = requestedMode; + mOwnerPid = ownerPid; + mActualMode = actualMode; } @Override public String eventToString() { - return new StringBuilder("setMode(").append(AudioSystem.modeToString(mMode)) + return new StringBuilder("setMode(").append(AudioSystem.modeToString(mRequestedMode)) .append(") from package=").append(mPackage) - .append(" pid=").append(mPid).toString(); + .append(" pid=").append(mRequesterPid) + .append(" selected mode=").append(AudioSystem.modeToString(mActualMode)) + .append(" by pid=").append(mOwnerPid).toString(); } }