Mercurial > mplayer.hg
annotate libao2/ao_arts.c @ 24590:2c238fa777ff
ao_alsa: Fix get_space() return values larger than buffersize
After a buffer underrun the ALSA get_space() function sometimes returned
values larger than the ao had set in ao_data.buffersize. Fix this by
replacing the old check against MAX_OUTBURST by one against
ao_data.buffersize. There should be no need for the MAX_OUTBURST check;
the current MPlayer side should no longer have any constant limit on the
amount of data an ao can buffer or request at once.
The get_space() values larger than ao_data.buffersize triggered errors
in audio decoding causing the current attempt to fill audio buffers to
be aborted. I'm not sure how often that caused behavior noticeably worse
then an underrun already is.
author | uau |
---|---|
date | Mon, 24 Sep 2007 21:49:58 +0000 |
parents | f580a7755ac5 |
children | 0fdf04b07ecb |
rev | line source |
---|---|
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
1 /* |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
2 * ao_arts - aRts audio output driver for MPlayer |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
3 * |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
4 * Michele Balistreri <brain87@gmx.net> |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
5 * |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
6 * This driver is distribuited under terms of GPL |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
7 * |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
8 */ |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
9 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
10 #include <artsc.h> |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
11 #include <stdio.h> |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
12 |
14479 | 13 #include "config.h" |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
14 #include "audio_out.h" |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
15 #include "audio_out_internal.h" |
14245 | 16 #include "libaf/af_format.h" |
14123 | 17 #include "mp_msg.h" |
18 #include "help_mp.h" | |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
19 |
14245 | 20 #define OBTAIN_BITRATE(a) (((a != AF_FORMAT_U8) && (a != AF_FORMAT_S8)) ? 16 : 8) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
21 |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
22 /* Feel free to experiment with the following values: */ |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
23 #define ARTS_PACKETS 10 /* Number of audio packets */ |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
24 #define ARTS_PACKET_SIZE_LOG2 11 /* Log2 of audio packet size */ |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
25 |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
26 static arts_stream_t stream; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
27 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
28 static ao_info_t info = |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
29 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
30 "aRts audio output", |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
31 "arts", |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
32 "Michele Balistreri <brain87@gmx.net>", |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
33 "" |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
34 }; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
35 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
36 LIBAO_EXTERN(arts) |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
37 |
9633
12b1790038b0
64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents:
8576
diff
changeset
|
38 static int control(int cmd, void *arg) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
39 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
40 return(CONTROL_UNKNOWN); |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
41 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
42 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
43 static int init(int rate_hz, int channels, int format, int flags) |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
44 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
45 int err; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
46 int frag_spec; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
47 |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
6807
diff
changeset
|
48 if( (err=arts_init()) ) { |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12984
diff
changeset
|
49 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_ARTS_CantInit, arts_error_text(err)); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
50 return 0; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
51 } |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12984
diff
changeset
|
52 mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_ARTS_ServerConnect); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
53 |
8576
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
54 /* |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
55 * arts supports 8bit unsigned and 16bit signed sample formats |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
56 * (16bit apparently in little endian format, even in the case |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
57 * when artsd runs on a big endian cpu). |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
58 * |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
59 * Unsupported formats are translated to one of these two formats |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
60 * using mplayer's audio filters. |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
61 */ |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
62 switch (format) { |
14245 | 63 case AF_FORMAT_U8: |
64 case AF_FORMAT_S8: | |
65 format = AF_FORMAT_U8; | |
8576
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
66 break; |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
67 default: |
14245 | 68 format = AF_FORMAT_S16_LE; /* artsd always expects little endian?*/ |
8576
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
69 break; |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
70 } |
ed132c268686
- Fix 8-bit sound in arts audio driver (logic in OBTAIN_BITRATE macro was
jkeil
parents:
8123
diff
changeset
|
71 |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
72 ao_data.format = format; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
73 ao_data.channels = channels; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
74 ao_data.samplerate = rate_hz; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
75 ao_data.bps = (rate_hz*channels); |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
76 |
14245 | 77 if(format != AF_FORMAT_U8 && format != AF_FORMAT_S8) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
78 ao_data.bps*=2; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
79 |
12984 | 80 stream=arts_play_stream(rate_hz, OBTAIN_BITRATE(format), channels, "MPlayer"); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
81 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
82 if(stream == NULL) { |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12984
diff
changeset
|
83 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_ARTS_CantOpenStream); |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
84 arts_free(); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
85 return 0; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
86 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
87 |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
88 /* Set the stream to blocking: it will not block anyway, but it seems */ |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
89 /* to be working better */ |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
90 arts_stream_set(stream, ARTS_P_BLOCKING, 1); |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
91 frag_spec = ARTS_PACKET_SIZE_LOG2 | ARTS_PACKETS << 16; |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
92 arts_stream_set(stream, ARTS_P_PACKET_SETTINGS, frag_spec); |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
93 ao_data.buffersize = arts_stream_get(stream, ARTS_P_BUFFER_SIZE); |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12984
diff
changeset
|
94 mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_ARTS_StreamOpen); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
95 |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12984
diff
changeset
|
96 mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_ARTS_BufferSize, |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
97 ao_data.buffersize); |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12984
diff
changeset
|
98 mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_ARTS_BufferSize, |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
99 arts_stream_get(stream, ARTS_P_PACKET_SIZE)); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
100 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
101 return 1; |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
102 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
103 |
12145 | 104 static void uninit(int immed) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
105 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
106 arts_close_stream(stream); |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
107 arts_free(); |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
108 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
109 |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
110 static int play(void* data,int len,int flags) |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
111 { |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
112 return arts_write(stream, data, len); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
113 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
114 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14479
diff
changeset
|
115 static void audio_pause(void) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
116 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
117 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
118 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14479
diff
changeset
|
119 static void audio_resume(void) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
120 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
121 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
122 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14479
diff
changeset
|
123 static void reset(void) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
124 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
125 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
126 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14479
diff
changeset
|
127 static int get_space(void) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
128 { |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
129 return arts_stream_get(stream, ARTS_P_BUFFER_SPACE); |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
130 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
131 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14479
diff
changeset
|
132 static float get_delay(void) |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
133 { |
6807
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
134 return ((float) (ao_data.buffersize - arts_stream_get(stream, |
ae2f3cdcb462
Improved ao_arts delay and buff er handling, patch by Szombathelyi Gy|rgy <gyurco@freemail.hu>
atmos4
parents:
6214
diff
changeset
|
135 ARTS_P_BUFFER_SPACE))) / ((float) ao_data.bps); |
6214
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
136 } |
0398cb49fe5e
aRts audio out support by Michele Balistreri <brain at email.it>
atmos4
parents:
diff
changeset
|
137 |