diff options
author | Max Kellermann <max@duempel.org> | 2011-09-14 09:37:52 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2011-09-14 09:41:27 +0200 |
commit | c344d63fb38c5d5aec4ad11815762e7ba1a13a31 (patch) | |
tree | bb50cefcd1bbe4f2b7210cb9b3ee28461caee529 | |
parent | 62557f4d6b72eed3c42f17da89e11e3327151b88 (diff) | |
download | mpd-c344d63fb38c5d5aec4ad11815762e7ba1a13a31.tar.gz mpd-c344d63fb38c5d5aec4ad11815762e7ba1a13a31.tar.xz mpd-c344d63fb38c5d5aec4ad11815762e7ba1a13a31.zip |
decoder_internal: don't call input_stream_buffer()
This is not necessary since all relevant input plugins have been moved
to the I/O thread, and there is no remaining useful buffer()
implementation. This also fixes a busy loop when playing radio.
-rw-r--r-- | src/decoder_api.c | 15 | ||||
-rw-r--r-- | src/decoder_internal.c | 32 | ||||
-rw-r--r-- | src/decoder_internal.h | 2 |
3 files changed, 12 insertions, 37 deletions
diff --git a/src/decoder_api.c b/src/decoder_api.c index 5536552e5..239ef6daf 100644 --- a/src/decoder_api.c +++ b/src/decoder_api.c @@ -202,8 +202,7 @@ decoder_timestamp(struct decoder *decoder, double t) * (decoder.chunk) if there is one. */ static enum decoder_command -do_send_tag(struct decoder *decoder, struct input_stream *is, - const struct tag *tag) +do_send_tag(struct decoder *decoder, const struct tag *tag) { struct music_chunk *chunk; @@ -216,7 +215,7 @@ do_send_tag(struct decoder *decoder, struct input_stream *is, assert(decoder->chunk == NULL); - chunk = decoder_get_chunk(decoder, is); + chunk = decoder_get_chunk(decoder); if (chunk == NULL) { assert(decoder->dc->command != DECODE_COMMAND_NONE); return decoder->dc->command; @@ -283,11 +282,11 @@ decoder_data(struct decoder *decoder, tag = tag_merge(decoder->decoder_tag, decoder->stream_tag); - cmd = do_send_tag(decoder, is, tag); + cmd = do_send_tag(decoder, tag); tag_free(tag); } else /* send only the stream tag */ - cmd = do_send_tag(decoder, is, decoder->stream_tag); + cmd = do_send_tag(decoder, decoder->stream_tag); if (cmd != DECODE_COMMAND_NONE) return cmd; @@ -313,7 +312,7 @@ decoder_data(struct decoder *decoder, size_t nbytes; bool full; - chunk = decoder_get_chunk(decoder, is); + chunk = decoder_get_chunk(decoder); if (chunk == NULL) { assert(dc->command != DECODE_COMMAND_NONE); return dc->command; @@ -392,11 +391,11 @@ decoder_tag(G_GNUC_UNUSED struct decoder *decoder, struct input_stream *is, struct tag *merged; merged = tag_merge(decoder->stream_tag, decoder->decoder_tag); - cmd = do_send_tag(decoder, is, merged); + cmd = do_send_tag(decoder, merged); tag_free(merged); } else /* send only the decoder tag */ - cmd = do_send_tag(decoder, is, tag); + cmd = do_send_tag(decoder, tag); return cmd; } diff --git a/src/decoder_internal.c b/src/decoder_internal.c index c9878b758..bc349f2ff 100644 --- a/src/decoder_internal.c +++ b/src/decoder_internal.c @@ -28,41 +28,17 @@ #include <assert.h> /** - * This is a wrapper for input_stream_buffer(). It assumes that the - * decoder is currently locked, and temporarily unlocks it while - * calling input_stream_buffer(). We shouldn't hold the lock during a - * potentially blocking operation. - */ -static bool -decoder_input_buffer(struct decoder_control *dc, struct input_stream *is) -{ - GError *error = NULL; - int ret; - - decoder_unlock(dc); - ret = input_stream_buffer(is, &error); - if (ret < 0) { - g_warning("%s", error->message); - g_error_free(error); - } - - decoder_lock(dc); - - return ret > 0; -} - -/** * All chunks are full of decoded data; wait for the player to free * one. */ static enum decoder_command -need_chunks(struct decoder_control *dc, struct input_stream *is, bool do_wait) +need_chunks(struct decoder_control *dc, bool do_wait) { if (dc->command == DECODE_COMMAND_STOP || dc->command == DECODE_COMMAND_SEEK) return dc->command; - if ((is == NULL || !decoder_input_buffer(dc, is)) && do_wait) { + if (do_wait) { decoder_wait(dc); g_cond_signal(dc->client_cond); @@ -73,7 +49,7 @@ need_chunks(struct decoder_control *dc, struct input_stream *is, bool do_wait) } struct music_chunk * -decoder_get_chunk(struct decoder *decoder, struct input_stream *is) +decoder_get_chunk(struct decoder *decoder) { struct decoder_control *dc = decoder->dc; enum decoder_command cmd; @@ -96,7 +72,7 @@ decoder_get_chunk(struct decoder *decoder, struct input_stream *is) } decoder_lock(dc); - cmd = need_chunks(dc, is, true); + cmd = need_chunks(dc, true); decoder_unlock(dc); } while (cmd == DECODE_COMMAND_NONE); diff --git a/src/decoder_internal.h b/src/decoder_internal.h index 8ed6a3c64..78a783f5e 100644 --- a/src/decoder_internal.h +++ b/src/decoder_internal.h @@ -70,7 +70,7 @@ struct decoder { * @return the chunk, or NULL if we have received a decoder command */ struct music_chunk * -decoder_get_chunk(struct decoder *decoder, struct input_stream *is); +decoder_get_chunk(struct decoder *decoder); /** * Flushes the current chunk. |