diff options
-rw-r--r-- | commands.c | 11 | ||||
-rw-r--r-- | decoder.c | 28 | ||||
-rw-r--r-- | decoder.h | 4 |
3 files changed, 39 insertions, 4 deletions
@@ -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: @@ -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; +} @@ -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 |