summaryrefslogtreecommitdiff
path: root/decoder.c
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2010-08-18 01:40:54 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2010-08-18 01:40:54 +0200
commite6ed2da856ec02f3982af4017f20ff873dde0485 (patch)
treed550157c897892ffa3ce0025f9237e2c59dd7906 /decoder.c
parent4f153bf7b20a76da5563f86047a8c0e74436644d (diff)
Dynamically select decoder using decoder_find().
Diffstat (limited to 'decoder.c')
-rw-r--r--decoder.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/decoder.c b/decoder.c
index 555757d..2f866c6 100644
--- a/decoder.c
+++ b/decoder.c
@@ -13,3 +13,31 @@ gssize decoder_decode(struct decoder *decoder, const guchar *inbuf,
void decoder_close(struct decoder *decoder) {
decoder->decoder->close(decoder->data);
}
+
+extern const struct decoder_plugin decoder_mpg123_decoder;
+
+static const struct decoder_plugin *decoder_plugins[] = {
+ &decoder_mpg123_decoder,
+ NULL,
+};
+
+const struct decoder_plugin *decoder_find(const gchar *filename) {
+ gchar *ext = g_strrstr(filename, ".");
+ if(ext == NULL) {
+ g_warning("decoder_find: no file extension found");
+ return NULL;
+ }
+ // exclude the dot
+ ext++;
+
+ for(int i = 0; decoder_plugins[i]; i++) {
+ const struct decoder_plugin *plugin = decoder_plugins[i];
+ for(int j = 0; plugin[i].extensions[j]; j++) {
+ if(g_strcmp0(plugin[i].extensions[j], ext) == 0) {
+ return plugin;
+ }
+ }
+ }
+
+ return NULL;
+}