aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/decoder_thread.c71
1 files changed, 66 insertions, 5 deletions
diff --git a/src/decoder_thread.c b/src/decoder_thread.c
index 23a947d77..ac1b41b6f 100644
--- a/src/decoder_thread.c
+++ b/src/decoder_thread.c
@@ -45,6 +45,65 @@ decoder_try_decode(const struct decoder_plugin *plugin,
return ret;
}
+static bool
+decoder_stream_decode(const struct decoder_plugin *plugin,
+ struct decoder *decoder,
+ struct input_stream *input_stream)
+{
+ bool ret;
+
+ assert(plugin != NULL);
+ assert(plugin->stream_decode != NULL);
+ assert(decoder != NULL);
+ assert(!decoder->stream_tag_sent);
+ assert(input_stream != NULL);
+ assert(input_stream->ready);
+ assert(dc.state == DECODE_STATE_START);
+
+ ret = plugin->stream_decode(decoder, input_stream);
+
+ if (ret) {
+ /* if the method has succeeded, the plugin must have
+ called decoder_initialized() */
+ assert(dc.state == DECODE_STATE_DECODE);
+ } else {
+ /* no decoder_initialized() allowed when the plugin
+ hasn't recognized the file format */
+ assert(dc.state == DECODE_STATE_START);
+ }
+
+ return ret;
+}
+
+static bool
+decoder_file_decode(const struct decoder_plugin *plugin,
+ struct decoder *decoder, const char *path)
+{
+ bool ret;
+
+ assert(plugin != NULL);
+ assert(plugin->stream_decode != NULL);
+ assert(decoder != NULL);
+ assert(!decoder->stream_tag_sent);
+ assert(path != NULL);
+ assert(path[0] == '/');
+ assert(dc.state == DECODE_STATE_START);
+
+ ret = plugin->file_decode(decoder, path);
+
+ if (ret) {
+ /* if the method has succeeded, the plugin must have
+ called decoder_initialized() */
+ assert(dc.state == DECODE_STATE_DECODE);
+ } else {
+ /* no decoder_initialized() allowed when the plugin
+ hasn't recognized the file format */
+ assert(dc.state == DECODE_STATE_START);
+ }
+
+ return ret;
+}
+
static void decoder_run(void)
{
struct song *song = dc.next_song;
@@ -112,7 +171,8 @@ static void decoder_run(void)
continue;
if (!decoder_try_decode(plugin, &input_stream))
continue;
- ret = plugin->stream_decode(&decoder, &input_stream);
+ ret = decoder_stream_decode(plugin, &decoder,
+ &input_stream);
break;
}
@@ -125,7 +185,7 @@ static void decoder_run(void)
continue;
if (!decoder_try_decode(plugin, &input_stream))
continue;
- ret = plugin->stream_decode(&decoder,
+ ret = decoder_stream_decode(plugin, &decoder,
&input_stream);
break;
}
@@ -137,7 +197,7 @@ static void decoder_run(void)
/* we already know our mp3Plugin supports streams, no
* need to check for stream{Types,DecodeFunc} */
if ((plugin = decoder_plugin_from_name("mp3"))) {
- ret = plugin->stream_decode(&decoder,
+ ret = decoder_stream_decode(plugin, &decoder,
&input_stream);
}
}
@@ -151,10 +211,11 @@ static void decoder_run(void)
if (plugin->file_decode != NULL) {
input_stream_close(&input_stream);
close_instream = false;
- ret = plugin->file_decode(&decoder, uri);
+ ret = decoder_file_decode(plugin,
+ &decoder, uri);
break;
} else if (plugin->stream_decode != NULL) {
- ret = plugin->stream_decode(&decoder,
+ ret = decoder_stream_decode(plugin, &decoder,
&input_stream);
break;
}