changeset 1320:18374d49befa

On big-endian architectures, all audio decoders default to big-endian 16-bit audio sample format. Add support to play both big- and little-endian 16-bit audio format to the sun audio_out driver.
author jkeil
date Sat, 14 Jul 2001 16:58:55 +0000
parents 7e52516cb3d7
children 2712e787f872
files dec_audio.c libao2/ao_sun.c
diffstat 2 files changed, 22 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/dec_audio.c	Sat Jul 14 16:54:30 2001 +0000
+++ b/dec_audio.c	Sat Jul 14 16:58:55 2001 +0000
@@ -61,7 +61,11 @@
 extern int acm_decode_audio(sh_audio_t *sh_audio, void* a_buffer,int minlen,int maxlen);
 
 sh_audio->samplesize=2;
+#if WORDS_BIGENDIAN
+sh_audio->sample_format=AFMT_S16_BE;
+#else
 sh_audio->sample_format=AFMT_S16_LE;
+#endif
 sh_audio->samplerate=0;
 //sh_audio->pcm_bswap=0;
 
--- a/libao2/ao_sun.c	Sat Jul 14 16:54:30 2001 +0000
+++ b/libao2/ao_sun.c	Sat Jul 14 16:58:55 2001 +0000
@@ -72,6 +72,7 @@
 	return AUDIO_ENCODING_ULAW;
     case AFMT_A_LAW:
 	return AUDIO_ENCODING_ALAW;
+    case AFMT_S16_BE:
     case AFMT_S16_LE:
 	return AUDIO_ENCODING_LINEAR;
     case AFMT_U8:
@@ -248,7 +249,10 @@
 
     AUDIO_INITINFO(&info);
     info.play.encoding = oss2sunfmt(ao_format = format);
-    info.play.precision = (format==AFMT_S16_LE? AUDIO_PRECISION_16:AUDIO_PRECISION_8);
+    info.play.precision =
+	(format==AFMT_S16_LE || format==AFMT_S16_BE
+	 ? AUDIO_PRECISION_16
+	 : AUDIO_PRECISION_8);
     info.play.channels = ao_channels = channels;
     info.play.sample_rate = ao_samplerate = rate;
     if(ioctl (audio_fd, AUDIO_SETINFO, &info)<0)
@@ -331,7 +335,10 @@
 
     AUDIO_INITINFO(&info);
     info.play.encoding = oss2sunfmt(ao_format);
-    info.play.precision = (ao_format==AFMT_S16_LE? AUDIO_PRECISION_16:AUDIO_PRECISION_8);
+    info.play.precision =
+	(ao_format==AFMT_S16_LE || ao_format==AFMT_S16_BE 
+	 ? AUDIO_PRECISION_16
+	 : AUDIO_PRECISION_8);
     info.play.channels = ao_channels;
     info.play.sample_rate = ao_samplerate;
     info.play.samples = 0;
@@ -390,16 +397,22 @@
 // it should round it down to outburst*n
 // return: number of bytes played
 static int play(void* data,int len,int flags){
+#if	WORDS_BIGENDIAN
+    int native_endian = AFMT_S16_BE;
+#else
+    int native_endian = AFMT_S16_LE;
+#endif
 
     if (len < ao_outburst) return 0;
     len /= ao_outburst;
     len *= ao_outburst;
 
-#if	WORDS_BIGENDIAN
-    {
+    /* 16-bit format using the 'wrong' byteorder?  swap words */
+    if ((ao_format == AFMT_S16_LE || ao_format == AFMT_S16_BE)
+	&& ao_format != native_endian) {
 	static void *swab_buf;
 	static int swab_len;
-	if (ao_format == AFMT_S16_LE && len > swab_len) {
+	if (len > swab_len) {
 	    if (swab_buf)
 		swab_buf = realloc(swab_buf, len);
 	    else
@@ -410,7 +423,6 @@
 	swab(data, swab_buf, len);
 	data = swab_buf;
     }
-#endif
 
     len = write(audio_fd, data, len);
     if(len > 0) {