From 42ed49a625ec08ec0b415923d74fe3c8f29875ff Mon Sep 17 00:00:00 2001 From: linus_lee Date: Thu, 11 Dec 2014 17:35:37 -0800 Subject: Eleven: Fix crash when launching a song from file manager There are some asycnhronous issues with interacting the service This should protect it a bit better and fixes the crash for me Change-Id: Ib50be1ca50badb83e8c206e01362a3971d050c1f --- .../cyanogenmod/eleven/MusicPlaybackService.java | 172 +++++++++++---------- src/com/cyanogenmod/eleven/utils/SrtManager.java | 17 +- 2 files changed, 94 insertions(+), 95 deletions(-) (limited to 'src') diff --git a/src/com/cyanogenmod/eleven/MusicPlaybackService.java b/src/com/cyanogenmod/eleven/MusicPlaybackService.java index b9a8073..77431e8 100644 --- a/src/com/cyanogenmod/eleven/MusicPlaybackService.java +++ b/src/com/cyanogenmod/eleven/MusicPlaybackService.java @@ -1083,7 +1083,7 @@ public class MusicPlaybackService extends Service { return c; } - private void closeCursor() { + private synchronized void closeCursor() { if (mCursor != null) { mCursor.close(); mCursor = null; @@ -2691,89 +2691,92 @@ public class MusicPlaybackService extends Service { return; } - switch (msg.what) { - case FADEDOWN: - mCurrentVolume -= .05f; - if (mCurrentVolume > .2f) { - sendEmptyMessageDelayed(FADEDOWN, 10); - } else { - mCurrentVolume = .2f; - } - service.mPlayer.setVolume(mCurrentVolume); - break; - case FADEUP: - mCurrentVolume += .01f; - if (mCurrentVolume < 1.0f) { - sendEmptyMessageDelayed(FADEUP, 10); - } else { - mCurrentVolume = 1.0f; - } - service.mPlayer.setVolume(mCurrentVolume); - break; - case SERVER_DIED: - if (service.isPlaying()) { - service.gotoNext(true); - } else { - service.openCurrentAndNext(); - } - break; - case TRACK_WENT_TO_NEXT: - service.setAndRecordPlayPos(service.mNextPlayPos); - service.setNextTrack(); - if (service.mCursor != null) { - service.mCursor.close(); - } - service.updateCursor(service.mPlaylist.get(service.mPlayPos).mId); - service.notifyChange(META_CHANGED); - service.updateNotification(); - break; - case TRACK_ENDED: - if (service.mRepeatMode == REPEAT_CURRENT) { - service.seek(0); - service.play(); - } else { - service.gotoNext(false); - } - break; - case LYRICS: - service.mLyrics = (String) msg.obj; - service.notifyChange(NEW_LYRICS); - break; - case RELEASE_WAKELOCK: - service.mWakeLock.release(); - break; - case FOCUSCHANGE: - if (D) Log.d(TAG, "Received audio focus change event " + msg.arg1); - switch (msg.arg1) { - case AudioManager.AUDIOFOCUS_LOSS: - case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: - if (service.isPlaying()) { - service.mPausedByTransientLossOfFocus = - msg.arg1 == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT; - } - service.pause(); - break; - case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: - removeMessages(FADEUP); - sendEmptyMessage(FADEDOWN); - break; - case AudioManager.AUDIOFOCUS_GAIN: - if (!service.isPlaying() - && service.mPausedByTransientLossOfFocus) { - service.mPausedByTransientLossOfFocus = false; - mCurrentVolume = 0f; - service.mPlayer.setVolume(mCurrentVolume); - service.play(); - } else { - removeMessages(FADEDOWN); - sendEmptyMessage(FADEUP); - } - break; - default: - } - break; - default: - break; + synchronized (service) { + switch (msg.what) { + case FADEDOWN: + mCurrentVolume -= .05f; + if (mCurrentVolume > .2f) { + sendEmptyMessageDelayed(FADEDOWN, 10); + } else { + mCurrentVolume = .2f; + } + service.mPlayer.setVolume(mCurrentVolume); + break; + case FADEUP: + mCurrentVolume += .01f; + if (mCurrentVolume < 1.0f) { + sendEmptyMessageDelayed(FADEUP, 10); + } else { + mCurrentVolume = 1.0f; + } + service.mPlayer.setVolume(mCurrentVolume); + break; + case SERVER_DIED: + if (service.isPlaying()) { + service.gotoNext(true); + } else { + service.openCurrentAndNext(); + } + break; + case TRACK_WENT_TO_NEXT: + service.setAndRecordPlayPos(service.mNextPlayPos); + service.setNextTrack(); + if (service.mCursor != null) { + service.mCursor.close(); + service.mCursor = null; + } + service.updateCursor(service.mPlaylist.get(service.mPlayPos).mId); + service.notifyChange(META_CHANGED); + service.updateNotification(); + break; + case TRACK_ENDED: + if (service.mRepeatMode == REPEAT_CURRENT) { + service.seek(0); + service.play(); + } else { + service.gotoNext(false); + } + break; + case LYRICS: + service.mLyrics = (String) msg.obj; + service.notifyChange(NEW_LYRICS); + break; + case RELEASE_WAKELOCK: + service.mWakeLock.release(); + break; + case FOCUSCHANGE: + if (D) Log.d(TAG, "Received audio focus change event " + msg.arg1); + switch (msg.arg1) { + case AudioManager.AUDIOFOCUS_LOSS: + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + if (service.isPlaying()) { + service.mPausedByTransientLossOfFocus = + msg.arg1 == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT; + } + service.pause(); + break; + case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: + removeMessages(FADEUP); + sendEmptyMessage(FADEDOWN); + break; + case AudioManager.AUDIOFOCUS_GAIN: + if (!service.isPlaying() + && service.mPausedByTransientLossOfFocus) { + service.mPausedByTransientLossOfFocus = false; + mCurrentVolume = 0f; + service.mPlayer.setVolume(mCurrentVolume); + service.play(); + } else { + removeMessages(FADEDOWN); + sendEmptyMessage(FADEUP); + } + break; + default: + } + break; + default: + break; + } } } } @@ -3014,7 +3017,6 @@ public class MusicPlaybackService extends Service { * Releases resources associated with this MediaPlayer object. */ public void release() { - stop(); mCurrentMediaPlayer.release(); mSrtManager.release(); mSrtManager = null; diff --git a/src/com/cyanogenmod/eleven/utils/SrtManager.java b/src/com/cyanogenmod/eleven/utils/SrtManager.java index ca7e884..ffa33dd 100644 --- a/src/com/cyanogenmod/eleven/utils/SrtManager.java +++ b/src/com/cyanogenmod/eleven/utils/SrtManager.java @@ -61,16 +61,13 @@ public abstract class SrtManager implements Handler.Callback { } public synchronized void release() { - reset(); - mHandlerThread.quit(); - mHandlerThread = null; - } - - @Override - protected void finalize() throws Throwable { - super.finalize(); - mHandlerThread.quit(); - mHandlerThread = null; + if (mHandlerThread != null) { + mHandler.removeMessages(POST_TEXT_MSG); + mHandler.removeCallbacks(mLoader); + mHandler = null; + mHandlerThread.quit(); + mHandlerThread = null; + } } public synchronized void initialize(final MediaPlayer player, final File f) { -- cgit v1.2.3