# HG changeset patch # User jkeil # Date 995129935 0 # Node ID 18374d49befa649a57d0709782deb05798c21184 # Parent 7e52516cb3d705b5b9aaa52ab9e469c50bd2c868 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. diff -r 7e52516cb3d7 -r 18374d49befa dec_audio.c --- 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; diff -r 7e52516cb3d7 -r 18374d49befa libao2/ao_sun.c --- 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) {