aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2011-09-14 09:37:52 +0200
committerMax Kellermann <max@duempel.org>2011-09-14 09:41:27 +0200
commitc344d63fb38c5d5aec4ad11815762e7ba1a13a31 (patch)
treebb50cefcd1bbe4f2b7210cb9b3ee28461caee529
parent62557f4d6b72eed3c42f17da89e11e3327151b88 (diff)
downloadmpd-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.c15
-rw-r--r--src/decoder_internal.c32
-rw-r--r--src/decoder_internal.h2
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.