rpms/mpd/devel 6a071efa2794806ad5a2a62f0fcdee4b1843b41f.patch, NONE, 1.1 mpd.git-00503c9251141b427457c17a9677444bf29c3992.patch, NONE, 1.1 mpd.git-9e9d7b73d2165f197eeec12ee953add5f49746b7.patch, NONE, 1.1 mpd.git-f3a5b753ae053eb1a862343b0fd3d62973cacc18.patch, NONE, 1.1 .cvsignore, 1.5, 1.6 mpd.spec, 1.10, 1.11 sources, 1.5, 1.6

Adrian Reber adrian at rpmfusion.org
Tue Aug 25 13:59:29 CEST 2009


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 at 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 at 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 at 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 at 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 at 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 at 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 at 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



More information about the rpmfusion-commits mailing list