#include "decoder.h" #include #include static gboolean mpg123_decoder_init(gpointer *data) { mpg123_handle *handle; int error; mpg123_init(); handle = mpg123_new("generic", &error); if(error) { g_warning("Error: %s", mpg123_plain_strerror(error)); return FALSE; } error = mpg123_open_feed(handle); if(error) { g_warning("Error: %s", mpg123_plain_strerror(error)); } /* force format for now */ mpg123_format_none(handle); mpg123_format(handle, 44100, 2, MPG123_ENC_SIGNED_16); *data = handle; return TRUE; } static gssize mpg123_decoder_decode(gpointer data, const guchar *inbuf, gsize inbuf_size, guchar *outbuf, gsize outbuf_size) { mpg123_handle *handle = data; gssize size; int ret; if(mpg123_feed(handle, inbuf, inbuf_size) != MPG123_OK) { g_debug("asdfasdf"); g_warning(mpg123_strerror(handle)); return -1; } ret = mpg123_read(handle, outbuf, outbuf_size, (size_t*)&size); if(ret == MPG123_NEW_FORMAT) { long rate; int channels, enc; mpg123_getformat(handle, &rate, &channels, &enc); g_debug("New format: %li Hz, %i channels, encoding value %i", rate, channels, enc); ret = mpg123_read(handle, outbuf, outbuf_size, (size_t*)&size); } if(ret != MPG123_OK && ret != MPG123_DONE && ret != MPG123_NEW_FORMAT && ret != MPG123_NEED_MORE) { g_warning(mpg123_plain_strerror(ret)); return -1; } return size; } static void mpg123_decoder_close(gpointer data) { mpg123_handle *handle = data; mpg123_close(handle); mpg123_delete(handle); } static const gchar * const decoder_mpg123_extensions[] = { "mp3", NULL, }; const struct decoder_plugin decoder_mpg123_decoder = { .name = "mpg123", .extensions = decoder_mpg123_extensions, .init = mpg123_decoder_init, .decode = mpg123_decoder_decode, .close = mpg123_decoder_close, };