decoder_thread: open input stream on demand

Moved the global input stream opener to decoder_run_stream().
decoder_run_file() now opens the input stream each time a plugin
provides a stream decoder method.
This commit is contained in:
Max Kellermann 2009-11-07 15:10:12 +01:00
parent 587284bae6
commit 9ba900486e

View File

@ -149,24 +149,67 @@ decoder_run_stream_fallback(struct decoder *decoder, struct input_stream *is)
* Try decoding a stream. * Try decoding a stream.
*/ */
static bool static bool
decoder_run_stream(struct decoder *decoder, struct input_stream *is, decoder_run_stream(struct decoder *decoder, const char *uri)
const char *uri)
{ {
struct decoder_control *dc = decoder->dc;
struct input_stream input_stream;
bool success;
decoder_unlock(dc);
if (!input_stream_open(&input_stream, uri)) {
decoder_lock(dc);
dc->state = DECODE_STATE_ERROR;
return false;
}
/* wait for the input stream to become ready; its metadata
will be available then */
while (!input_stream.ready) {
int ret;
decoder_lock(dc);
if (dc->command == DECODE_COMMAND_STOP) {
decoder_unlock(dc);
input_stream_close(&input_stream);
decoder_lock(dc);
return true;
}
decoder_unlock(dc);
ret = input_stream_buffer(&input_stream);
if (ret < 0) {
input_stream_close(&input_stream);
decoder_lock(dc);
return false;
}
}
decoder_lock(dc);
success = dc->command == DECODE_COMMAND_STOP ||
/* first we try mime types: */ /* first we try mime types: */
return decoder_run_stream_mime_type(decoder, is) || decoder_run_stream_mime_type(decoder, &input_stream) ||
/* if that fails, try suffix matching the URL: */ /* if that fails, try suffix matching the URL: */
decoder_run_stream_suffix(decoder, is, uri) || decoder_run_stream_suffix(decoder, &input_stream, uri) ||
/* fallback to mp3: this is needed for bastard streams /* fallback to mp3: this is needed for bastard streams
that don't have a suffix or set the mimeType */ that don't have a suffix or set the mimeType */
decoder_run_stream_fallback(decoder, is); decoder_run_stream_fallback(decoder, &input_stream);
decoder_unlock(dc);
input_stream_close(&input_stream);
decoder_lock(dc);
return success;
} }
/** /**
* Try decoding a file. * Try decoding a file.
*/ */
static bool static bool
decoder_run_file(struct decoder *decoder, struct input_stream *is, decoder_run_file(struct decoder *decoder, const char *path_fs)
const char *path_fs, bool *close_instream_p)
{ {
const char *suffix = uri_get_suffix(path_fs); const char *suffix = uri_get_suffix(path_fs);
const struct decoder_plugin *plugin; const struct decoder_plugin *plugin;
@ -179,9 +222,6 @@ decoder_run_file(struct decoder *decoder, struct input_stream *is,
while ((plugin = decoder_plugin_from_suffix(suffix, next++))) { while ((plugin = decoder_plugin_from_suffix(suffix, next++))) {
if (plugin->file_decode != NULL) { if (plugin->file_decode != NULL) {
input_stream_close(is);
*close_instream_p = false;
decoder_lock(decoder->dc); decoder_lock(decoder->dc);
if (decoder_file_decode(plugin, decoder, path_fs)) if (decoder_file_decode(plugin, decoder, path_fs))
@ -189,19 +229,15 @@ decoder_run_file(struct decoder *decoder, struct input_stream *is,
decoder_unlock(decoder->dc); decoder_unlock(decoder->dc);
} else if (plugin->stream_decode != NULL) { } else if (plugin->stream_decode != NULL) {
if (!*close_instream_p) { struct input_stream input_stream;
/* the input_stream object has been
closed before decoder_file_decode() if (!input_stream_open(&input_stream, path_fs))
- reopen it */
if (input_stream_open(is, path_fs))
*close_instream_p = true;
else
continue; continue;
}
decoder_lock(decoder->dc); decoder_lock(decoder->dc);
if (decoder_stream_decode(plugin, decoder, is)) if (decoder_stream_decode(plugin, decoder,
&input_stream))
return true; return true;
decoder_unlock(decoder->dc); decoder_unlock(decoder->dc);
@ -220,8 +256,6 @@ decoder_run_song(struct decoder_control *dc,
.dc = dc, .dc = dc,
}; };
int ret; int ret;
bool close_instream = true;
struct input_stream input_stream;
decoder.seeking = false; decoder.seeking = false;
decoder.song_tag = song->tag != NULL && song_is_file(song) decoder.song_tag = song->tag != NULL && song_is_file(song)
@ -235,55 +269,11 @@ decoder_run_song(struct decoder_control *dc,
player_signal(); player_signal();
decoder_unlock(dc);
if (!input_stream_open(&input_stream, uri)) {
decoder_lock(dc);
dc->state = DECODE_STATE_ERROR;
return;
}
/* wait for the input stream to become ready; its metadata
will be available then */
while (!input_stream.ready) {
decoder_lock(dc);
if (dc->command == DECODE_COMMAND_STOP) {
decoder_unlock(dc);
input_stream_close(&input_stream);
decoder_lock(dc);
dc->state = DECODE_STATE_STOP;
return;
}
decoder_unlock(dc);
ret = input_stream_buffer(&input_stream);
if (ret < 0) {
input_stream_close(&input_stream);
decoder_lock(dc);
dc->state = DECODE_STATE_ERROR;
return;
}
}
decoder_lock(dc);
if (dc->command == DECODE_COMMAND_STOP) {
decoder_unlock(dc);
input_stream_close(&input_stream);
decoder_lock(dc);
dc->state = DECODE_STATE_STOP;
return;
}
pcm_convert_init(&decoder.conv_state); pcm_convert_init(&decoder.conv_state);
ret = song_is_file(song) ret = song_is_file(song)
? decoder_run_file(&decoder, &input_stream, uri, ? decoder_run_file(&decoder, uri)
&close_instream) : decoder_run_stream(&decoder, uri);
: decoder_run_stream(&decoder, &input_stream, uri);
decoder_unlock(dc); decoder_unlock(dc);
@ -293,9 +283,6 @@ decoder_run_song(struct decoder_control *dc,
if (decoder.chunk != NULL) if (decoder.chunk != NULL)
decoder_flush_chunk(&decoder); decoder_flush_chunk(&decoder);
if (close_instream)
input_stream_close(&input_stream);
if (decoder.song_tag != NULL) if (decoder.song_tag != NULL)
tag_free(decoder.song_tag); tag_free(decoder.song_tag);