diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2013-01-02 12:22:50 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-01-02 12:22:50 -0800 |
commit | 0f617ba82cab1d9d13a9e2a5abbebd955d32d222 (patch) | |
tree | b12e7ce3c8175f53eae4244fe201ad5d72e2836c /media | |
parent | 1bb23b6cd5653b8769ce3bab7df92a3d143e382a (diff) | |
parent | 84aa61e2a838fdeb7484ffaf95945a205bccb453 (diff) | |
download | frameworks_base-0f617ba82cab1d9d13a9e2a5abbebd955d32d222.zip frameworks_base-0f617ba82cab1d9d13a9e2a5abbebd955d32d222.tar.gz frameworks_base-0f617ba82cab1d9d13a9e2a5abbebd955d32d222.tar.bz2 |
am 84aa61e2: Optimize remote control stack traversal order
* commit '84aa61e2a838fdeb7484ffaf95945a205bccb453':
Optimize remote control stack traversal order
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/AudioService.java | 139 |
1 files changed, 75 insertions, 64 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 39477fe..1c8c7cc 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -5579,60 +5579,66 @@ public class AudioService extends IAudioService.Stub implements OnFinished { if(DEBUG_RC) Log.d(TAG, "onNewPlaybackInfoForRcc(id=" + rccId + ", what=" + key + ",val=" + value + ")"); synchronized(mRCStack) { - Iterator<RemoteControlStackEntry> stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if (rcse.mRccId == rccId) { - switch (key) { - case RemoteControlClient.PLAYBACKINFO_PLAYBACK_TYPE: - rcse.mPlaybackType = value; - postReevaluateRemote(); - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME: - rcse.mPlaybackVolume = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolume = value; - mVolumePanel.postHasNewRemotePlaybackInfo(); + // iterating from top of stack as playback information changes are more likely + // on entries at the top of the remote control stack + try { + for (int index = mRCStack.size()-1; index >= 0; index--) { + final RemoteControlStackEntry rcse = mRCStack.elementAt(index); + if (rcse.mRccId == rccId) { + switch (key) { + case RemoteControlClient.PLAYBACKINFO_PLAYBACK_TYPE: + rcse.mPlaybackType = value; + postReevaluateRemote(); + break; + case RemoteControlClient.PLAYBACKINFO_VOLUME: + rcse.mPlaybackVolume = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemote.mVolume = value; + mVolumePanel.postHasNewRemotePlaybackInfo(); + } } - } - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME_MAX: - rcse.mPlaybackVolumeMax = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolumeMax = value; - mVolumePanel.postHasNewRemotePlaybackInfo(); + break; + case RemoteControlClient.PLAYBACKINFO_VOLUME_MAX: + rcse.mPlaybackVolumeMax = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemote.mVolumeMax = value; + mVolumePanel.postHasNewRemotePlaybackInfo(); + } } - } - break; - case RemoteControlClient.PLAYBACKINFO_VOLUME_HANDLING: - rcse.mPlaybackVolumeHandling = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemote.mVolumeHandling = value; - mVolumePanel.postHasNewRemotePlaybackInfo(); + break; + case RemoteControlClient.PLAYBACKINFO_VOLUME_HANDLING: + rcse.mPlaybackVolumeHandling = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemote.mVolumeHandling = value; + mVolumePanel.postHasNewRemotePlaybackInfo(); + } } - } - break; - case RemoteControlClient.PLAYBACKINFO_USES_STREAM: - rcse.mPlaybackStream = value; - break; - case RemoteControlClient.PLAYBACKINFO_PLAYSTATE: - rcse.mPlaybackState = value; - synchronized (mMainRemote) { - if (rccId == mMainRemote.mRccId) { - mMainRemoteIsActive = isPlaystateActive(value); - postReevaluateRemote(); + break; + case RemoteControlClient.PLAYBACKINFO_USES_STREAM: + rcse.mPlaybackStream = value; + break; + case RemoteControlClient.PLAYBACKINFO_PLAYSTATE: + rcse.mPlaybackState = value; + synchronized (mMainRemote) { + if (rccId == mMainRemote.mRccId) { + mMainRemoteIsActive = isPlaystateActive(value); + postReevaluateRemote(); + } } - } - break; - default: - Log.e(TAG, "unhandled key " + key + " for RCC " + rccId); - break; + break; + default: + Log.e(TAG, "unhandled key " + key + " for RCC " + rccId); + break; + } + return; } - return; - } + }//for + } catch (ArrayIndexOutOfBoundsException e) { + // not expected to happen, indicates improper concurrent modification + Log.e(TAG, "Wrong index accessing RC stack, lock error? ", e); } } } @@ -5669,23 +5675,28 @@ public class AudioService extends IAudioService.Stub implements OnFinished { */ private boolean checkUpdateRemoteStateIfActive(int streamType) { synchronized(mRCStack) { - Iterator<RemoteControlStackEntry> stackIterator = mRCStack.iterator(); - while(stackIterator.hasNext()) { - RemoteControlStackEntry rcse = stackIterator.next(); - if ((rcse.mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) - && isPlaystateActive(rcse.mPlaybackState) - && (rcse.mPlaybackStream == streamType)) { - if (DEBUG_RC) Log.d(TAG, "remote playback active on stream " + streamType - + ", vol =" + rcse.mPlaybackVolume); - synchronized (mMainRemote) { - mMainRemote.mRccId = rcse.mRccId; - mMainRemote.mVolume = rcse.mPlaybackVolume; - mMainRemote.mVolumeMax = rcse.mPlaybackVolumeMax; - mMainRemote.mVolumeHandling = rcse.mPlaybackVolumeHandling; - mMainRemoteIsActive = true; + // iterating from top of stack as active playback is more likely on entries at the top + try { + for (int index = mRCStack.size()-1; index >= 0; index--) { + final RemoteControlStackEntry rcse = mRCStack.elementAt(index); + if ((rcse.mPlaybackType == RemoteControlClient.PLAYBACK_TYPE_REMOTE) + && isPlaystateActive(rcse.mPlaybackState) + && (rcse.mPlaybackStream == streamType)) { + if (DEBUG_RC) Log.d(TAG, "remote playback active on stream " + streamType + + ", vol =" + rcse.mPlaybackVolume); + synchronized (mMainRemote) { + mMainRemote.mRccId = rcse.mRccId; + mMainRemote.mVolume = rcse.mPlaybackVolume; + mMainRemote.mVolumeMax = rcse.mPlaybackVolumeMax; + mMainRemote.mVolumeHandling = rcse.mPlaybackVolumeHandling; + mMainRemoteIsActive = true; + } + return true; } - return true; } + } catch (ArrayIndexOutOfBoundsException e) { + // not expected to happen, indicates improper concurrent modification + Log.e(TAG, "Wrong index accessing RC stack, lock error? ", e); } } synchronized (mMainRemote) { |