summaryrefslogtreecommitdiffstats
path: root/libao2
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-01-06 22:56:54 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-01-06 22:56:54 +0000
commit40b127ae8dc0fc202b810fe931494ccc926e7270 (patch)
treea33ac49994aa6e6377b4f94276378864ab93a96d /libao2
parent6e2c3b96e53ab690f0fc1004ba4b115ebde1fb1d (diff)
downloadmpv-40b127ae8dc0fc202b810fe931494ccc926e7270.tar.bz2
mpv-40b127ae8dc0fc202b810fe931494ccc926e7270.tar.xz
Cleanup, removing internal conversions. Testing welcome.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14410 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2')
-rw-r--r--libao2/ao_sun.c50
1 files changed, 15 insertions, 35 deletions
diff --git a/libao2/ao_sun.c b/libao2/ao_sun.c
index 6065bdcdd5..da2d4e9e7c 100644
--- a/libao2/ao_sun.c
+++ b/libao2/ao_sun.c
@@ -57,7 +57,6 @@ static int queued_bursts = 0;
static int queued_samples = 0;
static int bytes_per_sample = 0;
static int byte_per_sec = 0;
-static int convert_u8_s8;
static int audio_fd = -1;
static enum {
RTSC_UNKNOWN = 0,
@@ -76,13 +75,14 @@ static int af2sunfmt(int format)
return AUDIO_ENCODING_ULAW;
case AF_FORMAT_A_LAW:
return AUDIO_ENCODING_ALAW;
- case AF_FORMAT_S16_BE:
- case AF_FORMAT_S16_LE:
+ case AF_FORMAT_S16_NE:
return AUDIO_ENCODING_LINEAR;
#ifdef AUDIO_ENCODING_LINEAR8 // Missing on SunOS 5.5.1...
case AF_FORMAT_U8:
return AUDIO_ENCODING_LINEAR8;
#endif
+ case AF_FORMAT_S8:
+ return AUDIO_ENCODING_LINEAR;
#ifdef AUDIO_ENCODING_DVI // Missing on NetBSD...
case AF_FORMAT_IMA_ADPCM:
return AUDIO_ENCODING_DVI;
@@ -457,7 +457,7 @@ static int init(int rate,int channels,int format,int flags){
audio_info_t info;
int pass;
int ok;
- char buf[128];
+ int convert_u8_s8;
setup_device_paths();
@@ -477,12 +477,15 @@ static int init(int rate,int channels,int format,int flags){
ioctl(audio_fd, AUDIO_DRAIN, 0);
+ if (af2sunfmt(format) == AUDIO_ENCODING_NONE)
+ format = AF_FORMAT_S16_NE;
+
for (ok = pass = 0; pass <= 5; pass++) { /* pass 6&7 not useful */
AUDIO_INITINFO(&info);
info.play.encoding = af2sunfmt(ao_data.format = format);
info.play.precision =
- (format==AF_FORMAT_S16_LE || format==AF_FORMAT_S16_BE
+ (format==AF_FORMAT_S16_NE
? AUDIO_PRECISION_16
: AUDIO_PRECISION_8);
info.play.channels = ao_data.channels = channels;
@@ -498,7 +501,9 @@ static int init(int rate,int channels,int format,int flags){
* Try S8, and if it works, use our own U8->S8 conversion before
* sending the samples to the sound driver.
*/
+#ifdef AUDIO_ENCODING_LINEAR8
if (info.play.encoding != AUDIO_ENCODING_LINEAR8)
+#endif
continue;
info.play.encoding = AUDIO_ENCODING_LINEAR;
convert_u8_s8 = 1;
@@ -545,11 +550,15 @@ static int init(int rate,int channels,int format,int flags){
}
if (!ok) {
+ char buf[128];
mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_SUN_UnsupSampleRate,
channels, af_fmt2str(format, buf, 128), rate);
return 0;
}
+ if (convert_u8_s8)
+ ao_data.format = AF_FORMAT_S8;
+
bytes_per_sample = channels * info.play.precision / 8;
ao_data.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate;
ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
@@ -628,7 +637,7 @@ static void reset(){
AUDIO_INITINFO(&info);
info.play.encoding = af2sunfmt(ao_data.format);
info.play.precision =
- (ao_data.format==AF_FORMAT_S16_LE || ao_data.format==AF_FORMAT_S16_BE
+ (ao_data.format==AF_FORMAT_S16_NE
? AUDIO_PRECISION_16
: AUDIO_PRECISION_8);
info.play.channels = ao_data.channels;
@@ -696,39 +705,10 @@ 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 = AF_FORMAT_S16_BE;
-#else
- int native_endian = AF_FORMAT_S16_LE;
-#endif
-
if (len < ao_data.outburst) return 0;
len /= ao_data.outburst;
len *= ao_data.outburst;
- /* 16-bit format using the 'wrong' byteorder? swap words */
- if ((ao_data.format == AF_FORMAT_S16_LE || ao_data.format == AF_FORMAT_S16_BE)
- && ao_data.format != native_endian) {
- static void *swab_buf;
- static int swab_len;
- if (len > swab_len) {
- if (swab_buf)
- swab_buf = realloc(swab_buf, len);
- else
- swab_buf = malloc(len);
- swab_len = len;
- if (swab_buf == NULL) return 0;
- }
- swab(data, swab_buf, len);
- data = swab_buf;
- } else if (ao_data.format == AF_FORMAT_U8 && convert_u8_s8) {
- int i;
- unsigned char *p = data;
-
- for (i = 0, p = data; i < len; i++, p++)
- *p ^= 0x80;
- }
-
len = write(audio_fd, data, len);
if(len > 0) {
queued_samples += len / bytes_per_sample;