From 2a31946f6755326ec8420ea8c5be8c22c9d2b64b Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Sun, 28 Feb 2010 16:48:29 -0600 Subject: [PATCH] Safer thread synchronization for song timeline --- src/org/kreed/vanilla/PlaybackService.java | 63 ++++++++++++---------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java index 2e94ffec..f586dd0c 100644 --- a/src/org/kreed/vanilla/PlaybackService.java +++ b/src/org/kreed/vanilla/PlaybackService.java @@ -296,6 +296,7 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On private int[] mSongs; private ArrayList mSongTimeline; + private Object mSongTimelineLock = new Object(); private int mCurrentSong = 0; private int mQueuePos = 0; private int mState = STATE_NORMAL; @@ -527,7 +528,9 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On if (song == null) return; - mCurrentSong += delta; + synchronized (mSongTimelineLock) { + mCurrentSong += delta; + } try { mMediaPlayer.reset(); @@ -545,9 +548,11 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On getSong(+2); - while (mCurrentSong > 15) { - mSongTimeline.remove(0); - --mCurrentSong; + synchronized (mSongTimelineLock) { + while (mCurrentSong > 15) { + mSongTimeline.remove(0); + --mCurrentSong; + } } } @@ -572,27 +577,29 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On return new Song(mSongs[mRandom.nextInt(mSongs.length)]); } - private synchronized Song getSong(int delta) + private Song getSong(int delta) { - if (mSongTimeline == null) - return null; - - int pos = mCurrentSong + delta; - - if (pos < 0) - return null; - - int size = mSongTimeline.size(); - if (pos > size) - return null; - - if (pos == size) { - if (mSongs == null) + synchronized (mSongTimelineLock) { + if (mSongTimeline == null) return null; - mSongTimeline.add(randomSong()); + + int pos = mCurrentSong + delta; + + if (pos < 0) + return null; + + int size = mSongTimeline.size(); + if (pos > size) + return null; + + if (pos == size) { + if (mSongs == null) + return null; + mSongTimeline.add(randomSong()); + } + + return mSongTimeline.get(pos); } - - return mSongTimeline.get(pos); } private void updateWidgets() @@ -635,11 +642,13 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On String text = getResources().getString(R.string.enqueued, song.title); Toast.makeText(ContextApplication.getContext(), text, Toast.LENGTH_SHORT).show(); - int i = mCurrentSong + 1 + mQueuePos++; - if (i < mSongTimeline.size()) - mSongTimeline.set(i, song); - else - mSongTimeline.add(song); + synchronized (mSongTimelineLock) { + int i = mCurrentSong + 1 + mQueuePos++; + if (i < mSongTimeline.size()) + mSongTimeline.set(i, song); + else + mSongTimeline.add(song); + } } break; case TRACK_CHANGED: