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(). --- commands.c | 11 +++++++++-- decoder.c | 28 ++++++++++++++++++++++++++++ decoder.h | 4 ++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/commands.c b/commands.c index dd32a7c..38d760f 100644 --- a/commands.c +++ b/commands.c @@ -197,10 +197,17 @@ static void commands_get_mp3(GSocketConnection *connection, const gchar *cmd) { g_string_free(string, TRUE); - extern const struct decoder_plugin decoder_mpg123_decoder; + const struct decoder_plugin *decoder = decoder_find(path); extern const struct encoder_plugin encoder_lame_encoder; - transcode((GInputStream*)is, &decoder_mpg123_decoder, os, &encoder_lame_encoder); + if(decoder == NULL) { + g_warning("no suitable decoder found"); + goto commands_get_mp3_file_unref; + } else { + g_debug("using decoder %s", decoder->name); + } + + transcode((GInputStream*)is, decoder, os, &encoder_lame_encoder); commands_get_mp3_file_unref: 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; +} diff --git a/decoder.h b/decoder.h index 0a29c64..9139a84 100644 --- a/decoder.h +++ b/decoder.h @@ -20,11 +20,11 @@ struct decoder { gpointer data; }; -extern struct decoder_plugin *decoder_plugins; - gboolean decoder_init(struct decoder *decoder); gssize decoder_decode(struct decoder *decoder, const guchar *inbuf, gsize inbuf_size, guchar *outbuf, gsize outbuf_size); void decoder_close(struct decoder *decoder); +const struct decoder_plugin *decoder_find(const gchar *filename); + #endif -- cgit v1.2.3