summaryrefslogtreecommitdiffstats
path: root/libao2/ao_sun.c
diff options
context:
space:
mode:
authorjkeil <jkeil@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-07-14 16:58:55 +0000
committerjkeil <jkeil@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-07-14 16:58:55 +0000
commit61bce79d66481ba912d398cb96f313f104e9fe31 (patch)
treee051e4ee75d58c00a1431e80b3f7c1038e6a17e7 /libao2/ao_sun.c
parent7b813ca0ec725307c44d8663908da63f74c33035 (diff)
downloadmpv-61bce79d66481ba912d398cb96f313f104e9fe31.tar.bz2
mpv-61bce79d66481ba912d398cb96f313f104e9fe31.tar.xz
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. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1321 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2/ao_sun.c')
-rw-r--r--libao2/ao_sun.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/libao2/ao_sun.c b/libao2/ao_sun.c
index 58b075e98a..b723fd9ea4 100644
--- a/libao2/ao_sun.c
+++ b/libao2/ao_sun.c
@@ -72,6 +72,7 @@ static int oss2sunfmt(int oss_format)
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 @@ static int init(int rate,int channels,int format,int flags){
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 @@ static void reset(){
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 @@ static int get_space(){
// 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 @@ static int play(void* data,int len,int flags){
swab(data, swab_buf, len);
data = swab_buf;
}
-#endif
len = write(audio_fd, data, len);
if(len > 0) {