diff options
-rw-r--r-- | configure.ac | 11 | ||||
-rw-r--r-- | src/decoder/MpcdecDecoderPlugin.cxx | 145 |
2 files changed, 35 insertions, 121 deletions
diff --git a/configure.ac b/configure.ac index 27a6d5f07..3037837d8 100644 --- a/configure.ac +++ b/configure.ac @@ -966,16 +966,7 @@ if test x$enable_mpc = xyes; then LIBS=$oldlibs CPPFLAGS=$oldcppflags - if test x$enable_mpc = xyes; then - AC_CHECK_HEADER([mpc/mpcdec.h], - [AC_DEFINE(HAVE_MPCDEC,1, - [Define to use libmpcdec for MPC decoding])], - [AC_CHECK_HEADER(mpcdec/mpcdec.h, - [AC_DEFINE(MPC_IS_OLD_API, 1, - [Define if an old pre-SV8 libmpcdec is used])] - )] - ) - else + if test x$enable_mpc != xyes; then AC_MSG_WARN([mpcdec lib needed for MPC support -- disabling MPC support]) fi fi diff --git a/src/decoder/MpcdecDecoderPlugin.cxx b/src/decoder/MpcdecDecoderPlugin.cxx index d4333a527..921d7d923 100644 --- a/src/decoder/MpcdecDecoderPlugin.cxx +++ b/src/decoder/MpcdecDecoderPlugin.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2011 The Music Player Daemon Project + * Copyright (C) 2003-2013 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -23,16 +23,12 @@ #include "CheckAudioFormat.hxx" #include "TagHandler.hxx" -#ifdef MPC_IS_OLD_API -#include <mpcdec/mpcdec.h> -#else #include <mpc/mpcdec.h> -#include <math.h> -#endif #include <glib.h> #include <assert.h> #include <unistd.h> +#include <math.h> #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "mpcdec" @@ -42,50 +38,47 @@ struct mpc_decoder_data { struct decoder *decoder; }; -#ifdef MPC_IS_OLD_API -#define cb_first_arg void *vdata -#define cb_data vdata -#else -#define cb_first_arg mpc_reader *reader -#define cb_data reader->data -#endif - static mpc_int32_t -mpc_read_cb(cb_first_arg, void *ptr, mpc_int32_t size) +mpc_read_cb(mpc_reader *reader, void *ptr, mpc_int32_t size) { - struct mpc_decoder_data *data = (struct mpc_decoder_data *) cb_data; + struct mpc_decoder_data *data = + (struct mpc_decoder_data *)reader->data; return decoder_read(data->decoder, data->is, ptr, size); } static mpc_bool_t -mpc_seek_cb(cb_first_arg, mpc_int32_t offset) +mpc_seek_cb(mpc_reader *reader, mpc_int32_t offset) { - struct mpc_decoder_data *data = (struct mpc_decoder_data *) cb_data; + struct mpc_decoder_data *data = + (struct mpc_decoder_data *)reader->data; return input_stream_lock_seek(data->is, offset, SEEK_SET, nullptr); } static mpc_int32_t -mpc_tell_cb(cb_first_arg) +mpc_tell_cb(mpc_reader *reader) { - struct mpc_decoder_data *data = (struct mpc_decoder_data *) cb_data; + struct mpc_decoder_data *data = + (struct mpc_decoder_data *)reader->data; return (long)input_stream_get_offset(data->is); } static mpc_bool_t -mpc_canseek_cb(cb_first_arg) +mpc_canseek_cb(mpc_reader *reader) { - struct mpc_decoder_data *data = (struct mpc_decoder_data *) cb_data; + struct mpc_decoder_data *data = + (struct mpc_decoder_data *)reader->data; return input_stream_is_seekable(data->is); } static mpc_int32_t -mpc_getsize_cb(cb_first_arg) +mpc_getsize_cb(mpc_reader *reader) { - struct mpc_decoder_data *data = (struct mpc_decoder_data *) cb_data; + struct mpc_decoder_data *data = + (struct mpc_decoder_data *)reader->data; return input_stream_get_size(data->is); } @@ -136,31 +129,13 @@ mpc_to_mpd_buffer(int32_t *dest, const MPC_SAMPLE_FORMAT *src, static void mpcdec_decode(struct decoder *mpd_decoder, struct input_stream *is) { -#ifdef MPC_IS_OLD_API - mpc_decoder decoder; -#else - mpc_demux *demux; - mpc_frame_info frame; - mpc_status status; -#endif - mpc_reader reader; - mpc_streaminfo info; - GError *error = nullptr; - struct audio_format audio_format; - - struct mpc_decoder_data data; - MPC_SAMPLE_FORMAT sample_buffer[MPC_DECODER_BUFFER_LENGTH]; - mpc_uint32_t ret; - int32_t chunk[G_N_ELEMENTS(sample_buffer)]; - long bit_rate = 0; - mpc_uint32_t vbr_update_bits; - enum decoder_command cmd = DECODE_COMMAND_NONE; - + struct mpc_decoder_data data; data.is = is; data.decoder = mpd_decoder; + mpc_reader reader; reader.read = mpc_read_cb; reader.seek = mpc_seek_cb; reader.tell = mpc_tell_cb; @@ -168,57 +143,33 @@ mpcdec_decode(struct decoder *mpd_decoder, struct input_stream *is) reader.canseek = mpc_canseek_cb; reader.data = &data; -#ifdef MPC_IS_OLD_API - mpc_streaminfo_init(&info); - - if ((ret = mpc_streaminfo_read(&info, &reader)) != ERROR_CODE_OK) { - if (decoder_get_command(mpd_decoder) != DECODE_COMMAND_STOP) - g_warning("Not a valid musepack stream\n"); - return; - } - - mpc_decoder_setup(&decoder, &reader); - - if (!mpc_decoder_initialize(&decoder, &info)) { - if (decoder_get_command(mpd_decoder) != DECODE_COMMAND_STOP) - g_warning("Not a valid musepack stream\n"); - return; - } -#else - demux = mpc_demux_init(&reader); + mpc_demux *demux = mpc_demux_init(&reader); if (demux == nullptr) { if (decoder_get_command(mpd_decoder) != DECODE_COMMAND_STOP) g_warning("Not a valid musepack stream"); return; } + mpc_streaminfo info; mpc_demux_get_info(demux, &info); -#endif + GError *error = nullptr; + struct audio_format audio_format; if (!audio_format_init_checked(&audio_format, info.sample_freq, SAMPLE_FORMAT_S24_P32, info.channels, &error)) { g_warning("%s", error->message); g_error_free(error); -#ifndef MPC_IS_OLD_API mpc_demux_exit(demux); -#endif return; } struct replay_gain_info replay_gain_info; replay_gain_info_init(&replay_gain_info); -#ifdef MPC_IS_OLD_API - replay_gain_info.tuples[REPLAY_GAIN_ALBUM].gain = info.gain_album * 0.01; - replay_gain_info.tuples[REPLAY_GAIN_ALBUM].peak = info.peak_album / 32767.0; - replay_gain_info.tuples[REPLAY_GAIN_TRACK].gain = info.gain_title * 0.01; - replay_gain_info.tuples[REPLAY_GAIN_TRACK].peak = info.peak_title / 32767.0; -#else replay_gain_info.tuples[REPLAY_GAIN_ALBUM].gain = MPC_OLD_GAIN_REF - (info.gain_album / 256.); replay_gain_info.tuples[REPLAY_GAIN_ALBUM].peak = pow(10, info.peak_album / 256. / 20) / 32767; replay_gain_info.tuples[REPLAY_GAIN_TRACK].gain = MPC_OLD_GAIN_REF - (info.gain_title / 256.); replay_gain_info.tuples[REPLAY_GAIN_TRACK].peak = pow(10, info.peak_title / 256. / 20) / 32767; -#endif decoder_replay_gain(mpd_decoder, &replay_gain_info); @@ -226,36 +177,26 @@ mpcdec_decode(struct decoder *mpd_decoder, struct input_stream *is) input_stream_is_seekable(is), mpc_streaminfo_get_length(&info)); + enum decoder_command cmd = DECODE_COMMAND_NONE; do { if (cmd == DECODE_COMMAND_SEEK) { mpc_int64_t where = decoder_seek_where(mpd_decoder) * audio_format.sample_rate; bool success; -#ifdef MPC_IS_OLD_API - success = mpc_decoder_seek_sample(&decoder, where); -#else success = mpc_demux_seek_sample(demux, where) == MPC_STATUS_OK; -#endif if (success) decoder_command_finished(mpd_decoder); else decoder_seek_error(mpd_decoder); } - vbr_update_bits = 0; - -#ifdef MPC_IS_OLD_API - mpc_uint32_t vbr_update_acc = 0; + mpc_uint32_t vbr_update_bits = 0; - ret = mpc_decoder_decode(&decoder, sample_buffer, - &vbr_update_acc, &vbr_update_bits); - if (ret == 0 || ret == (mpc_uint32_t)-1) - break; -#else + mpc_frame_info frame; frame.buffer = (MPC_SAMPLE_FORMAT *)sample_buffer; - status = mpc_demux_decode(demux, &frame); + mpc_status status = mpc_demux_decode(demux, &frame); if (status != MPC_STATUS_OK) { g_warning("Failed to decode sample"); break; @@ -264,14 +205,13 @@ mpcdec_decode(struct decoder *mpd_decoder, struct input_stream *is) if (frame.bits == -1) break; - ret = frame.samples; -#endif - + mpc_uint32_t ret = frame.samples; ret *= info.channels; + int32_t chunk[G_N_ELEMENTS(sample_buffer)]; mpc_to_mpd_buffer(chunk, sample_buffer, ret); - bit_rate = vbr_update_bits * audio_format.sample_rate + long bit_rate = vbr_update_bits * audio_format.sample_rate / 1152 / 1000; cmd = decoder_data(mpd_decoder, is, @@ -279,26 +219,17 @@ mpcdec_decode(struct decoder *mpd_decoder, struct input_stream *is) bit_rate); } while (cmd != DECODE_COMMAND_STOP); -#ifndef MPC_IS_OLD_API mpc_demux_exit(demux); -#endif } static float mpcdec_get_file_duration(struct input_stream *is) { - float total_time = -1; - - mpc_reader reader; -#ifndef MPC_IS_OLD_API - mpc_demux *demux; -#endif - mpc_streaminfo info; struct mpc_decoder_data data; - data.is = is; data.decoder = nullptr; + mpc_reader reader; reader.read = mpc_read_cb; reader.seek = mpc_seek_cb; reader.tell = mpc_tell_cb; @@ -306,23 +237,15 @@ mpcdec_get_file_duration(struct input_stream *is) reader.canseek = mpc_canseek_cb; reader.data = &data; -#ifdef MPC_IS_OLD_API - mpc_streaminfo_init(&info); - - if (mpc_streaminfo_read(&info, &reader) != ERROR_CODE_OK) - return -1; -#else - demux = mpc_demux_init(&reader); + mpc_demux *demux = mpc_demux_init(&reader); if (demux == nullptr) return -1; + mpc_streaminfo info; mpc_demux_get_info(demux, &info); mpc_demux_exit(demux); -#endif - - total_time = mpc_streaminfo_get_length(&info); - return total_time; + return mpc_streaminfo_get_length(&info); } static bool |