audiovar.h revision 1.13 1 1.13 mlelstv /* $NetBSD: audiovar.h,v 1.13 2023/04/23 08:06:05 mlelstv Exp $ */
2 1.2 isaki
3 1.2 isaki /*-
4 1.2 isaki * Copyright (c) 2002 The NetBSD Foundation, Inc.
5 1.2 isaki * All rights reserved.
6 1.2 isaki *
7 1.2 isaki * This code is derived from software contributed to The NetBSD Foundation
8 1.2 isaki * by TAMURA Kent
9 1.2 isaki *
10 1.2 isaki * Redistribution and use in source and binary forms, with or without
11 1.2 isaki * modification, are permitted provided that the following conditions
12 1.2 isaki * are met:
13 1.2 isaki * 1. Redistributions of source code must retain the above copyright
14 1.2 isaki * notice, this list of conditions and the following disclaimer.
15 1.2 isaki * 2. Redistributions in binary form must reproduce the above copyright
16 1.2 isaki * notice, this list of conditions and the following disclaimer in the
17 1.2 isaki * documentation and/or other materials provided with the distribution.
18 1.2 isaki *
19 1.2 isaki * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.2 isaki * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.2 isaki * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.2 isaki * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.2 isaki * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.2 isaki * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.2 isaki * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.2 isaki * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.2 isaki * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.2 isaki * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.2 isaki * POSSIBILITY OF SUCH DAMAGE.
30 1.2 isaki */
31 1.2 isaki
32 1.2 isaki /*
33 1.2 isaki * Copyright (c) 1991-1993 Regents of the University of California.
34 1.2 isaki * All rights reserved.
35 1.2 isaki *
36 1.2 isaki * Redistribution and use in source and binary forms, with or without
37 1.2 isaki * modification, are permitted provided that the following conditions
38 1.2 isaki * are met:
39 1.2 isaki * 1. Redistributions of source code must retain the above copyright
40 1.2 isaki * notice, this list of conditions and the following disclaimer.
41 1.2 isaki * 2. Redistributions in binary form must reproduce the above copyright
42 1.2 isaki * notice, this list of conditions and the following disclaimer in the
43 1.2 isaki * documentation and/or other materials provided with the distribution.
44 1.2 isaki * 3. All advertising materials mentioning features or use of this software
45 1.2 isaki * must display the following acknowledgement:
46 1.2 isaki * This product includes software developed by the Computer Systems
47 1.2 isaki * Engineering Group at Lawrence Berkeley Laboratory.
48 1.2 isaki * 4. Neither the name of the University nor of the Laboratory may be used
49 1.2 isaki * to endorse or promote products derived from this software without
50 1.2 isaki * specific prior written permission.
51 1.2 isaki *
52 1.2 isaki * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 1.2 isaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 1.2 isaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 1.2 isaki * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 1.2 isaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 1.2 isaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 1.2 isaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 1.2 isaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 1.2 isaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 1.2 isaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 1.2 isaki * SUCH DAMAGE.
63 1.2 isaki *
64 1.2 isaki * From: Header: audiovar.h,v 1.3 93/07/18 14:07:25 mccanne Exp (LBL)
65 1.2 isaki */
66 1.2 isaki
67 1.2 isaki #ifndef _SYS_DEV_AUDIO_AUDIOVAR_H_
68 1.2 isaki #define _SYS_DEV_AUDIO_AUDIOVAR_H_
69 1.2 isaki
70 1.2 isaki #include <sys/condvar.h>
71 1.2 isaki #include <sys/proc.h>
72 1.8 isaki #include <sys/pserialize.h>
73 1.8 isaki #include <sys/psref.h>
74 1.2 isaki #include <sys/queue.h>
75 1.2 isaki
76 1.2 isaki #include <dev/audio/audio_if.h>
77 1.2 isaki #include <dev/audio/audiofil.h>
78 1.2 isaki
79 1.2 isaki /*
80 1.2 isaki * Whether supports [US]LINEAR24/24 as userland format.
81 1.2 isaki */
82 1.13 mlelstv #define AUDIO_SUPPORT_LINEAR24
83 1.2 isaki
84 1.2 isaki /*
85 1.2 isaki * Frequency range.
86 1.2 isaki * For lower limit, there are some antique machines who supports under
87 1.2 isaki * 4000Hz, so that we accept 1000Hz as lower limit, regardless of
88 1.2 isaki * practicality(?).
89 1.2 isaki * For upper limit, there are some devices who supports 384000Hz, but
90 1.2 isaki * I don't have them. :-)
91 1.2 isaki */
92 1.2 isaki #define AUDIO_MIN_FREQUENCY (1000)
93 1.2 isaki #define AUDIO_MAX_FREQUENCY (192000)
94 1.2 isaki
95 1.2 isaki typedef struct audio_file audio_file_t;
96 1.2 isaki typedef struct audio_trackmixer audio_trackmixer_t;
97 1.2 isaki
98 1.2 isaki /* ring buffer */
99 1.2 isaki typedef struct {
100 1.2 isaki audio_format2_t fmt; /* format */
101 1.2 isaki int capacity; /* capacity by frame */
102 1.2 isaki int head; /* head position in frame */
103 1.2 isaki int used; /* used frame count */
104 1.2 isaki void *mem; /* sample ptr */
105 1.2 isaki } audio_ring_t;
106 1.2 isaki
107 1.2 isaki #define AUDIO_N_PORTS 4
108 1.2 isaki
109 1.2 isaki struct au_mixer_ports {
110 1.2 isaki int index; /* index of port-selector mixerctl */
111 1.2 isaki int master; /* index of master mixerctl */
112 1.2 isaki int nports; /* number of selectable ports */
113 1.2 isaki bool isenum; /* selector is enum type */
114 1.2 isaki u_int allports; /* all aumasks or'd */
115 1.2 isaki u_int aumask[AUDIO_N_PORTS]; /* exposed value of "ports" */
116 1.2 isaki int misel [AUDIO_N_PORTS]; /* ord of port, for selector */
117 1.2 isaki int miport[AUDIO_N_PORTS]; /* index of port's mixerctl */
118 1.2 isaki bool isdual; /* has working mixerout */
119 1.2 isaki int mixerout; /* ord of mixerout, for dual case */
120 1.2 isaki int cur_port; /* the port that gain actually controls when
121 1.2 isaki mixerout is selected, for dual case */
122 1.2 isaki };
123 1.2 isaki
124 1.2 isaki struct audio_softc {
125 1.2 isaki /* Myself (e.g.; audio0, audio1, ...) */
126 1.2 isaki device_t sc_dev;
127 1.2 isaki
128 1.2 isaki /* Hardware device struct (e.g.; sb0, hdafg0, ...) */
129 1.2 isaki device_t hw_dev;
130 1.2 isaki
131 1.2 isaki /*
132 1.2 isaki * Hardware interface and driver handle.
133 1.2 isaki * hw_if == NULL means that the device is (attached but) disabled.
134 1.2 isaki */
135 1.2 isaki const struct audio_hw_if *hw_if;
136 1.2 isaki void *hw_hdl;
137 1.2 isaki
138 1.2 isaki /*
139 1.3 isaki * Properties obtained by get_props().
140 1.3 isaki * No need any locks to read this variable.
141 1.3 isaki */
142 1.3 isaki int sc_props;
143 1.3 isaki
144 1.3 isaki /*
145 1.2 isaki * List of opened descriptors.
146 1.5 isaki * Must be protected by sc_lock || sc_intr_lock for traversal(FOREACH).
147 1.5 isaki * Must be protected by sc_lock && sc_intr_lock for insertion/removal.
148 1.2 isaki */
149 1.2 isaki SLIST_HEAD(, audio_file) sc_files;
150 1.2 isaki
151 1.2 isaki /*
152 1.2 isaki * Blocksize in msec.
153 1.11 isaki * Must be protected by sc_exlock.
154 1.2 isaki */
155 1.2 isaki int sc_blk_ms;
156 1.2 isaki
157 1.2 isaki /*
158 1.2 isaki * Track mixer for playback and recording.
159 1.2 isaki * If null, the mixer is disabled.
160 1.11 isaki * Must be protected by sc_exlock.
161 1.2 isaki */
162 1.2 isaki audio_trackmixer_t *sc_pmixer;
163 1.2 isaki audio_trackmixer_t *sc_rmixer;
164 1.2 isaki
165 1.2 isaki /*
166 1.2 isaki * Opening track counter.
167 1.11 isaki * Must be protected by sc_lock && sc_exlock for modifying.
168 1.11 isaki * Must be protected by sc_lock || sc_exlock for reference.
169 1.2 isaki */
170 1.2 isaki int sc_popens;
171 1.2 isaki int sc_ropens;
172 1.2 isaki
173 1.2 isaki /*
174 1.2 isaki * true if the track mixer is running.
175 1.11 isaki * Must be protected by sc_exlock && sc_intr_lock for modifying.
176 1.11 isaki * Must be protected by sc_exlock || sc_intr_lock for reference.
177 1.2 isaki */
178 1.2 isaki bool sc_pbusy;
179 1.2 isaki bool sc_rbusy;
180 1.2 isaki
181 1.2 isaki /*
182 1.2 isaki * These four are the parameters sustained with /dev/sound.
183 1.11 isaki * Must be protected by sc_exlock.
184 1.2 isaki */
185 1.2 isaki audio_format2_t sc_sound_pparams;
186 1.2 isaki audio_format2_t sc_sound_rparams;
187 1.2 isaki bool sc_sound_ppause;
188 1.2 isaki bool sc_sound_rpause;
189 1.2 isaki
190 1.2 isaki /* recent info for /dev/sound */
191 1.2 isaki /* XXX TODO */
192 1.2 isaki struct audio_info sc_ai;
193 1.2 isaki
194 1.2 isaki /*
195 1.2 isaki * Playback(write)/Recording(read) selector.
196 1.2 isaki * Must be protected by sc_lock.
197 1.2 isaki */
198 1.2 isaki struct selinfo sc_wsel;
199 1.2 isaki struct selinfo sc_rsel;
200 1.2 isaki
201 1.2 isaki /*
202 1.7 isaki * Processes who want mixer SIGIO.
203 1.7 isaki * sc_am is an array of pids, or NULL if empty.
204 1.7 isaki * sc_am_capacity is the number of allocated elements.
205 1.7 isaki * sc_am_used is the number of elements actually used.
206 1.11 isaki * Must be protected by sc_exlock.
207 1.2 isaki */
208 1.7 isaki pid_t *sc_am;
209 1.7 isaki int sc_am_capacity;
210 1.7 isaki int sc_am_used;
211 1.2 isaki
212 1.2 isaki /*
213 1.2 isaki * Thread lock and interrupt lock obtained by get_locks().
214 1.2 isaki */
215 1.2 isaki kmutex_t *sc_lock;
216 1.2 isaki kmutex_t *sc_intr_lock;
217 1.2 isaki
218 1.2 isaki /*
219 1.2 isaki * Critical section.
220 1.2 isaki * Must be protected by sc_lock.
221 1.2 isaki */
222 1.2 isaki int sc_exlock;
223 1.2 isaki kcondvar_t sc_exlockcv;
224 1.2 isaki
225 1.2 isaki /*
226 1.8 isaki * Passive reference to prevent a race between detach and fileops.
227 1.8 isaki * pserialize_perform(sc_psz) must be protected by sc_lock.
228 1.8 isaki */
229 1.8 isaki pserialize_t sc_psz;
230 1.8 isaki struct psref_target sc_psref;
231 1.8 isaki
232 1.8 isaki /*
233 1.2 isaki * Must be protected by sc_lock (?)
234 1.2 isaki */
235 1.2 isaki bool sc_dying;
236 1.2 isaki
237 1.2 isaki /*
238 1.12 isaki * Indicates that about to suspend.
239 1.12 isaki * Must be protected by sc_lock.
240 1.12 isaki */
241 1.12 isaki bool sc_suspending;
242 1.12 isaki
243 1.12 isaki /*
244 1.2 isaki * If multiuser is false, other users who have different euid
245 1.2 isaki * than the first user cannot open this device.
246 1.11 isaki * Must be protected by sc_exlock.
247 1.2 isaki */
248 1.2 isaki bool sc_multiuser;
249 1.2 isaki kauth_cred_t sc_cred;
250 1.2 isaki
251 1.2 isaki struct sysctllog *sc_log;
252 1.2 isaki
253 1.2 isaki mixer_ctrl_t *sc_mixer_state;
254 1.2 isaki int sc_nmixer_states;
255 1.2 isaki struct au_mixer_ports sc_inports;
256 1.2 isaki struct au_mixer_ports sc_outports;
257 1.2 isaki int sc_monitor_port;
258 1.2 isaki u_int sc_lastgain;
259 1.2 isaki };
260 1.2 isaki
261 1.2 isaki #ifdef DIAGNOSTIC
262 1.2 isaki #define DIAGNOSTIC_filter_arg(arg) audio_diagnostic_filter_arg(__func__, (arg))
263 1.2 isaki #define DIAGNOSTIC_format2(fmt) audio_diagnostic_format2(__func__, (fmt))
264 1.2 isaki extern void audio_diagnostic_filter_arg(const char *,
265 1.2 isaki const audio_filter_arg_t *);
266 1.2 isaki extern void audio_diagnostic_format2(const char *, const audio_format2_t *);
267 1.2 isaki #else
268 1.2 isaki #define DIAGNOSTIC_filter_arg(arg)
269 1.2 isaki #define DIAGNOSTIC_format2(fmt)
270 1.2 isaki #endif
271 1.2 isaki
272 1.2 isaki /*
273 1.2 isaki * Return true if 'fmt' is the internal format.
274 1.2 isaki * It does not check for frequency and number of channels.
275 1.2 isaki */
276 1.2 isaki static __inline bool
277 1.2 isaki audio_format2_is_internal(const audio_format2_t *fmt)
278 1.2 isaki {
279 1.2 isaki
280 1.2 isaki if (fmt->encoding != AUDIO_ENCODING_SLINEAR_NE)
281 1.2 isaki return false;
282 1.2 isaki if (fmt->precision != AUDIO_INTERNAL_BITS)
283 1.2 isaki return false;
284 1.2 isaki if (fmt->stride != AUDIO_INTERNAL_BITS)
285 1.2 isaki return false;
286 1.2 isaki return true;
287 1.2 isaki }
288 1.2 isaki
289 1.2 isaki /*
290 1.2 isaki * Return true if fmt's encoding is one of LINEAR.
291 1.2 isaki */
292 1.2 isaki static __inline bool
293 1.2 isaki audio_format2_is_linear(const audio_format2_t *fmt)
294 1.2 isaki {
295 1.2 isaki return (fmt->encoding == AUDIO_ENCODING_SLINEAR_LE)
296 1.2 isaki || (fmt->encoding == AUDIO_ENCODING_SLINEAR_BE)
297 1.2 isaki || (fmt->encoding == AUDIO_ENCODING_ULINEAR_LE)
298 1.2 isaki || (fmt->encoding == AUDIO_ENCODING_ULINEAR_BE);
299 1.2 isaki }
300 1.2 isaki
301 1.2 isaki /*
302 1.2 isaki * Return true if fmt's encoding is one of SLINEAR.
303 1.2 isaki */
304 1.2 isaki static __inline bool
305 1.2 isaki audio_format2_is_signed(const audio_format2_t *fmt)
306 1.2 isaki {
307 1.2 isaki return (fmt->encoding == AUDIO_ENCODING_SLINEAR_LE)
308 1.2 isaki || (fmt->encoding == AUDIO_ENCODING_SLINEAR_BE);
309 1.2 isaki }
310 1.2 isaki
311 1.2 isaki /*
312 1.2 isaki * Return fmt's endian as LITTLE_ENDIAN or BIG_ENDIAN.
313 1.2 isaki */
314 1.2 isaki static __inline int
315 1.2 isaki audio_format2_endian(const audio_format2_t *fmt)
316 1.2 isaki {
317 1.2 isaki if (fmt->stride == 8) {
318 1.2 isaki /* HOST ENDIAN */
319 1.2 isaki return BYTE_ORDER;
320 1.2 isaki }
321 1.2 isaki
322 1.2 isaki if (fmt->encoding == AUDIO_ENCODING_SLINEAR_LE ||
323 1.2 isaki fmt->encoding == AUDIO_ENCODING_ULINEAR_LE) {
324 1.2 isaki return LITTLE_ENDIAN;
325 1.2 isaki }
326 1.2 isaki if (fmt->encoding == AUDIO_ENCODING_SLINEAR_BE ||
327 1.2 isaki fmt->encoding == AUDIO_ENCODING_ULINEAR_BE) {
328 1.2 isaki return BIG_ENDIAN;
329 1.2 isaki }
330 1.2 isaki return BYTE_ORDER;
331 1.2 isaki }
332 1.2 isaki
333 1.2 isaki /* Interfaces for audiobell. */
334 1.4 isaki int audiobellopen(dev_t, audio_file_t **);
335 1.4 isaki int audiobellsetrate(audio_file_t *, u_int);
336 1.2 isaki int audiobellclose(audio_file_t *);
337 1.2 isaki int audiobellwrite(audio_file_t *, struct uio *);
338 1.2 isaki
339 1.2 isaki #endif /* !_SYS_DEV_AUDIO_AUDIOVAR_H_ */
340