annotate libao2/ao_oss.c @ 30241:02b9c1a452e1

Add support for distinguishing between little- and big-endian SPDIF AC3 and converting between both.
author reimar
date Mon, 11 Jan 2010 20:27:52 +0000
parents 7227245da803
children 9d4720deada1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28343
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
1 /*
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
2 * OSS audio output driver
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
3 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
4 * This file is part of MPlayer.
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
5 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
7 * it under the terms of the GNU General Public License as published by
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
9 * (at your option) any later version.
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
10 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
14 * GNU General Public License for more details.
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
15 *
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
16 * You should have received a copy of the GNU General Public License along
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
19 */
e45b08f2f5d3 Add standard license headers.
diego
parents: 27450
diff changeset
20
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
21 #include <stdio.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
22 #include <stdlib.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
23
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
24 #include <sys/ioctl.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
25 #include <unistd.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
26 #include <sys/time.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
27 #include <sys/types.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
28 #include <sys/stat.h>
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
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>
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
32
14123
a92101a7eb49 Make include paths consistent.
diego
parents: 13383
diff changeset
33 #include "config.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13383
diff changeset
34 #include "mp_msg.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13383
diff changeset
35 #include "mixer.h"
a92101a7eb49 Make include paths consistent.
diego
parents: 13383
diff changeset
36 #include "help_mp.h"
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
37
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
38 #ifdef HAVE_SYS_SOUNDCARD_H
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
39 #include <sys/soundcard.h>
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
40 #else
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
41 #ifdef HAVE_SOUNDCARD_H
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
42 #include <soundcard.h>
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
43 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
44 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
45
17020
dde990d47ce8 Unify include paths, -I.. is in CFLAGS.
diego
parents: 16959
diff changeset
46 #include "libaf/af_format.h"
1532
cb9bc07f3d4c AFMT_AC3 fixed
arpi
parents: 1528
diff changeset
47
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
48 #include "audio_out.h"
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
49 #include "audio_out_internal.h"
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
50
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
51 static const ao_info_t info =
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
52 {
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
53 "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
54 "oss",
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
55 "A'rpi",
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
56 ""
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
57 };
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
58
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
59 /* 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
60
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
61 LIBAO_EXTERN(oss)
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
62
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
63 static int format2oss(int format)
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
64 {
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
65 switch(format)
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
66 {
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
67 case AF_FORMAT_U8: return AFMT_U8;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
68 case AF_FORMAT_S8: return AFMT_S8;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
69 case AF_FORMAT_U16_LE: return AFMT_U16_LE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
70 case AF_FORMAT_U16_BE: return AFMT_U16_BE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
71 case AF_FORMAT_S16_LE: return AFMT_S16_LE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
72 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
73 #ifdef AFMT_S24_PACKED
2de35e358503 Use the correct OSS format, where possible, for mplayer's packed 24-bit
cladisch
parents: 29263
diff changeset
74 case AF_FORMAT_S24_LE: return AFMT_S24_PACKED;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
75 #endif
14397
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
76 #ifdef AFMT_U32_LE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
77 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
78 #endif
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
79 #ifdef AFMT_U32_BE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
80 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
81 #endif
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
82 #ifdef AFMT_S32_LE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
83 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
84 #endif
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
85 #ifdef AFMT_S32_BE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
86 case AF_FORMAT_S32_BE: return AFMT_S32_BE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
87 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
88 #ifdef AFMT_FLOAT
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
89 case AF_FORMAT_FLOAT_NE: return AFMT_FLOAT;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
90 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
91 // SPECIALS
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
92 case AF_FORMAT_MU_LAW: return AFMT_MU_LAW;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
93 case AF_FORMAT_A_LAW: return AFMT_A_LAW;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
94 case AF_FORMAT_IMA_ADPCM: return AFMT_IMA_ADPCM;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
95 #ifdef AFMT_MPEG
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
96 case AF_FORMAT_MPEG2: return AFMT_MPEG;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
97 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
98 #ifdef AFMT_AC3
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30239
diff changeset
99 case AF_FORMAT_AC3_NE: return AFMT_AC3;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
100 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
101 }
14609
082177fb93b1 print "Unknown/not supported internal format" message only with -v as it
reimar
parents: 14404
diff changeset
102 mp_msg(MSGT_AO, MSGL_V, "OSS: Unknown/not supported internal format: %s\n", af_fmt2str_short(format));
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
103 return -1;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
104 }
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
105
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
106 static int oss2format(int format)
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
107 {
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
108 switch(format)
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
109 {
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
110 case AFMT_U8: return AF_FORMAT_U8;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
111 case AFMT_S8: return AF_FORMAT_S8;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
112 case AFMT_U16_LE: return AF_FORMAT_U16_LE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
113 case AFMT_U16_BE: return AF_FORMAT_U16_BE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
114 case AFMT_S16_LE: return AF_FORMAT_S16_LE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
115 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
116 #ifdef AFMT_S24_PACKED
2de35e358503 Use the correct OSS format, where possible, for mplayer's packed 24-bit
cladisch
parents: 29263
diff changeset
117 case AFMT_S24_PACKED: return AF_FORMAT_S24_LE;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
118 #endif
14397
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
119 #ifdef AFMT_U32_LE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
120 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
121 #endif
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
122 #ifdef AFMT_U32_BE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
123 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
124 #endif
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
125 #ifdef AFMT_S32_LE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
126 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
127 #endif
d862ff282815 Check for every 24 and 32 bit AFMT_ separately if it is defined.
reimar
parents: 14273
diff changeset
128 #ifdef AFMT_S32_BE
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
129 case AFMT_S32_BE: return AF_FORMAT_S32_BE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
130 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
131 #ifdef AFMT_FLOAT
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
132 case AFMT_FLOAT: return AF_FORMAT_FLOAT_NE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
133 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
134 // SPECIALS
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
135 case AFMT_MU_LAW: return AF_FORMAT_MU_LAW;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
136 case AFMT_A_LAW: return AF_FORMAT_A_LAW;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
137 case AFMT_IMA_ADPCM: return AF_FORMAT_IMA_ADPCM;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
138 #ifdef AFMT_MPEG
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
139 case AFMT_MPEG: return AF_FORMAT_MPEG2;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
140 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
141 #ifdef AFMT_AC3
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30239
diff changeset
142 case AFMT_AC3: return AF_FORMAT_AC3_NE;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
143 #endif
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
144 }
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17566
diff changeset
145 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_AO_OSS_UnknownUnsupportedFormat, format);
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
146 return -1;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
147 }
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
148
4803
5b4fd881200a using PATH_DEV_*
alex
parents: 4788
diff changeset
149 static char *dsp=PATH_DEV_DSP;
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
150 static audio_buf_info zz;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
151 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
152 static int prepause_space;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
153
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
154 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
155 static int oss_mixer_channel = SOUND_MIXER_PCM;
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
156
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
157 // to set/get/query special features/parameters
9633
12b1790038b0 64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents: 9141
diff changeset
158 static int control(int cmd,void *arg){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
159 switch(cmd){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
160 case AOCONTROL_SET_DEVICE:
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
161 dsp=(char*)arg;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
162 return CONTROL_OK;
6795
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 6588
diff changeset
163 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
164 *(char**)arg=dsp;
6795
776b686069af - add some control (ao_oss, pl_extrastereo)
pontscho
parents: 6588
diff changeset
165 return CONTROL_OK;
15898
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
166 #ifdef SNDCTL_DSP_GETFMTS
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
167 case AOCONTROL_QUERY_FORMAT:
15898
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
168 {
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
169 int format;
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
170 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
171 if ((unsigned int)format & (unsigned long)arg)
15898
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
172 return CONTROL_TRUE;
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
173 return CONTROL_FALSE;
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
174 }
a45af202818f QUERY_FORMAT support
alex
parents: 14834
diff changeset
175 #endif
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
176 case AOCONTROL_GET_VOLUME:
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
177 case AOCONTROL_SET_VOLUME:
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
178 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
179 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
180 int fd, v, devs;
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
181
30239
7227245da803 Use AF_FORMAT_IS_AC3 in ao_oss.c
reimar
parents: 29708
diff changeset
182 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
183 return CONTROL_TRUE;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
184
4788
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
185 if ((fd = open(oss_mixer_device, O_RDONLY)) > 0)
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
186 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
187 ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs);
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
188 if (devs & (1 << oss_mixer_channel))
4788
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
189 {
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
190 if (cmd == AOCONTROL_GET_VOLUME)
4788
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
191 {
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
192 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
193 vol->right = (v & 0xFF00) >> 8;
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
194 vol->left = v & 0x00FF;
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
195 }
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
196 else
4788
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
197 {
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
198 v = ((int)vol->right << 8) | (int)vol->left;
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
199 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
200 }
d678ce495a75 Moved HW dependent mixer stuff to libao and removed master switch
anders
parents: 4184
diff changeset
201 }
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
202 else
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
203 {
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
204 close(fd);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
205 return CONTROL_ERROR;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
206 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
207 close(fd);
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
208 return CONTROL_OK;
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
209 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
210 }
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
211 return CONTROL_ERROR;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
212 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
213 return CONTROL_UNKNOWN;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
214 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
215
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
216 // open & setup audio device
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
217 // return: 1=success 0=fail
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
218 static int init(int rate,int channels,int format,int flags){
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
219 char *mixer_channels [SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
220 int oss_format;
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
221 char *mdev = mixer_device, *mchan = mixer_channel;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
222
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14260
diff changeset
223 mp_msg(MSGT_AO,MSGL_V,"ao2: %d Hz %d chans %s\n",rate,channels,
cb5fbade8a5c af_fmt2str_short
alex
parents: 14260
diff changeset
224 af_fmt2str_short(format));
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
225
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
226 if (ao_subdevice) {
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
227 char *m,*c;
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
228 m = strchr(ao_subdevice,':');
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
229 if(m) {
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
230 c = strchr(m+1,':');
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
231 if(c) {
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
232 mchan = c+1;
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
233 c[0] = '\0';
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
234 }
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
235 mdev = m+1;
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
236 m[0] = '\0';
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
237 }
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
238 dsp = ao_subdevice;
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
239 }
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
240
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
241 if(mdev)
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
242 oss_mixer_device=mdev;
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
243 else
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
244 oss_mixer_device=PATH_DEV_MIXER;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
245
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
246 if(mchan){
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
247 int fd, devs, i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
248
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
249 if ((fd = open(oss_mixer_device, O_RDONLY)) == -1){
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
250 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantOpenMixer,
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
251 oss_mixer_device, strerror(errno));
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
252 }else{
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
253 ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devs);
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
254 close(fd);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
255
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
256 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
257 if(!strcasecmp(mixer_channels[i], mchan)){
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
258 if(!(devs & (1 << i))){
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
259 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_ChanNotFound,mchan);
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
260 i = SOUND_MIXER_NRDEVICES+1;
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
261 break;
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
262 }
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
263 oss_mixer_channel = i;
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
264 break;
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
265 }
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
266 }
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
267 if(i==SOUND_MIXER_NRDEVICES){
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
268 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_ChanNotFound,mchan);
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
269 }
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
270 }
16959
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
271 } else
832a93fc5deb Allow setting the mixer per instance so one can fallback between
albeu
parents: 15898
diff changeset
272 oss_mixer_channel = SOUND_MIXER_PCM;
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
273
6296
74115095d9fe msg/i18n fixes and some printf->mp_msg
arpi
parents: 6138
diff changeset
274 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using '%s' dsp device\n", dsp);
11837
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
275 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using '%s' mixer device\n", oss_mixer_device);
4e8f8efb6906 add option to select mixer channel
attila
parents: 10600
diff changeset
276 mp_msg(MSGT_AO,MSGL_V,"audio_setup: using '%s' mixer device\n", mixer_channels[oss_mixer_channel]);
1191
f9a46e7843ee ao_subdevice support
al3x
parents: 1079
diff changeset
277
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
278 #ifdef __linux__
5204
6bbf3271a694 non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents: 4803
diff changeset
279 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
280 #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
281 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
282 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
283 if(audio_fd<0){
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
284 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantOpenDev, dsp, strerror(errno));
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
285 return 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
286 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
287
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
288 #ifdef __linux__
5204
6bbf3271a694 non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents: 4803
diff changeset
289 /* Remove the non-blocking flag */
6bbf3271a694 non-blocking open - patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents: 4803
diff changeset
290 if(fcntl(audio_fd, F_SETFL, 0) < 0) {
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
291 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
292 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
293 }
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
294 #endif
8303
322f1a91a5e7 avoid giving a /dev/dsp fd to child processes!!
rfelker
parents: 8027
diff changeset
295
322f1a91a5e7 avoid giving a /dev/dsp fd to child processes!!
rfelker
parents: 8027
diff changeset
296 #if defined(FD_CLOEXEC) && defined(F_SETFD)
322f1a91a5e7 avoid giving a /dev/dsp fd to child processes!!
rfelker
parents: 8027
diff changeset
297 fcntl(audio_fd, F_SETFD, FD_CLOEXEC);
322f1a91a5e7 avoid giving a /dev/dsp fd to child processes!!
rfelker
parents: 8027
diff changeset
298 #endif
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
299
30239
7227245da803 Use AF_FORMAT_IS_AC3 in ao_oss.c
reimar
parents: 29708
diff changeset
300 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
301 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
302 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
303 }
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 5204
diff changeset
304
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
305 ac3_retry:
30241
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30239
diff changeset
306 if (AF_FORMAT_IS_AC3(format))
02b9c1a452e1 Add support for distinguishing between little- and big-endian SPDIF AC3
reimar
parents: 30239
diff changeset
307 format = AF_FORMAT_AC3_NE;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
308 ao_data.format=format;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
309 oss_format=format2oss(format);
14260
7f3c14830dcd 100l set default format for AF_FORMATs not supported by sound card
rtognimp
parents: 14245
diff changeset
310 if (oss_format == -1) {
29401
f01023c524c3 Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents: 29396
diff changeset
311 #if HAVE_BIGENDIAN
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
312 oss_format=AFMT_S16_BE;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 5204
diff changeset
313 #else
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
314 oss_format=AFMT_S16_LE;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 5204
diff changeset
315 #endif
14404
e4a52af25ee4 Use AF_FORMAT_S16_NE instead of #ifdef WORDS_BIGENDIAN ...
reimar
parents: 14397
diff changeset
316 format=AF_FORMAT_S16_NE;
14260
7f3c14830dcd 100l set default format for AF_FORMATs not supported by sound card
rtognimp
parents: 14245
diff changeset
317 }
7f3c14830dcd 100l set default format for AF_FORMATs not supported by sound card
rtognimp
parents: 14245
diff changeset
318 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
319 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
320 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
321 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
322 format=AF_FORMAT_S16_NE;
5790
d141f1e9cc36 AFMT_AC3 autodetect/fallback to S16
arpi
parents: 5204
diff changeset
323 goto ac3_retry;
1528
a444bd456fcc ac3/spdif patch by German Gomez Garcia <german@piraos.com>
arpi
parents: 1456
diff changeset
324 }
7668
76bd62c375e8 remove nonsense warnings now that libaf is used
rfelker
parents: 7472
diff changeset
325 #if 0
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
326 if(oss_format!=format2oss(format))
17058
1a87fe45bd4e -aop is long obsolete.
diego
parents: 17020
diff changeset
327 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
76bd62c375e8 remove nonsense warnings now that libaf is used
rfelker
parents: 7472
diff changeset
328 #endif
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
329
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
330 ao_data.format = oss2format(oss_format);
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
331 if (ao_data.format == -1) return 0;
14264
cb5fbade8a5c af_fmt2str_short
alex
parents: 14260
diff changeset
332
cb5fbade8a5c af_fmt2str_short
alex
parents: 14260
diff changeset
333 mp_msg(MSGT_AO,MSGL_V,"audio_setup: sample format: %s (requested: %s)\n",
cb5fbade8a5c af_fmt2str_short
alex
parents: 14260
diff changeset
334 af_fmt2str_short(ao_data.format), af_fmt2str_short(format));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
335
8848
arpi
parents: 8603
diff changeset
336 ao_data.channels = channels;
30239
7227245da803 Use AF_FORMAT_IS_AC3 in ao_oss.c
reimar
parents: 29708
diff changeset
337 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
338 // 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
339 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
340 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
341 ao_data.channels != channels ) {
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
342 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
343 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
344 }
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 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
347 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
348 if (ioctl (audio_fd, SNDCTL_DSP_STEREO, &c) == -1) {
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
349 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
350 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
351 }
9141
20793317e5ff nice 10l bug, found by Balatoni Denes <pnis@coder.hu>
arpi
parents: 8848
diff changeset
352 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
353 }
6296
74115095d9fe msg/i18n fixes and some printf->mp_msg
arpi
parents: 6138
diff changeset
354 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
355 // 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
356 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
357 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
6296
74115095d9fe msg/i18n fixes and some printf->mp_msg
arpi
parents: 6138
diff changeset
358 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
359 }
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
360
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
361 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
362 int r=0;
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
363 mp_msg(MSGT_AO,MSGL_WARN,MSGTR_AO_OSS_CantUseGetospace);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
364 if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &r)==-1){
6296
74115095d9fe msg/i18n fixes and some printf->mp_msg
arpi
parents: 6138
diff changeset
365 mp_msg(MSGT_AO,MSGL_V,"audio_setup: %d bytes/frag (config.h)\n",ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
366 } else {
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
367 ao_data.outburst=r;
6296
74115095d9fe msg/i18n fixes and some printf->mp_msg
arpi
parents: 6138
diff changeset
368 mp_msg(MSGT_AO,MSGL_V,"audio_setup: %d bytes/frag (GETBLKSIZE)\n",ao_data.outburst);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
369 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
370 } else {
6296
74115095d9fe msg/i18n fixes and some printf->mp_msg
arpi
parents: 6138
diff changeset
371 mp_msg(MSGT_AO,MSGL_V,"audio_setup: frags: %3d/%d (%d bytes/frag) free: %6d\n",
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
372 zz.fragments, zz.fragstotal, zz.fragsize, zz.bytes);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
373 if(ao_data.buffersize==-1) ao_data.buffersize=zz.bytes;
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
374 ao_data.outburst=zz.fragsize;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
375 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
376
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
377 if(ao_data.buffersize==-1){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
378 // Measuring buffer size:
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
379 void* data;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
380 ao_data.buffersize=0;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
381 #ifdef HAVE_AUDIO_SELECT
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
382 data=malloc(ao_data.outburst); memset(data,0,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
383 while(ao_data.buffersize<0x40000){
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
384 fd_set rfds;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
385 struct timeval tv;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
386 FD_ZERO(&rfds); FD_SET(audio_fd,&rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
387 tv.tv_sec=0; tv.tv_usec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
388 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) break;
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
389 write(audio_fd,data,ao_data.outburst);
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
390 ao_data.buffersize+=ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
391 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
392 free(data);
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
393 if(ao_data.buffersize==0){
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
394 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantUseSelect);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
395 return 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
396 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
397 #endif
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
398 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
399
8603
30bef3c97b8b ao_oss was not using the channel & format returned by the soundcard
arpi
parents: 8304
diff changeset
400 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
401 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
402 case AF_FORMAT_8BIT:
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
403 break;
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
404 case AF_FORMAT_16BIT:
8603
30bef3c97b8b ao_oss was not using the channel & format returned by the soundcard
arpi
parents: 8304
diff changeset
405 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
406 break;
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
407 case AF_FORMAT_24BIT:
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
408 ao_data.bps*=3;
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
409 break;
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
410 case AF_FORMAT_32BIT:
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
411 ao_data.bps*=4;
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
412 break;
38a054e832c7 fix calculation of ao_data.bps for sample formats with more than 16 bits
cladisch
parents: 29401
diff changeset
413 }
8603
30bef3c97b8b ao_oss was not using the channel & format returned by the soundcard
arpi
parents: 8304
diff changeset
414
6075
0b3b6d03779c fix for L<->R swap with 6ch playback - based on patch by Eric Lammerts <eric@lammerts.org>
arpi
parents: 5907
diff changeset
415 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
416 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
417
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
418 return 1;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
419 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
420
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
421 // close audio device
12145
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
422 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
423 if(audio_fd == -1) return;
12145
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
424 #ifdef SNDCTL_DSP_SYNC
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
425 // to get the buffer played
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
426 if (!immed)
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
427 ioctl(audio_fd, SNDCTL_DSP_SYNC, NULL);
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
428 #endif
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
429 #ifdef SNDCTL_DSP_RESET
12145
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
430 if (immed)
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
431 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
432 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
433 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
434 audio_fd = -1;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
435 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
436
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
437 // stop playing and empty buffers (for seeking/pause)
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17058
diff changeset
438 static void reset(void){
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
439 int oss_format;
12145
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
440 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
441 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
442 if(audio_fd < 0){
13383
c1955840883d mp_msg transition of unmaintained audio output drivers.
ivo
parents: 12383
diff changeset
443 mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_OSS_CantReopen, strerror(errno));
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
444 return;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
445 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
446
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
447 #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
448 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
449 #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
450
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
451 oss_format = format2oss(ao_data.format);
30239
7227245da803 Use AF_FORMAT_IS_AC3 in ao_oss.c
reimar
parents: 29708
diff changeset
452 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
453 ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14123
diff changeset
454 ioctl (audio_fd, SNDCTL_DSP_SETFMT, &oss_format);
30239
7227245da803 Use AF_FORMAT_IS_AC3 in ao_oss.c
reimar
parents: 29708
diff changeset
455 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
456 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
457 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
458 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
459 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
460 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
461 }
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 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
463 }
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
464 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
465
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
466 // stop playing, keep buffers (for pause)
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17058
diff changeset
467 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
468 {
23809
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
469 prepause_space = get_space();
12145
99798c3cdb93 uninit immed flag
alex
parents: 11837
diff changeset
470 uninit(1);
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
471 }
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 // resume playing, after audio_pause()
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17058
diff changeset
474 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
475 {
23809
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
476 int fillcnt;
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();
23809
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
478 fillcnt = get_space() - prepause_space;
28579
0405513156d1 100l, do 0-filling on resume (to avoid desync after pause) in ao_oss only when
reimar
parents: 28343
diff changeset
479 if (fillcnt > 0 && !(ao_data.format & AF_FORMAT_SPECIAL_MASK)) {
23809
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
480 void *silence = calloc(fillcnt, 1);
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
481 play(silence, fillcnt, 0);
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
482 free(silence);
6c348181fb20 Somewhat hackish fix for A-V desync with ao_oss and frame stepping:
reimar
parents: 21547
diff changeset
483 }
1038
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
484 }
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
485
b36fb1ae4b53 applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents: 1020
diff changeset
486
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
487 // return: how many bytes can be played without blocking
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17058
diff changeset
488 static int get_space(void){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
489 int playsize=ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
490
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
491 #ifdef SNDCTL_DSP_GETOSPACE
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
492 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
493 // calculate exact buffer space:
3455
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
494 playsize = zz.fragments*zz.fragsize;
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
495 if (playsize > MAX_OUTBURST)
921a78c7b4aa limit get_space return <= MAX_OUTBURST, whilst always an exact number of fragments
steve
parents: 3319
diff changeset
496 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
497 return playsize;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
498 }
1020
72cacd3b8f30 Solaris 8 support - patch by Marcus Comstedt <marcus@idonex.se>
arpi_esp
parents: 956
diff changeset
499 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
500
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
501 // check buffer
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
502 #ifdef HAVE_AUDIO_SELECT
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
503 { fd_set rfds;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
504 struct timeval tv;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
505 FD_ZERO(&rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
506 FD_SET(audio_fd, &rfds);
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
507 tv.tv_sec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
508 tv.tv_usec = 0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
509 if(!select(audio_fd+1, NULL, &rfds, NULL, &tv)) return 0; // not block!
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
510 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
511 #endif
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
512
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
513 return ao_data.outburst;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
514 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
515
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
516 // plays 'len' bytes of 'data'
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
517 // it should round it down to outburst*n
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
518 // return: number of bytes played
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
519 static int play(void* data,int len,int flags){
18842
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
520 if(len==0)
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
521 return len;
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
522 if(len>ao_data.outburst || !(flags & AOPLAY_FINAL_CHUNK)) {
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
523 len/=ao_data.outburst;
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
524 len*=ao_data.outburst;
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
525 }
518282cbf238 Respect AOPLAY_FINAL_CHUNK
pacman
parents: 17994
diff changeset
526 len=write(audio_fd,data,len);
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
527 return len;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
528 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
529
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
530 static int audio_delay_method=2;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
531
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
532 // 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
533 static float get_delay(void){
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
534 /* Calculate how many bytes/second is sent out */
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
535 if(audio_delay_method==2){
5872
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 5790
diff changeset
536 #ifdef SNDCTL_DSP_GETODELAY
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
537 int r=0;
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
538 if(ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &r)!=-1)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
539 return ((float)r)/(float)ao_data.bps;
5872
02576893af2a OpenBSD, NetBSD portability patches by
arpi
parents: 5790
diff changeset
540 #endif
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
541 audio_delay_method=1; // fallback if not supported
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
542 }
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
543 if(audio_delay_method==1){
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
544 // SNDCTL_DSP_GETOSPACE
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
545 if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)!=-1)
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
546 return ((float)(ao_data.buffersize-zz.bytes))/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
547 audio_delay_method=0; // fallback if not supported
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
548 }
3095
981a9e5118ce interface to libao2 changed ao_plugin added
anders
parents: 2080
diff changeset
549 return ((float)ao_data.buffersize)/(float)ao_data.bps;
954
db20b90dd34d audio out drivers
arpi_esp
parents:
diff changeset
550 }