aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-09-27 02:03:07 -0700
committerEric Wong <normalperson@yhbt.net>2008-09-28 14:19:00 -0700
commit7812cd9286fa7581b5ea18337e875ad98a2d8bd6 (patch)
treeba9899abacb25162ec0c8e64eea06033748cc5ad
parentc7955f31bc044510ed3a2fb84c5e6590e8cbd428 (diff)
downloadmpd-7812cd9286fa7581b5ea18337e875ad98a2d8bd6.tar.gz
mpd-7812cd9286fa7581b5ea18337e875ad98a2d8bd6.tar.xz
mpd-7812cd9286fa7581b5ea18337e875ad98a2d8bd6.zip
advance to the next song on decoder errors
Fix this regression introduced in the core rewrite so that we now skip to the next song when we encounter an error with the song we tried to decode.
-rw-r--r--src/decode.c14
-rw-r--r--src/outputBuffer.c3
-rw-r--r--src/playlist.c6
3 files changed, 17 insertions, 6 deletions
diff --git a/src/decode.c b/src/decode.c
index 90ec5bd37..e0685e0e9 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -166,7 +166,7 @@ static void finalize_per_track_actions(void)
/* DEBUG(":%s dc.action(%d): %d\n", __func__,__LINE__, dc.action); */
}
-static void decode_start(void)
+static int decode_start(void)
{
int err = -1;
int close_instream = 1;
@@ -203,7 +203,7 @@ static void decode_start(void)
if (openInputStream(&is, path_max_fs) < 0) {
DEBUG("couldn't open song: %s\n", path_max_fs);
player_seterror(PLAYER_ERROR_FILENOTFOUND, dc.current_song);
- return;
+ return err;
}
if (isRemoteUrl(path_max_utf8)) {
@@ -281,6 +281,7 @@ static void decode_start(void)
ERROR("player_error: %s\n", player_strerror());
if (close_instream)
closeInputStream(&is);
+ return err;
}
static void * decoder_task(mpd_unused void *arg)
@@ -300,12 +301,17 @@ static void * decoder_task(mpd_unused void *arg)
/* DEBUG("dc.action: %d\n", (int)dc.action); */
if ((dc.current_song = playlist_queued_song())) {
char p[MPD_PATH_MAX];
+ int err;
+
ob_advance_sequence();
get_song_url(p, dc.current_song);
DEBUG("decoding song: %s\n", p);
- decode_start();
+ err = decode_start();
DEBUG("DONE decoding song: %s\n", p);
- ob_flush();
+ if (err)
+ ob_trigger_action(OB_ACTION_RESET);
+ else
+ ob_flush();
dc.current_song = NULL;
}
finalize_per_track_actions();
diff --git a/src/outputBuffer.c b/src/outputBuffer.c
index ac0f420d8..606877dd0 100644
--- a/src/outputBuffer.c
+++ b/src/outputBuffer.c
@@ -115,7 +115,8 @@ void ob_trigger_action(enum ob_action action)
if (pthread_equal(pthread_self(), dc.thread))
assert(action == OB_ACTION_PLAY ||
action == OB_ACTION_SEEK_START ||
- action == OB_ACTION_SEEK_FINISH);
+ action == OB_ACTION_SEEK_FINISH ||
+ action == OB_ACTION_RESET);
else
assert(action != OB_ACTION_PLAY &&
action != OB_ACTION_SEEK_START &&
diff --git a/src/playlist.c b/src/playlist.c
index d454b4ad2..8b7416d2e 100644
--- a/src/playlist.c
+++ b/src/playlist.c
@@ -528,7 +528,11 @@ static void syncPlaylistWithQueue(void)
if (!ob_synced())
return;
- if (playlist.queued >= 0 &&
+ if (player_errno != PLAYER_ERROR_NONE) {
+ DEBUG("playlist: error: %s\n", player_strerror());
+ playlist.current = playlist.queued;
+ player_clearerror();
+ } else if (playlist.queued >= 0 &&
playlist.current != playlist.queued) {
DEBUG("playlist: now playing queued song\n");
DEBUG("%s:%d queued: %d\n",__func__,__LINE__,playlist.queued);