diff options
Diffstat (limited to '')
-rw-r--r-- | src/decoder_list.c | 8 | ||||
-rw-r--r-- | src/decoder_plugin.h | 55 | ||||
-rw-r--r-- | src/decoder_thread.c | 4 |
3 files changed, 62 insertions, 5 deletions
diff --git a/src/decoder_list.c b/src/decoder_list.c index 550fb1e73..ba179ee70 100644 --- a/src/decoder_list.c +++ b/src/decoder_list.c @@ -189,7 +189,8 @@ void decoder_plugin_init_all(void) { for (unsigned i = 0; i < num_decoder_plugins; ++i) { const struct decoder_plugin *plugin = decoder_plugins[i]; - if (plugin->init == NULL || decoder_plugins[i]->init()) + + if (decoder_plugin_init(plugin)) decoder_plugins_enabled[i] = true; } } @@ -198,7 +199,8 @@ void decoder_plugin_deinit_all(void) { for (unsigned i = 0; i < num_decoder_plugins; ++i) { const struct decoder_plugin *plugin = decoder_plugins[i]; - if (decoder_plugins_enabled[i] && plugin->finish != NULL) - decoder_plugins[i]->finish(); + + if (decoder_plugins_enabled[i]) + decoder_plugin_finish(plugin); } } diff --git a/src/decoder_plugin.h b/src/decoder_plugin.h index 3c05dc5b7..7034103ba 100644 --- a/src/decoder_plugin.h +++ b/src/decoder_plugin.h @@ -20,6 +20,7 @@ #define MPD_DECODER_PLUGIN_H #include <stdbool.h> +#include <stddef.h> struct input_stream; struct tag; @@ -77,4 +78,58 @@ struct decoder_plugin { const char *const*mime_types; }; +/** + * Initialize a decoder plugin. + * + * @return true if the plugin was initialized successfully, false if + * the plugin is not available + */ +static inline bool +decoder_plugin_init(const struct decoder_plugin *plugin) +{ + return plugin->init != NULL + ? plugin->init() + : true; +} + +/** + * Deinitialize a decoder plugin which was initialized successfully. + */ +static inline void +decoder_plugin_finish(const struct decoder_plugin *plugin) +{ + if (plugin->finish != NULL) + plugin->finish(); +} + +/** + * Decode a stream. + */ +static inline void +decoder_plugin_stream_decode(const struct decoder_plugin *plugin, + struct decoder *decoder, struct input_stream *is) +{ + plugin->stream_decode(decoder, is); +} + +/** + * Decode a file. + */ +static inline void +decoder_plugin_file_decode(const struct decoder_plugin *plugin, + struct decoder *decoder, const char *path_fs) +{ + plugin->file_decode(decoder, path_fs); +} + +/** + * Read the tag of a file. + */ +static inline struct tag * +decoder_plugin_tag_dup(const struct decoder_plugin *plugin, + const char *path_fs) +{ + return plugin->tag_dup(path_fs); +} + #endif diff --git a/src/decoder_thread.c b/src/decoder_thread.c index 97555f44d..07eea2f65 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -50,7 +50,7 @@ decoder_stream_decode(const struct decoder_plugin *plugin, /* rewind the stream, so each plugin gets a fresh start */ input_stream_seek(input_stream, 0, SEEK_SET); - plugin->stream_decode(decoder, input_stream); + decoder_plugin_stream_decode(plugin, decoder, input_stream); assert(dc.state == DECODE_STATE_START || dc.state == DECODE_STATE_DECODE); @@ -71,7 +71,7 @@ decoder_file_decode(const struct decoder_plugin *plugin, assert(path[0] == '/'); assert(dc.state == DECODE_STATE_START); - plugin->file_decode(decoder, path); + decoder_plugin_file_decode(plugin, decoder, path); assert(dc.state == DECODE_STATE_START || dc.state == DECODE_STATE_DECODE); |