diff options
| -rw-r--r-- | core/api/current.txt | 1 | ||||
| -rw-r--r-- | media/java/android/media/AudioPlaybackConfiguration.java | 65 | ||||
| -rw-r--r-- | media/java/android/media/AudioTrack.java | 27 | ||||
| -rw-r--r-- | media/java/android/media/HwAudioSource.java | 26 | ||||
| -rwxr-xr-x | media/java/android/media/IAudioService.aidl | 2 | ||||
| -rw-r--r-- | media/java/android/media/MediaPlayer.java | 87 | ||||
| -rw-r--r-- | media/java/android/media/PlayerBase.java | 39 | ||||
| -rw-r--r-- | media/java/android/media/SoundPool.java | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 10 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/PlaybackActivityMonitor.java | 28 |
10 files changed, 243 insertions, 45 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 58fadfde25d3..c2f88d7161c7 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -19907,6 +19907,7 @@ package android.media { public final class AudioPlaybackConfiguration implements android.os.Parcelable { method public int describeContents(); method public android.media.AudioAttributes getAudioAttributes(); + method @Nullable public android.media.AudioDeviceInfo getAudioDevice(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioPlaybackConfiguration> CREATOR; } diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java index 17305a501cd0..b9f449c20677 100644 --- a/media/java/android/media/AudioPlaybackConfiguration.java +++ b/media/java/android/media/AudioPlaybackConfiguration.java @@ -21,6 +21,7 @@ import static android.media.AudioAttributes.ALLOW_CAPTURE_BY_NONE; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.os.Binder; import android.os.IBinder; @@ -47,6 +48,8 @@ public final class AudioPlaybackConfiguration implements Parcelable { public static final int PLAYER_PIID_INVALID = -1; /** @hide */ public static final int PLAYER_UPID_INVALID = -1; + /** @hide */ + public static final int PLAYER_DEVICEID_INVALID = 0; // information about the implementation /** @@ -158,6 +161,11 @@ public final class AudioPlaybackConfiguration implements Parcelable { */ @SystemApi public static final int PLAYER_STATE_STOPPED = 4; + /** + * @hide + * The state used to update device id, does not actually change the state of the player + */ + public static final int PLAYER_UPDATE_DEVICE_ID = 5; /** @hide */ @IntDef({ @@ -166,7 +174,8 @@ public final class AudioPlaybackConfiguration implements Parcelable { PLAYER_STATE_IDLE, PLAYER_STATE_STARTED, PLAYER_STATE_PAUSED, - PLAYER_STATE_STOPPED + PLAYER_STATE_STOPPED, + PLAYER_UPDATE_DEVICE_ID }) @Retention(RetentionPolicy.SOURCE) public @interface PlayerState {} @@ -184,6 +193,8 @@ public final class AudioPlaybackConfiguration implements Parcelable { private int mPlayerState; private AudioAttributes mPlayerAttr; // never null + private int mDeviceId; + /** * Never use without initializing parameters afterwards */ @@ -201,6 +212,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { mPlayerType = pic.mPlayerType; mClientUid = uid; mClientPid = pid; + mDeviceId = PLAYER_DEVICEID_INVALID; mPlayerState = PLAYER_STATE_IDLE; mPlayerAttr = pic.mAttributes; if ((sPlayerDeathMonitor != null) && (pic.mIPlayer != null)) { @@ -241,6 +253,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { in.mPlayerAttr.getAllowedCapturePolicy() == ALLOW_CAPTURE_BY_ALL ? ALLOW_CAPTURE_BY_ALL : ALLOW_CAPTURE_BY_NONE) .build(); + anonymCopy.mDeviceId = in.mDeviceId; // anonymized data anonymCopy.mPlayerType = PLAYER_TYPE_UNKNOWN; anonymCopy.mClientUid = PLAYER_UPID_INVALID; @@ -278,6 +291,25 @@ public final class AudioPlaybackConfiguration implements Parcelable { } /** + * Returns information about the {@link AudioDeviceInfo} used for this playback. + * @return the audio playback device or null if the device is not available at the time of query + */ + public @Nullable AudioDeviceInfo getAudioDevice() { + if (mDeviceId == PLAYER_DEVICEID_INVALID) { + return null; + } + // TODO(175802592): change this to AudioManager.getDeviceForPortId() when available + AudioDeviceInfo[] devices = + AudioManager.getDevicesStatic(AudioManager.GET_DEVICES_OUTPUTS); + for (int i = 0; i < devices.length; i++) { + if (devices[i].getId() == mDeviceId) { + return devices[i]; + } + } + return null; + } + + /** * @hide * Return the type of player linked to this configuration. * <br>Note that player types not exposed in the system API will be represented as @@ -359,13 +391,29 @@ public final class AudioPlaybackConfiguration implements Parcelable { * @hide * Handle a player state change * @param event + * @param deviceId active device id or {@Code PLAYER_DEVICEID_INVALID} + * <br>Note device id is valid for {@code PLAYER_UPDATE_DEVICE_ID} or + * <br>{@code PLAYER_STATE_STARTED} events, as the device id will be reset to none when + * <br>pausing or stopping playback. It will be set to active device when playback starts or + * <br>it will be changed when PLAYER_UPDATE_DEVICE_ID is sent. The latter can happen if the + * <br>device changes in the middle of playback. * @return true if the state changed, false otherwise */ - public boolean handleStateEvent(int event) { - final boolean changed; + public boolean handleStateEvent(int event, int deviceId) { + boolean changed = false; synchronized (this) { - changed = (mPlayerState != event); - mPlayerState = event; + + // Do not update if it is only device id update + if (event != PLAYER_UPDATE_DEVICE_ID) { + changed = (mPlayerState != event); + mPlayerState = event; + } + + if (event == PLAYER_STATE_STARTED || event == PLAYER_UPDATE_DEVICE_ID) { + changed = changed || (mDeviceId != deviceId); + mDeviceId = deviceId; + } + if (changed && (event == PLAYER_STATE_RELEASED) && (mIPlayerShell != null)) { mIPlayerShell.release(); mIPlayerShell = null; @@ -436,7 +484,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { @Override public int hashCode() { - return Objects.hash(mPlayerIId, mPlayerType, mClientUid, mClientPid); + return Objects.hash(mPlayerIId, mDeviceId, mPlayerType, mClientUid, mClientPid); } @Override @@ -447,6 +495,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mPlayerIId); + dest.writeInt(mDeviceId); dest.writeInt(mPlayerType); dest.writeInt(mClientUid); dest.writeInt(mClientPid); @@ -461,6 +510,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { private AudioPlaybackConfiguration(Parcel in) { mPlayerIId = in.readInt(); + mDeviceId = in.readInt(); mPlayerType = in.readInt(); mClientUid = in.readInt(); mClientPid = in.readInt(); @@ -478,6 +528,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { AudioPlaybackConfiguration that = (AudioPlaybackConfiguration) o; return ((mPlayerIId == that.mPlayerIId) + && (mDeviceId == that.mDeviceId) && (mPlayerType == that.mPlayerType) && (mClientUid == that.mClientUid) && (mClientPid == that.mClientPid)); @@ -486,6 +537,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { @Override public String toString() { return "AudioPlaybackConfiguration piid:" + mPlayerIId + + " deviceId:" + mDeviceId + " type:" + toLogFriendlyPlayerType(mPlayerType) + " u/pid:" + mClientUid + "/" + mClientPid + " state:" + toLogFriendlyPlayerState(mPlayerState) @@ -571,6 +623,7 @@ public final class AudioPlaybackConfiguration implements Parcelable { case PLAYER_STATE_STARTED: return "started"; case PLAYER_STATE_PAUSED: return "paused"; case PLAYER_STATE_STOPPED: return "stopped"; + case PLAYER_UPDATE_DEVICE_ID: return "device"; default: return "unknown player state - FIXME"; } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index e3b6fba18eb0..e9a18e982ccc 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -1824,6 +1824,7 @@ public class AudioTrack extends PlayerBase @Override protected void finalize() { + tryToDisableNativeRoutingCallback(); baseRelease(); native_finalize(); } @@ -2717,9 +2718,15 @@ public class AudioTrack extends PlayerBase } private void startImpl() { + synchronized (mRoutingChangeListeners) { + if (!mEnableSelfRoutingMonitor) { + testEnableNativeRoutingCallbacksLocked(); + mEnableSelfRoutingMonitor = true; + } + } synchronized(mPlayStateLock) { - baseStart(); native_start(); + baseStart(native_getRoutedDeviceId()); if (mPlayState == PLAYSTATE_PAUSED_STOPPING) { mPlayState = PLAYSTATE_STOPPING; } else { @@ -2757,6 +2764,7 @@ public class AudioTrack extends PlayerBase mPlayStateLock.notify(); } } + tryToDisableNativeRoutingCallback(); } /** @@ -3496,12 +3504,21 @@ public class AudioTrack extends PlayerBase return null; } + private void tryToDisableNativeRoutingCallback() { + synchronized (mRoutingChangeListeners) { + if (mEnableSelfRoutingMonitor) { + mEnableSelfRoutingMonitor = false; + testDisableNativeRoutingCallbacksLocked(); + } + } + } + /* * Call BEFORE adding a routing callback handler. */ @GuardedBy("mRoutingChangeListeners") private void testEnableNativeRoutingCallbacksLocked() { - if (mRoutingChangeListeners.size() == 0) { + if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) { native_enableDeviceCallback(); } } @@ -3511,7 +3528,7 @@ public class AudioTrack extends PlayerBase */ @GuardedBy("mRoutingChangeListeners") private void testDisableNativeRoutingCallbacksLocked() { - if (mRoutingChangeListeners.size() == 0) { + if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) { native_disableDeviceCallback(); } } @@ -3528,6 +3545,9 @@ public class AudioTrack extends PlayerBase private ArrayMap<AudioRouting.OnRoutingChangedListener, NativeRoutingEventHandlerDelegate> mRoutingChangeListeners = new ArrayMap<>(); + @GuardedBy("mRoutingChangeListeners") + private boolean mEnableSelfRoutingMonitor; + /** * Adds an {@link AudioRouting.OnRoutingChangedListener} to receive notifications of routing * changes on this AudioTrack. @@ -3627,6 +3647,7 @@ public class AudioTrack extends PlayerBase */ private void broadcastRoutingChange() { AudioManager.resetAudioPortGeneration(); + baseUpdateDeviceId(getRoutedDevice()); synchronized (mRoutingChangeListeners) { for (NativeRoutingEventHandlerDelegate delegate : mRoutingChangeListeners.values()) { delegate.notifyClient(); diff --git a/media/java/android/media/HwAudioSource.java b/media/java/android/media/HwAudioSource.java index 01a02f1d9f05..bbf632a406ec 100644 --- a/media/java/android/media/HwAudioSource.java +++ b/media/java/android/media/HwAudioSource.java @@ -22,6 +22,8 @@ import android.annotation.SystemApi; import com.android.internal.util.Preconditions; +import java.util.ArrayList; + /** * The HwAudioSource represents the audio playback directly from a source audio device. * It currently supports {@link HwAudioSource#start()} and {@link HwAudioSource#stop()} only @@ -130,10 +132,32 @@ public class HwAudioSource extends PlayerBase { */ public void start() { Preconditions.checkState(!isPlaying(), "HwAudioSource is currently playing"); - baseStart(); mNativeHandle = AudioSystem.startAudioSource( mAudioDeviceInfo.getPort().activeConfig(), mAudioAttributes); + // FIXME: b/174876389 clean up device id reporting + baseStart(getDeviceId()); + } + + private int getDeviceId() { + ArrayList<AudioPatch> patches = new ArrayList<AudioPatch>(); + if (AudioManager.listAudioPatches(patches) != AudioManager.SUCCESS) { + return 0; + } + + for (int i = 0; i < patches.size(); i++) { + AudioPatch patch = patches.get(i); + AudioPortConfig[] sources = patch.sources(); + AudioPortConfig[] sinks = patch.sinks(); + if ((sources != null) && (sources.length > 0)) { + for (int c = 0; c < sources.length; c++) { + if (sources[c].port().id() == mAudioDeviceInfo.getId()) { + return sinks[c].port().id(); + } + } + } + } + return 0; } /** diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 2ac5b5088d98..ac3287742e87 100755 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -62,7 +62,7 @@ interface IAudioService { oneway void playerAttributes(in int piid, in AudioAttributes attr); - oneway void playerEvent(in int piid, in int event); + oneway void playerEvent(in int piid, in int event, in int deviceId); oneway void releasePlayer(in int piid); diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index f8311cd580a9..ceac2c9d5e05 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1352,7 +1352,6 @@ public class MediaPlayer extends PlayerBase } private void startImpl() { - baseStart(); stayAwake(true); _start(); } @@ -1378,7 +1377,6 @@ public class MediaPlayer extends PlayerBase public void stop() throws IllegalStateException { stayAwake(false); _stop(); - baseStop(); } private native void _stop() throws IllegalStateException; @@ -1392,7 +1390,6 @@ public class MediaPlayer extends PlayerBase public void pause() throws IllegalStateException { stayAwake(false); _pause(); - basePause(); } private native void _pause() throws IllegalStateException; @@ -1497,13 +1494,60 @@ public class MediaPlayer extends PlayerBase return null; } + + /** + * Sends device list change notification to all listeners. + */ + private void broadcastRoutingChange() { + AudioManager.resetAudioPortGeneration(); + synchronized (mRoutingChangeListeners) { + // Prevent the case where an event is triggered by registering a routing change + // listener via the media player. + if (mEnableSelfRoutingMonitor) { + baseUpdateDeviceId(getRoutedDevice()); + } + for (NativeRoutingEventHandlerDelegate delegate + : mRoutingChangeListeners.values()) { + delegate.notifyClient(); + } + } + } + /* - * Call BEFORE adding a routing callback handler or AFTER removing a routing callback handler. + * Call BEFORE adding a routing callback handler. */ @GuardedBy("mRoutingChangeListeners") - private void enableNativeRoutingCallbacksLocked(boolean enabled) { - if (mRoutingChangeListeners.size() == 0) { - native_enableDeviceCallback(enabled); + private void testEnableNativeRoutingCallbacksLocked() { + if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) { + native_enableDeviceCallback(true); + } + } + + private void tryToEnableNativeRoutingCallback() { + synchronized (mRoutingChangeListeners) { + if (!mEnableSelfRoutingMonitor) { + testEnableNativeRoutingCallbacksLocked(); + mEnableSelfRoutingMonitor = true; + } + } + } + + private void tryToDisableNativeRoutingCallback() { + synchronized (mRoutingChangeListeners) { + if (mEnableSelfRoutingMonitor) { + mEnableSelfRoutingMonitor = false; + testDisableNativeRoutingCallbacksLocked(); + } + } + } + + /* + * Call AFTER removing a routing callback handler. + */ + @GuardedBy("mRoutingChangeListeners") + private void testDisableNativeRoutingCallbacksLocked() { + if (mRoutingChangeListeners.size() == 0 && !mEnableSelfRoutingMonitor) { + native_enableDeviceCallback(false); } } @@ -1516,6 +1560,9 @@ public class MediaPlayer extends PlayerBase private ArrayMap<AudioRouting.OnRoutingChangedListener, NativeRoutingEventHandlerDelegate> mRoutingChangeListeners = new ArrayMap<>(); + @GuardedBy("mRoutingChangeListeners") + private boolean mEnableSelfRoutingMonitor; + /** * Adds an {@link AudioRouting.OnRoutingChangedListener} to receive notifications of routing * changes on this MediaPlayer. @@ -1529,7 +1576,7 @@ public class MediaPlayer extends PlayerBase Handler handler) { synchronized (mRoutingChangeListeners) { if (listener != null && !mRoutingChangeListeners.containsKey(listener)) { - enableNativeRoutingCallbacksLocked(true); + testEnableNativeRoutingCallbacksLocked(); mRoutingChangeListeners.put( listener, new NativeRoutingEventHandlerDelegate(this, listener, handler != null ? handler : mEventHandler)); @@ -1548,8 +1595,8 @@ public class MediaPlayer extends PlayerBase synchronized (mRoutingChangeListeners) { if (mRoutingChangeListeners.containsKey(listener)) { mRoutingChangeListeners.remove(listener); - enableNativeRoutingCallbacksLocked(false); } + testDisableNativeRoutingCallbacksLocked(); } } @@ -3301,6 +3348,7 @@ public class MediaPlayer extends PlayerBase @Override protected void finalize() { + tryToDisableNativeRoutingCallback(); baseRelease(); native_finalize(); } @@ -3415,6 +3463,8 @@ public class MediaPlayer extends PlayerBase case MEDIA_STOPPED: { + tryToDisableNativeRoutingCallback(); + baseStop(); TimeProvider timeProvider = mTimeProvider; if (timeProvider != null) { timeProvider.onStopped(); @@ -3423,8 +3473,16 @@ public class MediaPlayer extends PlayerBase break; case MEDIA_STARTED: + { + baseStart(native_getRoutedDeviceId()); + tryToEnableNativeRoutingCallback(); + } + // fall through case MEDIA_PAUSED: { + if (msg.what == MEDIA_PAUSED) { + basePause(); + } TimeProvider timeProvider = mTimeProvider; if (timeProvider != null) { timeProvider.onPaused(msg.what == MEDIA_PAUSED); @@ -3590,14 +3648,8 @@ public class MediaPlayer extends PlayerBase break; case MEDIA_AUDIO_ROUTING_CHANGED: - AudioManager.resetAudioPortGeneration(); - synchronized (mRoutingChangeListeners) { - for (NativeRoutingEventHandlerDelegate delegate - : mRoutingChangeListeners.values()) { - delegate.notifyClient(); - } - } - return; + broadcastRoutingChange(); + return; case MEDIA_TIME_DISCONTINUITY: final OnMediaTimeDiscontinuityListener mediaTimeListener; @@ -3803,6 +3855,7 @@ public class MediaPlayer extends PlayerBase @Override public void onCompletion(MediaPlayer mp) { baseStop(); + tryToDisableNativeRoutingCallback(); } }; diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java index da69c6cbbb5c..58ae279d4df1 100644 --- a/media/java/android/media/PlayerBase.java +++ b/media/java/android/media/PlayerBase.java @@ -90,6 +90,8 @@ public abstract class PlayerBase { private float mPanMultiplierR = 1.0f; @GuardedBy("mLock") private float mVolMultiplier = 1.0f; + @GuardedBy("mLock") + private int mDeviceId; /** * Constructor. Must be given audio attributes, as they are required for AppOps. @@ -152,14 +154,35 @@ public abstract class PlayerBase { } } - private void updateState(int state) { + void baseUpdateDeviceId(@Nullable AudioDeviceInfo deviceInfo) { + int deviceId = 0; + if (deviceInfo != null) { + deviceId = deviceInfo.getId(); + } + int piid; + synchronized (mLock) { + piid = mPlayerIId; + mDeviceId = deviceId; + } + try { + getService().playerEvent(piid, + AudioPlaybackConfiguration.PLAYER_UPDATE_DEVICE_ID, deviceId); + } catch (RemoteException e) { + Log.e(TAG, "Error talking to audio service, " + + deviceId + + " device id will not be tracked for piid=" + piid, e); + } + } + + private void updateState(int state, int deviceId) { final int piid; synchronized (mLock) { mState = state; piid = mPlayerIId; + mDeviceId = deviceId; } try { - getService().playerEvent(piid, state); + getService().playerEvent(piid, state, deviceId); } catch (RemoteException e) { Log.e(TAG, "Error talking to audio service, " + AudioPlaybackConfiguration.toLogFriendlyPlayerState(state) @@ -167,9 +190,11 @@ public abstract class PlayerBase { } } - void baseStart() { - if (DEBUG) { Log.v(TAG, "baseStart() piid=" + mPlayerIId); } - updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED); + void baseStart(int deviceId) { + if (DEBUG) { + Log.v(TAG, "baseStart() piid=" + mPlayerIId + " deviceId=" + deviceId); + } + updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED, deviceId); synchronized (mLock) { if (isRestricted_sync()) { playerSetVolume(true/*muting*/,0, 0); @@ -191,12 +216,12 @@ public abstract class PlayerBase { void basePause() { if (DEBUG) { Log.v(TAG, "basePause() piid=" + mPlayerIId); } - updateState(AudioPlaybackConfiguration.PLAYER_STATE_PAUSED); + updateState(AudioPlaybackConfiguration.PLAYER_STATE_PAUSED, 0); } void baseStop() { if (DEBUG) { Log.v(TAG, "baseStop() piid=" + mPlayerIId); } - updateState(AudioPlaybackConfiguration.PLAYER_STATE_STOPPED); + updateState(AudioPlaybackConfiguration.PLAYER_STATE_STOPPED, 0); } void baseSetPan(float pan) { diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java index 3f685a4c934e..797caf36203b 100644 --- a/media/java/android/media/SoundPool.java +++ b/media/java/android/media/SoundPool.java @@ -303,7 +303,8 @@ public class SoundPool extends PlayerBase { */ public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) { - baseStart(); + // FIXME: b/174876164 implement device id for soundpool + baseStart(0); return _play(soundID, leftVolume, rightVolume, priority, loop, rate); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 6bc927a5176f..20064310a23d 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -8777,8 +8777,14 @@ public class AudioService extends IAudioService.Stub mPlaybackMonitor.playerAttributes(piid, attr, Binder.getCallingUid()); } - public void playerEvent(int piid, int event) { - mPlaybackMonitor.playerEvent(piid, event, Binder.getCallingUid()); + /** + * Update player event + * @param piid Player id to update + * @param event The new player event + * @param deviceId The new player device id + */ + public void playerEvent(int piid, int event, int deviceId) { + mPlaybackMonitor.playerEvent(piid, event, deviceId, Binder.getCallingUid()); } public void playerHasOpPlayAudio(int piid, boolean hasOpPlayAudio) { diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index a5778836aa6e..36c67cdbac4b 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -233,15 +233,25 @@ public final class PlaybackActivityMonitor } } - public void playerEvent(int piid, int event, int binderUid) { - if (DEBUG) { Log.v(TAG, String.format("playerEvent(piid=%d, event=%d)", piid, event)); } + /** + * Update player event + * @param piid Player id to update + * @param event The new player event + * @param deviceId The new player device id + * @param binderUid Calling binder uid + */ + public void playerEvent(int piid, int event, int deviceId, int binderUid) { + if (DEBUG) { + Log.v(TAG, String.format("playerEvent(piid=%d, deviceId=%d, event=%d)", + piid, deviceId, event)); + } final boolean change; synchronized(mPlayerLock) { final AudioPlaybackConfiguration apc = mPlayers.get(new Integer(piid)); if (apc == null) { return; } - sEventLogger.log(new PlayerEvent(piid, event)); + sEventLogger.log(new PlayerEvent(piid, event, deviceId)); if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) { for (Integer uidInteger: mBannedUids) { if (checkBanPlayer(apc, uidInteger.intValue())) { @@ -259,7 +269,7 @@ public final class PlaybackActivityMonitor if (checkConfigurationCaller(piid, apc, binderUid)) { //TODO add generation counter to only update to the latest state checkVolumeForPrivilegedAlarm(apc, event); - change = apc.handleStateEvent(event); + change = apc.handleStateEvent(event, deviceId); } else { Log.e(TAG, "Error handling event " + event); change = false; @@ -289,7 +299,8 @@ public final class PlaybackActivityMonitor mPlayers.remove(new Integer(piid)); mDuckingManager.removeReleased(apc); checkVolumeForPrivilegedAlarm(apc, AudioPlaybackConfiguration.PLAYER_STATE_RELEASED); - change = apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED); + change = apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED, + AudioPlaybackConfiguration.PLAYER_DEVICEID_INVALID); } } if (change) { @@ -868,16 +879,19 @@ public final class PlaybackActivityMonitor // only keeping the player interface ID as it uniquely identifies the player in the event final int mPlayerIId; final int mState; + final int mDeviceId; - PlayerEvent(int piid, int state) { + PlayerEvent(int piid, int state, int deviceId) { mPlayerIId = piid; mState = state; + mDeviceId = deviceId; } @Override public String eventToString() { return new StringBuilder("player piid:").append(mPlayerIId).append(" state:") - .append(AudioPlaybackConfiguration.toLogFriendlyPlayerState(mState)).toString(); + .append(AudioPlaybackConfiguration.toLogFriendlyPlayerState(mState)) + .append(" DeviceId:").append(mDeviceId).toString(); } } |