aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/decoder_list.c8
-rw-r--r--src/decoder_plugin.h55
-rw-r--r--src/decoder_thread.c4
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);