diff options
author | waker <wakeroid@gmail.com> | 2010-10-26 20:49:36 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2010-10-26 20:49:36 +0200 |
commit | c307cf0c0eb3029de065f503140f9dfdc272930f (patch) | |
tree | 837349b0fa72829391f7d1844a5bd3850fc670fc | |
parent | 901e1856d514530b9f11d520da1fa1562746d1c0 (diff) |
on session resume, don't seek next track in failed to start
also better seekpos reporting
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | streamer.c | 28 |
2 files changed, 24 insertions, 8 deletions
@@ -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 (); } } } @@ -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"); |