aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Jackson <daneren2005@gmail.com>2012-12-13 19:47:42 -0800
committerScott Jackson <daneren2005@gmail.com>2012-12-13 19:47:42 -0800
commitb88942fd78b2f62e4e040453b4479166dc90968a (patch)
treedc2fe23e51876de5d0b33faee2dfe52a03a25c93
parentbcae7366c015165e9afbea9d0d3ded0f6e47524d (diff)
downloaddsub-b88942fd78b2f62e4e040453b4479166dc90968a.tar.gz
dsub-b88942fd78b2f62e4e040453b4479166dc90968a.tar.bz2
dsub-b88942fd78b2f62e4e040453b4479166dc90968a.zip
Async buffering -> eliminates block that can cause freezing for some
-rw-r--r--subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java46
1 files changed, 29 insertions, 17 deletions
diff --git a/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java b/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java
index 11e81ec5..0c4d7930 100644
--- a/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java
+++ b/subsonic-android/src/github/daneren2005/dsub/service/DownloadServiceImpl.java
@@ -819,7 +819,7 @@ public class DownloadServiceImpl extends Service implements DownloadService {
bufferTask.start();
}
- private synchronized void doPlay(final DownloadFile downloadFile, int position, boolean start) {
+ private synchronized void doPlay(final DownloadFile downloadFile, final int position, final boolean start) {
// TODO: Start play at curr pos on rebuffer instead of restart
try {
final File file = downloadFile.isCompleteFileAvailable() ? downloadFile.getCompleteFile() : downloadFile.getPartialFile();
@@ -830,8 +830,32 @@ public class DownloadServiceImpl extends Service implements DownloadService {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(file.getPath());
setPlayerState(PREPARING);
- mediaPlayer.prepare();
- setPlayerState(PREPARED);
+
+ mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+ public void onPrepared(MediaPlayer mp) {
+ try {
+ setPlayerState(PREPARED);
+
+ synchronized (DownloadServiceImpl.this) {
+ if (position != 0) {
+ Log.i(TAG, "Restarting player from position " + position);
+ mediaPlayer.seekTo(position);
+ }
+
+ if (start) {
+ mediaPlayer.start();
+ setPlayerState(STARTED);
+ } else {
+ setPlayerState(PAUSED);
+ }
+ }
+
+ lifecycleSupport.serializeDownloadQueue();
+ } catch (Exception x) {
+ handleError(x);
+ }
+ }
+ });
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
@@ -875,20 +899,8 @@ public class DownloadServiceImpl extends Service implements DownloadService {
}
}
});
-
- if (position != 0) {
- Log.i(TAG, "Restarting player from position " + position);
- mediaPlayer.seekTo(position);
- }
-
- if (start) {
- mediaPlayer.start();
- setPlayerState(STARTED);
- } else {
- setPlayerState(PAUSED);
- }
- lifecycleSupport.serializeDownloadQueue();
-
+
+ mediaPlayer.prepareAsync();
} catch (Exception x) {
handleError(x);
}