Content-Type: multipart/mixed; boundary="ikeVEW9yuYc//A+q" Content-Disposition: inline --ikeVEW9yuYc//A+q Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Feb 18, 2010 at 05:41:28AM +0100, Johannes Wei=C3=9Fl wrote: > I will post the patch soon. Here it is! I used the Debian patch from [1] and tested it with both versions of the library, so it should be pretty safe. [1] http://patch-tracker.debian.org/patch/misc/view/cmus/2.2.0-4.1/mpc.c --=20 Johannes Wei=C3=9Fl --ikeVEW9yuYc//A+q Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-mpc-now-also-works-with-SV8-libmpcdec.patch" Content-Transfer-Encoding: quoted-printable =46rom c8e04ee0d041f7717919f70708c75a31d29a3902 Mon Sep 17 00:00:00 2001 =46rom: =3D?UTF-8?q?Johannes=3D20Wei=3DC3=3D9Fl?=3D Date: Sat, 20 Feb 2010 04:00:51 +0100 Subject: [PATCH] mpc: now also works with SV8 libmpcdec --- configure | 3 ++ mpc.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----= --- 2 files changed, 77 insertions(+), 12 deletions(-) diff --git a/configure b/configure index 16d9fba..71bcbc6 100755 --- a/configure +++ b/configure @@ -95,6 +95,8 @@ check_ncurses() =20 check_mpc() { + check_header mpc/mpcdec.h + MPC_USE_OLD_HEADER=3D$? check_library MPC "" "-lmpcdec" return $? } @@ -346,6 +348,7 @@ config_header config/datadir.h DATADIR config_header config/libdir.h LIBDIR config_header config/debug.h DEBUG config_header config/tremor.h CONFIG_TREMOR +config_header config/mpc.h MPC_USE_OLD_HEADER config_header config/mp4.h MP4_USE_OLD_HEADER =20 makefile_vars bindir datadir libdir mandir exampledir diff --git a/mpc.c b/mpc.c index 68df486..2f020c0 100644 --- a/mpc.c +++ b/mpc.c @@ -10,13 +10,29 @@ #include "file.h" #include "xmalloc.h" #include "read_wrapper.h" +#include "config/mpc.h" =20 +#if !MPC_USE_OLD_HEADER +#include +#define callback_t mpc_reader +#define get_ip_data(d) (d)->data +#else #include +#define MPC_FALSE FALSE +#define MPC_TRUE TRUE +#define callback_t void +#define get_ip_data(d) (d) +#endif + #include #include =20 struct mpc_private { +#if !MPC_USE_OLD_HEADER + mpc_demux *decoder; +#else mpc_decoder decoder; +#endif mpc_reader reader; mpc_streaminfo info; =20 @@ -40,9 +56,9 @@ struct mpc_private { }; =20 /* callbacks */ -static mpc_int32_t read_impl(void *data, void *ptr, mpc_int32_t size) +static mpc_int32_t read_impl(callback_t *data, void *ptr, mpc_int32_t size) { - struct input_plugin_data *ip_data =3D data; + struct input_plugin_data *ip_data =3D get_ip_data(data); int rc; =20 rc =3D read_wrapper(ip_data, ptr, size); @@ -55,35 +71,35 @@ static mpc_int32_t read_impl(void *data, void *ptr, mpc= _int32_t size) return rc; } =20 -static mpc_bool_t seek_impl(void *data, mpc_int32_t offset) +static mpc_bool_t seek_impl(callback_t *data, mpc_int32_t offset) { - struct input_plugin_data *ip_data =3D data; + struct input_plugin_data *ip_data =3D get_ip_data(data); int rc; =20 rc =3D lseek(ip_data->fd, offset, SEEK_SET); if (rc =3D=3D -1) - return FALSE; - return TRUE; + return MPC_FALSE; + return MPC_TRUE; } =20 -static mpc_int32_t tell_impl(void *data) +static mpc_int32_t tell_impl(callback_t *data) { - struct input_plugin_data *ip_data =3D data; + struct input_plugin_data *ip_data =3D get_ip_data(data); =20 return lseek(ip_data->fd, 0, SEEK_CUR); } =20 -static mpc_int32_t get_size_impl(void *data) +static mpc_int32_t get_size_impl(callback_t *data) { - struct input_plugin_data *ip_data =3D data; + struct input_plugin_data *ip_data =3D get_ip_data(data); struct mpc_private *priv =3D ip_data->private; =20 return priv->file_size; } =20 -static mpc_bool_t canseek_impl(void *data) +static mpc_bool_t canseek_impl(callback_t *data) { - struct input_plugin_data *ip_data =3D data; + struct input_plugin_data *ip_data =3D get_ip_data(data); =20 return !ip_data->remote; } @@ -112,18 +128,28 @@ static int mpc_open(struct input_plugin_data *ip_data) ip_data->private =3D priv; =20 /* read file's streaminfo data */ +#if !MPC_USE_OLD_HEADER + priv->decoder =3D mpc_demux_init(&priv->reader); + if (!priv->decoder) { + mpc_demux_exit(priv->decoder); +#else mpc_streaminfo_init(&priv->info); if (mpc_streaminfo_read(&priv->info, &priv->reader) !=3D ERROR_CODE_OK) { +#endif free(priv); return -IP_ERROR_FILE_FORMAT; } =20 +#if !MPC_USE_OLD_HEADER + mpc_demux_get_info(priv->decoder, &priv->info); +#else /* instantiate a decoder with our file reader */ mpc_decoder_setup(&priv->decoder, &priv->reader); if (!mpc_decoder_initialize(&priv->decoder, &priv->info)) { free(priv); return -IP_ERROR_FILE_FORMAT; } +#endif =20 priv->samples_avail =3D 0; priv->samples_pos =3D 0; @@ -137,6 +163,9 @@ static int mpc_close(struct input_plugin_data *ip_data) { struct mpc_private *priv =3D ip_data->private; =20 +#if !MPC_USE_OLD_HEADER + mpc_demux_exit(priv->decoder); +#endif free(priv); ip_data->private =3D NULL; return 0; @@ -185,6 +214,29 @@ static int mpc_read(struct input_plugin_data *ip_data,= char *buffer, int count) { struct mpc_private *priv =3D ip_data->private; =20 +#if !MPC_USE_OLD_HEADER + mpc_status status; + mpc_frame_info frame; + int samples; + + frame.buffer =3D priv->samples; + + while (priv->samples_avail =3D=3D 0) { + status =3D mpc_demux_decode(priv->decoder, &frame); + + if (status !=3D MPC_STATUS_OK) { + return -IP_ERROR_ERRNO; + } + if (frame.bits =3D=3D -1) { + /* EOF */ + return 0; + } + + samples =3D frame.samples; + priv->samples_avail =3D samples * priv->info.channels; + } +#else + if (priv->samples_avail =3D=3D 0) { uint32_t status =3D mpc_decoder_decode(&priv->decoder, priv->samples, NU= LL, NULL); =20 @@ -202,6 +254,8 @@ static int mpc_read(struct input_plugin_data *ip_data, = char *buffer, int count) */ priv->samples_avail =3D status * priv->info.channels; } +#endif + return scale(ip_data, buffer, count); } =20 @@ -212,7 +266,11 @@ static int mpc_seek(struct input_plugin_data *ip_data,= double offset) priv->samples_pos =3D 0; priv->samples_avail =3D 0; =20 +#if !MPC_USE_OLD_HEADER + if (mpc_demux_seek_second(priv->decoder, offset) =3D=3D MPC_STATUS_OK) +#else if (mpc_decoder_seek_seconds(&priv->decoder, offset)) +#endif return 0; return -1; } @@ -281,7 +339,11 @@ static int mpc_duration(struct input_plugin_data *ip_d= ata) /* priv->info.pcm_samples seems to be number of frames * priv->info.frames is _not_ pcm frames */ +#if !MPC_USE_OLD_HEADER + return mpc_streaminfo_get_length(&priv->info); +#else return priv->info.pcm_samples / priv->info.sample_freq; +#endif } =20 const struct input_plugin_ops ip_ops =3D { --=20 1.6.6.1 --ikeVEW9yuYc//A+q--