summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2010-10-26 20:49:36 +0200
committerGravatar waker <wakeroid@gmail.com>2010-10-26 20:49:36 +0200
commitc307cf0c0eb3029de065f503140f9dfdc272930f (patch)
tree837349b0fa72829391f7d1844a5bd3850fc670fc
parent901e1856d514530b9f11d520da1fa1562746d1c0 (diff)
on session resume, don't seek next track in failed to start
also better seekpos reporting
-rw-r--r--main.c4
-rw-r--r--streamer.c28
2 files changed, 24 insertions, 8 deletions
diff --git a/main.c b/main.c
index 75185052..5e776b73 100644
--- a/main.c
+++ b/main.c
@@ -509,9 +509,11 @@ restore_resume_state (void) {
int paused = conf_get_int ("resume.paused", 0);
trace ("resume: track %d pos %f playlist %d\n", track, pos, plt);
if (plt >= 0 && track >= 0 && pos >= 0) {
+ streamer_lock (); // need to hold streamer thread to make the resume operation atomic
streamer_set_current_playlist (plt);
- streamer_set_seek (pos);
streamer_set_nextsong (track, paused ? 2 : 3);
+ streamer_set_seek (pos);
+ streamer_unlock ();
}
}
}
diff --git a/streamer.c b/streamer.c
index 3191cc5b..7f238e4e 100644
--- a/streamer.c
+++ b/streamer.c
@@ -524,6 +524,7 @@ streamer_song_removed_notify (playItem_t *it) {
if (!mutex) {
return; // streamer is not running
}
+ streamer_lock ();
if (it == playlist_track) {
playlist_track = playlist_track->next[PL_MAIN];
// queue new next song for streaming
@@ -532,6 +533,7 @@ streamer_song_removed_notify (playItem_t *it) {
streamer_move_to_nextsong (0);
}
}
+ streamer_unlock ();
}
// that must be called after last sample from str_playing_song was done reading
@@ -678,9 +680,6 @@ streamer_set_current (playItem_t *it) {
}
return -1;
}
-// if (bytes_until_next_song == -1) {
-// bytes_until_next_song = 0;
-// }
success:
plug_trigger_event_trackinfochanged (to);
@@ -699,6 +698,10 @@ error:
float
streamer_get_playpos (void) {
+ float seek = seekpos;
+ if (seek >= 0) {
+ return seek;
+ }
return playpos;
}
@@ -717,6 +720,7 @@ streamer_get_apx_bitrate (void) {
void
streamer_set_nextsong (int song, int pstate) {
trace ("streamer_set_nextsong %d %d\n", song, pstate);
+ streamer_lock ();
streamer_abort_files ();
nextsong = song;
nextsong_pstate = pstate;
@@ -727,8 +731,9 @@ streamer_set_nextsong (int song, int pstate) {
// no sense to wait until end of previous song, reset buffer
bytes_until_next_song = 0;
playpos = 0;
-// seekpos = -1;
+ seekpos = -1;
}
+ streamer_unlock ();
}
void
@@ -847,13 +852,16 @@ streamer_thread (void *ctx) {
gettimeofday (&tm1, NULL);
if (nextsong >= 0) { // start streaming next song
trace ("\033[0;34mnextsong=%d\033[37;0m\n", nextsong);
+ streamer_lock ();
streamer_start_new_song ();
+ streamer_unlock ();
// it's totally possible that song was switched
// while streamer_set_current was running,
// so we need to restart here
continue;
}
else if (nextsong == -2 && (nextsong_pstate==0 || bytes_until_next_song == 0)) {
+ streamer_lock ();
playItem_t *from = playing_track;
bytes_until_next_song = -1;
trace ("nextsong=-2\n");
@@ -875,6 +883,7 @@ streamer_thread (void *ctx) {
if (from) {
pl_item_unref (from);
}
+ streamer_unlock ();
continue;
}
else if (p_isstopped ()) {
@@ -883,11 +892,13 @@ streamer_thread (void *ctx) {
}
if (bytes_until_next_song == 0) {
+ streamer_lock ();
if (!streaming_track) {
// means last song was deleted during final drain
nextsong = -1;
p_stop ();
streamer_set_current (NULL);
+ streamer_unlock ();
continue;
}
trace ("bytes_until_next_song=0, starting playback of new song\n");
@@ -952,16 +963,19 @@ streamer_thread (void *ctx) {
if (p_play () < 0) {
fprintf (stderr, "streamer: failed to start playback after samplerate change; output plugin doesn't work\n");
streamer_set_nextsong (-2, 0);
+ streamer_unlock ();
continue;
}
}
}
+ streamer_unlock ();
}
- if (seekpos >= 0) {
- trace ("seeking to %f\n", seekpos);
- float pos = seekpos;
+ int seek = seekpos;
+ if (seek >= 0) {
seekpos = -1;
+ trace ("seeking to %f\n", seek);
+ float pos = seek;
if (playing_track != streaming_track) {
trace ("streamer already switched to next track\n");