Author: adrian
Update of /cvs/free/rpms/mpd/devel
In directory se02.es.rpmfusion.net:/tmp/cvs-serv32137
Modified Files:
.cvsignore mpd.spec sources
Added Files:
6a071efa2794806ad5a2a62f0fcdee4b1843b41f.patch
mpd.git-00503c9251141b427457c17a9677444bf29c3992.patch
mpd.git-9e9d7b73d2165f197eeec12ee953add5f49746b7.patch
mpd.git-f3a5b753ae053eb1a862343b0fd3d62973cacc18.patch
Log Message:
* Tue Aug 25 2009 Adrian Reber <adrian(a)lisas.de> - 0.15.2
- updated to 0.15.2
- applied patches from David Woodhouse to fix
"mpd fails to play to usb audio device" (#731)
- fix description (#765)
6a071efa2794806ad5a2a62f0fcdee4b1843b41f.patch:
--- NEW FILE 6a071efa2794806ad5a2a62f0fcdee4b1843b41f.patch ---
From 6a071efa2794806ad5a2a62f0fcdee4b1843b41f Mon Sep 17 00:00:00 2001
From: Max Kellermann<max(a)duempel.org>
Date: Wed, 22 Jul 2009 13:56:36 +0000
Subject: audio_format: initialize reverse_endian in audio_format_init()
This line was missing in the reverse_endian patch, and led to
undefined values and crashes in that attribute.
---
diff --git a/src/audio_format.h b/src/audio_format.h
index 54514ff..6373d1e 100644
--- a/src/audio_format.h
+++ b/src/audio_format.h
@@ -45,6 +45,7 @@ static inline void audio_format_init(struct audio_format *af,
af->sample_rate = sample_rate;
af->bits = bits;
af->channels = channels;
+ af->reverse_endian = 0;
}
static inline bool audio_format_defined(const struct audio_format *af)
--
cgit v0.8.1-8-g7b5c
mpd.git-00503c9251141b427457c17a9677444bf29c3992.patch:
--- NEW FILE mpd.git-00503c9251141b427457c17a9677444bf29c3992.patch ---
From 00503c9251141b427457c17a9677444bf29c3992 Mon Sep 17 00:00:00 2001
From: David Woodhouse <David.Woodhouse(a)intel.com>
Date: Sun, 19 Jul 2009 16:43:08 +0100
Subject: [PATCH 1/1] Support wrong-endian ALSA output
---
src/output/alsa_plugin.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index 818c83c..9f5c53b 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -183,6 +183,19 @@ get_bitformat(const struct audio_format *af)
return SND_PCM_FORMAT_UNKNOWN;
}
+static snd_pcm_format_t
+byteswap_bitformat(snd_pcm_format_t fmt)
+{
+ switch(fmt) {
+ case SND_PCM_FORMAT_S16_LE: return SND_PCM_FORMAT_S16_BE;
+ case SND_PCM_FORMAT_S24_LE: return SND_PCM_FORMAT_S24_BE;
+ case SND_PCM_FORMAT_S32_LE: return SND_PCM_FORMAT_S32_BE;
+ case SND_PCM_FORMAT_S16_BE: return SND_PCM_FORMAT_S16_LE;
+ case SND_PCM_FORMAT_S24_BE: return SND_PCM_FORMAT_S24_LE;
+ case SND_PCM_FORMAT_S32_BE: return SND_PCM_FORMAT_S32_LE;
+ }
+ return SND_PCM_FORMAT_UNKNOWN;
+}
/**
* Set up the snd_pcm_t object which was opened by the caller. Set up
* the configured settings and the audio format.
@@ -208,7 +221,6 @@ alsa_setup(struct alsa_data *ad, struct audio_format *audio_format,
configure_hw:
/* configure HW params */
snd_pcm_hw_params_alloca(&hwparams);
-
cmd = "snd_pcm_hw_params_any";
err = snd_pcm_hw_params_any(ad->pcm, hwparams);
if (err < 0)
@@ -236,13 +248,37 @@ configure_hw:
}
err = snd_pcm_hw_params_set_format(ad->pcm, hwparams, bitformat);
+ if (err == -EINVAL) {
+ snd_pcm_format_t fmt = byteswap_bitformat(bitformat);
+ err = snd_pcm_hw_params_set_format(ad->pcm, hwparams, fmt);
+ if (err == 0) {
+ g_debug("ALSA device \"%s\": converting %u bit to
reverse-endian\n",
+ alsa_device(ad), audio_format->bits);
+ audio_format->reverse_endian = 1;
+ }
+ }
if (err == -EINVAL && (audio_format->bits == 24 ||
audio_format->bits == 16)) {
/* fall back to 32 bit, let pcm_convert.c do the conversion */
err = snd_pcm_hw_params_set_format(ad->pcm, hwparams,
SND_PCM_FORMAT_S32);
- if (err == 0)
+ if (err == 0) {
+ g_debug("ALSA device \"%s\": converting %u bit to 32 bit\n",
+ alsa_device(ad), audio_format->bits);
+ audio_format->bits = 32;
+ }
+ }
+ if (err == -EINVAL && (audio_format->bits == 24 ||
+ audio_format->bits == 16)) {
+ /* fall back to 32 bit, let pcm_convert.c do the conversion */
+ err = snd_pcm_hw_params_set_format(ad->pcm, hwparams,
+ byteswap_bitformat(SND_PCM_FORMAT_S32));
+ if (err == 0) {
+ g_debug("ALSA device \"%s\": converting %u bit to 32 bit
backward-endian\n",
+ alsa_device(ad), audio_format->bits);
audio_format->bits = 32;
+ audio_format->reverse_endian = 1;
+ }
}
if (err == -EINVAL && audio_format->bits != 16) {
@@ -255,6 +291,17 @@ configure_hw:
audio_format->bits = 16;
}
}
+ if (err == -EINVAL && audio_format->bits != 16) {
+ /* fall back to 16 bit, let pcm_convert.c do the conversion */
+ err = snd_pcm_hw_params_set_format(ad->pcm, hwparams,
+ byteswap_bitformat(SND_PCM_FORMAT_S16));
+ if (err == 0) {
+ g_debug("ALSA device \"%s\": converting %u bit to 16 bit
backward-endian\n",
+ alsa_device(ad), audio_format->bits);
+ audio_format->bits = 16;
+ audio_format->reverse_endian = 1;
+ }
+ }
if (err < 0) {
g_set_error(error, alsa_output_quark(), err,
@@ -470,6 +517,7 @@ static size_t
alsa_play(void *data, const void *chunk, size_t size, GError **error)
{
struct alsa_data *ad = data;
+ int i;
size /= ad->frame_size;
--
1.6.2.5
mpd.git-9e9d7b73d2165f197eeec12ee953add5f49746b7.patch:
--- NEW FILE mpd.git-9e9d7b73d2165f197eeec12ee953add5f49746b7.patch ---
From 9e9d7b73d2165f197eeec12ee953add5f49746b7 Mon Sep 17 00:00:00 2001
From: David Woodhouse <David.Woodhouse(a)intel.com>
Date: Sun, 19 Jul 2009 16:24:43 +0100
Subject: [PATCH 1/1] Add audio_format_init() function
---
src/audio_format.h | 9 +++++++++
src/audio_parser.c | 10 +++++++---
src/decoder/_flac_common.c | 5 ++---
src/decoder/audiofile_plugin.c | 8 +++-----
src/decoder/faad_plugin.c | 6 +-----
src/decoder/ffmpeg_plugin.c | 9 +++++----
src/decoder/mad_plugin.c | 10 ++--------
src/decoder/mikmod_plugin.c | 4 +---
src/decoder/modplug_plugin.c | 4 +---
src/decoder/mp4ff_plugin.c | 6 +-----
src/decoder/mpcdec_plugin.c | 4 +---
src/decoder/sidplay_plugin.cxx | 4 +---
src/decoder/sndfile_decoder_plugin.c | 4 +---
src/decoder/vorbis_plugin.c | 3 +--
src/decoder/wavpack_plugin.c | 6 +++---
test/run_encoder.c | 8 +++-----
test/run_filter.c | 8 +++-----
test/run_output.c | 8 +++-----
test/software_volume.c | 7 ++-----
19 files changed, 50 insertions(+), 73 deletions(-)
diff --git a/src/audio_format.h b/src/audio_format.h
index 64087d0..e325c1b 100644
--- a/src/audio_format.h
+++ b/src/audio_format.h
@@ -36,6 +36,15 @@ static inline void audio_format_clear(struct audio_format *af)
af->channels = 0;
}
+static inline void audio_format_init(struct audio_format *af,
+ uint32_t sample_rate,
+ uint8_t bits, uint8_t channels)
+{
+ af->sample_rate = sample_rate;
+ af->bits = bits;
+ af->channels = channels;
+}
+
static inline bool audio_format_defined(const struct audio_format *af)
{
return af->sample_rate != 0;
diff --git a/src/audio_parser.c b/src/audio_parser.c
index 906b0f8..d29f5f4 100644
--- a/src/audio_parser.c
+++ b/src/audio_parser.c
@@ -41,6 +41,8 @@ audio_format_parse(struct audio_format *dest, const char *src, GError
**error)
{
char *endptr;
unsigned long value;
+ uint32_t rate;
+ uint8_t bits, channels;
audio_format_clear(dest);
@@ -61,7 +63,7 @@ audio_format_parse(struct audio_format *dest, const char *src, GError
**error)
return false;
}
- dest->sample_rate = value;
+ rate = value;
/* parse sample format */
@@ -81,7 +83,7 @@ audio_format_parse(struct audio_format *dest, const char *src, GError
**error)
return false;
}
- dest->bits = value;
+ bits = value;
/* parse channel count */
@@ -93,7 +95,9 @@ audio_format_parse(struct audio_format *dest, const char *src, GError
**error)
return false;
}
- dest->channels = value;
+ channels = value;
+
+ audio_format_init(dest, rate, bits, channels);
return true;
}
diff --git a/src/decoder/_flac_common.c b/src/decoder/_flac_common.c
index 713dfe9..7b34538 100644
--- a/src/decoder/_flac_common.c
+++ b/src/decoder/_flac_common.c
@@ -195,9 +195,8 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block,
switch (block->type) {
case FLAC__METADATA_TYPE_STREAMINFO:
- data->audio_format.bits = (int8_t)si->bits_per_sample;
- data->audio_format.sample_rate = si->sample_rate;
- data->audio_format.channels = (int8_t)si->channels;
+ audio_format_init(&data->audio_format, si->sample_rate,
+ si->bits_per_sample, si->channels);
data->total_time = ((float)si->total_samples) / (si->sample_rate);
break;
case FLAC__METADATA_TYPE_VORBIS_COMMENT:
diff --git a/src/decoder/audiofile_plugin.c b/src/decoder/audiofile_plugin.c
index f66d90d..b4959f6 100644
--- a/src/decoder/audiofile_plugin.c
+++ b/src/decoder/audiofile_plugin.c
@@ -136,11 +136,9 @@ audiofile_stream_decode(struct decoder *decoder, struct input_stream
*is)
afSetVirtualSampleFormat(af_fp, AF_DEFAULT_TRACK,
AF_SAMPFMT_TWOSCOMP, bits);
afGetVirtualSampleFormat(af_fp, AF_DEFAULT_TRACK, &fs, &bits);
- audio_format.bits = (uint8_t)bits;
- audio_format.sample_rate =
- (unsigned int)afGetRate(af_fp, AF_DEFAULT_TRACK);
- audio_format.channels =
- (uint8_t)afGetVirtualChannels(af_fp, AF_DEFAULT_TRACK);
+
+ audio_format_init(&audio_format, afGetRate(af_fp, AF_DEFAULT_TRACK),
+ bits, afGetVirtualChannels(af_fp, AF_DEFAULT_TRACK));
if (!audio_format_valid(&audio_format)) {
g_warning("Invalid audio format: %u:%u:%u\n",
diff --git a/src/decoder/faad_plugin.c b/src/decoder/faad_plugin.c
index d0537dd..1b8b2b7 100644
--- a/src/decoder/faad_plugin.c
+++ b/src/decoder/faad_plugin.c
@@ -262,11 +262,7 @@ faad_decoder_init(faacDecHandle decoder, struct decoder_buffer
*buffer,
decoder_buffer_consume(buffer, nbytes);
- *audio_format = (struct audio_format){
- .bits = 16,
- .channels = channels,
- .sample_rate = sample_rate,
- };
+ audio_format_init(audio_format, sample_rate, 16, channels);
return true;
}
diff --git a/src/decoder/ffmpeg_plugin.c b/src/decoder/ffmpeg_plugin.c
index 03c46a7..f6003d2 100644
--- a/src/decoder/ffmpeg_plugin.c
+++ b/src/decoder/ffmpeg_plugin.c
@@ -267,6 +267,7 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx)
struct audio_format audio_format;
enum decoder_command cmd;
int total_time;
+ uint8_t bits;
total_time = 0;
@@ -275,13 +276,13 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx)
}
#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(41<<8)+0)
- audio_format.bits = (uint8_t)
av_get_bits_per_sample_format(codec_context->sample_fmt);
+ bits = (uint8_t) av_get_bits_per_sample_format(codec_context->sample_fmt);
#else
/* XXX fixme 16-bit for older ffmpeg (13 Aug 2007) */
- audio_format.bits = (uint8_t) 16;
+ bits = (uint8_t) 16;
#endif
- audio_format.sample_rate = (unsigned int)codec_context->sample_rate;
- audio_format.channels = codec_context->channels;
+ audio_format_init(&audio_format, codec_context->sample_rate, bits,
+ codec_context->channels);
if (!audio_format_valid(&audio_format)) {
g_warning("Invalid audio format: %u:%u:%u\n",
diff --git a/src/decoder/mad_plugin.c b/src/decoder/mad_plugin.c
index c6b9d32..85f4506 100644
--- a/src/decoder/mad_plugin.c
+++ b/src/decoder/mad_plugin.c
@@ -1148,13 +1148,6 @@ mp3_read(struct mp3_data *data, struct replay_gain_info
**replay_gain_info_r)
return ret != DECODE_BREAK;
}
-static void mp3_audio_format(struct mp3_data *data, struct audio_format *af)
-{
- af->bits = 24;
- af->sample_rate = (data->frame).header.samplerate;
- af->channels = MAD_NCHANNELS(&(data->frame).header);
-}
-
static void
mp3_decode(struct decoder *decoder, struct input_stream *input_stream)
{
@@ -1170,7 +1163,8 @@ mp3_decode(struct decoder *decoder, struct input_stream
*input_stream)
return;
}
- mp3_audio_format(&data, &audio_format);
+ audio_format_init(&audio_format, data.frame.header.samplerate, 24,
+ MAD_NCHANNELS(&data.frame.header));
decoder_initialized(decoder, &audio_format,
data.input_stream->seekable, data.total_time);
diff --git a/src/decoder/mikmod_plugin.c b/src/decoder/mikmod_plugin.c
index 065c343..e7b7bfb 100644
--- a/src/decoder/mikmod_plugin.c
+++ b/src/decoder/mikmod_plugin.c
@@ -175,9 +175,7 @@ mod_decode(struct decoder *decoder, const char *path)
return;
}
- audio_format.bits = 16;
- audio_format.sample_rate = 44100;
- audio_format.channels = 2;
+ audio_format_init(&audio_format, 44100, 16, 2);
secPerByte =
1.0 / ((audio_format.bits * audio_format.channels / 8.0) *
diff --git a/src/decoder/modplug_plugin.c b/src/decoder/modplug_plugin.c
index 31f0a47..6c375e6 100644
--- a/src/decoder/modplug_plugin.c
+++ b/src/decoder/modplug_plugin.c
@@ -121,9 +121,7 @@ mod_decode(struct decoder *decoder, struct input_stream *is)
return;
}
- audio_format.bits = 16;
- audio_format.sample_rate = 44100;
- audio_format.channels = 2;
+ audio_format_init(&audio_format, 44100, 16, 2);
sec_perbyte =
1.0 / ((audio_format.bits * audio_format.channels / 8.0) *
diff --git a/src/decoder/mp4ff_plugin.c b/src/decoder/mp4ff_plugin.c
index cf93829..d2c63f9 100644
--- a/src/decoder/mp4ff_plugin.c
+++ b/src/decoder/mp4ff_plugin.c
@@ -131,11 +131,7 @@ mp4_faad_new(mp4ff_t *mp4fh, int *track_r, struct audio_format
*audio_format)
}
*track_r = track;
- *audio_format = (struct audio_format){
- .bits = 16,
- .channels = channels,
- .sample_rate = sample_rate,
- };
+ audio_format_init(audio_format, sample_rate, 16, channels);
if (!audio_format_valid(audio_format)) {
g_warning("Invalid audio format: %u:%u:%u\n",
diff --git a/src/decoder/mpcdec_plugin.c b/src/decoder/mpcdec_plugin.c
index 26349f9..a684da1 100644
--- a/src/decoder/mpcdec_plugin.c
+++ b/src/decoder/mpcdec_plugin.c
@@ -193,9 +193,7 @@ mpcdec_decode(struct decoder *mpd_decoder, struct input_stream *is)
mpc_demux_get_info(demux, &info);
#endif
- audio_format.bits = 24;
- audio_format.channels = info.channels;
- audio_format.sample_rate = info.sample_freq;
+ audio_format_init(&audio_format, info.sample_freq, 24, info.channels);
if (!audio_format_valid(&audio_format)) {
#ifndef MPC_IS_OLD_API
diff --git a/src/decoder/sidplay_plugin.cxx b/src/decoder/sidplay_plugin.cxx
index c62e6b4..54ab746 100644
--- a/src/decoder/sidplay_plugin.cxx
+++ b/src/decoder/sidplay_plugin.cxx
@@ -103,9 +103,7 @@ sidplay_file_decode(struct decoder *decoder, const char *path_fs)
/* initialize the MPD decoder */
struct audio_format audio_format;
- audio_format.sample_rate = 48000;
- audio_format.bits = 16;
- audio_format.channels = 2;
+ audio_format_init(&audio_format, 48000, 16, 2);
decoder_initialized(decoder, &audio_format, false, -1);
diff --git a/src/decoder/vorbis_plugin.c b/src/decoder/vorbis_plugin.c
index d4f81e9..bab1d57 100644
--- a/src/decoder/vorbis_plugin.c
+++ b/src/decoder/vorbis_plugin.c
@@ -324,8 +324,7 @@ vorbis_stream_decode(struct decoder *decoder,
vorbis_info *vi = ov_info(&vf, -1);
struct replay_gain_info *new_rgi;
- audio_format.channels = vi->channels;
- audio_format.sample_rate = vi->rate;
+ audio_format_init(&audio_format, vi->rate, 16, vi->channels);
if (!audio_format_valid(&audio_format)) {
g_warning("Invalid audio format: %u:%u:%u\n",
diff --git a/src/decoder/wavpack_plugin.c b/src/decoder/wavpack_plugin.c
index 821536f..f3d7011 100644
--- a/src/decoder/wavpack_plugin.c
+++ b/src/decoder/wavpack_plugin.c
@@ -145,9 +145,9 @@ wavpack_decode(struct decoder *decoder, WavpackContext *wpc, bool
can_seek,
int bytes_per_sample, output_sample_size;
int position;
- audio_format.sample_rate = WavpackGetSampleRate(wpc);
- audio_format.channels = WavpackGetReducedChannels(wpc);
- audio_format.bits = WavpackGetBitsPerSample(wpc);
+ audio_format_init(&audio_format, WavpackGetSampleRate(wpc),
+ WavpackGetBitsPerSample(wpc),
+ WavpackGetReducedChannels(wpc));
/* round bitwidth to 8-bit units */
audio_format.bits = (audio_format.bits + 7) & (~7);
diff --git a/test/run_encoder.c b/test/run_encoder.c
index 8cb1c6d..a9b00e9 100644
--- a/test/run_encoder.c
+++ b/test/run_encoder.c
@@ -41,11 +41,7 @@ encoder_to_stdout(struct encoder *encoder)
int main(int argc, char **argv)
{
GError *error = NULL;
- struct audio_format audio_format = {
- .sample_rate = 44100,
- .bits = 16,
- .channels = 2,
- };
+ struct audio_format audio_format;
bool ret;
const char *encoder_name;
const struct encoder_plugin *plugin;
@@ -66,6 +62,8 @@ int main(int argc, char **argv)
else
encoder_name = "vorbis";
+ audio_format_init(&audio_format, 44100, 16, 2);
+
/* create the encoder */
plugin = encoder_plugin_get(encoder_name);
diff --git a/test/run_output.c b/test/run_output.c
index adf6e1d..a280f88 100644
--- a/test/run_output.c
+++ b/test/run_output.c
@@ -100,11 +100,7 @@ load_audio_output(struct audio_output *ao, const char *name)
int main(int argc, char **argv)
{
struct audio_output ao;
- struct audio_format audio_format = {
- .sample_rate = 44100,
- .bits = 16,
- .channels = 2,
- };
+ struct audio_format audio_format;
bool success;
GError *error = NULL;
char buffer[4096];
@@ -116,6 +112,8 @@ int main(int argc, char **argv)
return 1;
}
+ audio_format_init(&audio_format, 44100, 16, 2);
+
g_thread_init(NULL);
/* read configuration file (mpd.conf) */
diff --git a/test/software_volume.c b/test/software_volume.c
index 9a9fd56..9e8c8e7 100644
--- a/test/software_volume.c
+++ b/test/software_volume.c
@@ -35,11 +35,7 @@
int main(int argc, char **argv)
{
GError *error = NULL;
- struct audio_format audio_format = {
- .sample_rate = 48000,
- .bits = 16,
- .channels = 2,
- };
+ struct audio_format audio_format;
bool ret;
static char buffer[4096];
ssize_t nbytes;
@@ -57,6 +53,7 @@ int main(int argc, char **argv)
return 1;
}
}
+ audio_format_init(&audio_format, 48000, 16, 2);
while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) {
pcm_volume(buffer, nbytes, &audio_format, PCM_VOLUME_1 / 2);
--
1.6.2.5
mpd.git-f3a5b753ae053eb1a862343b0fd3d62973cacc18.patch:
--- NEW FILE mpd.git-f3a5b753ae053eb1a862343b0fd3d62973cacc18.patch ---
From f3a5b753ae053eb1a862343b0fd3d62973cacc18 Mon Sep 17 00:00:00 2001
From: David Woodhouse <David.Woodhouse(a)intel.com>
Date: Sun, 19 Jul 2009 16:42:19 +0100
Subject: [PATCH] Add reverse_endian field to struct audio_format and handle conversion
---
Makefile.am | 2 +
src/audio_format.h | 5 ++-
src/filter/convert_filter_plugin.c | 1 +
src/output_thread.c | 10 +++--
src/pcm_byteswap.c | 71 ++++++++++++++++++++++++++++++++++++
src/pcm_byteswap.h | 50 +++++++++++++++++++++++++
src/pcm_convert.c | 18 +++++++++
7 files changed, 152 insertions(+), 5 deletions(-)
create mode 100644 src/pcm_byteswap.c
create mode 100644 src/pcm_byteswap.h
diff --git a/Makefile.am b/Makefile.am
index 5c53ca5..e53dfb1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -114,6 +114,7 @@ mpd_headers = \
src/pcm_convert.h \
src/pcm_volume.h \
src/pcm_mix.h \
+ src/pcm_byteswap.h \
src/pcm_channels.h \
src/pcm_format.h \
src/pcm_resample.h \
@@ -218,6 +219,7 @@ src_mpd_SOURCES = \
src/pcm_convert.c \
src/pcm_volume.c \
src/pcm_mix.c \
+ src/pcm_byteswap.c \
src/pcm_channels.c \
src/pcm_format.c \
src/pcm_resample.c \
diff --git a/src/audio_format.h b/src/audio_format.h
index e325c1b..54514ff 100644
--- a/src/audio_format.h
+++ b/src/audio_format.h
@@ -27,6 +27,7 @@ struct audio_format {
uint32_t sample_rate;
uint8_t bits;
uint8_t channels;
+ uint8_t reverse_endian;
};
static inline void audio_format_clear(struct audio_format *af)
@@ -34,6 +35,7 @@ static inline void audio_format_clear(struct audio_format *af)
af->sample_rate = 0;
af->bits = 0;
af->channels = 0;
+ af->reverse_endian = 0;
}
static inline void audio_format_init(struct audio_format *af,
@@ -97,7 +99,8 @@ static inline bool audio_format_equals(const struct audio_format *a,
{
return a->sample_rate == b->sample_rate &&
a->bits == b->bits &&
- a->channels == b->channels;
+ a->channels == b->channels &&
+ a->reverse_endian == b->reverse_endian;
}
/**
diff --git a/src/pcm_byteswap.c b/src/pcm_byteswap.c
new file mode 100644
index 0000000..6bdec1f
--- /dev/null
+++ b/src/pcm_byteswap.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2003-2009 The Music Player Daemon Project
+ *
http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "pcm_byteswap.h"
+#include "pcm_buffer.h"
+
+#include <glib.h>
+
+#include <assert.h>
+
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "pcm"
+
+static inline uint16_t swab16(uint16_t x)
+{
+ return (x << 8) | (x >> 8);
+}
+
+const int16_t *pcm_byteswap_16(struct pcm_buffer *buffer,
+ const int16_t *src, size_t len)
+{
+ unsigned i;
+ int16_t *buf = pcm_buffer_get(buffer, len);
+
+ if (!buf)
+ return NULL;
+
+ for (i = 0; i < len / 2; i++)
+ buf[i] = swab16(src[i]);
+
+ return buf;
+}
+
+static inline uint32_t swab32(uint32_t x)
+{
+ return (x << 24) |
+ ((x & 0xff00) << 8) |
+ ((x & 0xff0000) >> 8) |
+ (x >> 24);
+}
+
+const int32_t *pcm_byteswap_32(struct pcm_buffer *buffer,
+ const int32_t *src, size_t len)
+{
+ unsigned i;
+ int32_t *buf = pcm_buffer_get(buffer, len);
+
+ if (!buf)
+ return NULL;
+
+ for (i = 0; i < len / 4; i++)
+ buf[i] = swab32(src[i]);
+
+ return buf;
+}
diff --git a/src/pcm_byteswap.h b/src/pcm_byteswap.h
new file mode 100644
index 0000000..e1196d9
--- /dev/null
+++ b/src/pcm_byteswap.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2003-2009 The Music Player Daemon Project
+ *
http://www.musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef MPD_PCM_BYTESWAP_H
+#define MPD_PCM_BYTESWAP_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+struct pcm_buffer;
+
+/**
+ * Changes the endianness of 16 bit PCM data.
+ *
+ * @param buffer the destination pcm_buffer object
+ * @param src the source PCM buffer
+ * @param src_size the number of bytes in #src
+ * @return the destination buffer
+ */
+const int16_t *pcm_byteswap_16(struct pcm_buffer *buffer,
+ const int16_t *src, size_t len);
+
+/**
+ * Changes the endianness of 32-bit (or 24-bit) PCM data.
+ *
+ * @param buffer the destination pcm_buffer object
+ * @param src the source PCM buffer
+ * @param src_size the number of bytes in #src
+ * @return the destination buffer
+ */
+const int32_t *pcm_byteswap_32(struct pcm_buffer *buffer,
+ const int32_t *src, size_t len);
+
+#endif
diff --git a/src/pcm_convert.c b/src/pcm_convert.c
index ebb4adf..a96c338 100644
--- a/src/pcm_convert.c
+++ b/src/pcm_convert.c
@@ -83,6 +83,12 @@ pcm_convert_16(struct pcm_convert_state *state,
dest_format->sample_rate,
&len);
+ if (dest_format->reverse_endian) {
+ buf = pcm_byteswap_16(&state->format_buffer, buf, len);
+ if (!buf)
+ g_error("pcm_byteswap_16() failed");
+ }
+
*dest_size_r = len;
return buf;
}
@@ -120,6 +126,12 @@ pcm_convert_24(struct pcm_convert_state *state,
dest_format->sample_rate,
&len);
+ if (dest_format->reverse_endian) {
+ buf = pcm_byteswap_32(&state->format_buffer, buf, len);
+ if (!buf)
+ g_error("pcm_byteswap_32() failed");
+ }
+
*dest_size_r = len;
return buf;
}
@@ -157,6 +169,12 @@ pcm_convert_32(struct pcm_convert_state *state,
dest_format->sample_rate,
&len);
+ if (dest_format->reverse_endian) {
+ buf = pcm_byteswap_32(&state->format_buffer, buf, len);
+ if (!buf)
+ g_error("pcm_byteswap_32() failed");
+ }
+
*dest_size_r = len;
return buf;
}
--
1.6.2.5
Index: .cvsignore
===================================================================
RCS file: /cvs/free/rpms/mpd/devel/.cvsignore,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- .cvsignore 29 Jun 2009 12:13:10 -0000 1.5
+++ .cvsignore 25 Aug 2009 11:59:29 -0000 1.6
@@ -1 +1 @@
-mpd-0.15.tar.bz2
+mpd-0.15.2.tar.bz2
Index: mpd.spec
===================================================================
RCS file: /cvs/free/rpms/mpd/devel/mpd.spec,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- mpd.spec 29 Jun 2009 12:13:10 -0000 1.10
+++ mpd.spec 25 Aug 2009 11:59:29 -0000 1.11
@@ -1,13 +1,17 @@
Name: mpd
-Version: 0.15
+Version: 0.15.2
Release: 1%{?dist}
Summary: The Music Player Daemon
License: GPLv2+
Group: Applications/Multimedia
URL:
http://mpd.wikia.com/
-Source:
http://downloads.sourceforge.net/musicpd/mpd-0.15.tar.bz2
+Source:
http://downloads.sourceforge.net/musicpd/mpd-0.15.2.tar.bz2
Source1: mpd.init
Source2: 95-grant-audio-devices-to-mpd.fdi
+Patch0: mpd.git-9e9d7b73d2165f197eeec12ee953add5f49746b7.patch
+Patch1: mpd.git-f3a5b753ae053eb1a862343b0fd3d62973cacc18.patch
+Patch2: mpd.git-00503c9251141b427457c17a9677444bf29c3992.patch
+Patch3: 6a071efa2794806ad5a2a62f0fcdee4b1843b41f.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -38,6 +42,7 @@
BuildRequires: bzip2-devel
BuildRequires: zziplib-devel
BuildRequires: sqlite-devel
+BuildRequires: autoconf
Requires(pre): shadow-utils
Requires(post): chkconfig
Requires(preun): chkconfig /sbin/service
@@ -50,10 +55,15 @@
Vorbis, FLAC, Mod, AAC and wave files) and managing playlists. MPD is designed
for integrating a computer into a stereo system that provides control for music
playback over a local network. It is also makes a great desktop music player,
-especially if your a console junkie, like frontend options, or restart X often.
+especially if you are a console junkie, like frontend options or restart X often.
%prep
%setup -q
+%patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+autoreconf --force --install
%build
%configure --enable-mikmod --enable-bzip2 --enable-zip
@@ -149,6 +159,12 @@
%ghost %{_localstatedir}/lib/%{name}/mpdstate
%changelog
+* Tue Aug 25 2009 Adrian Reber <adrian(a)lisas.de> - 0.15.2
+- updated to 0.15.2
+- applied patches from David Woodhouse to fix
+ "mpd fails to play to usb audio device" (#731)
+- fix description (#765)
+
* Mon Jun 29 2009 Adrian Reber <adrian(a)lisas.de> - 0.15-1
- updated to 0.15
- added "Conflicts: mpich2" (#593)
Index: sources
===================================================================
RCS file: /cvs/free/rpms/mpd/devel/sources,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- sources 29 Jun 2009 12:13:10 -0000 1.5
+++ sources 25 Aug 2009 11:59:29 -0000 1.6
@@ -1 +1 @@
-2ed93a60bd703ba46d6794e12cfb5f1d mpd-0.15.tar.bz2
+869779fdf592ac45d067c7dec228cb51 mpd-0.15.2.tar.bz2