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 | 
