From e6ed2da856ec02f3982af4017f20ff873dde0485 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 18 Aug 2010 01:40:54 +0200 Subject: Dynamically select decoder using decoder_find(). --- decoder.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'decoder.c') 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; +} -- cgit v1.2.3