DecoderThread: use decoder_plugins_try()

.. instead of decoder_plugin_from_suffix().  This reduces overhead by
walking the array only once.
This commit is contained in:
Max Kellermann 2013-12-29 16:51:18 +01:00
parent 5bb563e3bc
commit decc4002a0
1 changed files with 46 additions and 34 deletions

View File

@ -280,54 +280,66 @@ decoder_load_replay_gain(Decoder &decoder, const char *path_fs)
decoder_replay_gain(decoder, &info);
}
static bool
TryDecoderFile(Decoder &decoder, const char *path_fs, const char *suffix,
const DecoderPlugin &plugin)
{
if (!plugin.SupportsSuffix(suffix))
return false;
DecoderControl &dc = decoder.dc;
if (plugin.file_decode != nullptr) {
dc.Lock();
if (decoder_file_decode(plugin, decoder, path_fs))
return true;
dc.Unlock();
} else if (plugin.stream_decode != nullptr) {
InputStream *input_stream =
decoder_input_stream_open(dc, path_fs);
if (input_stream == nullptr)
return false;
dc.Lock();
bool success = decoder_stream_decode(plugin, decoder,
*input_stream);
dc.Unlock();
input_stream->Close();
if (success) {
dc.Lock();
return true;
}
}
return false;
}
/**
* Try decoding a file.
*/
static bool
decoder_run_file(Decoder &decoder, const char *path_fs)
{
DecoderControl &dc = decoder.dc;
const char *suffix = uri_get_suffix(path_fs);
const struct DecoderPlugin *plugin = nullptr;
if (suffix == nullptr)
return false;
DecoderControl &dc = decoder.dc;
dc.Unlock();
decoder_load_replay_gain(decoder, path_fs);
while ((plugin = decoder_plugin_from_suffix(suffix, plugin)) != nullptr) {
if (plugin->file_decode != nullptr) {
dc.Lock();
if (decoder_file_decode(*plugin, decoder, path_fs))
return true;
dc.Unlock();
} else if (plugin->stream_decode != nullptr) {
InputStream *input_stream;
bool success;
input_stream = decoder_input_stream_open(dc, path_fs);
if (input_stream == nullptr)
continue;
dc.Lock();
success = decoder_stream_decode(*plugin, decoder,
*input_stream);
dc.Unlock();
input_stream->Close();
if (success) {
dc.Lock();
return true;
}
}
}
if (decoder_plugins_try([&decoder, path_fs, suffix](const DecoderPlugin &plugin){
return TryDecoderFile(decoder, path_fs, suffix,
plugin);
}))
return true;
dc.Lock();
return false;