diff --git a/libao2/ao_alsa1x.c b/libao2/ao_alsa1x.c index 0f35f2e819..f95d21a84b 100644 --- a/libao2/ao_alsa1x.c +++ b/libao2/ao_alsa1x.c @@ -125,9 +125,15 @@ static int init(int rate_hz, int channels, int format, int flags) case AFMT_U16_BE: alsa_format = SND_PCM_FORMAT_U16_BE; break; +#ifndef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_LE: alsa_format = SND_PCM_FORMAT_S16_LE; break; +#ifdef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_BE: alsa_format = SND_PCM_FORMAT_S16_BE; break; diff --git a/libao2/ao_alsa5.c b/libao2/ao_alsa5.c index 211bf6a7c2..13653306fb 100644 --- a/libao2/ao_alsa5.c +++ b/libao2/ao_alsa5.c @@ -87,9 +87,15 @@ static int init(int rate_hz, int channels, int format, int flags) case AFMT_U16_BE: alsa_format.format = SND_PCM_SFMT_U16_BE; break; +#ifndef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_LE: alsa_format.format = SND_PCM_SFMT_S16_LE; break; +#ifdef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_BE: alsa_format.format = SND_PCM_SFMT_S16_BE; break; diff --git a/libao2/ao_alsa9.c b/libao2/ao_alsa9.c index 0f35f2e819..f95d21a84b 100644 --- a/libao2/ao_alsa9.c +++ b/libao2/ao_alsa9.c @@ -125,9 +125,15 @@ static int init(int rate_hz, int channels, int format, int flags) case AFMT_U16_BE: alsa_format = SND_PCM_FORMAT_U16_BE; break; +#ifndef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_LE: alsa_format = SND_PCM_FORMAT_S16_LE; break; +#ifdef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_BE: alsa_format = SND_PCM_FORMAT_S16_BE; break; diff --git a/libao2/ao_nas.c b/libao2/ao_nas.c index 7a651324f7..8118e6256d 100644 --- a/libao2/ao_nas.c +++ b/libao2/ao_nas.c @@ -291,7 +291,13 @@ static unsigned char nas_aformat_to_auformat(unsigned int format) case AFMT_S8: return AuFormatLinearSigned8; case AFMT_U16_LE: return AuFormatLinearUnsigned16LSB; case AFMT_U16_BE: return AuFormatLinearUnsigned16MSB; +#ifndef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_LE: return AuFormatLinearSigned16LSB; +#ifdef WORDS_BIGENDIAN + case AFMT_AC3: +#endif case AFMT_S16_BE: return AuFormatLinearSigned16MSB; case AFMT_MU_LAW: return AuFormatULAW8; default: return 0; diff --git a/libao2/ao_oss.c b/libao2/ao_oss.c index 1ac3b79a5c..17e6fc4fd5 100644 --- a/libao2/ao_oss.c +++ b/libao2/ao_oss.c @@ -123,12 +123,18 @@ static int init(int rate,int channels,int format,int flags){ ao_data.samplerate=rate; ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); } - + +ac3_retry: ao_data.format=format; - ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format); - if(format == AFMT_AC3 && ao_data.format != AFMT_AC3) { - printf("Can't set audio device %s to AC3 output\n", dsp); - return 0; + if( ioctl(audio_fd, SNDCTL_DSP_SETFMT, &ao_data.format)<0 || + ao_data.format != format) if(format == AFMT_AC3){ + printf("Can't set audio device %s to AC3 output, trying S16...\n", dsp); +#ifdef WORDS_BIGENDIAN + format=AFMT_S16_BE; +#else + format=AFMT_S16_LE; +#endif + goto ac3_retry; } printf("audio_setup: sample format: %s (requested: %s)\n", audio_out_format_name(ao_data.format), audio_out_format_name(format));