This flag is used internally; it is set by decoder_seek_where(), and
indicates that the decoder plugin has begun the seek process.  It is
used for the case that the decoder plugin has to read data during the
seek process.  Before this patch, that was impossible, because
decoder_read() would refuse to read data unless dc->command is NONE.
This patch is kind of a dirty workaround, and needs to be redesigned
later.
---

 src/decode.c           |    2 ++
 src/decoder_api.c      |    9 ++++++++-
 src/decoder_internal.h |    2 ++
 3 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/src/decode.c b/src/decode.c
index 97896f6..33f0170 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -50,6 +50,8 @@ static void decodeStart(void)
                goto stop_no_close;
        }
 
+       decoder.seeking = 0;
+
        dc.state = DECODE_STATE_START;
        dc.command = DECODE_COMMAND_NONE;
 
diff --git a/src/decoder_api.c b/src/decoder_api.c
index 9a8b803..360df28 100644
--- a/src/decoder_api.c
+++ b/src/decoder_api.c
@@ -69,6 +69,8 @@ enum decoder_command decoder_get_command(mpd_unused struct 
decoder * decoder)
 void decoder_command_finished(mpd_unused struct decoder * decoder)
 {
        assert(dc.command != DECODE_COMMAND_NONE);
+       assert(dc.command != DECODE_COMMAND_SEEK ||
+              dc.seekError || decoder->seeking);
 
        dc.command = DECODE_COMMAND_NONE;
        notify_signal(&pc.notify);
@@ -78,6 +80,8 @@ double decoder_seek_where(mpd_unused struct decoder * decoder)
 {
        assert(dc.command == DECODE_COMMAND_SEEK);
 
+       decoder->seeking = 1;
+
        return dc.seekWhere;
 }
 
@@ -100,7 +104,10 @@ size_t decoder_read(struct decoder *decoder,
 
        while (1) {
                /* XXX don't allow decoder==NULL */
-               if (decoder != NULL && dc.command != DECODE_COMMAND_NONE)
+               if (decoder != NULL &&
+                   (dc.command != DECODE_COMMAND_SEEK ||
+                    !decoder->seeking) &&
+                   dc.command != DECODE_COMMAND_NONE)
                        return 0;
 
                nbytes = readFromInputStream(inStream, buffer, 1, length);
diff --git a/src/decoder_internal.h b/src/decoder_internal.h
index 37b7b65..6d8bc7a 100644
--- a/src/decoder_internal.h
+++ b/src/decoder_internal.h
@@ -26,6 +26,8 @@ struct decoder {
        struct decoder_plugin *plugin;
 
        ConvState conv_state;
+
+       int seeking;
 };
 
 #endif


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to