tags 476382 + patch
thanks

Here is a patch porting cmus to the new libmpcdec API.  I couldn't
find my way through upstream's non-standard build system, though -- so
I don't know whether conditionally supporting the old API is possible
at all.

--- cmus-2.2.0.orig/mpc.c
+++ cmus-2.2.0/mpc.c
@@ -11,12 +11,12 @@
 #include "xmalloc.h"
 #include "read_wrapper.h"
 
-#include <mpcdec/mpcdec.h>
+#include <mpc/mpcdec.h>
 #include <inttypes.h>
 #include <errno.h>
 
 struct mpc_private {
-       mpc_decoder decoder;
+       mpc_demux *decoder;
        mpc_reader reader;
        mpc_streaminfo info;
 
@@ -40,9 +40,9 @@
 };
 
 /* callbacks */
-static mpc_int32_t read_impl(void *data, void *ptr, mpc_int32_t size)
+static mpc_int32_t read_impl(mpc_reader *data, void *ptr, mpc_int32_t size)
 {
-       struct input_plugin_data *ip_data = data;
+       struct input_plugin_data *ip_data = data->data;
        int rc;
 
        rc = read_wrapper(ip_data, ptr, size);
@@ -55,35 +55,35 @@
        return rc;
 }
 
-static mpc_bool_t seek_impl(void *data, mpc_int32_t offset)
+static mpc_bool_t seek_impl(mpc_reader *data, mpc_int32_t offset)
 {
-       struct input_plugin_data *ip_data = data;
+       struct input_plugin_data *ip_data = data->data;
        int rc;
 
        rc = lseek(ip_data->fd, offset, SEEK_SET);
        if (rc == -1)
-               return FALSE;
-       return TRUE;
+               return MPC_FALSE;
+       return MPC_TRUE;
 }
 
-static mpc_int32_t tell_impl(void *data)
+static mpc_int32_t tell_impl(mpc_reader *data)
 {
-       struct input_plugin_data *ip_data = data;
+       struct input_plugin_data *ip_data = data->data;
 
        return lseek(ip_data->fd, 0, SEEK_CUR);
 }
 
-static mpc_int32_t get_size_impl(void *data)
+static mpc_int32_t get_size_impl(mpc_reader *data)
 {
-       struct input_plugin_data *ip_data = data;
+       struct input_plugin_data *ip_data = data->data;
        struct mpc_private *priv = ip_data->private;
 
        return priv->file_size;
 }
 
-static mpc_bool_t canseek_impl(void *data)
+static mpc_bool_t canseek_impl(mpc_reader *data)
 {
-       struct input_plugin_data *ip_data = data;
+       struct input_plugin_data *ip_data = data->data;
 
        return !ip_data->remote;
 }
@@ -108,23 +108,19 @@
        priv->reader.canseek = canseek_impl;
        priv->reader.data = ip_data;
 
-       /* must be before mpc_streaminfo_read() */
+       /* must be before populating the streaminfo structure */
        ip_data->private = priv;
 
-       /* read file's streaminfo data */
-       mpc_streaminfo_init(&priv->info);
-       if (mpc_streaminfo_read(&priv->info, &priv->reader) != ERROR_CODE_OK) {
-               free(priv);
-               return -IP_ERROR_FILE_FORMAT;
-       }
-
        /* instantiate a decoder with our file reader */
-       mpc_decoder_setup(&priv->decoder, &priv->reader);
-       if (!mpc_decoder_initialize(&priv->decoder, &priv->info)) {
+       priv->decoder = mpc_demux_init(&priv->reader);
+       if (!priv->decoder) {
+               mpc_demux_exit (priv->decoder);
                free(priv);
                return -IP_ERROR_FILE_FORMAT;
        }
 
+       mpc_demux_get_info(priv->decoder, &priv->info);
+
        priv->samples_avail = 0;
        priv->samples_pos = 0;
 
@@ -137,6 +133,7 @@
 {
        struct mpc_private *priv = ip_data->private;
 
+       mpc_demux_exit (priv->decoder);
        free(priv);
        ip_data->private = NULL;
        return 0;
@@ -184,23 +181,25 @@
 static int mpc_read(struct input_plugin_data *ip_data, char *buffer, int count)
 {
        struct mpc_private *priv = ip_data->private;
+       mpc_status status;
+       mpc_frame_info frame;
+       int samples;
+
+       frame.buffer = priv->samples;
 
-       if (priv->samples_avail == 0) {
-               uint32_t status = mpc_decoder_decode(&priv->decoder, 
priv->samples, NULL, NULL);
+       while (priv->samples_avail == 0) {
+               status = mpc_demux_decode(priv->decoder, &frame);
 
-               if (status == (uint32_t)(-1)) {
-                       /* right ret val? */
+               if (status != MPC_STATUS_OK) {
                        return -IP_ERROR_ERRNO;
                }
-               if (status == 0) {
+               if (frame.bits == -1) {
                        /* EOF */
                        return 0;
                }
 
-               /* status seems to be number of _frames_
-                * the api documentation is wrong
-                */
-               priv->samples_avail = status * priv->info.channels;
+               samples = frame.samples;
+               priv->samples_avail = samples * priv->info.channels;
        }
        return scale(ip_data, buffer, count);
 }
@@ -212,7 +211,7 @@
        priv->samples_pos = 0;
        priv->samples_avail = 0;
 
-       if (mpc_decoder_seek_seconds(&priv->decoder, offset))
+       if (mpc_demux_seek_second(priv->decoder, offset) == MPC_STATUS_OK)
                return 0;
        return -1;
 }
@@ -281,7 +280,7 @@
        /* priv->info.pcm_samples seems to be number of frames
         * priv->info.frames is _not_ pcm frames
         */
-       return priv->info.pcm_samples / priv->info.sample_freq;
+       return mpc_streaminfo_get_length(&priv->info);
 }
 
 const struct input_plugin_ops ip_ops = {

Reply via email to