Mercurial > mplayer.hg
annotate libao2/ao_oss.c @ 36174:dabe949e41e9
Support audio in GameCube rsd files.
author | cehoyos |
---|---|
date | Wed, 15 May 2013 09:54:40 +0000 |
parents | 389d43c448b3 |
children |
rev | line source |
---|---|
28343 | 1 /* |
2 * OSS audio output driver | |
3 * | |
4 * This file is part of MPlayer. | |
5 * | |
6 * MPlayer is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * MPlayer is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License along | |
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
19 */ | |
20 | |
954 | 21 #include <stdio.h> |
22 #include <stdlib.h> | |
23 | |
24 #include <sys/ioctl.h> | |
25 #include <unistd.h> | |
26 #include <sys/time.h> | |
27 #include <sys/types.h> | |
28 #include <sys/stat.h> | |
29 #include <fcntl.h> | |
5204
6bbf3271a694
non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4803
diff
changeset
|
30 #include <errno.h> |
6bbf3271a694
non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4803
diff
changeset
|
31 #include <string.h> |
35903 | 32 #include <strings.h> |
954 | 33 |
14123 | 34 #include "config.h" |
35 #include "mp_msg.h" | |
36 #include "mixer.h" | |
37 #include "help_mp.h" | |
954 | 38 |
14245 | 39 #ifdef HAVE_SYS_SOUNDCARD_H |
40 #include <sys/soundcard.h> | |
41 #else | |
42 #ifdef HAVE_SOUNDCARD_H | |
43 #include <soundcard.h> | |
44 #endif | |
45 #endif | |
46 | |
17020 | 47 #include "libaf/af_format.h" |
1532 | 48 |
954 | 49 #include "audio_out.h" |
50 #include "audio_out_internal.h" | |
51 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
52 static const ao_info_t info = |
954 | 53 { |
54 "OSS/ioctl audio output", | |
956
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
954
diff
changeset
|
55 "oss", |
954 | 56 "A'rpi", |
57 "" | |
58 }; | |
59 | |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
60 /* Support for >2 output channels added 2001-11-25 - Steve Davies <steve@daviesfam.org> */ |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
61 |
954 | 62 LIBAO_EXTERN(oss) |
63 | |
14245 | 64 static int format2oss(int format) |
65 { | |
66 switch(format) | |
67 { | |
68 case AF_FORMAT_U8: return AFMT_U8; | |
69 case AF_FORMAT_S8: return AFMT_S8; | |
70 case AF_FORMAT_U16_LE: return AFMT_U16_LE; | |
71 case AF_FORMAT_U16_BE: return AFMT_U16_BE; | |
72 case AF_FORMAT_S16_LE: return AFMT_S16_LE; | |
73 case AF_FORMAT_S16_BE: return AFMT_S16_BE; | |
29396
2de35e358503
Use the correct OSS format, where possible, for mplayer's packed 24-bit
cladisch
parents:
29263
diff
changeset
|
74 #ifdef AFMT_S24_PACKED |
2de35e358503
Use the correct OSS format, where possible, for mplayer's packed 24-bit
cladisch
parents:
29263
diff
changeset
|
75 case AF_FORMAT_S24_LE: return AFMT_S24_PACKED; |
14245 | 76 #endif |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
77 #ifdef AFMT_U32_LE |
14245 | 78 case AF_FORMAT_U32_LE: return AFMT_U32_LE; |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
79 #endif |
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
80 #ifdef AFMT_U32_BE |
14245 | 81 case AF_FORMAT_U32_BE: return AFMT_U32_BE; |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
82 #endif |
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
83 #ifdef AFMT_S32_LE |
14245 | 84 case AF_FORMAT_S32_LE: return AFMT_S32_LE; |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
85 #endif |
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
86 #ifdef AFMT_S32_BE |
14245 | 87 case AF_FORMAT_S32_BE: return AFMT_S32_BE; |
88 #endif | |
89 #ifdef AFMT_FLOAT | |
90 case AF_FORMAT_FLOAT_NE: return AFMT_FLOAT; | |
91 #endif | |
92 // SPECIALS | |
93 case AF_FORMAT_MU_LAW: return AFMT_MU_LAW; | |
94 case AF_FORMAT_A_LAW: return AFMT_A_LAW; | |
95 case AF_FORMAT_IMA_ADPCM: return AFMT_IMA_ADPCM; | |
96 #ifdef AFMT_MPEG | |
97 case AF_FORMAT_MPEG2: return AFMT_MPEG; | |
98 #endif | |
99 #ifdef AFMT_AC3 | |
30241
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30239
diff
changeset
|
100 case AF_FORMAT_AC3_NE: return AFMT_AC3; |
14245 | 101 #endif |
102 } | |
14609
082177fb93b1
print "Unknown/not supported internal format" message only with -v as it
reimar
parents:
14404
diff
changeset
|
103 mp_msg(MSGT_AO, MSGL_V, "OSS: Unknown/not supported internal format: %s\n", af_fmt2str_short(format)); |
14245 | 104 return -1; |
105 } | |
106 | |
107 static int oss2format(int format) | |
108 { | |
109 switch(format) | |
110 { | |
111 case AFMT_U8: return AF_FORMAT_U8; | |
112 case AFMT_S8: return AF_FORMAT_S8; | |
113 case AFMT_U16_LE: return AF_FORMAT_U16_LE; | |
114 case AFMT_U16_BE: return AF_FORMAT_U16_BE; | |
115 case AFMT_S16_LE: return AF_FORMAT_S16_LE; | |
116 case AFMT_S16_BE: return AF_FORMAT_S16_BE; | |
29396
2de35e358503
Use the correct OSS format, where possible, for mplayer's packed 24-bit
cladisch
parents:
29263
diff
changeset
|
117 #ifdef AFMT_S24_PACKED |
2de35e358503
Use the correct OSS format, where possible, for mplayer's packed 24-bit
cladisch
parents:
29263
diff
changeset
|
118 case AFMT_S24_PACKED: return AF_FORMAT_S24_LE; |
14245 | 119 #endif |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
120 #ifdef AFMT_U32_LE |
14245 | 121 case AFMT_U32_LE: return AF_FORMAT_U32_LE; |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
122 #endif |
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
123 #ifdef AFMT_U32_BE |
14245 | 124 case AFMT_U32_BE: return AF_FORMAT_U32_BE; |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
125 #endif |
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
126 #ifdef AFMT_S32_LE |
14245 | 127 case AFMT_S32_LE: return AF_FORMAT_S32_LE; |
14397
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
128 #endif |
d862ff282815
Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents:
14273
diff
changeset
|
129 #ifdef AFMT_S32_BE |
14245 | 130 case AFMT_S32_BE: return AF_FORMAT_S32_BE; |
131 #endif | |
132 #ifdef AFMT_FLOAT | |
133 case AFMT_FLOAT: return AF_FORMAT_FLOAT_NE; | |
134 #endif | |
135 // SPECIALS | |
136 case AFMT_MU_LAW: return AF_FORMAT_MU_LAW; | |
137 case AFMT_A_LAW: return AF_FORMAT_A_LAW; | |
138 case AFMT_IMA_ADPCM: return AF_FORMAT_IMA_ADPCM; | |
139 #ifdef AFMT_MPEG | |
140 case AFMT_MPEG: return AF_FORMAT_MPEG2; | |
141 #endif | |
142 #ifdef AFMT_AC3 | |
30241
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30239
diff
changeset
|
143 case AFMT_AC3: return AF_FORMAT_AC3_NE; |
14245 | 144 #endif |
145 } | |
17994
6927fabaef92
Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents:
17566
diff
changeset
|
146 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_AO_OSS_UnknownUnsupportedFormat, format); |
14245 | 147 return -1; |
148 } | |
149 | |
4803 | 150 static char *dsp=PATH_DEV_DSP; |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
956
diff
changeset
|
151 static audio_buf_info zz; |
954 | 152 static int audio_fd=-1; |
23809
6c348181fb20
Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents:
21547
diff
changeset
|
153 static int prepause_space; |
954 | 154 |
18966
0662e5119de2
two variables are made static, one of them additionaly modified to const char*. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18842
diff
changeset
|
155 static const char *oss_mixer_device = PATH_DEV_MIXER; |
0662e5119de2
two variables are made static, one of them additionaly modified to const char*. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18842
diff
changeset
|
156 static int oss_mixer_channel = SOUND_MIXER_PCM; |
1191 | 157 |
954 | 158 // to set/get/query special features/parameters |
9633
12b1790038b0
64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents:
9141
diff
changeset
|
159 static int control(int cmd,void *arg){ |
954 | 160 switch(cmd){ |
161 case AOCONTROL_SET_DEVICE: | |
162 dsp=(char*)arg; | |
163 return CONTROL_OK; | |
6795 | 164 case AOCONTROL_GET_DEVICE: |
12383
94ba609e53f7
ok this one is beyond stupid. the code didn't even do what was intended
rfelker
parents:
12145
diff
changeset
|
165 *(char**)arg=dsp; |
6795 | 166 return CONTROL_OK; |
15898 | 167 #ifdef SNDCTL_DSP_GETFMTS |
954 | 168 case AOCONTROL_QUERY_FORMAT: |
15898 | 169 { |
170 int format; | |
171 if (!ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &format)) | |
27450
4da9ce4d8327
Fix 'cast from pointer to integer of different size' on 64bit architectures. Casting to long should work for 32bit and 64bit and not make a difference to the boolean operation (since 'format' is always 32bit (int) the upper 32bit of 'arg' won't matter, but the compiler should be happy now. Casting both to unsigned makes sure the compiler isn't messing things up by sign-extending 'format' to 64bit before masking)
ranma
parents:
23809
diff
changeset
|
172 if ((unsigned int)format & (unsigned long)arg) |
15898 | 173 return CONTROL_TRUE; |
174 return CONTROL_FALSE; | |
175 } | |
176 #endif | |
1191 | 177 case AOCONTROL_GET_VOLUME: |
178 case AOCONTROL_SET_VOLUME: | |
179 { | |
180 ao_control_vol_t *vol = (ao_control_vol_t *)arg; | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7118
diff
changeset
|
181 int fd, v, devs; |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1456
diff
changeset
|
182 |
30239 | 183 if(AF_FORMAT_IS_AC3(ao_data.format)) |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1456
diff
changeset
|
184 return CONTROL_TRUE; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
185 |
35201
522fcb8ffb1b
Only a return value of -1 indicates an error for open(),
reimar
parents:
34754
diff
changeset
|
186 if ((fd = open(oss_mixer_device, O_RDONLY)) != -1) |
1191 | 187 { |
188 ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs); | |
11837 | 189 if (devs & (1 << oss_mixer_channel)) |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
190 { |
1191 | 191 if (cmd == AOCONTROL_GET_VOLUME) |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
192 { |
11837 | 193 ioctl(fd, MIXER_READ(oss_mixer_channel), &v); |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
194 vol->right = (v & 0xFF00) >> 8; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
195 vol->left = v & 0x00FF; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
196 } |
1191 | 197 else |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
198 { |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
199 v = ((int)vol->right << 8) | (int)vol->left; |
11837 | 200 ioctl(fd, MIXER_WRITE(oss_mixer_channel), &v); |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
201 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4184
diff
changeset
|
202 } |
1191 | 203 else |
204 { | |
205 close(fd); | |
206 return CONTROL_ERROR; | |
207 } | |
208 close(fd); | |
209 return CONTROL_OK; | |
210 } | |
211 } | |
212 return CONTROL_ERROR; | |
954 | 213 } |
214 return CONTROL_UNKNOWN; | |
215 } | |
216 | |
217 // open & setup audio device | |
218 // return: 1=success 0=fail | |
219 static int init(int rate,int channels,int format,int flags){ | |
11837 | 220 char *mixer_channels [SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES; |
14245 | 221 int oss_format; |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
222 char *mdev = mixer_device, *mchan = mixer_channel; |
954 | 223 |
14264 | 224 mp_msg(MSGT_AO,MSGL_V,"ao2: %d Hz %d chans %s\n",rate,channels, |
225 af_fmt2str_short(format)); | |
954 | 226 |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
227 if (ao_subdevice) { |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
228 char *m,*c; |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
229 m = strchr(ao_subdevice,':'); |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
230 if(m) { |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
231 c = strchr(m+1,':'); |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
232 if(c) { |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
233 mchan = c+1; |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
234 c[0] = '\0'; |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
235 } |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
236 mdev = m+1; |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
237 m[0] = '\0'; |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
238 } |
1191 | 239 dsp = ao_subdevice; |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
240 } |
1191 | 241 |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
242 if(mdev) |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
243 oss_mixer_device=mdev; |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
244 else |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
245 oss_mixer_device=PATH_DEV_MIXER; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
246 |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
247 if(mchan){ |
11837 | 248 int fd, devs, i; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
249 |
11837 | 250 if ((fd = open(oss_mixer_device, O_RDONLY)) == -1){ |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
251 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantOpenMixer, |
11837 | 252 oss_mixer_device, strerror(errno)); |
253 }else{ | |
254 ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs); | |
255 close(fd); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
256 |
11837 | 257 for (i=0; i<SOUND_MIXER_NRDEVICES; i++){ |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
258 if(!strcasecmp(mixer_channels[i], mchan)){ |
11837 | 259 if(!(devs & (1 << i))){ |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
260 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_ChanNotFound,mchan); |
11837 | 261 i = SOUND_MIXER_NRDEVICES+1; |
262 break; | |
263 } | |
264 oss_mixer_channel = i; | |
265 break; | |
266 } | |
267 } | |
268 if(i==SOUND_MIXER_NRDEVICES){ | |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
269 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_ChanNotFound,mchan); |
11837 | 270 } |
271 } | |
16959
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
272 } else |
832a93fc5deb
Allow setting the mixer per instance so one can fallback between
albeu
parents:
15898
diff
changeset
|
273 oss_mixer_channel = SOUND_MIXER_PCM; |
11837 | 274 |
6296 | 275 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using '%s' dsp device\n", dsp); |
11837 | 276 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using '%s' mixer device\n", oss_mixer_device); |
277 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using '%s' mixer device\n", mixer_channels[oss_mixer_channel]); | |
1191 | 278 |
5907
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
279 #ifdef __linux__ |
5204
6bbf3271a694
non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4803
diff
changeset
|
280 audio_fd=open(dsp, O_WRONLY | O_NONBLOCK); |
5907
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
281 #else |
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
282 audio_fd=open(dsp, O_WRONLY); |
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
283 #endif |
954 | 284 if(audio_fd<0){ |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
285 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantOpenDev, dsp, strerror(errno)); |
954 | 286 return 0; |
287 } | |
288 | |
5907
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
289 #ifdef __linux__ |
5204
6bbf3271a694
non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4803
diff
changeset
|
290 /* Remove the non-blocking flag */ |
6bbf3271a694
non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4803
diff
changeset
|
291 if(fcntl(audio_fd, F_SETFL, 0) < 0) { |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
292 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantMakeFd, strerror(errno)); |
5204
6bbf3271a694
non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4803
diff
changeset
|
293 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
294 } |
5907
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
295 #endif |
8303 | 296 |
297 #if defined(FD_CLOEXEC) && defined(F_SETFD) | |
298 fcntl(audio_fd, F_SETFD, FD_CLOEXEC); | |
299 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
300 |
30239 | 301 if(AF_FORMAT_IS_AC3(format)) { |
4184
f648f699eda6
hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents:
3455
diff
changeset
|
302 ao_data.samplerate=rate; |
f648f699eda6
hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents:
3455
diff
changeset
|
303 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); |
f648f699eda6
hwac3 fix for cmedia 8738 by Hans-Peter Raschke <Hans-Peter.Raschke@wintermann-datenservice.de>
arpi
parents:
3455
diff
changeset
|
304 } |
5790 | 305 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
306 ac3_retry: |
30241
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30239
diff
changeset
|
307 if (AF_FORMAT_IS_AC3(format)) |
02b9c1a452e1
Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents:
30239
diff
changeset
|
308 format = AF_FORMAT_AC3_NE; |
3095 | 309 ao_data.format=format; |
14245 | 310 oss_format=format2oss(format); |
14260
7f3c14830dcd
100l set default format for AF_FORMATs not supported by sound card
rtognimp
parents:
14245
diff
changeset
|
311 if (oss_format == -1) { |
29401
f01023c524c3
Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents:
29396
diff
changeset
|
312 #if HAVE_BIGENDIAN |
14245 | 313 oss_format=AFMT_S16_BE; |
5790 | 314 #else |
14245 | 315 oss_format=AFMT_S16_LE; |
5790 | 316 #endif |
14404
e4a52af25ee4
Use AF_FORMAT_S16_NE instead of #ifdef WORDS_BIGENDIAN ...
reimar
parents:
14397
diff
changeset
|
317 format=AF_FORMAT_S16_NE; |
14260
7f3c14830dcd
100l set default format for AF_FORMATs not supported by sound card
rtognimp
parents:
14245
diff
changeset
|
318 } |
7f3c14830dcd
100l set default format for AF_FORMATs not supported by sound card
rtognimp
parents:
14245
diff
changeset
|
319 if( ioctl(audio_fd, SNDCTL_DSP_SETFMT, &oss_format)<0 || |
14834
2d919650990a
Have OSS audio out fall back to s16ne instead of u8 if it can't open the
ivo
parents:
14609
diff
changeset
|
320 oss_format != format2oss(format)) { |
2d919650990a
Have OSS audio out fall back to s16ne instead of u8 if it can't open the
ivo
parents:
14609
diff
changeset
|
321 mp_msg(MSGT_AO,MSGL_WARN, MSGTR_AO_OSS_CantSet, dsp, |
2d919650990a
Have OSS audio out fall back to s16ne instead of u8 if it can't open the
ivo
parents:
14609
diff
changeset
|
322 af_fmt2str_short(format), af_fmt2str_short(AF_FORMAT_S16_NE) ); |
14404
e4a52af25ee4
Use AF_FORMAT_S16_NE instead of #ifdef WORDS_BIGENDIAN ...
reimar
parents:
14397
diff
changeset
|
323 format=AF_FORMAT_S16_NE; |
5790 | 324 goto ac3_retry; |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1456
diff
changeset
|
325 } |
7668 | 326 #if 0 |
14245 | 327 if(oss_format!=format2oss(format)) |
17058 | 328 mp_msg(MSGT_AO,MSGL_WARN,"WARNING! Your soundcard does NOT support %s sample format! Broken audio or bad playback speed are possible! Try with '-af format'\n",audio_out_format_name(format)); |
7668 | 329 #endif |
14245 | 330 |
331 ao_data.format = oss2format(oss_format); | |
332 if (ao_data.format == -1) return 0; | |
14264 | 333 |
334 mp_msg(MSGT_AO,MSGL_V,"audio_setup: sample format: %s (requested: %s)\n", | |
335 af_fmt2str_short(ao_data.format), af_fmt2str_short(format)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28823
diff
changeset
|
336 |
8848 | 337 ao_data.channels = channels; |
30239 | 338 if(!AF_FORMAT_IS_AC3(format)) { |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
339 // We only use SNDCTL_DSP_CHANNELS for >2 channels, in case some drivers don't have it |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
340 if (ao_data.channels > 2) { |
3319
66134af21278
fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents:
3181
diff
changeset
|
341 if ( ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels) == -1 || |
66134af21278
fixed to check that SNDCTL_DSP_CHANNELS actually grants the requested number of channels
steve
parents:
3181
diff
changeset
|
342 ao_data.channels != channels ) { |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
343 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantSetChans, channels); |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
344 return 0; |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
345 } |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
346 } |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
347 else { |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
348 int c = ao_data.channels-1; |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
349 if (ioctl (audio_fd, SNDCTL_DSP_STEREO, &c) == -1) { |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
350 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantSetChans, ao_data.channels); |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
351 return 0; |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
352 } |
9141
20793317e5ff
nice 10l bug, found by Balatoni Denes <pnis@coder.hu>
arpi
parents:
8848
diff
changeset
|
353 ao_data.channels=c+1; |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
354 } |
6296 | 355 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using %d channels (requested: %d)\n", ao_data.channels, channels); |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
356 // set rate |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
357 ao_data.samplerate=rate; |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
358 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); |
6296 | 359 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate); |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1456
diff
changeset
|
360 } |
954 | 361 |
362 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){ | |
363 int r=0; | |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
364 mp_msg(MSGT_AO,MSGL_WARN,MSGTR_AO_OSS_CantUseGetospace); |
954 | 365 if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &r)==-1){ |
6296 | 366 mp_msg(MSGT_AO,MSGL_V,"audio_setup: %d bytes/frag (config.h)\n",ao_data.outburst); |
954 | 367 } else { |
3095 | 368 ao_data.outburst=r; |
6296 | 369 mp_msg(MSGT_AO,MSGL_V,"audio_setup: %d bytes/frag (GETBLKSIZE)\n",ao_data.outburst); |
954 | 370 } |
371 } else { | |
6296 | 372 mp_msg(MSGT_AO,MSGL_V,"audio_setup: frags: %3d/%d (%d bytes/frag) free: %6d\n", |
954 | 373 zz.fragments, zz.fragstotal, zz.fragsize, zz.bytes); |
3095 | 374 if(ao_data.buffersize==-1) ao_data.buffersize=zz.bytes; |
375 ao_data.outburst=zz.fragsize; | |
954 | 376 } |
377 | |
3095 | 378 if(ao_data.buffersize==-1){ |
954 | 379 // Measuring buffer size: |
380 void* data; | |
3095 | 381 ao_data.buffersize=0; |
954 | 382 #ifdef HAVE_AUDIO_SELECT |
3095 | 383 data=malloc(ao_data.outburst); memset(data,0,ao_data.outburst); |
384 while(ao_data.buffersize<0x40000){ | |
954 | 385 fd_set rfds; |
386 struct timeval tv; | |
387 FD_ZERO(&rfds); FD_SET(audio_fd,&rfds); | |
388 tv.tv_sec=0; tv.tv_usec = 0; | |
389 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) break; | |
3095 | 390 write(audio_fd,data,ao_data.outburst); |
391 ao_data.buffersize+=ao_data.outburst; | |
954 | 392 } |
393 free(data); | |
3095 | 394 if(ao_data.buffersize==0){ |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
395 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantUseSelect); |
954 | 396 return 0; |
397 } | |
398 #endif | |
399 } | |
400 | |
8603
30bef3c97b8b
ao_oss was not using the channel & format returned by the soundcard
arpi
parents:
8304
diff
changeset
|
401 ao_data.bps=ao_data.channels; |
29708
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
402 switch (ao_data.format & AF_FORMAT_BITS_MASK) { |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
403 case AF_FORMAT_8BIT: |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
404 break; |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
405 case AF_FORMAT_16BIT: |
8603
30bef3c97b8b
ao_oss was not using the channel & format returned by the soundcard
arpi
parents:
8304
diff
changeset
|
406 ao_data.bps*=2; |
29708
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
407 break; |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
408 case AF_FORMAT_24BIT: |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
409 ao_data.bps*=3; |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
410 break; |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
411 case AF_FORMAT_32BIT: |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
412 ao_data.bps*=4; |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
413 break; |
38a054e832c7
fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents:
29401
diff
changeset
|
414 } |
8603
30bef3c97b8b
ao_oss was not using the channel & format returned by the soundcard
arpi
parents:
8304
diff
changeset
|
415 |
6075
0b3b6d03779c
fix for L<->R swap with 6ch playback - based on patch by Eric Lammerts <eric@lammerts.org>
arpi
parents:
5907
diff
changeset
|
416 ao_data.outburst-=ao_data.outburst % ao_data.bps; // round down |
8603
30bef3c97b8b
ao_oss was not using the channel & format returned by the soundcard
arpi
parents:
8304
diff
changeset
|
417 ao_data.bps*=ao_data.samplerate; |
6075
0b3b6d03779c
fix for L<->R swap with 6ch playback - based on patch by Eric Lammerts <eric@lammerts.org>
arpi
parents:
5907
diff
changeset
|
418 |
954 | 419 return 1; |
420 } | |
421 | |
422 // close audio device | |
12145 | 423 static void uninit(int immed){ |
7118
4332922afec4
release /dev/dsp on pause patch by Eric Lammerts <eric@lammerts.org> (and D Richard Felker III <dalias@aerifal.cx>)
alex
parents:
6899
diff
changeset
|
424 if(audio_fd == -1) return; |
12145 | 425 #ifdef SNDCTL_DSP_SYNC |
426 // to get the buffer played | |
427 if (!immed) | |
428 ioctl(audio_fd, SNDCTL_DSP_SYNC, NULL); | |
429 #endif | |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
956
diff
changeset
|
430 #ifdef SNDCTL_DSP_RESET |
12145 | 431 if (immed) |
432 ioctl(audio_fd, SNDCTL_DSP_RESET, NULL); | |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
956
diff
changeset
|
433 #endif |
954 | 434 close(audio_fd); |
7118
4332922afec4
release /dev/dsp on pause patch by Eric Lammerts <eric@lammerts.org> (and D Richard Felker III <dalias@aerifal.cx>)
alex
parents:
6899
diff
changeset
|
435 audio_fd = -1; |
954 | 436 } |
437 | |
438 // stop playing and empty buffers (for seeking/pause) | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17058
diff
changeset
|
439 static void reset(void){ |
14245 | 440 int oss_format; |
12145 | 441 uninit(1); |
5907
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
442 audio_fd=open(dsp, O_WRONLY); |
d8c34a35ccb9
nonblock open is not legal for OSS (see OSS api docs), and causes problems on freebsd (and maybe other OSs)
arpi
parents:
5872
diff
changeset
|
443 if(audio_fd < 0){ |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12383
diff
changeset
|
444 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantReopen, strerror(errno)); |
954 | 445 return; |
446 } | |
447 | |
10600
3cf428b56cde
Set close-on-exec after newer open (in reset func). Patch by Andriy Gapon <agapon@cv-nj.com>
alex
parents:
9633
diff
changeset
|
448 #if defined(FD_CLOEXEC) && defined(F_SETFD) |
3cf428b56cde
Set close-on-exec after newer open (in reset func). Patch by Andriy Gapon <agapon@cv-nj.com>
alex
parents:
9633
diff
changeset
|
449 fcntl(audio_fd, F_SETFD, FD_CLOEXEC); |
3cf428b56cde
Set close-on-exec after newer open (in reset func). Patch by Andriy Gapon <agapon@cv-nj.com>
alex
parents:
9633
diff
changeset
|
450 #endif |
3cf428b56cde
Set close-on-exec after newer open (in reset func). Patch by Andriy Gapon <agapon@cv-nj.com>
alex
parents:
9633
diff
changeset
|
451 |
14245 | 452 oss_format = format2oss(ao_data.format); |
30239 | 453 if(AF_FORMAT_IS_AC3(ao_data.format)) |
28605
65e49c604b25
Set samplerate in reset also for AC3, and set it before the format in that
reimar
parents:
28579
diff
changeset
|
454 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); |
14245 | 455 ioctl (audio_fd, SNDCTL_DSP_SETFMT, &oss_format); |
30239 | 456 if(!AF_FORMAT_IS_AC3(ao_data.format)) { |
3181
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
457 if (ao_data.channels > 2) |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
458 ioctl (audio_fd, SNDCTL_DSP_CHANNELS, &ao_data.channels); |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
459 else { |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
460 int c = ao_data.channels-1; |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
461 ioctl (audio_fd, SNDCTL_DSP_STEREO, &c); |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
462 } |
c8edb0691f09
Extended oss output driver and libac3 to support 4 and 6 channel output mixes. added -channels command line option
steve
parents:
3137
diff
changeset
|
463 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); |
1528
a444bd456fcc
ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents:
1456
diff
changeset
|
464 } |
954 | 465 } |
466 | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
467 // stop playing, keep buffers (for pause) |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17058
diff
changeset
|
468 static void audio_pause(void) |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
469 { |
23809
6c348181fb20
Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents:
21547
diff
changeset
|
470 prepause_space = get_space(); |
12145 | 471 uninit(1); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
472 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
473 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
474 // resume playing, after audio_pause() |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17058
diff
changeset
|
475 static void audio_resume(void) |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
476 { |
7118
4332922afec4
release /dev/dsp on pause patch by Eric Lammerts <eric@lammerts.org> (and D Richard Felker III <dalias@aerifal.cx>)
alex
parents:
6899
diff
changeset
|
477 reset(); |
34754 | 478 mp_ao_resume_refill(&audio_out_oss, prepause_space); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
479 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
480 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1020
diff
changeset
|
481 |
954 | 482 // return: how many bytes can be played without blocking |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17058
diff
changeset
|
483 static int get_space(void){ |
3095 | 484 int playsize=ao_data.outburst; |
954 | 485 |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
956
diff
changeset
|
486 #ifdef SNDCTL_DSP_GETOSPACE |
954 | 487 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1){ |
488 // calculate exact buffer space: | |
3455
921a78c7b4aa
limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents:
3319
diff
changeset
|
489 playsize = zz.fragments*zz.fragsize; |
921a78c7b4aa
limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents:
3319
diff
changeset
|
490 if (playsize > MAX_OUTBURST) |
921a78c7b4aa
limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents:
3319
diff
changeset
|
491 playsize = (MAX_OUTBURST / zz.fragsize) * zz.fragsize; |
921a78c7b4aa
limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents:
3319
diff
changeset
|
492 return playsize; |
954 | 493 } |
1020
72cacd3b8f30
Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents:
956
diff
changeset
|
494 #endif |
954 | 495 |
496 // check buffer | |
497 #ifdef HAVE_AUDIO_SELECT | |
498 { fd_set rfds; | |
499 struct timeval tv; | |
500 FD_ZERO(&rfds); | |
501 FD_SET(audio_fd, &rfds); | |
502 tv.tv_sec = 0; | |
503 tv.tv_usec = 0; | |
504 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) return 0; // not block! | |
505 } | |
506 #endif | |
507 | |
3095 | 508 return ao_data.outburst; |
954 | 509 } |
510 | |
511 // plays 'len' bytes of 'data' | |
512 // it should round it down to outburst*n | |
513 // return: number of bytes played | |
514 static int play(void* data,int len,int flags){ | |
18842 | 515 if(len==0) |
516 return len; | |
517 if(len>ao_data.outburst || !(flags & AOPLAY_FINAL_CHUNK)) { | |
518 len/=ao_data.outburst; | |
519 len*=ao_data.outburst; | |
520 } | |
521 len=write(audio_fd,data,len); | |
954 | 522 return len; |
523 } | |
524 | |
525 static int audio_delay_method=2; | |
526 | |
3095 | 527 // return: delay in seconds between first and last sample in buffer |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17058
diff
changeset
|
528 static float get_delay(void){ |
3095 | 529 /* Calculate how many bytes/second is sent out */ |
954 | 530 if(audio_delay_method==2){ |
5872 | 531 #ifdef SNDCTL_DSP_GETODELAY |
954 | 532 int r=0; |
533 if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1) | |
3095 | 534 return ((float)r)/(float)ao_data.bps; |
5872 | 535 #endif |
954 | 536 audio_delay_method=1; // fallback if not supported |
537 } | |
538 if(audio_delay_method==1){ | |
539 // SNDCTL_DSP_GETOSPACE | |
540 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1) | |
3095 | 541 return ((float)(ao_data.buffersize-zz.bytes))/(float)ao_data.bps; |
954 | 542 audio_delay_method=0; // fallback if not supported |
543 } | |
3095 | 544 return ((float)ao_data.buffersize)/(float)ao_data.bps; |
954 | 545 } |