# HG changeset patch # User Tony Vroon # Date 1236170716 0 # Node ID b7c181d0b32524f223700fb4595220d276212a22 # Parent 1192140d9e3f760c6c1470cdaad422c365d9b99f Patch from John Lindgren to support seeking whilst paused, Debian bug #517692. diff -r 1192140d9e3f -r b7c181d0b325 src/flacng/plugin.c --- a/src/flacng/plugin.c Wed Mar 04 12:03:14 2009 +0000 +++ b/src/flacng/plugin.c Wed Mar 04 12:45:16 2009 +0000 @@ -56,6 +56,7 @@ callback_info* main_info; gboolean plugin_initialized = FALSE; glong seek_to = -1; +static volatile char pause_flag = 0; static GThread* thread = NULL; /* === */ @@ -302,6 +303,22 @@ /* --- */ +static void do_seek (InputPlayback * playback) { + playback->output->flush (seek_to); + FLAC__stream_decoder_seek_absolute (main_decoder, (long long) seek_to * main_info->stream.samplerate / 1000); + seek_to = -1; +} + +static void do_pause (InputPlayback * playback) { + playback->output->pause (1); + while (pause_flag) { + if (seek_to != -1) + do_seek (playback); + g_usleep(50000); + } + playback->output->pause (0); +} + static gpointer flac_play_loop(gpointer arg) { /* @@ -312,7 +329,6 @@ gint32* read_pointer; gint elements_left; - gint seek_sample; FLAC__StreamDecoderState state; struct stream_info stream_info; guint sample_count; @@ -435,24 +451,10 @@ main_info->buffer_free = BUFFER_SIZE_SAMP; main_info->buffer_used = 0; - /* - * Do we have to seek to somewhere? - */ - if (-1 != seek_to) { - _DEBUG("Seek requested to %d milliseconds", seek_to); - - seek_sample = (unsigned long)((gint64)seek_to * (gint64) main_info->stream.samplerate / 1000L ); - _DEBUG("Seek requested to sample %d", seek_sample); - if (FALSE == FLAC__stream_decoder_seek_absolute(main_decoder, seek_sample)) { - _ERROR("Could not seek to sample %d!", seek_sample); - } else { - /* - * Flush the buffers - */ - playback->output->flush(seek_to); - } - seek_to = -1; - } + if (seek_to != -1) + do_seek (playback); + if (pause_flag) + do_pause (playback); /* * Have we reached the end of the stream? @@ -567,12 +569,7 @@ /* --- */ void flac_pause(InputPlayback* input, gshort p) { - - _ENTER; - - input->output->pause(p); - - _LEAVE; + pause_flag = p; } /* --- */