1 1.146 nia /* $NetBSD: audio.c,v 1.146 2024/05/27 02:47:53 nia Exp $ */ 2 1.2 isaki 3 1.2 isaki /*- 4 1.2 isaki * Copyright (c) 2008 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 Andrew Doran. 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 65 1.2 isaki /* 66 1.120 isaki * Terminology: "sample", "channel", "frame", "block", "track": 67 1.120 isaki * 68 1.120 isaki * channel frame 69 1.120 isaki * | ........ 70 1.120 isaki * v : : \ 71 1.120 isaki * +------:------:------:- -+------+ : +------+-.. | 72 1.120 isaki * #0(L) |sample|sample|sample| .. |sample| : |sample| | 73 1.120 isaki * +------:------:------:- -+------+ : +------+-.. | 74 1.120 isaki * #1(R) |sample|sample|sample| .. |sample| : |sample| | 75 1.120 isaki * +------:------:------:- -+------+ : +------+-.. | track 76 1.120 isaki * : : : : | 77 1.120 isaki * +------:------:------:- -+------+ : +------+-.. | 78 1.120 isaki * |sample|sample|sample| .. |sample| : |sample| | 79 1.120 isaki * +------:------:------:- -+------+ : +------+-.. | 80 1.120 isaki * : : / 81 1.120 isaki * ........ 82 1.120 isaki * 83 1.120 isaki * \--------------------------------/ \--------.. 84 1.120 isaki * block 85 1.120 isaki * 86 1.120 isaki * - A "frame" is the minimum unit in the time axis direction, and consists 87 1.120 isaki * of samples for the number of channels. 88 1.120 isaki * - A "block" is basic length of processing. The audio layer basically 89 1.120 isaki * handles audio data stream block by block, asks underlying hardware to 90 1.120 isaki * process them block by block, and then the hardware raises interrupt by 91 1.120 isaki * each block. 92 1.120 isaki * - A "track" is single completed audio stream. 93 1.120 isaki * 94 1.120 isaki * For example, the hardware block is assumed to be 10 msec, and your audio 95 1.120 isaki * track consists of 2.1(=3) channels 44.1kHz 16bit PCM, 96 1.120 isaki * 97 1.120 isaki * "channel" = 3 98 1.120 isaki * "sample" = 2 [bytes] 99 1.120 isaki * "frame" = 2 [bytes/sample] * 3 [channels] = 6 [bytes] 100 1.120 isaki * "block" = 44100 [Hz] * (10/1000) [seconds] * 6 [bytes/frame] = 2646 [bytes] 101 1.120 isaki * 102 1.120 isaki * The terminologies shown here are only for this MI audio layer. Note that 103 1.120 isaki * different terminologies may be used in each manufacturer's datasheet, and 104 1.120 isaki * each MD driver may follow it. For example, what we call a "block" is 105 1.120 isaki * called a "frame" in sys/dev/pci/yds.c. 106 1.120 isaki */ 107 1.120 isaki 108 1.120 isaki /* 109 1.2 isaki * Locking: there are three locks per device. 110 1.2 isaki * 111 1.2 isaki * - sc_lock, provided by the underlying driver. This is an adaptive lock, 112 1.2 isaki * returned in the second parameter to hw_if->get_locks(). It is known 113 1.2 isaki * as the "thread lock". 114 1.2 isaki * 115 1.2 isaki * It serializes access to state in all places except the 116 1.2 isaki * driver's interrupt service routine. This lock is taken from process 117 1.2 isaki * context (example: access to /dev/audio). It is also taken from soft 118 1.2 isaki * interrupt handlers in this module, primarily to serialize delivery of 119 1.2 isaki * wakeups. This lock may be used/provided by modules external to the 120 1.2 isaki * audio subsystem, so take care not to introduce a lock order problem. 121 1.2 isaki * LONG TERM SLEEPS MUST NOT OCCUR WITH THIS LOCK HELD. 122 1.2 isaki * 123 1.2 isaki * - sc_intr_lock, provided by the underlying driver. This may be either a 124 1.2 isaki * spinlock (at IPL_SCHED or IPL_VM) or an adaptive lock (IPL_NONE or 125 1.2 isaki * IPL_SOFT*), returned in the first parameter to hw_if->get_locks(). It 126 1.2 isaki * is known as the "interrupt lock". 127 1.2 isaki * 128 1.2 isaki * It provides atomic access to the device's hardware state, and to audio 129 1.2 isaki * channel data that may be accessed by the hardware driver's ISR. 130 1.2 isaki * In all places outside the ISR, sc_lock must be held before taking 131 1.2 isaki * sc_intr_lock. This is to ensure that groups of hardware operations are 132 1.2 isaki * made atomically. SLEEPS CANNOT OCCUR WITH THIS LOCK HELD. 133 1.2 isaki * 134 1.2 isaki * - sc_exlock, private to this module. This is a variable protected by 135 1.2 isaki * sc_lock. It is known as the "critical section". 136 1.2 isaki * Some operations release sc_lock in order to allocate memory, to wait 137 1.2 isaki * for in-flight I/O to complete, to copy to/from user context, etc. 138 1.2 isaki * sc_exlock provides a critical section even under the circumstance. 139 1.2 isaki * "+" in following list indicates the interfaces which necessary to be 140 1.2 isaki * protected by sc_exlock. 141 1.2 isaki * 142 1.2 isaki * List of hardware interface methods, and which locks are held when each 143 1.2 isaki * is called by this module: 144 1.2 isaki * 145 1.2 isaki * METHOD INTR THREAD NOTES 146 1.2 isaki * ----------------------- ------- ------- ------------------------- 147 1.2 isaki * open x x + 148 1.2 isaki * close x x + 149 1.2 isaki * query_format - x 150 1.2 isaki * set_format - x 151 1.2 isaki * round_blocksize - x 152 1.2 isaki * commit_settings - x 153 1.2 isaki * init_output x x 154 1.2 isaki * init_input x x 155 1.2 isaki * start_output x x + 156 1.2 isaki * start_input x x + 157 1.2 isaki * halt_output x x + 158 1.2 isaki * halt_input x x + 159 1.2 isaki * speaker_ctl x x 160 1.109 riastrad * getdev - - 161 1.2 isaki * set_port - x + 162 1.2 isaki * get_port - x + 163 1.2 isaki * query_devinfo - x 164 1.64 isaki * allocm - - + 165 1.64 isaki * freem - - + 166 1.2 isaki * round_buffersize - x 167 1.52 isaki * get_props - - Called at attach time 168 1.2 isaki * trigger_output x x + 169 1.2 isaki * trigger_input x x + 170 1.2 isaki * dev_ioctl - x 171 1.2 isaki * get_locks - - Called at attach time 172 1.2 isaki * 173 1.9 isaki * In addition, there is an additional lock. 174 1.2 isaki * 175 1.2 isaki * - track->lock. This is an atomic variable and is similar to the 176 1.2 isaki * "interrupt lock". This is one for each track. If any thread context 177 1.2 isaki * (and software interrupt context) and hardware interrupt context who 178 1.2 isaki * want to access some variables on this track, they must acquire this 179 1.2 isaki * lock before. It protects track's consistency between hardware 180 1.2 isaki * interrupt context and others. 181 1.2 isaki */ 182 1.2 isaki 183 1.2 isaki #include <sys/cdefs.h> 184 1.146 nia __KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.146 2024/05/27 02:47:53 nia Exp $"); 185 1.2 isaki 186 1.2 isaki #ifdef _KERNEL_OPT 187 1.2 isaki #include "audio.h" 188 1.2 isaki #include "midi.h" 189 1.2 isaki #endif 190 1.2 isaki 191 1.2 isaki #if NAUDIO > 0 192 1.2 isaki 193 1.2 isaki #include <sys/types.h> 194 1.2 isaki #include <sys/param.h> 195 1.2 isaki #include <sys/atomic.h> 196 1.2 isaki #include <sys/audioio.h> 197 1.2 isaki #include <sys/conf.h> 198 1.2 isaki #include <sys/cpu.h> 199 1.2 isaki #include <sys/device.h> 200 1.2 isaki #include <sys/fcntl.h> 201 1.2 isaki #include <sys/file.h> 202 1.2 isaki #include <sys/filedesc.h> 203 1.2 isaki #include <sys/intr.h> 204 1.2 isaki #include <sys/ioctl.h> 205 1.2 isaki #include <sys/kauth.h> 206 1.2 isaki #include <sys/kernel.h> 207 1.2 isaki #include <sys/kmem.h> 208 1.114 riastrad #include <sys/lock.h> 209 1.2 isaki #include <sys/malloc.h> 210 1.2 isaki #include <sys/mman.h> 211 1.2 isaki #include <sys/module.h> 212 1.2 isaki #include <sys/poll.h> 213 1.2 isaki #include <sys/proc.h> 214 1.2 isaki #include <sys/queue.h> 215 1.2 isaki #include <sys/select.h> 216 1.2 isaki #include <sys/signalvar.h> 217 1.2 isaki #include <sys/stat.h> 218 1.2 isaki #include <sys/sysctl.h> 219 1.2 isaki #include <sys/systm.h> 220 1.2 isaki #include <sys/syslog.h> 221 1.2 isaki #include <sys/vnode.h> 222 1.2 isaki 223 1.2 isaki #include <dev/audio/audio_if.h> 224 1.2 isaki #include <dev/audio/audiovar.h> 225 1.2 isaki #include <dev/audio/audiodef.h> 226 1.2 isaki #include <dev/audio/linear.h> 227 1.2 isaki #include <dev/audio/mulaw.h> 228 1.2 isaki 229 1.2 isaki #include <machine/endian.h> 230 1.2 isaki 231 1.53 chs #include <uvm/uvm_extern.h> 232 1.2 isaki 233 1.2 isaki #include "ioconf.h" 234 1.2 isaki 235 1.2 isaki /* 236 1.2 isaki * 0: No debug logs 237 1.135 isaki * 1: action changes like open/close/set_format/mmap... 238 1.2 isaki * 2: + normal operations like read/write/ioctl... 239 1.2 isaki * 3: + TRACEs except interrupt 240 1.2 isaki * 4: + TRACEs including interrupt 241 1.2 isaki */ 242 1.2 isaki //#define AUDIO_DEBUG 1 243 1.2 isaki 244 1.2 isaki #if defined(AUDIO_DEBUG) 245 1.2 isaki 246 1.2 isaki int audiodebug = AUDIO_DEBUG; 247 1.2 isaki static void audio_vtrace(struct audio_softc *sc, const char *, const char *, 248 1.2 isaki const char *, va_list); 249 1.2 isaki static void audio_trace(struct audio_softc *sc, const char *, const char *, ...) 250 1.2 isaki __printflike(3, 4); 251 1.2 isaki static void audio_tracet(const char *, audio_track_t *, const char *, ...) 252 1.2 isaki __printflike(3, 4); 253 1.2 isaki static void audio_tracef(const char *, audio_file_t *, const char *, ...) 254 1.2 isaki __printflike(3, 4); 255 1.2 isaki 256 1.2 isaki /* XXX sloppy memory logger */ 257 1.2 isaki static void audio_mlog_init(void); 258 1.2 isaki static void audio_mlog_free(void); 259 1.2 isaki static void audio_mlog_softintr(void *); 260 1.2 isaki extern void audio_mlog_flush(void); 261 1.2 isaki extern void audio_mlog_printf(const char *, ...); 262 1.2 isaki 263 1.2 isaki static int mlog_refs; /* reference counter */ 264 1.2 isaki static char *mlog_buf[2]; /* double buffer */ 265 1.2 isaki static int mlog_buflen; /* buffer length */ 266 1.2 isaki static int mlog_used; /* used length */ 267 1.2 isaki static int mlog_full; /* number of dropped lines by buffer full */ 268 1.2 isaki static int mlog_drop; /* number of dropped lines by busy */ 269 1.2 isaki static volatile uint32_t mlog_inuse; /* in-use */ 270 1.2 isaki static int mlog_wpage; /* active page */ 271 1.2 isaki static void *mlog_sih; /* softint handle */ 272 1.2 isaki 273 1.2 isaki static void 274 1.2 isaki audio_mlog_init(void) 275 1.2 isaki { 276 1.2 isaki mlog_refs++; 277 1.2 isaki if (mlog_refs > 1) 278 1.2 isaki return; 279 1.2 isaki mlog_buflen = 4096; 280 1.2 isaki mlog_buf[0] = kmem_zalloc(mlog_buflen, KM_SLEEP); 281 1.2 isaki mlog_buf[1] = kmem_zalloc(mlog_buflen, KM_SLEEP); 282 1.2 isaki mlog_used = 0; 283 1.2 isaki mlog_full = 0; 284 1.2 isaki mlog_drop = 0; 285 1.2 isaki mlog_inuse = 0; 286 1.2 isaki mlog_wpage = 0; 287 1.2 isaki mlog_sih = softint_establish(SOFTINT_SERIAL, audio_mlog_softintr, NULL); 288 1.2 isaki if (mlog_sih == NULL) 289 1.2 isaki printf("%s: softint_establish failed\n", __func__); 290 1.2 isaki } 291 1.2 isaki 292 1.2 isaki static void 293 1.2 isaki audio_mlog_free(void) 294 1.2 isaki { 295 1.2 isaki mlog_refs--; 296 1.2 isaki if (mlog_refs > 0) 297 1.2 isaki return; 298 1.2 isaki 299 1.2 isaki audio_mlog_flush(); 300 1.2 isaki if (mlog_sih) 301 1.2 isaki softint_disestablish(mlog_sih); 302 1.2 isaki kmem_free(mlog_buf[0], mlog_buflen); 303 1.2 isaki kmem_free(mlog_buf[1], mlog_buflen); 304 1.2 isaki } 305 1.2 isaki 306 1.2 isaki /* 307 1.2 isaki * Flush memory buffer. 308 1.2 isaki * It must not be called from hardware interrupt context. 309 1.2 isaki */ 310 1.2 isaki void 311 1.2 isaki audio_mlog_flush(void) 312 1.2 isaki { 313 1.2 isaki if (mlog_refs == 0) 314 1.2 isaki return; 315 1.2 isaki 316 1.2 isaki /* Nothing to do if already in use ? */ 317 1.2 isaki if (atomic_swap_32(&mlog_inuse, 1) == 1) 318 1.2 isaki return; 319 1.123 riastrad membar_acquire(); 320 1.2 isaki 321 1.2 isaki int rpage = mlog_wpage; 322 1.2 isaki mlog_wpage ^= 1; 323 1.2 isaki mlog_buf[mlog_wpage][0] = '\0'; 324 1.2 isaki mlog_used = 0; 325 1.2 isaki 326 1.115 riastrad atomic_store_release(&mlog_inuse, 0); 327 1.2 isaki 328 1.2 isaki if (mlog_buf[rpage][0] != '\0') { 329 1.2 isaki printf("%s", mlog_buf[rpage]); 330 1.2 isaki if (mlog_drop > 0) 331 1.2 isaki printf("mlog_drop %d\n", mlog_drop); 332 1.2 isaki if (mlog_full > 0) 333 1.2 isaki printf("mlog_full %d\n", mlog_full); 334 1.2 isaki } 335 1.2 isaki mlog_full = 0; 336 1.2 isaki mlog_drop = 0; 337 1.2 isaki } 338 1.2 isaki 339 1.2 isaki static void 340 1.2 isaki audio_mlog_softintr(void *cookie) 341 1.2 isaki { 342 1.2 isaki audio_mlog_flush(); 343 1.2 isaki } 344 1.2 isaki 345 1.2 isaki void 346 1.2 isaki audio_mlog_printf(const char *fmt, ...) 347 1.2 isaki { 348 1.2 isaki int len; 349 1.2 isaki va_list ap; 350 1.2 isaki 351 1.2 isaki if (atomic_swap_32(&mlog_inuse, 1) == 1) { 352 1.2 isaki /* already inuse */ 353 1.2 isaki mlog_drop++; 354 1.2 isaki return; 355 1.2 isaki } 356 1.123 riastrad membar_acquire(); 357 1.2 isaki 358 1.2 isaki va_start(ap, fmt); 359 1.2 isaki len = vsnprintf( 360 1.2 isaki mlog_buf[mlog_wpage] + mlog_used, 361 1.2 isaki mlog_buflen - mlog_used, 362 1.2 isaki fmt, ap); 363 1.2 isaki va_end(ap); 364 1.2 isaki 365 1.2 isaki mlog_used += len; 366 1.2 isaki if (mlog_buflen - mlog_used <= 1) { 367 1.2 isaki mlog_full++; 368 1.2 isaki } 369 1.2 isaki 370 1.114 riastrad atomic_store_release(&mlog_inuse, 0); 371 1.2 isaki 372 1.2 isaki if (mlog_sih) 373 1.2 isaki softint_schedule(mlog_sih); 374 1.2 isaki } 375 1.2 isaki 376 1.2 isaki /* trace functions */ 377 1.2 isaki static void 378 1.2 isaki audio_vtrace(struct audio_softc *sc, const char *funcname, const char *header, 379 1.2 isaki const char *fmt, va_list ap) 380 1.2 isaki { 381 1.2 isaki char buf[256]; 382 1.2 isaki int n; 383 1.2 isaki 384 1.2 isaki n = 0; 385 1.2 isaki buf[0] = '\0'; 386 1.2 isaki n += snprintf(buf + n, sizeof(buf) - n, "%s@%d %s", 387 1.2 isaki funcname, device_unit(sc->sc_dev), header); 388 1.2 isaki n += vsnprintf(buf + n, sizeof(buf) - n, fmt, ap); 389 1.2 isaki 390 1.2 isaki if (cpu_intr_p()) { 391 1.2 isaki audio_mlog_printf("%s\n", buf); 392 1.2 isaki } else { 393 1.2 isaki audio_mlog_flush(); 394 1.2 isaki printf("%s\n", buf); 395 1.2 isaki } 396 1.2 isaki } 397 1.2 isaki 398 1.2 isaki static void 399 1.2 isaki audio_trace(struct audio_softc *sc, const char *funcname, const char *fmt, ...) 400 1.2 isaki { 401 1.2 isaki va_list ap; 402 1.2 isaki 403 1.2 isaki va_start(ap, fmt); 404 1.2 isaki audio_vtrace(sc, funcname, "", fmt, ap); 405 1.2 isaki va_end(ap); 406 1.2 isaki } 407 1.2 isaki 408 1.2 isaki static void 409 1.2 isaki audio_tracet(const char *funcname, audio_track_t *track, const char *fmt, ...) 410 1.2 isaki { 411 1.2 isaki char hdr[16]; 412 1.2 isaki va_list ap; 413 1.2 isaki 414 1.2 isaki snprintf(hdr, sizeof(hdr), "#%d ", track->id); 415 1.2 isaki va_start(ap, fmt); 416 1.2 isaki audio_vtrace(track->mixer->sc, funcname, hdr, fmt, ap); 417 1.2 isaki va_end(ap); 418 1.2 isaki } 419 1.2 isaki 420 1.2 isaki static void 421 1.2 isaki audio_tracef(const char *funcname, audio_file_t *file, const char *fmt, ...) 422 1.2 isaki { 423 1.2 isaki char hdr[32]; 424 1.2 isaki char phdr[16], rhdr[16]; 425 1.2 isaki va_list ap; 426 1.2 isaki 427 1.2 isaki phdr[0] = '\0'; 428 1.2 isaki rhdr[0] = '\0'; 429 1.2 isaki if (file->ptrack) 430 1.2 isaki snprintf(phdr, sizeof(phdr), "#%d", file->ptrack->id); 431 1.2 isaki if (file->rtrack) 432 1.2 isaki snprintf(rhdr, sizeof(rhdr), "#%d", file->rtrack->id); 433 1.2 isaki snprintf(hdr, sizeof(hdr), "{%s,%s} ", phdr, rhdr); 434 1.2 isaki 435 1.2 isaki va_start(ap, fmt); 436 1.2 isaki audio_vtrace(file->sc, funcname, hdr, fmt, ap); 437 1.2 isaki va_end(ap); 438 1.2 isaki } 439 1.2 isaki 440 1.2 isaki #define DPRINTF(n, fmt...) do { \ 441 1.2 isaki if (audiodebug >= (n)) { \ 442 1.2 isaki audio_mlog_flush(); \ 443 1.2 isaki printf(fmt); \ 444 1.2 isaki } \ 445 1.2 isaki } while (0) 446 1.2 isaki #define TRACE(n, fmt...) do { \ 447 1.2 isaki if (audiodebug >= (n)) audio_trace(sc, __func__, fmt); \ 448 1.2 isaki } while (0) 449 1.2 isaki #define TRACET(n, t, fmt...) do { \ 450 1.2 isaki if (audiodebug >= (n)) audio_tracet(__func__, t, fmt); \ 451 1.2 isaki } while (0) 452 1.2 isaki #define TRACEF(n, f, fmt...) do { \ 453 1.2 isaki if (audiodebug >= (n)) audio_tracef(__func__, f, fmt); \ 454 1.2 isaki } while (0) 455 1.2 isaki 456 1.2 isaki struct audio_track_debugbuf { 457 1.2 isaki char usrbuf[32]; 458 1.2 isaki char codec[32]; 459 1.2 isaki char chvol[32]; 460 1.2 isaki char chmix[32]; 461 1.2 isaki char freq[32]; 462 1.2 isaki char outbuf[32]; 463 1.2 isaki }; 464 1.2 isaki 465 1.2 isaki static void 466 1.2 isaki audio_track_bufstat(audio_track_t *track, struct audio_track_debugbuf *buf) 467 1.2 isaki { 468 1.2 isaki 469 1.2 isaki memset(buf, 0, sizeof(*buf)); 470 1.2 isaki 471 1.2 isaki snprintf(buf->outbuf, sizeof(buf->outbuf), " out=%d/%d/%d", 472 1.2 isaki track->outbuf.head, track->outbuf.used, track->outbuf.capacity); 473 1.2 isaki if (track->freq.filter) 474 1.2 isaki snprintf(buf->freq, sizeof(buf->freq), " f=%d/%d/%d", 475 1.2 isaki track->freq.srcbuf.head, 476 1.2 isaki track->freq.srcbuf.used, 477 1.2 isaki track->freq.srcbuf.capacity); 478 1.2 isaki if (track->chmix.filter) 479 1.2 isaki snprintf(buf->chmix, sizeof(buf->chmix), " m=%d", 480 1.2 isaki track->chmix.srcbuf.used); 481 1.2 isaki if (track->chvol.filter) 482 1.2 isaki snprintf(buf->chvol, sizeof(buf->chvol), " v=%d", 483 1.2 isaki track->chvol.srcbuf.used); 484 1.2 isaki if (track->codec.filter) 485 1.2 isaki snprintf(buf->codec, sizeof(buf->codec), " e=%d", 486 1.2 isaki track->codec.srcbuf.used); 487 1.2 isaki snprintf(buf->usrbuf, sizeof(buf->usrbuf), " usr=%d/%d/H%d", 488 1.2 isaki track->usrbuf.head, track->usrbuf.used, track->usrbuf_usedhigh); 489 1.2 isaki } 490 1.2 isaki #else 491 1.2 isaki #define DPRINTF(n, fmt...) do { } while (0) 492 1.2 isaki #define TRACE(n, fmt, ...) do { } while (0) 493 1.2 isaki #define TRACET(n, t, fmt, ...) do { } while (0) 494 1.2 isaki #define TRACEF(n, f, fmt, ...) do { } while (0) 495 1.2 isaki #endif 496 1.2 isaki 497 1.2 isaki #define SPECIFIED(x) ((x) != ~0) 498 1.2 isaki #define SPECIFIED_CH(x) ((x) != (u_char)~0) 499 1.2 isaki 500 1.68 isaki /* 501 1.68 isaki * Default hardware blocksize in msec. 502 1.68 isaki * 503 1.69 isaki * We use 10 msec for most modern platforms. This period is good enough to 504 1.69 isaki * play audio and video synchronizely. 505 1.68 isaki * In contrast, for very old platforms, this is usually too short and too 506 1.68 isaki * severe. Also such platforms usually can not play video confortably, so 507 1.69 isaki * it's not so important to make the blocksize shorter. If the platform 508 1.69 isaki * defines its own value as __AUDIO_BLK_MS in its <machine/param.h>, it 509 1.69 isaki * uses this instead. 510 1.69 isaki * 511 1.68 isaki * In either case, you can overwrite AUDIO_BLK_MS by your kernel 512 1.68 isaki * configuration file if you wish. 513 1.69 isaki */ 514 1.68 isaki #if !defined(AUDIO_BLK_MS) 515 1.69 isaki # if defined(__AUDIO_BLK_MS) 516 1.69 isaki # define AUDIO_BLK_MS __AUDIO_BLK_MS 517 1.68 isaki # else 518 1.69 isaki # define AUDIO_BLK_MS (10) 519 1.68 isaki # endif 520 1.68 isaki #endif 521 1.68 isaki 522 1.2 isaki /* Device timeout in msec */ 523 1.2 isaki #define AUDIO_TIMEOUT (3000) 524 1.2 isaki 525 1.2 isaki /* #define AUDIO_PM_IDLE */ 526 1.2 isaki #ifdef AUDIO_PM_IDLE 527 1.2 isaki int audio_idle_timeout = 30; 528 1.2 isaki #endif 529 1.2 isaki 530 1.41 isaki /* Number of elements of async mixer's pid */ 531 1.41 isaki #define AM_CAPACITY (4) 532 1.41 isaki 533 1.2 isaki struct portname { 534 1.2 isaki const char *name; 535 1.2 isaki int mask; 536 1.2 isaki }; 537 1.2 isaki 538 1.2 isaki static int audiomatch(device_t, cfdata_t, void *); 539 1.2 isaki static void audioattach(device_t, device_t, void *); 540 1.2 isaki static int audiodetach(device_t, int); 541 1.2 isaki static int audioactivate(device_t, enum devact); 542 1.2 isaki static void audiochilddet(device_t, device_t); 543 1.2 isaki static int audiorescan(device_t, const char *, const int *); 544 1.2 isaki 545 1.2 isaki static int audio_modcmd(modcmd_t, void *); 546 1.2 isaki 547 1.2 isaki #ifdef AUDIO_PM_IDLE 548 1.2 isaki static void audio_idle(void *); 549 1.2 isaki static void audio_activity(device_t, devactive_t); 550 1.2 isaki #endif 551 1.2 isaki 552 1.2 isaki static bool audio_suspend(device_t dv, const pmf_qual_t *); 553 1.2 isaki static bool audio_resume(device_t dv, const pmf_qual_t *); 554 1.2 isaki static void audio_volume_down(device_t); 555 1.2 isaki static void audio_volume_up(device_t); 556 1.2 isaki static void audio_volume_toggle(device_t); 557 1.2 isaki 558 1.2 isaki static void audio_mixer_capture(struct audio_softc *); 559 1.2 isaki static void audio_mixer_restore(struct audio_softc *); 560 1.2 isaki 561 1.2 isaki static void audio_softintr_rd(void *); 562 1.2 isaki static void audio_softintr_wr(void *); 563 1.2 isaki 564 1.138 mlelstv static int audio_properties(struct audio_softc *); 565 1.88 isaki static void audio_printf(struct audio_softc *, const char *, ...) 566 1.88 isaki __printflike(2, 3); 567 1.63 isaki static int audio_exlock_mutex_enter(struct audio_softc *); 568 1.63 isaki static void audio_exlock_mutex_exit(struct audio_softc *); 569 1.63 isaki static int audio_exlock_enter(struct audio_softc *); 570 1.63 isaki static void audio_exlock_exit(struct audio_softc *); 571 1.90 isaki static struct audio_softc *audio_sc_acquire_fromfile(audio_file_t *, 572 1.90 isaki struct psref *); 573 1.90 isaki static void audio_sc_release(struct audio_softc *, struct psref *); 574 1.142 mlelstv static int audio_track_waitio(struct audio_softc *, audio_track_t *, 575 1.142 mlelstv const char *mess); 576 1.2 isaki 577 1.2 isaki static int audioclose(struct file *); 578 1.2 isaki static int audioread(struct file *, off_t *, struct uio *, kauth_cred_t, int); 579 1.2 isaki static int audiowrite(struct file *, off_t *, struct uio *, kauth_cred_t, int); 580 1.2 isaki static int audioioctl(struct file *, u_long, void *); 581 1.2 isaki static int audiopoll(struct file *, int); 582 1.2 isaki static int audiokqfilter(struct file *, struct knote *); 583 1.2 isaki static int audiommap(struct file *, off_t *, size_t, int, int *, int *, 584 1.2 isaki struct uvm_object **, int *); 585 1.2 isaki static int audiostat(struct file *, struct stat *); 586 1.2 isaki 587 1.2 isaki static void filt_audiowrite_detach(struct knote *); 588 1.2 isaki static int filt_audiowrite_event(struct knote *, long); 589 1.2 isaki static void filt_audioread_detach(struct knote *); 590 1.2 isaki static int filt_audioread_event(struct knote *, long); 591 1.2 isaki 592 1.2 isaki static int audio_open(dev_t, struct audio_softc *, int, int, struct lwp *, 593 1.21 isaki audio_file_t **); 594 1.2 isaki static int audio_close(struct audio_softc *, audio_file_t *); 595 1.102 riastrad static void audio_unlink(struct audio_softc *, audio_file_t *); 596 1.2 isaki static int audio_read(struct audio_softc *, struct uio *, int, audio_file_t *); 597 1.2 isaki static int audio_write(struct audio_softc *, struct uio *, int, audio_file_t *); 598 1.2 isaki static void audio_file_clear(struct audio_softc *, audio_file_t *); 599 1.2 isaki static int audio_ioctl(dev_t, struct audio_softc *, u_long, void *, int, 600 1.2 isaki struct lwp *, audio_file_t *); 601 1.2 isaki static int audio_poll(struct audio_softc *, int, struct lwp *, audio_file_t *); 602 1.2 isaki static int audio_kqfilter(struct audio_softc *, audio_file_t *, struct knote *); 603 1.2 isaki static int audio_mmap(struct audio_softc *, off_t *, size_t, int, int *, int *, 604 1.2 isaki struct uvm_object **, int *, audio_file_t *); 605 1.2 isaki 606 1.2 isaki static int audioctl_open(dev_t, struct audio_softc *, int, int, struct lwp *); 607 1.2 isaki 608 1.2 isaki static void audio_pintr(void *); 609 1.2 isaki static void audio_rintr(void *); 610 1.2 isaki 611 1.2 isaki static int audio_query_devinfo(struct audio_softc *, mixer_devinfo_t *); 612 1.2 isaki 613 1.126 isaki static int audio_track_inputblk_as_usrbyte(const audio_track_t *, int); 614 1.126 isaki static int audio_track_readablebytes(const audio_track_t *); 615 1.2 isaki static int audio_file_setinfo(struct audio_softc *, audio_file_t *, 616 1.2 isaki const struct audio_info *); 617 1.62 isaki static int audio_track_setinfo_check(audio_track_t *, 618 1.62 isaki audio_format2_t *, const struct audio_prinfo *); 619 1.2 isaki static void audio_track_setinfo_water(audio_track_t *, 620 1.2 isaki const struct audio_info *); 621 1.2 isaki static int audio_hw_setinfo(struct audio_softc *, const struct audio_info *, 622 1.2 isaki struct audio_info *); 623 1.2 isaki static int audio_hw_set_format(struct audio_softc *, int, 624 1.45 isaki const audio_format2_t *, const audio_format2_t *, 625 1.2 isaki audio_filter_reg_t *, audio_filter_reg_t *); 626 1.2 isaki static int audiogetinfo(struct audio_softc *, struct audio_info *, int, 627 1.2 isaki audio_file_t *); 628 1.2 isaki static bool audio_can_playback(struct audio_softc *); 629 1.2 isaki static bool audio_can_capture(struct audio_softc *); 630 1.2 isaki static int audio_check_params(audio_format2_t *); 631 1.2 isaki static int audio_mixers_init(struct audio_softc *sc, int, 632 1.2 isaki const audio_format2_t *, const audio_format2_t *, 633 1.2 isaki const audio_filter_reg_t *, const audio_filter_reg_t *); 634 1.2 isaki static int audio_select_freq(const struct audio_format *); 635 1.55 isaki static int audio_hw_probe(struct audio_softc *, audio_format2_t *, int); 636 1.2 isaki static int audio_hw_validate_format(struct audio_softc *, int, 637 1.2 isaki const audio_format2_t *); 638 1.2 isaki static int audio_mixers_set_format(struct audio_softc *, 639 1.2 isaki const struct audio_info *); 640 1.2 isaki static void audio_mixers_get_format(struct audio_softc *, struct audio_info *); 641 1.2 isaki static int audio_sysctl_blk_ms(SYSCTLFN_PROTO); 642 1.2 isaki static int audio_sysctl_multiuser(SYSCTLFN_PROTO); 643 1.2 isaki #if defined(AUDIO_DEBUG) 644 1.2 isaki static int audio_sysctl_debug(SYSCTLFN_PROTO); 645 1.2 isaki static void audio_format2_tostr(char *, size_t, const audio_format2_t *); 646 1.2 isaki static void audio_print_format2(const char *, const audio_format2_t *) __unused; 647 1.2 isaki #endif 648 1.2 isaki 649 1.2 isaki static void *audio_realloc(void *, size_t); 650 1.2 isaki static void audio_free_usrbuf(audio_track_t *); 651 1.2 isaki 652 1.2 isaki static audio_track_t *audio_track_create(struct audio_softc *, 653 1.2 isaki audio_trackmixer_t *); 654 1.2 isaki static void audio_track_destroy(audio_track_t *); 655 1.2 isaki static audio_filter_t audio_track_get_codec(audio_track_t *, 656 1.2 isaki const audio_format2_t *, const audio_format2_t *); 657 1.2 isaki static int audio_track_set_format(audio_track_t *, audio_format2_t *); 658 1.2 isaki static void audio_track_play(audio_track_t *); 659 1.2 isaki static int audio_track_drain(struct audio_softc *, audio_track_t *); 660 1.2 isaki static void audio_track_record(audio_track_t *); 661 1.2 isaki static void audio_track_clear(struct audio_softc *, audio_track_t *); 662 1.2 isaki 663 1.2 isaki static int audio_mixer_init(struct audio_softc *, int, 664 1.2 isaki const audio_format2_t *, const audio_filter_reg_t *); 665 1.2 isaki static void audio_mixer_destroy(struct audio_softc *, audio_trackmixer_t *); 666 1.2 isaki static void audio_pmixer_start(struct audio_softc *, bool); 667 1.2 isaki static void audio_pmixer_process(struct audio_softc *); 668 1.23 isaki static void audio_pmixer_agc(audio_trackmixer_t *, int); 669 1.2 isaki static int audio_pmixer_mix_track(audio_trackmixer_t *, audio_track_t *, int); 670 1.2 isaki static void audio_pmixer_output(struct audio_softc *); 671 1.2 isaki static int audio_pmixer_halt(struct audio_softc *); 672 1.2 isaki static void audio_rmixer_start(struct audio_softc *); 673 1.2 isaki static void audio_rmixer_process(struct audio_softc *); 674 1.2 isaki static void audio_rmixer_input(struct audio_softc *); 675 1.2 isaki static int audio_rmixer_halt(struct audio_softc *); 676 1.2 isaki 677 1.2 isaki static void mixer_init(struct audio_softc *); 678 1.2 isaki static int mixer_open(dev_t, struct audio_softc *, int, int, struct lwp *); 679 1.2 isaki static int mixer_close(struct audio_softc *, audio_file_t *); 680 1.2 isaki static int mixer_ioctl(struct audio_softc *, u_long, void *, int, struct lwp *); 681 1.41 isaki static void mixer_async_add(struct audio_softc *, pid_t); 682 1.41 isaki static void mixer_async_remove(struct audio_softc *, pid_t); 683 1.2 isaki static void mixer_signal(struct audio_softc *); 684 1.2 isaki 685 1.2 isaki static int au_portof(struct audio_softc *, char *, int); 686 1.2 isaki 687 1.2 isaki static void au_setup_ports(struct audio_softc *, struct au_mixer_ports *, 688 1.2 isaki mixer_devinfo_t *, const struct portname *); 689 1.2 isaki static int au_set_lr_value(struct audio_softc *, mixer_ctrl_t *, int, int); 690 1.2 isaki static int au_get_lr_value(struct audio_softc *, mixer_ctrl_t *, int *, int *); 691 1.2 isaki static int au_set_gain(struct audio_softc *, struct au_mixer_ports *, int, int); 692 1.2 isaki static void au_get_gain(struct audio_softc *, struct au_mixer_ports *, 693 1.2 isaki u_int *, u_char *); 694 1.2 isaki static int au_set_port(struct audio_softc *, struct au_mixer_ports *, u_int); 695 1.2 isaki static int au_get_port(struct audio_softc *, struct au_mixer_ports *); 696 1.2 isaki static int au_set_monitor_gain(struct audio_softc *, int); 697 1.2 isaki static int au_get_monitor_gain(struct audio_softc *); 698 1.2 isaki static int audio_get_port(struct audio_softc *, mixer_ctrl_t *); 699 1.2 isaki static int audio_set_port(struct audio_softc *, mixer_ctrl_t *); 700 1.2 isaki 701 1.140 mlelstv void audio_mixsample_to_linear(audio_filter_arg_t *); 702 1.140 mlelstv 703 1.2 isaki static __inline struct audio_params 704 1.2 isaki format2_to_params(const audio_format2_t *f2) 705 1.2 isaki { 706 1.2 isaki audio_params_t p; 707 1.2 isaki 708 1.2 isaki /* validbits/precision <-> precision/stride */ 709 1.2 isaki p.sample_rate = f2->sample_rate; 710 1.2 isaki p.channels = f2->channels; 711 1.2 isaki p.encoding = f2->encoding; 712 1.2 isaki p.validbits = f2->precision; 713 1.2 isaki p.precision = f2->stride; 714 1.2 isaki return p; 715 1.2 isaki } 716 1.2 isaki 717 1.2 isaki static __inline audio_format2_t 718 1.2 isaki params_to_format2(const struct audio_params *p) 719 1.2 isaki { 720 1.2 isaki audio_format2_t f2; 721 1.2 isaki 722 1.2 isaki /* precision/stride <-> validbits/precision */ 723 1.2 isaki f2.sample_rate = p->sample_rate; 724 1.2 isaki f2.channels = p->channels; 725 1.2 isaki f2.encoding = p->encoding; 726 1.2 isaki f2.precision = p->validbits; 727 1.2 isaki f2.stride = p->precision; 728 1.2 isaki return f2; 729 1.2 isaki } 730 1.2 isaki 731 1.2 isaki /* Return true if this track is a playback track. */ 732 1.2 isaki static __inline bool 733 1.2 isaki audio_track_is_playback(const audio_track_t *track) 734 1.2 isaki { 735 1.2 isaki 736 1.2 isaki return ((track->mode & AUMODE_PLAY) != 0); 737 1.2 isaki } 738 1.2 isaki 739 1.128 macallan #if 0 740 1.2 isaki /* Return true if this track is a recording track. */ 741 1.2 isaki static __inline bool 742 1.2 isaki audio_track_is_record(const audio_track_t *track) 743 1.2 isaki { 744 1.2 isaki 745 1.2 isaki return ((track->mode & AUMODE_RECORD) != 0); 746 1.2 isaki } 747 1.128 macallan #endif 748 1.2 isaki 749 1.2 isaki #if 0 /* XXX Not used yet */ 750 1.2 isaki /* 751 1.2 isaki * Convert 0..255 volume used in userland to internal presentation 0..256. 752 1.2 isaki */ 753 1.2 isaki static __inline u_int 754 1.2 isaki audio_volume_to_inner(u_int v) 755 1.2 isaki { 756 1.2 isaki 757 1.2 isaki return v < 127 ? v : v + 1; 758 1.2 isaki } 759 1.2 isaki 760 1.2 isaki /* 761 1.2 isaki * Convert 0..256 internal presentation to 0..255 volume used in userland. 762 1.2 isaki */ 763 1.2 isaki static __inline u_int 764 1.2 isaki audio_volume_to_outer(u_int v) 765 1.2 isaki { 766 1.2 isaki 767 1.2 isaki return v < 127 ? v : v - 1; 768 1.2 isaki } 769 1.2 isaki #endif /* 0 */ 770 1.2 isaki 771 1.2 isaki static dev_type_open(audioopen); 772 1.2 isaki /* XXXMRG use more dev_type_xxx */ 773 1.2 isaki 774 1.121 riastrad static int 775 1.121 riastrad audiounit(dev_t dev) 776 1.121 riastrad { 777 1.121 riastrad 778 1.121 riastrad return AUDIOUNIT(dev); 779 1.121 riastrad } 780 1.121 riastrad 781 1.2 isaki const struct cdevsw audio_cdevsw = { 782 1.2 isaki .d_open = audioopen, 783 1.2 isaki .d_close = noclose, 784 1.2 isaki .d_read = noread, 785 1.2 isaki .d_write = nowrite, 786 1.2 isaki .d_ioctl = noioctl, 787 1.2 isaki .d_stop = nostop, 788 1.2 isaki .d_tty = notty, 789 1.2 isaki .d_poll = nopoll, 790 1.2 isaki .d_mmap = nommap, 791 1.2 isaki .d_kqfilter = nokqfilter, 792 1.2 isaki .d_discard = nodiscard, 793 1.121 riastrad .d_cfdriver = &audio_cd, 794 1.121 riastrad .d_devtounit = audiounit, 795 1.2 isaki .d_flag = D_OTHER | D_MPSAFE 796 1.2 isaki }; 797 1.2 isaki 798 1.2 isaki const struct fileops audio_fileops = { 799 1.2 isaki .fo_name = "audio", 800 1.2 isaki .fo_read = audioread, 801 1.2 isaki .fo_write = audiowrite, 802 1.2 isaki .fo_ioctl = audioioctl, 803 1.2 isaki .fo_fcntl = fnullop_fcntl, 804 1.2 isaki .fo_stat = audiostat, 805 1.2 isaki .fo_poll = audiopoll, 806 1.2 isaki .fo_close = audioclose, 807 1.2 isaki .fo_mmap = audiommap, 808 1.2 isaki .fo_kqfilter = audiokqfilter, 809 1.2 isaki .fo_restart = fnullop_restart 810 1.2 isaki }; 811 1.2 isaki 812 1.2 isaki /* The default audio mode: 8 kHz mono mu-law */ 813 1.2 isaki static const struct audio_params audio_default = { 814 1.2 isaki .sample_rate = 8000, 815 1.2 isaki .encoding = AUDIO_ENCODING_ULAW, 816 1.2 isaki .precision = 8, 817 1.2 isaki .validbits = 8, 818 1.2 isaki .channels = 1, 819 1.2 isaki }; 820 1.2 isaki 821 1.2 isaki static const char *encoding_names[] = { 822 1.2 isaki "none", 823 1.2 isaki AudioEmulaw, 824 1.2 isaki AudioEalaw, 825 1.2 isaki "pcm16", 826 1.2 isaki "pcm8", 827 1.2 isaki AudioEadpcm, 828 1.2 isaki AudioEslinear_le, 829 1.2 isaki AudioEslinear_be, 830 1.2 isaki AudioEulinear_le, 831 1.2 isaki AudioEulinear_be, 832 1.2 isaki AudioEslinear, 833 1.2 isaki AudioEulinear, 834 1.2 isaki AudioEmpeg_l1_stream, 835 1.2 isaki AudioEmpeg_l1_packets, 836 1.2 isaki AudioEmpeg_l1_system, 837 1.2 isaki AudioEmpeg_l2_stream, 838 1.2 isaki AudioEmpeg_l2_packets, 839 1.2 isaki AudioEmpeg_l2_system, 840 1.2 isaki AudioEac3, 841 1.2 isaki }; 842 1.2 isaki 843 1.2 isaki /* 844 1.2 isaki * Returns encoding name corresponding to AUDIO_ENCODING_*. 845 1.2 isaki * Note that it may return a local buffer because it is mainly for debugging. 846 1.2 isaki */ 847 1.2 isaki const char * 848 1.2 isaki audio_encoding_name(int encoding) 849 1.2 isaki { 850 1.2 isaki static char buf[16]; 851 1.2 isaki 852 1.2 isaki if (0 <= encoding && encoding < __arraycount(encoding_names)) { 853 1.2 isaki return encoding_names[encoding]; 854 1.2 isaki } else { 855 1.2 isaki snprintf(buf, sizeof(buf), "enc=%d", encoding); 856 1.2 isaki return buf; 857 1.2 isaki } 858 1.2 isaki } 859 1.2 isaki 860 1.2 isaki /* 861 1.2 isaki * Supported encodings used by AUDIO_GETENC. 862 1.2 isaki * index and flags are set by code. 863 1.2 isaki * XXX is there any needs for SLINEAR_OE:>=16/ULINEAR_OE:>=16 ? 864 1.2 isaki */ 865 1.2 isaki static const audio_encoding_t audio_encodings[] = { 866 1.2 isaki { 0, AudioEmulaw, AUDIO_ENCODING_ULAW, 8, 0 }, 867 1.2 isaki { 0, AudioEalaw, AUDIO_ENCODING_ALAW, 8, 0 }, 868 1.2 isaki { 0, AudioEslinear, AUDIO_ENCODING_SLINEAR, 8, 0 }, 869 1.2 isaki { 0, AudioEulinear, AUDIO_ENCODING_ULINEAR, 8, 0 }, 870 1.2 isaki { 0, AudioEslinear_le, AUDIO_ENCODING_SLINEAR_LE, 16, 0 }, 871 1.2 isaki { 0, AudioEulinear_le, AUDIO_ENCODING_ULINEAR_LE, 16, 0 }, 872 1.2 isaki { 0, AudioEslinear_be, AUDIO_ENCODING_SLINEAR_BE, 16, 0 }, 873 1.2 isaki { 0, AudioEulinear_be, AUDIO_ENCODING_ULINEAR_BE, 16, 0 }, 874 1.2 isaki #if defined(AUDIO_SUPPORT_LINEAR24) 875 1.2 isaki { 0, AudioEslinear_le, AUDIO_ENCODING_SLINEAR_LE, 24, 0 }, 876 1.2 isaki { 0, AudioEulinear_le, AUDIO_ENCODING_ULINEAR_LE, 24, 0 }, 877 1.2 isaki { 0, AudioEslinear_be, AUDIO_ENCODING_SLINEAR_BE, 24, 0 }, 878 1.2 isaki { 0, AudioEulinear_be, AUDIO_ENCODING_ULINEAR_BE, 24, 0 }, 879 1.2 isaki #endif 880 1.2 isaki { 0, AudioEslinear_le, AUDIO_ENCODING_SLINEAR_LE, 32, 0 }, 881 1.2 isaki { 0, AudioEulinear_le, AUDIO_ENCODING_ULINEAR_LE, 32, 0 }, 882 1.2 isaki { 0, AudioEslinear_be, AUDIO_ENCODING_SLINEAR_BE, 32, 0 }, 883 1.2 isaki { 0, AudioEulinear_be, AUDIO_ENCODING_ULINEAR_BE, 32, 0 }, 884 1.2 isaki }; 885 1.2 isaki 886 1.2 isaki static const struct portname itable[] = { 887 1.2 isaki { AudioNmicrophone, AUDIO_MICROPHONE }, 888 1.2 isaki { AudioNline, AUDIO_LINE_IN }, 889 1.2 isaki { AudioNcd, AUDIO_CD }, 890 1.2 isaki { 0, 0 } 891 1.2 isaki }; 892 1.2 isaki static const struct portname otable[] = { 893 1.2 isaki { AudioNspeaker, AUDIO_SPEAKER }, 894 1.2 isaki { AudioNheadphone, AUDIO_HEADPHONE }, 895 1.2 isaki { AudioNline, AUDIO_LINE_OUT }, 896 1.2 isaki { 0, 0 } 897 1.2 isaki }; 898 1.2 isaki 899 1.56 isaki static struct psref_class *audio_psref_class __read_mostly; 900 1.56 isaki 901 1.2 isaki CFATTACH_DECL3_NEW(audio, sizeof(struct audio_softc), 902 1.2 isaki audiomatch, audioattach, audiodetach, audioactivate, audiorescan, 903 1.2 isaki audiochilddet, DVF_DETACH_SHUTDOWN); 904 1.2 isaki 905 1.2 isaki static int 906 1.2 isaki audiomatch(device_t parent, cfdata_t match, void *aux) 907 1.2 isaki { 908 1.2 isaki struct audio_attach_args *sa; 909 1.2 isaki 910 1.2 isaki sa = aux; 911 1.2 isaki DPRINTF(1, "%s: type=%d sa=%p hw=%p\n", 912 1.2 isaki __func__, sa->type, sa, sa->hwif); 913 1.2 isaki return (sa->type == AUDIODEV_TYPE_AUDIO) ? 1 : 0; 914 1.2 isaki } 915 1.2 isaki 916 1.2 isaki static void 917 1.2 isaki audioattach(device_t parent, device_t self, void *aux) 918 1.2 isaki { 919 1.2 isaki struct audio_softc *sc; 920 1.2 isaki struct audio_attach_args *sa; 921 1.2 isaki const struct audio_hw_if *hw_if; 922 1.2 isaki audio_format2_t phwfmt; 923 1.2 isaki audio_format2_t rhwfmt; 924 1.2 isaki audio_filter_reg_t pfil; 925 1.2 isaki audio_filter_reg_t rfil; 926 1.2 isaki const struct sysctlnode *node; 927 1.2 isaki void *hdlp; 928 1.13 isaki bool has_playback; 929 1.13 isaki bool has_capture; 930 1.13 isaki bool has_indep; 931 1.13 isaki bool has_fulldup; 932 1.2 isaki int mode; 933 1.2 isaki int error; 934 1.2 isaki 935 1.2 isaki sc = device_private(self); 936 1.2 isaki sc->sc_dev = self; 937 1.2 isaki sa = (struct audio_attach_args *)aux; 938 1.2 isaki hw_if = sa->hwif; 939 1.2 isaki hdlp = sa->hdl; 940 1.2 isaki 941 1.54 isaki if (hw_if == NULL) { 942 1.2 isaki panic("audioattach: missing hw_if method"); 943 1.2 isaki } 944 1.54 isaki if (hw_if->get_locks == NULL || hw_if->get_props == NULL) { 945 1.54 isaki aprint_error(": missing mandatory method\n"); 946 1.54 isaki return; 947 1.54 isaki } 948 1.2 isaki 949 1.2 isaki hw_if->get_locks(hdlp, &sc->sc_intr_lock, &sc->sc_lock); 950 1.54 isaki sc->sc_props = hw_if->get_props(hdlp); 951 1.54 isaki 952 1.54 isaki has_playback = (sc->sc_props & AUDIO_PROP_PLAYBACK); 953 1.54 isaki has_capture = (sc->sc_props & AUDIO_PROP_CAPTURE); 954 1.54 isaki has_indep = (sc->sc_props & AUDIO_PROP_INDEPENDENT); 955 1.54 isaki has_fulldup = (sc->sc_props & AUDIO_PROP_FULLDUPLEX); 956 1.2 isaki 957 1.2 isaki #ifdef DIAGNOSTIC 958 1.2 isaki if (hw_if->query_format == NULL || 959 1.2 isaki hw_if->set_format == NULL || 960 1.2 isaki hw_if->getdev == NULL || 961 1.2 isaki hw_if->set_port == NULL || 962 1.2 isaki hw_if->get_port == NULL || 963 1.54 isaki hw_if->query_devinfo == NULL) { 964 1.54 isaki aprint_error(": missing mandatory method\n"); 965 1.2 isaki return; 966 1.2 isaki } 967 1.54 isaki if (has_playback) { 968 1.76 isaki if ((hw_if->start_output == NULL && 969 1.76 isaki hw_if->trigger_output == NULL) || 970 1.54 isaki hw_if->halt_output == NULL) { 971 1.54 isaki aprint_error(": missing playback method\n"); 972 1.54 isaki } 973 1.54 isaki } 974 1.54 isaki if (has_capture) { 975 1.76 isaki if ((hw_if->start_input == NULL && 976 1.76 isaki hw_if->trigger_input == NULL) || 977 1.54 isaki hw_if->halt_input == NULL) { 978 1.54 isaki aprint_error(": missing capture method\n"); 979 1.54 isaki } 980 1.54 isaki } 981 1.2 isaki #endif 982 1.2 isaki 983 1.2 isaki sc->hw_if = hw_if; 984 1.2 isaki sc->hw_hdl = hdlp; 985 1.2 isaki sc->hw_dev = parent; 986 1.2 isaki 987 1.63 isaki sc->sc_exlock = 1; 988 1.2 isaki sc->sc_blk_ms = AUDIO_BLK_MS; 989 1.2 isaki SLIST_INIT(&sc->sc_files); 990 1.2 isaki cv_init(&sc->sc_exlockcv, "audiolk"); 991 1.41 isaki sc->sc_am_capacity = 0; 992 1.41 isaki sc->sc_am_used = 0; 993 1.41 isaki sc->sc_am = NULL; 994 1.2 isaki 995 1.14 isaki /* MMAP is now supported by upper layer. */ 996 1.14 isaki sc->sc_props |= AUDIO_PROP_MMAP; 997 1.14 isaki 998 1.13 isaki KASSERT(has_playback || has_capture); 999 1.13 isaki /* Unidirectional device must have neither FULLDUP nor INDEPENDENT. */ 1000 1.13 isaki if (!has_playback || !has_capture) { 1001 1.13 isaki KASSERT(!has_indep); 1002 1.13 isaki KASSERT(!has_fulldup); 1003 1.13 isaki } 1004 1.2 isaki 1005 1.2 isaki mode = 0; 1006 1.13 isaki if (has_playback) { 1007 1.13 isaki aprint_normal(": playback"); 1008 1.2 isaki mode |= AUMODE_PLAY; 1009 1.2 isaki } 1010 1.13 isaki if (has_capture) { 1011 1.13 isaki aprint_normal("%c capture", has_playback ? ',' : ':'); 1012 1.2 isaki mode |= AUMODE_RECORD; 1013 1.2 isaki } 1014 1.13 isaki if (has_playback && has_capture) { 1015 1.13 isaki if (has_fulldup) 1016 1.13 isaki aprint_normal(", full duplex"); 1017 1.13 isaki else 1018 1.13 isaki aprint_normal(", half duplex"); 1019 1.13 isaki 1020 1.13 isaki if (has_indep) 1021 1.13 isaki aprint_normal(", independent"); 1022 1.13 isaki } 1023 1.2 isaki 1024 1.2 isaki aprint_naive("\n"); 1025 1.2 isaki aprint_normal("\n"); 1026 1.2 isaki 1027 1.2 isaki /* probe hw params */ 1028 1.2 isaki memset(&phwfmt, 0, sizeof(phwfmt)); 1029 1.2 isaki memset(&rhwfmt, 0, sizeof(rhwfmt)); 1030 1.2 isaki memset(&pfil, 0, sizeof(pfil)); 1031 1.2 isaki memset(&rfil, 0, sizeof(rfil)); 1032 1.55 isaki if (has_indep) { 1033 1.55 isaki int perror, rerror; 1034 1.55 isaki 1035 1.55 isaki /* On independent devices, probe separately. */ 1036 1.55 isaki perror = audio_hw_probe(sc, &phwfmt, AUMODE_PLAY); 1037 1.55 isaki rerror = audio_hw_probe(sc, &rhwfmt, AUMODE_RECORD); 1038 1.55 isaki if (perror && rerror) { 1039 1.88 isaki aprint_error_dev(self, 1040 1.88 isaki "audio_hw_probe failed: perror=%d, rerror=%d\n", 1041 1.88 isaki perror, rerror); 1042 1.55 isaki goto bad; 1043 1.55 isaki } 1044 1.55 isaki if (perror) { 1045 1.55 isaki mode &= ~AUMODE_PLAY; 1046 1.88 isaki aprint_error_dev(self, "audio_hw_probe failed: " 1047 1.88 isaki "errno=%d, playback disabled\n", perror); 1048 1.55 isaki } 1049 1.55 isaki if (rerror) { 1050 1.55 isaki mode &= ~AUMODE_RECORD; 1051 1.88 isaki aprint_error_dev(self, "audio_hw_probe failed: " 1052 1.88 isaki "errno=%d, capture disabled\n", rerror); 1053 1.55 isaki } 1054 1.55 isaki } else { 1055 1.55 isaki /* 1056 1.55 isaki * On non independent devices or uni-directional devices, 1057 1.55 isaki * probe once (simultaneously). 1058 1.55 isaki */ 1059 1.55 isaki audio_format2_t *fmt = has_playback ? &phwfmt : &rhwfmt; 1060 1.55 isaki error = audio_hw_probe(sc, fmt, mode); 1061 1.55 isaki if (error) { 1062 1.88 isaki aprint_error_dev(self, 1063 1.88 isaki "audio_hw_probe failed: errno=%d\n", error); 1064 1.55 isaki goto bad; 1065 1.55 isaki } 1066 1.55 isaki if (has_playback && has_capture) 1067 1.55 isaki rhwfmt = phwfmt; 1068 1.2 isaki } 1069 1.55 isaki 1070 1.138 mlelstv /* Make device id available */ 1071 1.138 mlelstv if (audio_properties(sc)) 1072 1.138 mlelstv aprint_error_dev(self, "audio_properties failed\n"); 1073 1.138 mlelstv 1074 1.2 isaki /* Init hardware. */ 1075 1.2 isaki /* hw_probe() also validates [pr]hwfmt. */ 1076 1.2 isaki error = audio_hw_set_format(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 1077 1.2 isaki if (error) { 1078 1.88 isaki aprint_error_dev(self, 1079 1.88 isaki "audio_hw_set_format failed: errno=%d\n", error); 1080 1.2 isaki goto bad; 1081 1.2 isaki } 1082 1.2 isaki 1083 1.2 isaki /* 1084 1.2 isaki * Init track mixers. If at least one direction is available on 1085 1.2 isaki * attach time, we assume a success. 1086 1.2 isaki */ 1087 1.2 isaki error = audio_mixers_init(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 1088 1.4 nakayama if (sc->sc_pmixer == NULL && sc->sc_rmixer == NULL) { 1089 1.88 isaki aprint_error_dev(self, 1090 1.88 isaki "audio_mixers_init failed: errno=%d\n", error); 1091 1.2 isaki goto bad; 1092 1.4 nakayama } 1093 1.2 isaki 1094 1.56 isaki sc->sc_psz = pserialize_create(); 1095 1.56 isaki psref_target_init(&sc->sc_psref, audio_psref_class); 1096 1.56 isaki 1097 1.2 isaki selinit(&sc->sc_wsel); 1098 1.2 isaki selinit(&sc->sc_rsel); 1099 1.2 isaki 1100 1.2 isaki /* Initial parameter of /dev/sound */ 1101 1.2 isaki sc->sc_sound_pparams = params_to_format2(&audio_default); 1102 1.2 isaki sc->sc_sound_rparams = params_to_format2(&audio_default); 1103 1.2 isaki sc->sc_sound_ppause = false; 1104 1.2 isaki sc->sc_sound_rpause = false; 1105 1.2 isaki 1106 1.2 isaki /* XXX TODO: consider about sc_ai */ 1107 1.2 isaki 1108 1.2 isaki mixer_init(sc); 1109 1.2 isaki TRACE(2, "inputs ports=0x%x, input master=%d, " 1110 1.2 isaki "output ports=0x%x, output master=%d", 1111 1.2 isaki sc->sc_inports.allports, sc->sc_inports.master, 1112 1.2 isaki sc->sc_outports.allports, sc->sc_outports.master); 1113 1.2 isaki 1114 1.2 isaki sysctl_createv(&sc->sc_log, 0, NULL, &node, 1115 1.2 isaki 0, 1116 1.2 isaki CTLTYPE_NODE, device_xname(sc->sc_dev), 1117 1.2 isaki SYSCTL_DESCR("audio test"), 1118 1.2 isaki NULL, 0, 1119 1.2 isaki NULL, 0, 1120 1.2 isaki CTL_HW, 1121 1.2 isaki CTL_CREATE, CTL_EOL); 1122 1.2 isaki 1123 1.2 isaki if (node != NULL) { 1124 1.2 isaki sysctl_createv(&sc->sc_log, 0, NULL, NULL, 1125 1.2 isaki CTLFLAG_READWRITE, 1126 1.2 isaki CTLTYPE_INT, "blk_ms", 1127 1.2 isaki SYSCTL_DESCR("blocksize in msec"), 1128 1.2 isaki audio_sysctl_blk_ms, 0, (void *)sc, 0, 1129 1.2 isaki CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 1130 1.2 isaki 1131 1.2 isaki sysctl_createv(&sc->sc_log, 0, NULL, NULL, 1132 1.2 isaki CTLFLAG_READWRITE, 1133 1.2 isaki CTLTYPE_BOOL, "multiuser", 1134 1.2 isaki SYSCTL_DESCR("allow multiple user access"), 1135 1.2 isaki audio_sysctl_multiuser, 0, (void *)sc, 0, 1136 1.2 isaki CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 1137 1.2 isaki 1138 1.2 isaki #if defined(AUDIO_DEBUG) 1139 1.2 isaki sysctl_createv(&sc->sc_log, 0, NULL, NULL, 1140 1.2 isaki CTLFLAG_READWRITE, 1141 1.2 isaki CTLTYPE_INT, "debug", 1142 1.2 isaki SYSCTL_DESCR("debug level (0..4)"), 1143 1.2 isaki audio_sysctl_debug, 0, (void *)sc, 0, 1144 1.2 isaki CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL); 1145 1.2 isaki #endif 1146 1.2 isaki } 1147 1.2 isaki 1148 1.2 isaki #ifdef AUDIO_PM_IDLE 1149 1.2 isaki callout_init(&sc->sc_idle_counter, 0); 1150 1.2 isaki callout_setfunc(&sc->sc_idle_counter, audio_idle, self); 1151 1.2 isaki #endif 1152 1.2 isaki 1153 1.2 isaki if (!pmf_device_register(self, audio_suspend, audio_resume)) 1154 1.2 isaki aprint_error_dev(self, "couldn't establish power handler\n"); 1155 1.2 isaki #ifdef AUDIO_PM_IDLE 1156 1.2 isaki if (!device_active_register(self, audio_activity)) 1157 1.2 isaki aprint_error_dev(self, "couldn't register activity handler\n"); 1158 1.2 isaki #endif 1159 1.2 isaki 1160 1.2 isaki if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_DOWN, 1161 1.2 isaki audio_volume_down, true)) 1162 1.2 isaki aprint_error_dev(self, "couldn't add volume down handler\n"); 1163 1.2 isaki if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_UP, 1164 1.2 isaki audio_volume_up, true)) 1165 1.2 isaki aprint_error_dev(self, "couldn't add volume up handler\n"); 1166 1.2 isaki if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_TOGGLE, 1167 1.2 isaki audio_volume_toggle, true)) 1168 1.2 isaki aprint_error_dev(self, "couldn't add volume toggle handler\n"); 1169 1.2 isaki 1170 1.2 isaki #ifdef AUDIO_PM_IDLE 1171 1.2 isaki callout_schedule(&sc->sc_idle_counter, audio_idle_timeout * hz); 1172 1.2 isaki #endif 1173 1.2 isaki 1174 1.2 isaki #if defined(AUDIO_DEBUG) 1175 1.2 isaki audio_mlog_init(); 1176 1.2 isaki #endif 1177 1.2 isaki 1178 1.92 thorpej audiorescan(self, NULL, NULL); 1179 1.63 isaki sc->sc_exlock = 0; 1180 1.2 isaki return; 1181 1.2 isaki 1182 1.2 isaki bad: 1183 1.2 isaki /* Clearing hw_if means that device is attached but disabled. */ 1184 1.2 isaki sc->hw_if = NULL; 1185 1.63 isaki sc->sc_exlock = 0; 1186 1.2 isaki aprint_error_dev(sc->sc_dev, "disabled\n"); 1187 1.2 isaki return; 1188 1.2 isaki } 1189 1.2 isaki 1190 1.141 mlelstv /* 1191 1.138 mlelstv * Identify audio backend device for drvctl. 1192 1.138 mlelstv */ 1193 1.138 mlelstv static int 1194 1.138 mlelstv audio_properties(struct audio_softc *sc) 1195 1.138 mlelstv { 1196 1.139 mlelstv prop_dictionary_t dict = device_properties(sc->sc_dev); 1197 1.139 mlelstv audio_device_t adev; 1198 1.139 mlelstv int error; 1199 1.139 mlelstv 1200 1.139 mlelstv error = sc->hw_if->getdev(sc->hw_hdl, &adev); 1201 1.139 mlelstv if (error) 1202 1.139 mlelstv return error; 1203 1.139 mlelstv 1204 1.139 mlelstv prop_dictionary_set_string(dict, "name", adev.name); 1205 1.139 mlelstv prop_dictionary_set_string(dict, "version", adev.version); 1206 1.139 mlelstv prop_dictionary_set_string(dict, "config", adev.config); 1207 1.138 mlelstv 1208 1.139 mlelstv return 0; 1209 1.138 mlelstv } 1210 1.138 mlelstv 1211 1.2 isaki /* 1212 1.2 isaki * Initialize hardware mixer. 1213 1.2 isaki * This function is called from audioattach(). 1214 1.2 isaki */ 1215 1.2 isaki static void 1216 1.2 isaki mixer_init(struct audio_softc *sc) 1217 1.2 isaki { 1218 1.2 isaki mixer_devinfo_t mi; 1219 1.2 isaki int iclass, mclass, oclass, rclass; 1220 1.2 isaki int record_master_found, record_source_found; 1221 1.2 isaki 1222 1.2 isaki iclass = mclass = oclass = rclass = -1; 1223 1.2 isaki sc->sc_inports.index = -1; 1224 1.2 isaki sc->sc_inports.master = -1; 1225 1.2 isaki sc->sc_inports.nports = 0; 1226 1.2 isaki sc->sc_inports.isenum = false; 1227 1.2 isaki sc->sc_inports.allports = 0; 1228 1.2 isaki sc->sc_inports.isdual = false; 1229 1.2 isaki sc->sc_inports.mixerout = -1; 1230 1.2 isaki sc->sc_inports.cur_port = -1; 1231 1.2 isaki sc->sc_outports.index = -1; 1232 1.2 isaki sc->sc_outports.master = -1; 1233 1.2 isaki sc->sc_outports.nports = 0; 1234 1.2 isaki sc->sc_outports.isenum = false; 1235 1.2 isaki sc->sc_outports.allports = 0; 1236 1.2 isaki sc->sc_outports.isdual = false; 1237 1.2 isaki sc->sc_outports.mixerout = -1; 1238 1.2 isaki sc->sc_outports.cur_port = -1; 1239 1.2 isaki sc->sc_monitor_port = -1; 1240 1.2 isaki /* 1241 1.2 isaki * Read through the underlying driver's list, picking out the class 1242 1.2 isaki * names from the mixer descriptions. We'll need them to decode the 1243 1.2 isaki * mixer descriptions on the next pass through the loop. 1244 1.2 isaki */ 1245 1.2 isaki mutex_enter(sc->sc_lock); 1246 1.2 isaki for(mi.index = 0; ; mi.index++) { 1247 1.2 isaki if (audio_query_devinfo(sc, &mi) != 0) 1248 1.2 isaki break; 1249 1.2 isaki /* 1250 1.2 isaki * The type of AUDIO_MIXER_CLASS merely introduces a class. 1251 1.2 isaki * All the other types describe an actual mixer. 1252 1.2 isaki */ 1253 1.2 isaki if (mi.type == AUDIO_MIXER_CLASS) { 1254 1.2 isaki if (strcmp(mi.label.name, AudioCinputs) == 0) 1255 1.2 isaki iclass = mi.mixer_class; 1256 1.2 isaki if (strcmp(mi.label.name, AudioCmonitor) == 0) 1257 1.2 isaki mclass = mi.mixer_class; 1258 1.2 isaki if (strcmp(mi.label.name, AudioCoutputs) == 0) 1259 1.2 isaki oclass = mi.mixer_class; 1260 1.2 isaki if (strcmp(mi.label.name, AudioCrecord) == 0) 1261 1.2 isaki rclass = mi.mixer_class; 1262 1.2 isaki } 1263 1.2 isaki } 1264 1.2 isaki mutex_exit(sc->sc_lock); 1265 1.2 isaki 1266 1.2 isaki /* Allocate save area. Ensure non-zero allocation. */ 1267 1.2 isaki sc->sc_nmixer_states = mi.index; 1268 1.98 riastrad sc->sc_mixer_state = kmem_zalloc(sizeof(sc->sc_mixer_state[0]) * 1269 1.2 isaki (sc->sc_nmixer_states + 1), KM_SLEEP); 1270 1.2 isaki 1271 1.2 isaki /* 1272 1.2 isaki * This is where we assign each control in the "audio" model, to the 1273 1.2 isaki * underlying "mixer" control. We walk through the whole list once, 1274 1.2 isaki * assigning likely candidates as we come across them. 1275 1.2 isaki */ 1276 1.2 isaki record_master_found = 0; 1277 1.2 isaki record_source_found = 0; 1278 1.2 isaki mutex_enter(sc->sc_lock); 1279 1.2 isaki for(mi.index = 0; ; mi.index++) { 1280 1.2 isaki if (audio_query_devinfo(sc, &mi) != 0) 1281 1.2 isaki break; 1282 1.2 isaki KASSERT(mi.index < sc->sc_nmixer_states); 1283 1.2 isaki if (mi.type == AUDIO_MIXER_CLASS) 1284 1.2 isaki continue; 1285 1.2 isaki if (mi.mixer_class == iclass) { 1286 1.2 isaki /* 1287 1.2 isaki * AudioCinputs is only a fallback, when we don't 1288 1.2 isaki * find what we're looking for in AudioCrecord, so 1289 1.2 isaki * check the flags before accepting one of these. 1290 1.2 isaki */ 1291 1.2 isaki if (strcmp(mi.label.name, AudioNmaster) == 0 1292 1.2 isaki && record_master_found == 0) 1293 1.2 isaki sc->sc_inports.master = mi.index; 1294 1.2 isaki if (strcmp(mi.label.name, AudioNsource) == 0 1295 1.2 isaki && record_source_found == 0) { 1296 1.2 isaki if (mi.type == AUDIO_MIXER_ENUM) { 1297 1.2 isaki int i; 1298 1.2 isaki for(i = 0; i < mi.un.e.num_mem; i++) 1299 1.2 isaki if (strcmp(mi.un.e.member[i].label.name, 1300 1.2 isaki AudioNmixerout) == 0) 1301 1.2 isaki sc->sc_inports.mixerout = 1302 1.2 isaki mi.un.e.member[i].ord; 1303 1.2 isaki } 1304 1.2 isaki au_setup_ports(sc, &sc->sc_inports, &mi, 1305 1.2 isaki itable); 1306 1.2 isaki } 1307 1.2 isaki if (strcmp(mi.label.name, AudioNdac) == 0 && 1308 1.2 isaki sc->sc_outports.master == -1) 1309 1.2 isaki sc->sc_outports.master = mi.index; 1310 1.2 isaki } else if (mi.mixer_class == mclass) { 1311 1.2 isaki if (strcmp(mi.label.name, AudioNmonitor) == 0) 1312 1.2 isaki sc->sc_monitor_port = mi.index; 1313 1.2 isaki } else if (mi.mixer_class == oclass) { 1314 1.2 isaki if (strcmp(mi.label.name, AudioNmaster) == 0) 1315 1.2 isaki sc->sc_outports.master = mi.index; 1316 1.2 isaki if (strcmp(mi.label.name, AudioNselect) == 0) 1317 1.2 isaki au_setup_ports(sc, &sc->sc_outports, &mi, 1318 1.2 isaki otable); 1319 1.2 isaki } else if (mi.mixer_class == rclass) { 1320 1.2 isaki /* 1321 1.2 isaki * These are the preferred mixers for the audio record 1322 1.2 isaki * controls, so set the flags here, but don't check. 1323 1.2 isaki */ 1324 1.2 isaki if (strcmp(mi.label.name, AudioNmaster) == 0) { 1325 1.2 isaki sc->sc_inports.master = mi.index; 1326 1.2 isaki record_master_found = 1; 1327 1.2 isaki } 1328 1.2 isaki #if 1 /* Deprecated. Use AudioNmaster. */ 1329 1.2 isaki if (strcmp(mi.label.name, AudioNrecord) == 0) { 1330 1.2 isaki sc->sc_inports.master = mi.index; 1331 1.2 isaki record_master_found = 1; 1332 1.2 isaki } 1333 1.2 isaki if (strcmp(mi.label.name, AudioNvolume) == 0) { 1334 1.2 isaki sc->sc_inports.master = mi.index; 1335 1.2 isaki record_master_found = 1; 1336 1.2 isaki } 1337 1.2 isaki #endif 1338 1.2 isaki if (strcmp(mi.label.name, AudioNsource) == 0) { 1339 1.2 isaki if (mi.type == AUDIO_MIXER_ENUM) { 1340 1.2 isaki int i; 1341 1.2 isaki for(i = 0; i < mi.un.e.num_mem; i++) 1342 1.2 isaki if (strcmp(mi.un.e.member[i].label.name, 1343 1.2 isaki AudioNmixerout) == 0) 1344 1.2 isaki sc->sc_inports.mixerout = 1345 1.2 isaki mi.un.e.member[i].ord; 1346 1.2 isaki } 1347 1.2 isaki au_setup_ports(sc, &sc->sc_inports, &mi, 1348 1.2 isaki itable); 1349 1.2 isaki record_source_found = 1; 1350 1.2 isaki } 1351 1.2 isaki } 1352 1.2 isaki } 1353 1.2 isaki mutex_exit(sc->sc_lock); 1354 1.2 isaki } 1355 1.2 isaki 1356 1.2 isaki static int 1357 1.2 isaki audioactivate(device_t self, enum devact act) 1358 1.2 isaki { 1359 1.2 isaki struct audio_softc *sc = device_private(self); 1360 1.2 isaki 1361 1.2 isaki switch (act) { 1362 1.2 isaki case DVACT_DEACTIVATE: 1363 1.2 isaki mutex_enter(sc->sc_lock); 1364 1.2 isaki sc->sc_dying = true; 1365 1.2 isaki cv_broadcast(&sc->sc_exlockcv); 1366 1.2 isaki mutex_exit(sc->sc_lock); 1367 1.2 isaki return 0; 1368 1.2 isaki default: 1369 1.2 isaki return EOPNOTSUPP; 1370 1.2 isaki } 1371 1.2 isaki } 1372 1.2 isaki 1373 1.2 isaki static int 1374 1.2 isaki audiodetach(device_t self, int flags) 1375 1.2 isaki { 1376 1.2 isaki struct audio_softc *sc; 1377 1.56 isaki struct audio_file *file; 1378 1.124 riastrad int maj, mn; 1379 1.2 isaki int error; 1380 1.2 isaki 1381 1.2 isaki sc = device_private(self); 1382 1.2 isaki TRACE(2, "flags=%d", flags); 1383 1.2 isaki 1384 1.2 isaki /* device is not initialized */ 1385 1.2 isaki if (sc->hw_if == NULL) 1386 1.2 isaki return 0; 1387 1.2 isaki 1388 1.2 isaki /* Start draining existing accessors of the device. */ 1389 1.2 isaki error = config_detach_children(self, flags); 1390 1.2 isaki if (error) 1391 1.2 isaki return error; 1392 1.2 isaki 1393 1.90 isaki /* 1394 1.124 riastrad * Prevent new opens and wait for existing opens to complete. 1395 1.136 riastrad * 1396 1.136 riastrad * At the moment there are only four bits in the minor for the 1397 1.136 riastrad * unit number, so we only revoke if the unit number could be 1398 1.136 riastrad * used in a device node. 1399 1.136 riastrad * 1400 1.136 riastrad * XXX If we want more audio units, we need to encode them 1401 1.136 riastrad * more elaborately in the minor space. 1402 1.124 riastrad */ 1403 1.124 riastrad maj = cdevsw_lookup_major(&audio_cdevsw); 1404 1.124 riastrad mn = device_unit(self); 1405 1.136 riastrad if (mn <= 0xf) { 1406 1.136 riastrad vdevgone(maj, mn|SOUND_DEVICE, mn|SOUND_DEVICE, VCHR); 1407 1.136 riastrad vdevgone(maj, mn|AUDIO_DEVICE, mn|AUDIO_DEVICE, VCHR); 1408 1.136 riastrad vdevgone(maj, mn|AUDIOCTL_DEVICE, mn|AUDIOCTL_DEVICE, VCHR); 1409 1.136 riastrad vdevgone(maj, mn|MIXER_DEVICE, mn|MIXER_DEVICE, VCHR); 1410 1.136 riastrad } 1411 1.124 riastrad 1412 1.124 riastrad /* 1413 1.90 isaki * This waits currently running sysctls to finish if exists. 1414 1.90 isaki * After this, no more new sysctls will come. 1415 1.90 isaki */ 1416 1.56 isaki sysctl_teardown(&sc->sc_log); 1417 1.56 isaki 1418 1.2 isaki mutex_enter(sc->sc_lock); 1419 1.2 isaki sc->sc_dying = true; 1420 1.2 isaki cv_broadcast(&sc->sc_exlockcv); 1421 1.2 isaki if (sc->sc_pmixer) 1422 1.2 isaki cv_broadcast(&sc->sc_pmixer->outcv); 1423 1.2 isaki if (sc->sc_rmixer) 1424 1.2 isaki cv_broadcast(&sc->sc_rmixer->outcv); 1425 1.56 isaki 1426 1.56 isaki /* Prevent new users */ 1427 1.56 isaki SLIST_FOREACH(file, &sc->sc_files, entry) { 1428 1.56 isaki atomic_store_relaxed(&file->dying, true); 1429 1.56 isaki } 1430 1.110 riastrad mutex_exit(sc->sc_lock); 1431 1.56 isaki 1432 1.56 isaki /* 1433 1.56 isaki * Wait for existing users to drain. 1434 1.56 isaki * - pserialize_perform waits for all pserialize_read sections on 1435 1.56 isaki * all CPUs; after this, no more new psref_acquire can happen. 1436 1.56 isaki * - psref_target_destroy waits for all extant acquired psrefs to 1437 1.56 isaki * be psref_released. 1438 1.56 isaki */ 1439 1.56 isaki pserialize_perform(sc->sc_psz); 1440 1.56 isaki psref_target_destroy(&sc->sc_psref, audio_psref_class); 1441 1.2 isaki 1442 1.56 isaki /* 1443 1.56 isaki * We are now guaranteed that there are no calls to audio fileops 1444 1.56 isaki * that hold sc, and any new calls with files that were for sc will 1445 1.56 isaki * fail. Thus, we now have exclusive access to the softc. 1446 1.56 isaki */ 1447 1.89 isaki sc->sc_exlock = 1; 1448 1.2 isaki 1449 1.2 isaki /* 1450 1.89 isaki * Clean up all open instances. 1451 1.2 isaki */ 1452 1.101 riastrad mutex_enter(sc->sc_lock); 1453 1.56 isaki while ((file = SLIST_FIRST(&sc->sc_files)) != NULL) { 1454 1.101 riastrad mutex_enter(sc->sc_intr_lock); 1455 1.101 riastrad SLIST_REMOVE_HEAD(&sc->sc_files, entry); 1456 1.101 riastrad mutex_exit(sc->sc_intr_lock); 1457 1.101 riastrad if (file->ptrack || file->rtrack) { 1458 1.101 riastrad mutex_exit(sc->sc_lock); 1459 1.101 riastrad audio_unlink(sc, file); 1460 1.101 riastrad mutex_enter(sc->sc_lock); 1461 1.101 riastrad } 1462 1.56 isaki } 1463 1.101 riastrad mutex_exit(sc->sc_lock); 1464 1.2 isaki 1465 1.2 isaki pmf_event_deregister(self, PMFE_AUDIO_VOLUME_DOWN, 1466 1.2 isaki audio_volume_down, true); 1467 1.2 isaki pmf_event_deregister(self, PMFE_AUDIO_VOLUME_UP, 1468 1.2 isaki audio_volume_up, true); 1469 1.2 isaki pmf_event_deregister(self, PMFE_AUDIO_VOLUME_TOGGLE, 1470 1.2 isaki audio_volume_toggle, true); 1471 1.2 isaki 1472 1.2 isaki #ifdef AUDIO_PM_IDLE 1473 1.2 isaki callout_halt(&sc->sc_idle_counter, sc->sc_lock); 1474 1.2 isaki 1475 1.2 isaki device_active_deregister(self, audio_activity); 1476 1.2 isaki #endif 1477 1.2 isaki 1478 1.2 isaki pmf_device_deregister(self); 1479 1.2 isaki 1480 1.2 isaki /* Free resources */ 1481 1.2 isaki if (sc->sc_pmixer) { 1482 1.2 isaki audio_mixer_destroy(sc, sc->sc_pmixer); 1483 1.2 isaki kmem_free(sc->sc_pmixer, sizeof(*sc->sc_pmixer)); 1484 1.2 isaki } 1485 1.2 isaki if (sc->sc_rmixer) { 1486 1.2 isaki audio_mixer_destroy(sc, sc->sc_rmixer); 1487 1.2 isaki kmem_free(sc->sc_rmixer, sizeof(*sc->sc_rmixer)); 1488 1.2 isaki } 1489 1.41 isaki if (sc->sc_am) 1490 1.41 isaki kern_free(sc->sc_am); 1491 1.2 isaki 1492 1.2 isaki seldestroy(&sc->sc_wsel); 1493 1.2 isaki seldestroy(&sc->sc_rsel); 1494 1.2 isaki 1495 1.2 isaki #ifdef AUDIO_PM_IDLE 1496 1.2 isaki callout_destroy(&sc->sc_idle_counter); 1497 1.2 isaki #endif 1498 1.2 isaki 1499 1.2 isaki cv_destroy(&sc->sc_exlockcv); 1500 1.2 isaki 1501 1.2 isaki #if defined(AUDIO_DEBUG) 1502 1.2 isaki audio_mlog_free(); 1503 1.2 isaki #endif 1504 1.2 isaki 1505 1.2 isaki return 0; 1506 1.2 isaki } 1507 1.2 isaki 1508 1.2 isaki static void 1509 1.2 isaki audiochilddet(device_t self, device_t child) 1510 1.2 isaki { 1511 1.2 isaki 1512 1.2 isaki /* we hold no child references, so do nothing */ 1513 1.2 isaki } 1514 1.2 isaki 1515 1.2 isaki static int 1516 1.2 isaki audiosearch(device_t parent, cfdata_t cf, const int *locs, void *aux) 1517 1.2 isaki { 1518 1.2 isaki 1519 1.92 thorpej if (config_probe(parent, cf, aux)) 1520 1.92 thorpej config_attach(parent, cf, aux, NULL, 1521 1.106 thorpej CFARGS_NONE); 1522 1.2 isaki 1523 1.2 isaki return 0; 1524 1.2 isaki } 1525 1.2 isaki 1526 1.2 isaki static int 1527 1.92 thorpej audiorescan(device_t self, const char *ifattr, const int *locators) 1528 1.2 isaki { 1529 1.2 isaki struct audio_softc *sc = device_private(self); 1530 1.2 isaki 1531 1.92 thorpej config_search(sc->sc_dev, NULL, 1532 1.106 thorpej CFARGS(.search = audiosearch)); 1533 1.2 isaki 1534 1.2 isaki return 0; 1535 1.2 isaki } 1536 1.2 isaki 1537 1.2 isaki /* 1538 1.2 isaki * Called from hardware driver. This is where the MI audio driver gets 1539 1.2 isaki * probed/attached to the hardware driver. 1540 1.2 isaki */ 1541 1.2 isaki device_t 1542 1.2 isaki audio_attach_mi(const struct audio_hw_if *ahwp, void *hdlp, device_t dev) 1543 1.2 isaki { 1544 1.2 isaki struct audio_attach_args arg; 1545 1.2 isaki 1546 1.2 isaki #ifdef DIAGNOSTIC 1547 1.2 isaki if (ahwp == NULL) { 1548 1.2 isaki aprint_error("audio_attach_mi: NULL\n"); 1549 1.2 isaki return 0; 1550 1.2 isaki } 1551 1.2 isaki #endif 1552 1.2 isaki arg.type = AUDIODEV_TYPE_AUDIO; 1553 1.2 isaki arg.hwif = ahwp; 1554 1.2 isaki arg.hdl = hdlp; 1555 1.93 thorpej return config_found(dev, &arg, audioprint, 1556 1.106 thorpej CFARGS(.iattr = "audiobus")); 1557 1.2 isaki } 1558 1.2 isaki 1559 1.2 isaki /* 1560 1.88 isaki * audio_printf() outputs fmt... with the audio device name and MD device 1561 1.88 isaki * name prefixed. If the message is considered to be related to the MD 1562 1.88 isaki * driver, use this one instead of device_printf(). 1563 1.88 isaki */ 1564 1.88 isaki static void 1565 1.88 isaki audio_printf(struct audio_softc *sc, const char *fmt, ...) 1566 1.88 isaki { 1567 1.88 isaki va_list ap; 1568 1.88 isaki 1569 1.88 isaki printf("%s(%s): ", device_xname(sc->sc_dev), device_xname(sc->hw_dev)); 1570 1.88 isaki va_start(ap, fmt); 1571 1.88 isaki vprintf(fmt, ap); 1572 1.88 isaki va_end(ap); 1573 1.88 isaki } 1574 1.88 isaki 1575 1.88 isaki /* 1576 1.63 isaki * Enter critical section and also keep sc_lock. 1577 1.63 isaki * If successful, returns 0 with sc_lock held. Otherwise returns errno. 1578 1.42 isaki * Must be called without sc_lock held. 1579 1.2 isaki */ 1580 1.2 isaki static int 1581 1.63 isaki audio_exlock_mutex_enter(struct audio_softc *sc) 1582 1.2 isaki { 1583 1.2 isaki int error; 1584 1.2 isaki 1585 1.2 isaki mutex_enter(sc->sc_lock); 1586 1.2 isaki if (sc->sc_dying) { 1587 1.2 isaki mutex_exit(sc->sc_lock); 1588 1.2 isaki return EIO; 1589 1.2 isaki } 1590 1.2 isaki 1591 1.2 isaki while (__predict_false(sc->sc_exlock != 0)) { 1592 1.2 isaki error = cv_wait_sig(&sc->sc_exlockcv, sc->sc_lock); 1593 1.2 isaki if (sc->sc_dying) 1594 1.2 isaki error = EIO; 1595 1.2 isaki if (error) { 1596 1.2 isaki mutex_exit(sc->sc_lock); 1597 1.2 isaki return error; 1598 1.2 isaki } 1599 1.2 isaki } 1600 1.2 isaki 1601 1.2 isaki /* Acquire */ 1602 1.2 isaki sc->sc_exlock = 1; 1603 1.2 isaki return 0; 1604 1.2 isaki } 1605 1.2 isaki 1606 1.2 isaki /* 1607 1.63 isaki * Exit critical section and exit sc_lock. 1608 1.2 isaki * Must be called with sc_lock held. 1609 1.2 isaki */ 1610 1.2 isaki static void 1611 1.63 isaki audio_exlock_mutex_exit(struct audio_softc *sc) 1612 1.2 isaki { 1613 1.2 isaki 1614 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 1615 1.2 isaki 1616 1.2 isaki sc->sc_exlock = 0; 1617 1.2 isaki cv_broadcast(&sc->sc_exlockcv); 1618 1.2 isaki mutex_exit(sc->sc_lock); 1619 1.2 isaki } 1620 1.2 isaki 1621 1.2 isaki /* 1622 1.63 isaki * Enter critical section. 1623 1.63 isaki * If successful, it returns 0. Otherwise returns errno. 1624 1.63 isaki * Must be called without sc_lock held. 1625 1.63 isaki * This function returns without sc_lock held. 1626 1.63 isaki */ 1627 1.63 isaki static int 1628 1.63 isaki audio_exlock_enter(struct audio_softc *sc) 1629 1.63 isaki { 1630 1.63 isaki int error; 1631 1.63 isaki 1632 1.63 isaki error = audio_exlock_mutex_enter(sc); 1633 1.63 isaki if (error) 1634 1.63 isaki return error; 1635 1.63 isaki mutex_exit(sc->sc_lock); 1636 1.63 isaki return 0; 1637 1.63 isaki } 1638 1.63 isaki 1639 1.63 isaki /* 1640 1.63 isaki * Exit critical section. 1641 1.63 isaki * Must be called without sc_lock held. 1642 1.63 isaki */ 1643 1.63 isaki static void 1644 1.63 isaki audio_exlock_exit(struct audio_softc *sc) 1645 1.63 isaki { 1646 1.63 isaki 1647 1.63 isaki mutex_enter(sc->sc_lock); 1648 1.63 isaki audio_exlock_mutex_exit(sc); 1649 1.63 isaki } 1650 1.63 isaki 1651 1.63 isaki /* 1652 1.90 isaki * Get sc from file, and increment reference counter for this sc. 1653 1.90 isaki * This is intended to be used for methods other than open. 1654 1.56 isaki * If successful, returns sc. Otherwise returns NULL. 1655 1.56 isaki */ 1656 1.56 isaki struct audio_softc * 1657 1.90 isaki audio_sc_acquire_fromfile(audio_file_t *file, struct psref *refp) 1658 1.56 isaki { 1659 1.56 isaki int s; 1660 1.56 isaki bool dying; 1661 1.56 isaki 1662 1.56 isaki /* Block audiodetach while we acquire a reference */ 1663 1.56 isaki s = pserialize_read_enter(); 1664 1.56 isaki 1665 1.56 isaki /* If close or audiodetach already ran, tough -- no more audio */ 1666 1.56 isaki dying = atomic_load_relaxed(&file->dying); 1667 1.56 isaki if (dying) { 1668 1.56 isaki pserialize_read_exit(s); 1669 1.56 isaki return NULL; 1670 1.56 isaki } 1671 1.56 isaki 1672 1.56 isaki /* Acquire a reference */ 1673 1.56 isaki psref_acquire(refp, &file->sc->sc_psref, audio_psref_class); 1674 1.56 isaki 1675 1.56 isaki /* Now sc won't go away until we drop the reference count */ 1676 1.56 isaki pserialize_read_exit(s); 1677 1.56 isaki 1678 1.56 isaki return file->sc; 1679 1.56 isaki } 1680 1.56 isaki 1681 1.56 isaki /* 1682 1.90 isaki * Decrement reference counter for this sc. 1683 1.56 isaki */ 1684 1.56 isaki void 1685 1.90 isaki audio_sc_release(struct audio_softc *sc, struct psref *refp) 1686 1.56 isaki { 1687 1.56 isaki 1688 1.56 isaki psref_release(refp, &sc->sc_psref, audio_psref_class); 1689 1.56 isaki } 1690 1.56 isaki 1691 1.56 isaki /* 1692 1.2 isaki * Wait for I/O to complete, releasing sc_lock. 1693 1.2 isaki * Must be called with sc_lock held. 1694 1.2 isaki */ 1695 1.2 isaki static int 1696 1.142 mlelstv audio_track_waitio(struct audio_softc *sc, audio_track_t *track, 1697 1.142 mlelstv const char *mess) 1698 1.2 isaki { 1699 1.2 isaki int error; 1700 1.2 isaki 1701 1.2 isaki KASSERT(track); 1702 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 1703 1.2 isaki 1704 1.2 isaki /* Wait for pending I/O to complete. */ 1705 1.2 isaki error = cv_timedwait_sig(&track->mixer->outcv, sc->sc_lock, 1706 1.2 isaki mstohz(AUDIO_TIMEOUT)); 1707 1.75 isaki if (sc->sc_suspending) { 1708 1.75 isaki /* If it's about to suspend, ignore timeout error. */ 1709 1.75 isaki if (error == EWOULDBLOCK) { 1710 1.75 isaki TRACET(2, track, "timeout (suspending)"); 1711 1.75 isaki return 0; 1712 1.75 isaki } 1713 1.75 isaki } 1714 1.2 isaki if (sc->sc_dying) { 1715 1.2 isaki error = EIO; 1716 1.2 isaki } 1717 1.2 isaki if (error) { 1718 1.2 isaki TRACET(2, track, "cv_timedwait_sig failed %d", error); 1719 1.142 mlelstv if (error == EWOULDBLOCK) { 1720 1.142 mlelstv audio_ring_t *usrbuf = &track->usrbuf; 1721 1.142 mlelstv audio_ring_t *outbuf = &track->outbuf; 1722 1.142 mlelstv audio_printf(sc, 1723 1.142 mlelstv "%s: device timeout, seq=%d, usrbuf=%d/H%d, outbuf=%d/%d\n", 1724 1.142 mlelstv mess, (int)track->seq, 1725 1.142 mlelstv usrbuf->used, track->usrbuf_usedhigh, 1726 1.142 mlelstv outbuf->used, outbuf->capacity); 1727 1.142 mlelstv } 1728 1.2 isaki } else { 1729 1.2 isaki TRACET(3, track, "wakeup"); 1730 1.2 isaki } 1731 1.2 isaki return error; 1732 1.2 isaki } 1733 1.2 isaki 1734 1.2 isaki /* 1735 1.2 isaki * Try to acquire track lock. 1736 1.107 andvar * It doesn't block if the track lock is already acquired. 1737 1.2 isaki * Returns true if the track lock was acquired, or false if the track 1738 1.2 isaki * lock was already acquired. 1739 1.2 isaki */ 1740 1.2 isaki static __inline bool 1741 1.2 isaki audio_track_lock_tryenter(audio_track_t *track) 1742 1.2 isaki { 1743 1.114 riastrad 1744 1.114 riastrad if (atomic_swap_uint(&track->lock, 1) != 0) 1745 1.114 riastrad return false; 1746 1.123 riastrad membar_acquire(); 1747 1.114 riastrad return true; 1748 1.2 isaki } 1749 1.2 isaki 1750 1.2 isaki /* 1751 1.2 isaki * Acquire track lock. 1752 1.2 isaki */ 1753 1.2 isaki static __inline void 1754 1.2 isaki audio_track_lock_enter(audio_track_t *track) 1755 1.2 isaki { 1756 1.114 riastrad 1757 1.2 isaki /* Don't sleep here. */ 1758 1.2 isaki while (audio_track_lock_tryenter(track) == false) 1759 1.114 riastrad SPINLOCK_BACKOFF_HOOK; 1760 1.2 isaki } 1761 1.2 isaki 1762 1.2 isaki /* 1763 1.2 isaki * Release track lock. 1764 1.2 isaki */ 1765 1.2 isaki static __inline void 1766 1.2 isaki audio_track_lock_exit(audio_track_t *track) 1767 1.2 isaki { 1768 1.114 riastrad 1769 1.114 riastrad atomic_store_release(&track->lock, 0); 1770 1.2 isaki } 1771 1.2 isaki 1772 1.2 isaki 1773 1.2 isaki static int 1774 1.2 isaki audioopen(dev_t dev, int flags, int ifmt, struct lwp *l) 1775 1.2 isaki { 1776 1.2 isaki struct audio_softc *sc; 1777 1.2 isaki int error; 1778 1.2 isaki 1779 1.121 riastrad /* 1780 1.121 riastrad * Find the device. Because we wired the cdevsw to the audio 1781 1.121 riastrad * autoconf instance, the system ensures it will not go away 1782 1.121 riastrad * until after we return. 1783 1.121 riastrad */ 1784 1.2 isaki sc = device_lookup_private(&audio_cd, AUDIOUNIT(dev)); 1785 1.2 isaki if (sc == NULL || sc->hw_if == NULL) 1786 1.2 isaki return ENXIO; 1787 1.2 isaki 1788 1.63 isaki error = audio_exlock_enter(sc); 1789 1.2 isaki if (error) 1790 1.121 riastrad return error; 1791 1.2 isaki 1792 1.2 isaki device_active(sc->sc_dev, DVA_SYSTEM); 1793 1.2 isaki switch (AUDIODEV(dev)) { 1794 1.2 isaki case SOUND_DEVICE: 1795 1.2 isaki case AUDIO_DEVICE: 1796 1.2 isaki error = audio_open(dev, sc, flags, ifmt, l, NULL); 1797 1.2 isaki break; 1798 1.2 isaki case AUDIOCTL_DEVICE: 1799 1.2 isaki error = audioctl_open(dev, sc, flags, ifmt, l); 1800 1.2 isaki break; 1801 1.2 isaki case MIXER_DEVICE: 1802 1.2 isaki error = mixer_open(dev, sc, flags, ifmt, l); 1803 1.2 isaki break; 1804 1.2 isaki default: 1805 1.2 isaki error = ENXIO; 1806 1.2 isaki break; 1807 1.2 isaki } 1808 1.63 isaki audio_exlock_exit(sc); 1809 1.2 isaki 1810 1.2 isaki return error; 1811 1.2 isaki } 1812 1.2 isaki 1813 1.2 isaki static int 1814 1.2 isaki audioclose(struct file *fp) 1815 1.2 isaki { 1816 1.2 isaki struct audio_softc *sc; 1817 1.56 isaki struct psref sc_ref; 1818 1.2 isaki audio_file_t *file; 1819 1.91 isaki int bound; 1820 1.2 isaki int error; 1821 1.2 isaki dev_t dev; 1822 1.2 isaki 1823 1.2 isaki KASSERT(fp->f_audioctx); 1824 1.2 isaki file = fp->f_audioctx; 1825 1.2 isaki dev = file->dev; 1826 1.56 isaki error = 0; 1827 1.56 isaki 1828 1.56 isaki /* 1829 1.56 isaki * audioclose() must 1830 1.56 isaki * - unplug track from the trackmixer (and unplug anything from softc), 1831 1.56 isaki * if sc exists. 1832 1.56 isaki * - free all memory objects, regardless of sc. 1833 1.56 isaki */ 1834 1.2 isaki 1835 1.91 isaki bound = curlwp_bind(); 1836 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 1837 1.56 isaki if (sc) { 1838 1.56 isaki switch (AUDIODEV(dev)) { 1839 1.56 isaki case SOUND_DEVICE: 1840 1.56 isaki case AUDIO_DEVICE: 1841 1.56 isaki error = audio_close(sc, file); 1842 1.56 isaki break; 1843 1.56 isaki case AUDIOCTL_DEVICE: 1844 1.103 riastrad mutex_enter(sc->sc_lock); 1845 1.103 riastrad mutex_enter(sc->sc_intr_lock); 1846 1.103 riastrad SLIST_REMOVE(&sc->sc_files, file, audio_file, entry); 1847 1.103 riastrad mutex_exit(sc->sc_intr_lock); 1848 1.103 riastrad mutex_exit(sc->sc_lock); 1849 1.56 isaki error = 0; 1850 1.56 isaki break; 1851 1.56 isaki case MIXER_DEVICE: 1852 1.103 riastrad mutex_enter(sc->sc_lock); 1853 1.103 riastrad mutex_enter(sc->sc_intr_lock); 1854 1.103 riastrad SLIST_REMOVE(&sc->sc_files, file, audio_file, entry); 1855 1.103 riastrad mutex_exit(sc->sc_intr_lock); 1856 1.103 riastrad mutex_exit(sc->sc_lock); 1857 1.56 isaki error = mixer_close(sc, file); 1858 1.56 isaki break; 1859 1.56 isaki default: 1860 1.56 isaki error = ENXIO; 1861 1.56 isaki break; 1862 1.56 isaki } 1863 1.2 isaki 1864 1.90 isaki audio_sc_release(sc, &sc_ref); 1865 1.2 isaki } 1866 1.91 isaki curlwp_bindx(bound); 1867 1.56 isaki 1868 1.56 isaki /* Free memory objects anyway */ 1869 1.56 isaki TRACEF(2, file, "free memory"); 1870 1.56 isaki if (file->ptrack) 1871 1.56 isaki audio_track_destroy(file->ptrack); 1872 1.56 isaki if (file->rtrack) 1873 1.56 isaki audio_track_destroy(file->rtrack); 1874 1.56 isaki kmem_free(file, sizeof(*file)); 1875 1.39 isaki fp->f_audioctx = NULL; 1876 1.2 isaki 1877 1.2 isaki return error; 1878 1.2 isaki } 1879 1.2 isaki 1880 1.2 isaki static int 1881 1.2 isaki audioread(struct file *fp, off_t *offp, struct uio *uio, kauth_cred_t cred, 1882 1.2 isaki int ioflag) 1883 1.2 isaki { 1884 1.2 isaki struct audio_softc *sc; 1885 1.56 isaki struct psref sc_ref; 1886 1.2 isaki audio_file_t *file; 1887 1.91 isaki int bound; 1888 1.2 isaki int error; 1889 1.2 isaki dev_t dev; 1890 1.2 isaki 1891 1.2 isaki KASSERT(fp->f_audioctx); 1892 1.2 isaki file = fp->f_audioctx; 1893 1.2 isaki dev = file->dev; 1894 1.2 isaki 1895 1.91 isaki bound = curlwp_bind(); 1896 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 1897 1.91 isaki if (sc == NULL) { 1898 1.91 isaki error = EIO; 1899 1.91 isaki goto done; 1900 1.91 isaki } 1901 1.56 isaki 1902 1.2 isaki if (fp->f_flag & O_NONBLOCK) 1903 1.2 isaki ioflag |= IO_NDELAY; 1904 1.2 isaki 1905 1.2 isaki switch (AUDIODEV(dev)) { 1906 1.2 isaki case SOUND_DEVICE: 1907 1.2 isaki case AUDIO_DEVICE: 1908 1.2 isaki error = audio_read(sc, uio, ioflag, file); 1909 1.2 isaki break; 1910 1.2 isaki case AUDIOCTL_DEVICE: 1911 1.2 isaki case MIXER_DEVICE: 1912 1.2 isaki error = ENODEV; 1913 1.2 isaki break; 1914 1.2 isaki default: 1915 1.2 isaki error = ENXIO; 1916 1.2 isaki break; 1917 1.2 isaki } 1918 1.2 isaki 1919 1.90 isaki audio_sc_release(sc, &sc_ref); 1920 1.91 isaki done: 1921 1.91 isaki curlwp_bindx(bound); 1922 1.2 isaki return error; 1923 1.2 isaki } 1924 1.2 isaki 1925 1.2 isaki static int 1926 1.2 isaki audiowrite(struct file *fp, off_t *offp, struct uio *uio, kauth_cred_t cred, 1927 1.2 isaki int ioflag) 1928 1.2 isaki { 1929 1.2 isaki struct audio_softc *sc; 1930 1.56 isaki struct psref sc_ref; 1931 1.2 isaki audio_file_t *file; 1932 1.91 isaki int bound; 1933 1.2 isaki int error; 1934 1.2 isaki dev_t dev; 1935 1.2 isaki 1936 1.2 isaki KASSERT(fp->f_audioctx); 1937 1.2 isaki file = fp->f_audioctx; 1938 1.2 isaki dev = file->dev; 1939 1.2 isaki 1940 1.91 isaki bound = curlwp_bind(); 1941 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 1942 1.91 isaki if (sc == NULL) { 1943 1.91 isaki error = EIO; 1944 1.91 isaki goto done; 1945 1.91 isaki } 1946 1.56 isaki 1947 1.2 isaki if (fp->f_flag & O_NONBLOCK) 1948 1.2 isaki ioflag |= IO_NDELAY; 1949 1.2 isaki 1950 1.2 isaki switch (AUDIODEV(dev)) { 1951 1.2 isaki case SOUND_DEVICE: 1952 1.2 isaki case AUDIO_DEVICE: 1953 1.2 isaki error = audio_write(sc, uio, ioflag, file); 1954 1.2 isaki break; 1955 1.2 isaki case AUDIOCTL_DEVICE: 1956 1.2 isaki case MIXER_DEVICE: 1957 1.2 isaki error = ENODEV; 1958 1.2 isaki break; 1959 1.2 isaki default: 1960 1.2 isaki error = ENXIO; 1961 1.2 isaki break; 1962 1.2 isaki } 1963 1.2 isaki 1964 1.90 isaki audio_sc_release(sc, &sc_ref); 1965 1.91 isaki done: 1966 1.91 isaki curlwp_bindx(bound); 1967 1.2 isaki return error; 1968 1.2 isaki } 1969 1.2 isaki 1970 1.2 isaki static int 1971 1.2 isaki audioioctl(struct file *fp, u_long cmd, void *addr) 1972 1.2 isaki { 1973 1.2 isaki struct audio_softc *sc; 1974 1.56 isaki struct psref sc_ref; 1975 1.2 isaki audio_file_t *file; 1976 1.2 isaki struct lwp *l = curlwp; 1977 1.91 isaki int bound; 1978 1.2 isaki int error; 1979 1.2 isaki dev_t dev; 1980 1.2 isaki 1981 1.2 isaki KASSERT(fp->f_audioctx); 1982 1.2 isaki file = fp->f_audioctx; 1983 1.2 isaki dev = file->dev; 1984 1.2 isaki 1985 1.91 isaki bound = curlwp_bind(); 1986 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 1987 1.91 isaki if (sc == NULL) { 1988 1.91 isaki error = EIO; 1989 1.91 isaki goto done; 1990 1.91 isaki } 1991 1.56 isaki 1992 1.2 isaki switch (AUDIODEV(dev)) { 1993 1.2 isaki case SOUND_DEVICE: 1994 1.2 isaki case AUDIO_DEVICE: 1995 1.2 isaki case AUDIOCTL_DEVICE: 1996 1.2 isaki mutex_enter(sc->sc_lock); 1997 1.2 isaki device_active(sc->sc_dev, DVA_SYSTEM); 1998 1.2 isaki mutex_exit(sc->sc_lock); 1999 1.2 isaki if (IOCGROUP(cmd) == IOCGROUP(AUDIO_MIXER_READ)) 2000 1.2 isaki error = mixer_ioctl(sc, cmd, addr, fp->f_flag, l); 2001 1.2 isaki else 2002 1.2 isaki error = audio_ioctl(dev, sc, cmd, addr, fp->f_flag, l, 2003 1.2 isaki file); 2004 1.2 isaki break; 2005 1.2 isaki case MIXER_DEVICE: 2006 1.2 isaki error = mixer_ioctl(sc, cmd, addr, fp->f_flag, l); 2007 1.2 isaki break; 2008 1.2 isaki default: 2009 1.2 isaki error = ENXIO; 2010 1.2 isaki break; 2011 1.2 isaki } 2012 1.2 isaki 2013 1.90 isaki audio_sc_release(sc, &sc_ref); 2014 1.91 isaki done: 2015 1.91 isaki curlwp_bindx(bound); 2016 1.2 isaki return error; 2017 1.2 isaki } 2018 1.2 isaki 2019 1.2 isaki static int 2020 1.2 isaki audiostat(struct file *fp, struct stat *st) 2021 1.2 isaki { 2022 1.56 isaki struct audio_softc *sc; 2023 1.56 isaki struct psref sc_ref; 2024 1.2 isaki audio_file_t *file; 2025 1.91 isaki int bound; 2026 1.91 isaki int error; 2027 1.2 isaki 2028 1.2 isaki KASSERT(fp->f_audioctx); 2029 1.2 isaki file = fp->f_audioctx; 2030 1.2 isaki 2031 1.91 isaki bound = curlwp_bind(); 2032 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2033 1.91 isaki if (sc == NULL) { 2034 1.91 isaki error = EIO; 2035 1.91 isaki goto done; 2036 1.91 isaki } 2037 1.56 isaki 2038 1.91 isaki error = 0; 2039 1.2 isaki memset(st, 0, sizeof(*st)); 2040 1.2 isaki 2041 1.2 isaki st->st_dev = file->dev; 2042 1.2 isaki st->st_uid = kauth_cred_geteuid(fp->f_cred); 2043 1.2 isaki st->st_gid = kauth_cred_getegid(fp->f_cred); 2044 1.2 isaki st->st_mode = S_IFCHR; 2045 1.56 isaki 2046 1.90 isaki audio_sc_release(sc, &sc_ref); 2047 1.91 isaki done: 2048 1.91 isaki curlwp_bindx(bound); 2049 1.91 isaki return error; 2050 1.2 isaki } 2051 1.2 isaki 2052 1.2 isaki static int 2053 1.2 isaki audiopoll(struct file *fp, int events) 2054 1.2 isaki { 2055 1.2 isaki struct audio_softc *sc; 2056 1.56 isaki struct psref sc_ref; 2057 1.2 isaki audio_file_t *file; 2058 1.2 isaki struct lwp *l = curlwp; 2059 1.91 isaki int bound; 2060 1.2 isaki int revents; 2061 1.2 isaki dev_t dev; 2062 1.2 isaki 2063 1.2 isaki KASSERT(fp->f_audioctx); 2064 1.2 isaki file = fp->f_audioctx; 2065 1.2 isaki dev = file->dev; 2066 1.2 isaki 2067 1.91 isaki bound = curlwp_bind(); 2068 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2069 1.91 isaki if (sc == NULL) { 2070 1.91 isaki revents = POLLERR; 2071 1.91 isaki goto done; 2072 1.91 isaki } 2073 1.56 isaki 2074 1.2 isaki switch (AUDIODEV(dev)) { 2075 1.2 isaki case SOUND_DEVICE: 2076 1.2 isaki case AUDIO_DEVICE: 2077 1.2 isaki revents = audio_poll(sc, events, l, file); 2078 1.2 isaki break; 2079 1.2 isaki case AUDIOCTL_DEVICE: 2080 1.2 isaki case MIXER_DEVICE: 2081 1.2 isaki revents = 0; 2082 1.2 isaki break; 2083 1.2 isaki default: 2084 1.2 isaki revents = POLLERR; 2085 1.2 isaki break; 2086 1.2 isaki } 2087 1.2 isaki 2088 1.90 isaki audio_sc_release(sc, &sc_ref); 2089 1.91 isaki done: 2090 1.91 isaki curlwp_bindx(bound); 2091 1.2 isaki return revents; 2092 1.2 isaki } 2093 1.2 isaki 2094 1.2 isaki static int 2095 1.2 isaki audiokqfilter(struct file *fp, struct knote *kn) 2096 1.2 isaki { 2097 1.2 isaki struct audio_softc *sc; 2098 1.56 isaki struct psref sc_ref; 2099 1.2 isaki audio_file_t *file; 2100 1.2 isaki dev_t dev; 2101 1.91 isaki int bound; 2102 1.2 isaki int error; 2103 1.2 isaki 2104 1.2 isaki KASSERT(fp->f_audioctx); 2105 1.2 isaki file = fp->f_audioctx; 2106 1.2 isaki dev = file->dev; 2107 1.2 isaki 2108 1.91 isaki bound = curlwp_bind(); 2109 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2110 1.91 isaki if (sc == NULL) { 2111 1.91 isaki error = EIO; 2112 1.91 isaki goto done; 2113 1.91 isaki } 2114 1.56 isaki 2115 1.2 isaki switch (AUDIODEV(dev)) { 2116 1.2 isaki case SOUND_DEVICE: 2117 1.2 isaki case AUDIO_DEVICE: 2118 1.2 isaki error = audio_kqfilter(sc, file, kn); 2119 1.2 isaki break; 2120 1.2 isaki case AUDIOCTL_DEVICE: 2121 1.2 isaki case MIXER_DEVICE: 2122 1.2 isaki error = ENODEV; 2123 1.2 isaki break; 2124 1.2 isaki default: 2125 1.2 isaki error = ENXIO; 2126 1.2 isaki break; 2127 1.2 isaki } 2128 1.2 isaki 2129 1.90 isaki audio_sc_release(sc, &sc_ref); 2130 1.91 isaki done: 2131 1.91 isaki curlwp_bindx(bound); 2132 1.2 isaki return error; 2133 1.2 isaki } 2134 1.2 isaki 2135 1.2 isaki static int 2136 1.2 isaki audiommap(struct file *fp, off_t *offp, size_t len, int prot, int *flagsp, 2137 1.2 isaki int *advicep, struct uvm_object **uobjp, int *maxprotp) 2138 1.2 isaki { 2139 1.2 isaki struct audio_softc *sc; 2140 1.56 isaki struct psref sc_ref; 2141 1.2 isaki audio_file_t *file; 2142 1.2 isaki dev_t dev; 2143 1.91 isaki int bound; 2144 1.2 isaki int error; 2145 1.2 isaki 2146 1.134 riastrad KASSERT(len > 0); 2147 1.134 riastrad 2148 1.2 isaki KASSERT(fp->f_audioctx); 2149 1.2 isaki file = fp->f_audioctx; 2150 1.2 isaki dev = file->dev; 2151 1.2 isaki 2152 1.91 isaki bound = curlwp_bind(); 2153 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2154 1.91 isaki if (sc == NULL) { 2155 1.91 isaki error = EIO; 2156 1.91 isaki goto done; 2157 1.91 isaki } 2158 1.56 isaki 2159 1.2 isaki mutex_enter(sc->sc_lock); 2160 1.2 isaki device_active(sc->sc_dev, DVA_SYSTEM); /* XXXJDM */ 2161 1.2 isaki mutex_exit(sc->sc_lock); 2162 1.2 isaki 2163 1.2 isaki switch (AUDIODEV(dev)) { 2164 1.2 isaki case SOUND_DEVICE: 2165 1.2 isaki case AUDIO_DEVICE: 2166 1.2 isaki error = audio_mmap(sc, offp, len, prot, flagsp, advicep, 2167 1.2 isaki uobjp, maxprotp, file); 2168 1.2 isaki break; 2169 1.2 isaki case AUDIOCTL_DEVICE: 2170 1.2 isaki case MIXER_DEVICE: 2171 1.2 isaki default: 2172 1.2 isaki error = ENOTSUP; 2173 1.2 isaki break; 2174 1.2 isaki } 2175 1.2 isaki 2176 1.90 isaki audio_sc_release(sc, &sc_ref); 2177 1.91 isaki done: 2178 1.91 isaki curlwp_bindx(bound); 2179 1.2 isaki return error; 2180 1.2 isaki } 2181 1.2 isaki 2182 1.2 isaki 2183 1.2 isaki /* Exported interfaces for audiobell. */ 2184 1.2 isaki 2185 1.2 isaki /* 2186 1.2 isaki * Open for audiobell. 2187 1.21 isaki * It stores allocated file to *filep. 2188 1.2 isaki * If successful returns 0, otherwise errno. 2189 1.2 isaki */ 2190 1.2 isaki int 2191 1.21 isaki audiobellopen(dev_t dev, audio_file_t **filep) 2192 1.2 isaki { 2193 1.121 riastrad device_t audiodev = NULL; 2194 1.2 isaki struct audio_softc *sc; 2195 1.121 riastrad bool exlock = false; 2196 1.2 isaki int error; 2197 1.2 isaki 2198 1.121 riastrad /* 2199 1.121 riastrad * Find the autoconf instance and make sure it doesn't go away 2200 1.121 riastrad * while we are opening it. 2201 1.121 riastrad */ 2202 1.121 riastrad audiodev = device_lookup_acquire(&audio_cd, AUDIOUNIT(dev)); 2203 1.121 riastrad if (audiodev == NULL) { 2204 1.121 riastrad error = ENXIO; 2205 1.121 riastrad goto out; 2206 1.121 riastrad } 2207 1.2 isaki 2208 1.121 riastrad /* If attach failed, it's hopeless -- give up. */ 2209 1.121 riastrad sc = device_private(audiodev); 2210 1.121 riastrad if (sc->hw_if == NULL) { 2211 1.121 riastrad error = ENXIO; 2212 1.121 riastrad goto out; 2213 1.121 riastrad } 2214 1.90 isaki 2215 1.121 riastrad /* Take the exclusive configuration lock. */ 2216 1.63 isaki error = audio_exlock_enter(sc); 2217 1.2 isaki if (error) 2218 1.121 riastrad goto out; 2219 1.121 riastrad exlock = true; 2220 1.2 isaki 2221 1.121 riastrad /* Open the audio device. */ 2222 1.2 isaki device_active(sc->sc_dev, DVA_SYSTEM); 2223 1.21 isaki error = audio_open(dev, sc, FWRITE, 0, curlwp, filep); 2224 1.2 isaki 2225 1.121 riastrad out: if (exlock) 2226 1.121 riastrad audio_exlock_exit(sc); 2227 1.121 riastrad if (audiodev) 2228 1.121 riastrad device_release(audiodev); 2229 1.2 isaki return error; 2230 1.2 isaki } 2231 1.2 isaki 2232 1.2 isaki /* Close for audiobell */ 2233 1.2 isaki int 2234 1.2 isaki audiobellclose(audio_file_t *file) 2235 1.2 isaki { 2236 1.2 isaki struct audio_softc *sc; 2237 1.56 isaki struct psref sc_ref; 2238 1.91 isaki int bound; 2239 1.2 isaki int error; 2240 1.2 isaki 2241 1.90 isaki error = 0; 2242 1.90 isaki /* 2243 1.90 isaki * audiobellclose() must 2244 1.90 isaki * - unplug track from the trackmixer if sc exist. 2245 1.90 isaki * - free all memory objects, regardless of sc. 2246 1.90 isaki */ 2247 1.91 isaki bound = curlwp_bind(); 2248 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2249 1.90 isaki if (sc) { 2250 1.90 isaki error = audio_close(sc, file); 2251 1.90 isaki audio_sc_release(sc, &sc_ref); 2252 1.90 isaki } 2253 1.91 isaki curlwp_bindx(bound); 2254 1.57 isaki 2255 1.90 isaki /* Free memory objects anyway */ 2256 1.57 isaki KASSERT(file->ptrack); 2257 1.57 isaki audio_track_destroy(file->ptrack); 2258 1.57 isaki KASSERT(file->rtrack == NULL); 2259 1.57 isaki kmem_free(file, sizeof(*file)); 2260 1.2 isaki return error; 2261 1.2 isaki } 2262 1.2 isaki 2263 1.21 isaki /* Set sample rate for audiobell */ 2264 1.21 isaki int 2265 1.21 isaki audiobellsetrate(audio_file_t *file, u_int sample_rate) 2266 1.21 isaki { 2267 1.21 isaki struct audio_softc *sc; 2268 1.56 isaki struct psref sc_ref; 2269 1.21 isaki struct audio_info ai; 2270 1.91 isaki int bound; 2271 1.21 isaki int error; 2272 1.21 isaki 2273 1.91 isaki bound = curlwp_bind(); 2274 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2275 1.91 isaki if (sc == NULL) { 2276 1.91 isaki error = EIO; 2277 1.91 isaki goto done1; 2278 1.91 isaki } 2279 1.21 isaki 2280 1.21 isaki AUDIO_INITINFO(&ai); 2281 1.21 isaki ai.play.sample_rate = sample_rate; 2282 1.21 isaki 2283 1.63 isaki error = audio_exlock_enter(sc); 2284 1.21 isaki if (error) 2285 1.91 isaki goto done2; 2286 1.21 isaki error = audio_file_setinfo(sc, file, &ai); 2287 1.63 isaki audio_exlock_exit(sc); 2288 1.21 isaki 2289 1.91 isaki done2: 2290 1.90 isaki audio_sc_release(sc, &sc_ref); 2291 1.91 isaki done1: 2292 1.91 isaki curlwp_bindx(bound); 2293 1.21 isaki return error; 2294 1.21 isaki } 2295 1.21 isaki 2296 1.2 isaki /* Playback for audiobell */ 2297 1.2 isaki int 2298 1.2 isaki audiobellwrite(audio_file_t *file, struct uio *uio) 2299 1.2 isaki { 2300 1.2 isaki struct audio_softc *sc; 2301 1.56 isaki struct psref sc_ref; 2302 1.91 isaki int bound; 2303 1.2 isaki int error; 2304 1.2 isaki 2305 1.91 isaki bound = curlwp_bind(); 2306 1.90 isaki sc = audio_sc_acquire_fromfile(file, &sc_ref); 2307 1.91 isaki if (sc == NULL) { 2308 1.91 isaki error = EIO; 2309 1.91 isaki goto done; 2310 1.91 isaki } 2311 1.56 isaki 2312 1.2 isaki error = audio_write(sc, uio, 0, file); 2313 1.56 isaki 2314 1.90 isaki audio_sc_release(sc, &sc_ref); 2315 1.91 isaki done: 2316 1.91 isaki curlwp_bindx(bound); 2317 1.2 isaki return error; 2318 1.2 isaki } 2319 1.2 isaki 2320 1.2 isaki 2321 1.2 isaki /* 2322 1.2 isaki * Audio driver 2323 1.2 isaki */ 2324 1.63 isaki 2325 1.63 isaki /* 2326 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 2327 1.63 isaki */ 2328 1.2 isaki int 2329 1.2 isaki audio_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, 2330 1.21 isaki struct lwp *l, audio_file_t **bellfile) 2331 1.2 isaki { 2332 1.2 isaki struct audio_info ai; 2333 1.2 isaki struct file *fp; 2334 1.2 isaki audio_file_t *af; 2335 1.2 isaki audio_ring_t *hwbuf; 2336 1.2 isaki bool fullduplex; 2337 1.81 isaki bool cred_held; 2338 1.81 isaki bool hw_opened; 2339 1.80 isaki bool rmixer_started; 2340 1.90 isaki bool inserted; 2341 1.2 isaki int fd; 2342 1.2 isaki int error; 2343 1.2 isaki 2344 1.2 isaki KASSERT(sc->sc_exlock); 2345 1.2 isaki 2346 1.22 isaki TRACE(1, "%sdev=%s flags=0x%x po=%d ro=%d", 2347 1.2 isaki (audiodebug >= 3) ? "start " : "", 2348 1.22 isaki ISDEVSOUND(dev) ? "sound" : "audio", 2349 1.2 isaki flags, sc->sc_popens, sc->sc_ropens); 2350 1.2 isaki 2351 1.81 isaki fp = NULL; 2352 1.81 isaki cred_held = false; 2353 1.81 isaki hw_opened = false; 2354 1.80 isaki rmixer_started = false; 2355 1.90 isaki inserted = false; 2356 1.80 isaki 2357 1.98 riastrad af = kmem_zalloc(sizeof(*af), KM_SLEEP); 2358 1.2 isaki af->sc = sc; 2359 1.2 isaki af->dev = dev; 2360 1.104 riastrad if ((flags & FWRITE) != 0 && audio_can_playback(sc)) 2361 1.2 isaki af->mode |= AUMODE_PLAY | AUMODE_PLAY_ALL; 2362 1.104 riastrad if ((flags & FREAD) != 0 && audio_can_capture(sc)) 2363 1.2 isaki af->mode |= AUMODE_RECORD; 2364 1.2 isaki if (af->mode == 0) { 2365 1.2 isaki error = ENXIO; 2366 1.81 isaki goto bad; 2367 1.2 isaki } 2368 1.2 isaki 2369 1.14 isaki fullduplex = (sc->sc_props & AUDIO_PROP_FULLDUPLEX); 2370 1.2 isaki 2371 1.2 isaki /* 2372 1.2 isaki * On half duplex hardware, 2373 1.2 isaki * 1. if mode is (PLAY | REC), let mode PLAY. 2374 1.2 isaki * 2. if mode is PLAY, let mode PLAY if no rec tracks, otherwise error. 2375 1.2 isaki * 3. if mode is REC, let mode REC if no play tracks, otherwise error. 2376 1.2 isaki */ 2377 1.2 isaki if (fullduplex == false) { 2378 1.2 isaki if ((af->mode & AUMODE_PLAY)) { 2379 1.2 isaki if (sc->sc_ropens != 0) { 2380 1.2 isaki TRACE(1, "record track already exists"); 2381 1.2 isaki error = ENODEV; 2382 1.81 isaki goto bad; 2383 1.2 isaki } 2384 1.2 isaki /* Play takes precedence */ 2385 1.2 isaki af->mode &= ~AUMODE_RECORD; 2386 1.2 isaki } 2387 1.2 isaki if ((af->mode & AUMODE_RECORD)) { 2388 1.2 isaki if (sc->sc_popens != 0) { 2389 1.2 isaki TRACE(1, "play track already exists"); 2390 1.2 isaki error = ENODEV; 2391 1.81 isaki goto bad; 2392 1.2 isaki } 2393 1.2 isaki } 2394 1.2 isaki } 2395 1.2 isaki 2396 1.2 isaki /* Create tracks */ 2397 1.2 isaki if ((af->mode & AUMODE_PLAY)) 2398 1.2 isaki af->ptrack = audio_track_create(sc, sc->sc_pmixer); 2399 1.2 isaki if ((af->mode & AUMODE_RECORD)) 2400 1.2 isaki af->rtrack = audio_track_create(sc, sc->sc_rmixer); 2401 1.2 isaki 2402 1.2 isaki /* Set parameters */ 2403 1.2 isaki AUDIO_INITINFO(&ai); 2404 1.21 isaki if (bellfile) { 2405 1.21 isaki /* If audiobell, only sample_rate will be set later. */ 2406 1.21 isaki ai.play.sample_rate = audio_default.sample_rate; 2407 1.21 isaki ai.play.encoding = AUDIO_ENCODING_SLINEAR_NE; 2408 1.21 isaki ai.play.channels = 1; 2409 1.21 isaki ai.play.precision = 16; 2410 1.58 isaki ai.play.pause = 0; 2411 1.2 isaki } else if (ISDEVAUDIO(dev)) { 2412 1.2 isaki /* If /dev/audio, initialize everytime. */ 2413 1.2 isaki ai.play.sample_rate = audio_default.sample_rate; 2414 1.2 isaki ai.play.encoding = audio_default.encoding; 2415 1.2 isaki ai.play.channels = audio_default.channels; 2416 1.2 isaki ai.play.precision = audio_default.precision; 2417 1.58 isaki ai.play.pause = 0; 2418 1.2 isaki ai.record.sample_rate = audio_default.sample_rate; 2419 1.2 isaki ai.record.encoding = audio_default.encoding; 2420 1.2 isaki ai.record.channels = audio_default.channels; 2421 1.2 isaki ai.record.precision = audio_default.precision; 2422 1.58 isaki ai.record.pause = 0; 2423 1.2 isaki } else { 2424 1.2 isaki /* If /dev/sound, take over the previous parameters. */ 2425 1.2 isaki ai.play.sample_rate = sc->sc_sound_pparams.sample_rate; 2426 1.2 isaki ai.play.encoding = sc->sc_sound_pparams.encoding; 2427 1.2 isaki ai.play.channels = sc->sc_sound_pparams.channels; 2428 1.2 isaki ai.play.precision = sc->sc_sound_pparams.precision; 2429 1.2 isaki ai.play.pause = sc->sc_sound_ppause; 2430 1.2 isaki ai.record.sample_rate = sc->sc_sound_rparams.sample_rate; 2431 1.2 isaki ai.record.encoding = sc->sc_sound_rparams.encoding; 2432 1.2 isaki ai.record.channels = sc->sc_sound_rparams.channels; 2433 1.2 isaki ai.record.precision = sc->sc_sound_rparams.precision; 2434 1.2 isaki ai.record.pause = sc->sc_sound_rpause; 2435 1.2 isaki } 2436 1.2 isaki error = audio_file_setinfo(sc, af, &ai); 2437 1.2 isaki if (error) 2438 1.81 isaki goto bad; 2439 1.2 isaki 2440 1.2 isaki if (sc->sc_popens + sc->sc_ropens == 0) { 2441 1.2 isaki /* First open */ 2442 1.2 isaki 2443 1.2 isaki sc->sc_cred = kauth_cred_get(); 2444 1.2 isaki kauth_cred_hold(sc->sc_cred); 2445 1.81 isaki cred_held = true; 2446 1.2 isaki 2447 1.2 isaki if (sc->hw_if->open) { 2448 1.2 isaki int hwflags; 2449 1.2 isaki 2450 1.2 isaki /* 2451 1.2 isaki * Call hw_if->open() only at first open of 2452 1.2 isaki * combination of playback and recording. 2453 1.2 isaki * On full duplex hardware, the flags passed to 2454 1.2 isaki * hw_if->open() is always (FREAD | FWRITE) 2455 1.2 isaki * regardless of this open()'s flags. 2456 1.2 isaki * see also dev/isa/aria.c 2457 1.2 isaki * On half duplex hardware, the flags passed to 2458 1.2 isaki * hw_if->open() is either FREAD or FWRITE. 2459 1.2 isaki * see also arch/evbarm/mini2440/audio_mini2440.c 2460 1.2 isaki */ 2461 1.2 isaki if (fullduplex) { 2462 1.2 isaki hwflags = FREAD | FWRITE; 2463 1.2 isaki } else { 2464 1.2 isaki /* Construct hwflags from af->mode. */ 2465 1.2 isaki hwflags = 0; 2466 1.2 isaki if ((af->mode & AUMODE_PLAY) != 0) 2467 1.2 isaki hwflags |= FWRITE; 2468 1.2 isaki if ((af->mode & AUMODE_RECORD) != 0) 2469 1.2 isaki hwflags |= FREAD; 2470 1.2 isaki } 2471 1.2 isaki 2472 1.63 isaki mutex_enter(sc->sc_lock); 2473 1.2 isaki mutex_enter(sc->sc_intr_lock); 2474 1.2 isaki error = sc->hw_if->open(sc->hw_hdl, hwflags); 2475 1.2 isaki mutex_exit(sc->sc_intr_lock); 2476 1.63 isaki mutex_exit(sc->sc_lock); 2477 1.2 isaki if (error) 2478 1.81 isaki goto bad; 2479 1.2 isaki } 2480 1.81 isaki /* 2481 1.81 isaki * Regardless of whether we called hw_if->open (whether 2482 1.81 isaki * hw_if->open exists) or not, we move to the Opened phase 2483 1.81 isaki * here. Therefore from this point, we have to call 2484 1.81 isaki * hw_if->close (if exists) whenever abort. 2485 1.81 isaki * Note that both of hw_if->{open,close} are optional. 2486 1.81 isaki */ 2487 1.81 isaki hw_opened = true; 2488 1.2 isaki 2489 1.2 isaki /* 2490 1.2 isaki * Set speaker mode when a half duplex. 2491 1.2 isaki * XXX I'm not sure this is correct. 2492 1.2 isaki */ 2493 1.2 isaki if (1/*XXX*/) { 2494 1.2 isaki if (sc->hw_if->speaker_ctl) { 2495 1.2 isaki int on; 2496 1.2 isaki if (af->ptrack) { 2497 1.2 isaki on = 1; 2498 1.2 isaki } else { 2499 1.2 isaki on = 0; 2500 1.2 isaki } 2501 1.63 isaki mutex_enter(sc->sc_lock); 2502 1.2 isaki mutex_enter(sc->sc_intr_lock); 2503 1.2 isaki error = sc->hw_if->speaker_ctl(sc->hw_hdl, on); 2504 1.2 isaki mutex_exit(sc->sc_intr_lock); 2505 1.63 isaki mutex_exit(sc->sc_lock); 2506 1.2 isaki if (error) 2507 1.81 isaki goto bad; 2508 1.2 isaki } 2509 1.2 isaki } 2510 1.2 isaki } else if (sc->sc_multiuser == false) { 2511 1.2 isaki uid_t euid = kauth_cred_geteuid(kauth_cred_get()); 2512 1.2 isaki if (euid != 0 && euid != kauth_cred_geteuid(sc->sc_cred)) { 2513 1.2 isaki error = EPERM; 2514 1.81 isaki goto bad; 2515 1.2 isaki } 2516 1.2 isaki } 2517 1.2 isaki 2518 1.2 isaki /* Call init_output if this is the first playback open. */ 2519 1.2 isaki if (af->ptrack && sc->sc_popens == 0) { 2520 1.2 isaki if (sc->hw_if->init_output) { 2521 1.2 isaki hwbuf = &sc->sc_pmixer->hwbuf; 2522 1.63 isaki mutex_enter(sc->sc_lock); 2523 1.2 isaki mutex_enter(sc->sc_intr_lock); 2524 1.2 isaki error = sc->hw_if->init_output(sc->hw_hdl, 2525 1.2 isaki hwbuf->mem, 2526 1.2 isaki hwbuf->capacity * 2527 1.2 isaki hwbuf->fmt.channels * hwbuf->fmt.stride / NBBY); 2528 1.2 isaki mutex_exit(sc->sc_intr_lock); 2529 1.63 isaki mutex_exit(sc->sc_lock); 2530 1.2 isaki if (error) 2531 1.81 isaki goto bad; 2532 1.2 isaki } 2533 1.2 isaki } 2534 1.65 isaki /* 2535 1.65 isaki * Call init_input and start rmixer, if this is the first recording 2536 1.65 isaki * open. See pause consideration notes. 2537 1.65 isaki */ 2538 1.2 isaki if (af->rtrack && sc->sc_ropens == 0) { 2539 1.2 isaki if (sc->hw_if->init_input) { 2540 1.2 isaki hwbuf = &sc->sc_rmixer->hwbuf; 2541 1.63 isaki mutex_enter(sc->sc_lock); 2542 1.2 isaki mutex_enter(sc->sc_intr_lock); 2543 1.2 isaki error = sc->hw_if->init_input(sc->hw_hdl, 2544 1.2 isaki hwbuf->mem, 2545 1.2 isaki hwbuf->capacity * 2546 1.2 isaki hwbuf->fmt.channels * hwbuf->fmt.stride / NBBY); 2547 1.2 isaki mutex_exit(sc->sc_intr_lock); 2548 1.63 isaki mutex_exit(sc->sc_lock); 2549 1.2 isaki if (error) 2550 1.81 isaki goto bad; 2551 1.2 isaki } 2552 1.65 isaki 2553 1.65 isaki mutex_enter(sc->sc_lock); 2554 1.65 isaki audio_rmixer_start(sc); 2555 1.65 isaki mutex_exit(sc->sc_lock); 2556 1.80 isaki rmixer_started = true; 2557 1.2 isaki } 2558 1.2 isaki 2559 1.90 isaki /* 2560 1.90 isaki * This is the last sc_lock section in the function, so we have to 2561 1.90 isaki * examine sc_dying again before starting the rest tasks. Because 2562 1.90 isaki * audiodeatch() may have been invoked (and it would set sc_dying) 2563 1.90 isaki * from the time audioopen() was executed until now. If it happens, 2564 1.90 isaki * audiodetach() may already have set file->dying for all sc_files 2565 1.90 isaki * that exist at that point, so that audioopen() must abort without 2566 1.90 isaki * inserting af to sc_files, in order to keep consistency. 2567 1.90 isaki */ 2568 1.90 isaki mutex_enter(sc->sc_lock); 2569 1.90 isaki if (sc->sc_dying) { 2570 1.90 isaki mutex_exit(sc->sc_lock); 2571 1.97 riastrad error = ENXIO; 2572 1.90 isaki goto bad; 2573 1.90 isaki } 2574 1.90 isaki 2575 1.90 isaki /* Count up finally */ 2576 1.90 isaki if (af->ptrack) 2577 1.90 isaki sc->sc_popens++; 2578 1.90 isaki if (af->rtrack) 2579 1.90 isaki sc->sc_ropens++; 2580 1.90 isaki mutex_enter(sc->sc_intr_lock); 2581 1.90 isaki SLIST_INSERT_HEAD(&sc->sc_files, af, entry); 2582 1.90 isaki mutex_exit(sc->sc_intr_lock); 2583 1.90 isaki mutex_exit(sc->sc_lock); 2584 1.90 isaki inserted = true; 2585 1.90 isaki 2586 1.81 isaki if (bellfile) { 2587 1.81 isaki *bellfile = af; 2588 1.81 isaki } else { 2589 1.2 isaki error = fd_allocfile(&fp, &fd); 2590 1.2 isaki if (error) 2591 1.81 isaki goto bad; 2592 1.81 isaki 2593 1.81 isaki error = fd_clone(fp, fd, flags, &audio_fileops, af); 2594 1.81 isaki KASSERTMSG(error == EMOVEFD, "error=%d", error); 2595 1.2 isaki } 2596 1.2 isaki 2597 1.90 isaki /* Be nothing else after fd_clone */ 2598 1.2 isaki 2599 1.2 isaki TRACEF(3, af, "done"); 2600 1.2 isaki return error; 2601 1.2 isaki 2602 1.81 isaki bad: 2603 1.90 isaki if (inserted) { 2604 1.90 isaki mutex_enter(sc->sc_lock); 2605 1.90 isaki mutex_enter(sc->sc_intr_lock); 2606 1.90 isaki SLIST_REMOVE(&sc->sc_files, af, audio_file, entry); 2607 1.90 isaki mutex_exit(sc->sc_intr_lock); 2608 1.90 isaki if (af->ptrack) 2609 1.90 isaki sc->sc_popens--; 2610 1.90 isaki if (af->rtrack) 2611 1.90 isaki sc->sc_ropens--; 2612 1.90 isaki mutex_exit(sc->sc_lock); 2613 1.81 isaki } 2614 1.81 isaki 2615 1.80 isaki if (rmixer_started) { 2616 1.80 isaki mutex_enter(sc->sc_lock); 2617 1.80 isaki audio_rmixer_halt(sc); 2618 1.80 isaki mutex_exit(sc->sc_lock); 2619 1.80 isaki } 2620 1.81 isaki 2621 1.81 isaki if (hw_opened) { 2622 1.2 isaki if (sc->hw_if->close) { 2623 1.63 isaki mutex_enter(sc->sc_lock); 2624 1.2 isaki mutex_enter(sc->sc_intr_lock); 2625 1.2 isaki sc->hw_if->close(sc->hw_hdl); 2626 1.2 isaki mutex_exit(sc->sc_intr_lock); 2627 1.63 isaki mutex_exit(sc->sc_lock); 2628 1.2 isaki } 2629 1.2 isaki } 2630 1.81 isaki if (cred_held) { 2631 1.81 isaki kauth_cred_free(sc->sc_cred); 2632 1.81 isaki } 2633 1.81 isaki 2634 1.80 isaki /* 2635 1.80 isaki * Since track here is not yet linked to sc_files, 2636 1.80 isaki * you can call track_destroy() without sc_intr_lock. 2637 1.80 isaki */ 2638 1.2 isaki if (af->rtrack) { 2639 1.2 isaki audio_track_destroy(af->rtrack); 2640 1.2 isaki af->rtrack = NULL; 2641 1.2 isaki } 2642 1.2 isaki if (af->ptrack) { 2643 1.2 isaki audio_track_destroy(af->ptrack); 2644 1.2 isaki af->ptrack = NULL; 2645 1.2 isaki } 2646 1.81 isaki 2647 1.2 isaki kmem_free(af, sizeof(*af)); 2648 1.2 isaki return error; 2649 1.2 isaki } 2650 1.2 isaki 2651 1.9 isaki /* 2652 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 2653 1.9 isaki */ 2654 1.2 isaki int 2655 1.2 isaki audio_close(struct audio_softc *sc, audio_file_t *file) 2656 1.2 isaki { 2657 1.89 isaki int error; 2658 1.56 isaki 2659 1.56 isaki /* 2660 1.56 isaki * Drain first. 2661 1.63 isaki * It must be done before unlinking(acquiring exlock). 2662 1.56 isaki */ 2663 1.56 isaki if (file->ptrack) { 2664 1.56 isaki mutex_enter(sc->sc_lock); 2665 1.56 isaki audio_track_drain(sc, file->ptrack); 2666 1.56 isaki mutex_exit(sc->sc_lock); 2667 1.56 isaki } 2668 1.56 isaki 2669 1.103 riastrad mutex_enter(sc->sc_lock); 2670 1.103 riastrad mutex_enter(sc->sc_intr_lock); 2671 1.103 riastrad SLIST_REMOVE(&sc->sc_files, file, audio_file, entry); 2672 1.103 riastrad mutex_exit(sc->sc_intr_lock); 2673 1.103 riastrad mutex_exit(sc->sc_lock); 2674 1.103 riastrad 2675 1.89 isaki error = audio_exlock_enter(sc); 2676 1.89 isaki if (error) { 2677 1.89 isaki /* 2678 1.89 isaki * If EIO, this sc is about to detach. In this case, even if 2679 1.89 isaki * we don't do subsequent _unlink(), audiodetach() will do it. 2680 1.89 isaki */ 2681 1.89 isaki if (error == EIO) 2682 1.89 isaki return error; 2683 1.89 isaki 2684 1.89 isaki /* XXX This should not happen but what should I do ? */ 2685 1.89 isaki panic("%s: can't acquire exlock: errno=%d", __func__, error); 2686 1.89 isaki } 2687 1.102 riastrad audio_unlink(sc, file); 2688 1.89 isaki audio_exlock_exit(sc); 2689 1.89 isaki 2690 1.102 riastrad return 0; 2691 1.56 isaki } 2692 1.56 isaki 2693 1.56 isaki /* 2694 1.56 isaki * Unlink this file, but not freeing memory here. 2695 1.89 isaki * Must be called with sc_exlock held and without sc_lock held. 2696 1.56 isaki */ 2697 1.102 riastrad static void 2698 1.56 isaki audio_unlink(struct audio_softc *sc, audio_file_t *file) 2699 1.56 isaki { 2700 1.99 riastrad kauth_cred_t cred = NULL; 2701 1.2 isaki int error; 2702 1.2 isaki 2703 1.63 isaki mutex_enter(sc->sc_lock); 2704 1.63 isaki 2705 1.2 isaki TRACEF(1, file, "%spid=%d.%d po=%d ro=%d", 2706 1.2 isaki (audiodebug >= 3) ? "start " : "", 2707 1.2 isaki (int)curproc->p_pid, (int)curlwp->l_lid, 2708 1.2 isaki sc->sc_popens, sc->sc_ropens); 2709 1.2 isaki KASSERTMSG(sc->sc_popens + sc->sc_ropens > 0, 2710 1.2 isaki "sc->sc_popens=%d, sc->sc_ropens=%d", 2711 1.2 isaki sc->sc_popens, sc->sc_ropens); 2712 1.2 isaki 2713 1.56 isaki device_active(sc->sc_dev, DVA_SYSTEM); 2714 1.56 isaki 2715 1.2 isaki if (file->ptrack) { 2716 1.56 isaki TRACET(3, file->ptrack, "dropframes=%" PRIu64, 2717 1.56 isaki file->ptrack->dropframes); 2718 1.56 isaki 2719 1.56 isaki KASSERT(sc->sc_popens > 0); 2720 1.56 isaki sc->sc_popens--; 2721 1.56 isaki 2722 1.2 isaki /* Call hw halt_output if this is the last playback track. */ 2723 1.56 isaki if (sc->sc_popens == 0 && sc->sc_pbusy) { 2724 1.2 isaki error = audio_pmixer_halt(sc); 2725 1.2 isaki if (error) { 2726 1.88 isaki audio_printf(sc, 2727 1.88 isaki "halt_output failed: errno=%d (ignored)\n", 2728 1.56 isaki error); 2729 1.2 isaki } 2730 1.2 isaki } 2731 1.2 isaki 2732 1.20 isaki /* Restore mixing volume if all tracks are gone. */ 2733 1.20 isaki if (sc->sc_popens == 0) { 2734 1.56 isaki /* intr_lock is not necessary, but just manners. */ 2735 1.20 isaki mutex_enter(sc->sc_intr_lock); 2736 1.20 isaki sc->sc_pmixer->volume = 256; 2737 1.23 isaki sc->sc_pmixer->voltimer = 0; 2738 1.20 isaki mutex_exit(sc->sc_intr_lock); 2739 1.20 isaki } 2740 1.2 isaki } 2741 1.2 isaki if (file->rtrack) { 2742 1.56 isaki TRACET(3, file->rtrack, "dropframes=%" PRIu64, 2743 1.56 isaki file->rtrack->dropframes); 2744 1.56 isaki 2745 1.56 isaki KASSERT(sc->sc_ropens > 0); 2746 1.56 isaki sc->sc_ropens--; 2747 1.56 isaki 2748 1.2 isaki /* Call hw halt_input if this is the last recording track. */ 2749 1.56 isaki if (sc->sc_ropens == 0 && sc->sc_rbusy) { 2750 1.2 isaki error = audio_rmixer_halt(sc); 2751 1.2 isaki if (error) { 2752 1.88 isaki audio_printf(sc, 2753 1.88 isaki "halt_input failed: errno=%d (ignored)\n", 2754 1.56 isaki error); 2755 1.2 isaki } 2756 1.2 isaki } 2757 1.2 isaki 2758 1.2 isaki } 2759 1.2 isaki 2760 1.2 isaki /* Call hw close if this is the last track. */ 2761 1.2 isaki if (sc->sc_popens + sc->sc_ropens == 0) { 2762 1.2 isaki if (sc->hw_if->close) { 2763 1.2 isaki TRACE(2, "hw_if close"); 2764 1.2 isaki mutex_enter(sc->sc_intr_lock); 2765 1.2 isaki sc->hw_if->close(sc->hw_hdl); 2766 1.2 isaki mutex_exit(sc->sc_intr_lock); 2767 1.2 isaki } 2768 1.99 riastrad cred = sc->sc_cred; 2769 1.99 riastrad sc->sc_cred = NULL; 2770 1.63 isaki } 2771 1.2 isaki 2772 1.63 isaki mutex_exit(sc->sc_lock); 2773 1.99 riastrad if (cred) 2774 1.99 riastrad kauth_cred_free(cred); 2775 1.2 isaki 2776 1.2 isaki TRACE(3, "done"); 2777 1.2 isaki } 2778 1.2 isaki 2779 1.42 isaki /* 2780 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 2781 1.42 isaki */ 2782 1.2 isaki int 2783 1.2 isaki audio_read(struct audio_softc *sc, struct uio *uio, int ioflag, 2784 1.2 isaki audio_file_t *file) 2785 1.2 isaki { 2786 1.2 isaki audio_track_t *track; 2787 1.2 isaki audio_ring_t *usrbuf; 2788 1.2 isaki audio_ring_t *input; 2789 1.2 isaki int error; 2790 1.2 isaki 2791 1.24 isaki /* 2792 1.24 isaki * On half-duplex hardware, O_RDWR is treated as O_WRONLY. 2793 1.24 isaki * However read() system call itself can be called because it's 2794 1.24 isaki * opened with O_RDWR. So in this case, deny this read(). 2795 1.24 isaki */ 2796 1.2 isaki track = file->rtrack; 2797 1.24 isaki if (track == NULL) { 2798 1.24 isaki return EBADF; 2799 1.24 isaki } 2800 1.2 isaki 2801 1.2 isaki /* I think it's better than EINVAL. */ 2802 1.2 isaki if (track->mmapped) 2803 1.2 isaki return EPERM; 2804 1.2 isaki 2805 1.78 isaki TRACET(2, track, "resid=%zd ioflag=0x%x", uio->uio_resid, ioflag); 2806 1.24 isaki 2807 1.65 isaki #ifdef AUDIO_PM_IDLE 2808 1.63 isaki error = audio_exlock_mutex_enter(sc); 2809 1.63 isaki if (error) 2810 1.63 isaki return error; 2811 1.63 isaki 2812 1.2 isaki if (device_is_active(&sc->sc_dev) || sc->sc_idle) 2813 1.2 isaki device_active(&sc->sc_dev, DVA_SYSTEM); 2814 1.2 isaki 2815 1.65 isaki /* In recording, unlike playback, read() never operates rmixer. */ 2816 1.65 isaki 2817 1.63 isaki audio_exlock_mutex_exit(sc); 2818 1.65 isaki #endif 2819 1.2 isaki 2820 1.63 isaki usrbuf = &track->usrbuf; 2821 1.63 isaki input = track->input; 2822 1.2 isaki error = 0; 2823 1.63 isaki 2824 1.2 isaki while (uio->uio_resid > 0 && error == 0) { 2825 1.2 isaki int bytes; 2826 1.2 isaki 2827 1.2 isaki TRACET(3, track, 2828 1.126 isaki "while resid=%zd input=%d/%d/%d usrbuf=%d/%d/C%d", 2829 1.2 isaki uio->uio_resid, 2830 1.2 isaki input->head, input->used, input->capacity, 2831 1.126 isaki usrbuf->head, usrbuf->used, usrbuf->capacity); 2832 1.2 isaki 2833 1.2 isaki /* Wait when buffers are empty. */ 2834 1.2 isaki mutex_enter(sc->sc_lock); 2835 1.2 isaki for (;;) { 2836 1.2 isaki bool empty; 2837 1.2 isaki audio_track_lock_enter(track); 2838 1.2 isaki empty = (input->used == 0 && usrbuf->used == 0); 2839 1.2 isaki audio_track_lock_exit(track); 2840 1.2 isaki if (!empty) 2841 1.2 isaki break; 2842 1.2 isaki 2843 1.2 isaki if ((ioflag & IO_NDELAY)) { 2844 1.2 isaki mutex_exit(sc->sc_lock); 2845 1.2 isaki return EWOULDBLOCK; 2846 1.2 isaki } 2847 1.2 isaki 2848 1.2 isaki TRACET(3, track, "sleep"); 2849 1.142 mlelstv error = audio_track_waitio(sc, track, "audio_read"); 2850 1.2 isaki if (error) { 2851 1.2 isaki mutex_exit(sc->sc_lock); 2852 1.2 isaki return error; 2853 1.2 isaki } 2854 1.2 isaki } 2855 1.2 isaki mutex_exit(sc->sc_lock); 2856 1.2 isaki 2857 1.2 isaki audio_track_lock_enter(track); 2858 1.126 isaki /* Convert one block if possible. */ 2859 1.126 isaki if (usrbuf->used == 0 && input->used > 0) { 2860 1.116 isaki audio_track_record(track); 2861 1.116 isaki } 2862 1.2 isaki 2863 1.119 isaki /* uiomove from usrbuf as many bytes as possible. */ 2864 1.2 isaki bytes = uimin(usrbuf->used, uio->uio_resid); 2865 1.126 isaki error = uiomove((uint8_t *)usrbuf->mem + usrbuf->head, bytes, 2866 1.126 isaki uio); 2867 1.126 isaki if (error) { 2868 1.126 isaki audio_track_lock_exit(track); 2869 1.126 isaki device_printf(sc->sc_dev, 2870 1.126 isaki "%s: uiomove(%d) failed: errno=%d\n", 2871 1.126 isaki __func__, bytes, error); 2872 1.126 isaki goto abort; 2873 1.2 isaki } 2874 1.126 isaki auring_take(usrbuf, bytes); 2875 1.126 isaki TRACET(3, track, "uiomove(len=%d) usrbuf=%d/%d/C%d", 2876 1.126 isaki bytes, 2877 1.126 isaki usrbuf->head, usrbuf->used, usrbuf->capacity); 2878 1.9 isaki 2879 1.9 isaki audio_track_lock_exit(track); 2880 1.2 isaki } 2881 1.2 isaki 2882 1.2 isaki abort: 2883 1.2 isaki return error; 2884 1.2 isaki } 2885 1.2 isaki 2886 1.2 isaki 2887 1.2 isaki /* 2888 1.2 isaki * Clear file's playback and/or record track buffer immediately. 2889 1.2 isaki */ 2890 1.2 isaki static void 2891 1.2 isaki audio_file_clear(struct audio_softc *sc, audio_file_t *file) 2892 1.2 isaki { 2893 1.2 isaki 2894 1.2 isaki if (file->ptrack) 2895 1.2 isaki audio_track_clear(sc, file->ptrack); 2896 1.2 isaki if (file->rtrack) 2897 1.2 isaki audio_track_clear(sc, file->rtrack); 2898 1.2 isaki } 2899 1.2 isaki 2900 1.42 isaki /* 2901 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 2902 1.42 isaki */ 2903 1.2 isaki int 2904 1.2 isaki audio_write(struct audio_softc *sc, struct uio *uio, int ioflag, 2905 1.2 isaki audio_file_t *file) 2906 1.2 isaki { 2907 1.2 isaki audio_track_t *track; 2908 1.2 isaki audio_ring_t *usrbuf; 2909 1.2 isaki audio_ring_t *outbuf; 2910 1.2 isaki int error; 2911 1.2 isaki 2912 1.2 isaki track = file->ptrack; 2913 1.104 riastrad if (track == NULL) 2914 1.104 riastrad return EPERM; 2915 1.2 isaki 2916 1.2 isaki /* I think it's better than EINVAL. */ 2917 1.2 isaki if (track->mmapped) 2918 1.2 isaki return EPERM; 2919 1.2 isaki 2920 1.25 isaki TRACET(2, track, "%sresid=%zd pid=%d.%d ioflag=0x%x", 2921 1.25 isaki audiodebug >= 3 ? "begin " : "", 2922 1.25 isaki uio->uio_resid, (int)curproc->p_pid, (int)curlwp->l_lid, ioflag); 2923 1.25 isaki 2924 1.2 isaki if (uio->uio_resid == 0) { 2925 1.2 isaki track->eofcounter++; 2926 1.2 isaki return 0; 2927 1.2 isaki } 2928 1.2 isaki 2929 1.63 isaki error = audio_exlock_mutex_enter(sc); 2930 1.63 isaki if (error) 2931 1.63 isaki return error; 2932 1.63 isaki 2933 1.2 isaki #ifdef AUDIO_PM_IDLE 2934 1.2 isaki if (device_is_active(&sc->sc_dev) || sc->sc_idle) 2935 1.2 isaki device_active(&sc->sc_dev, DVA_SYSTEM); 2936 1.2 isaki #endif 2937 1.2 isaki 2938 1.2 isaki /* 2939 1.2 isaki * The first write starts pmixer. 2940 1.2 isaki */ 2941 1.2 isaki if (sc->sc_pbusy == false) 2942 1.2 isaki audio_pmixer_start(sc, false); 2943 1.63 isaki audio_exlock_mutex_exit(sc); 2944 1.2 isaki 2945 1.63 isaki usrbuf = &track->usrbuf; 2946 1.63 isaki outbuf = &track->outbuf; 2947 1.2 isaki track->pstate = AUDIO_STATE_RUNNING; 2948 1.2 isaki error = 0; 2949 1.63 isaki 2950 1.2 isaki while (uio->uio_resid > 0 && error == 0) { 2951 1.2 isaki int bytes; 2952 1.2 isaki 2953 1.2 isaki TRACET(3, track, "while resid=%zd usrbuf=%d/%d/H%d", 2954 1.2 isaki uio->uio_resid, 2955 1.2 isaki usrbuf->head, usrbuf->used, track->usrbuf_usedhigh); 2956 1.2 isaki 2957 1.2 isaki /* Wait when buffers are full. */ 2958 1.2 isaki mutex_enter(sc->sc_lock); 2959 1.2 isaki for (;;) { 2960 1.2 isaki bool full; 2961 1.2 isaki audio_track_lock_enter(track); 2962 1.2 isaki full = (usrbuf->used >= track->usrbuf_usedhigh && 2963 1.2 isaki outbuf->used >= outbuf->capacity); 2964 1.2 isaki audio_track_lock_exit(track); 2965 1.2 isaki if (!full) 2966 1.2 isaki break; 2967 1.2 isaki 2968 1.2 isaki if ((ioflag & IO_NDELAY)) { 2969 1.2 isaki error = EWOULDBLOCK; 2970 1.2 isaki mutex_exit(sc->sc_lock); 2971 1.2 isaki goto abort; 2972 1.2 isaki } 2973 1.2 isaki 2974 1.2 isaki TRACET(3, track, "sleep usrbuf=%d/H%d", 2975 1.2 isaki usrbuf->used, track->usrbuf_usedhigh); 2976 1.142 mlelstv error = audio_track_waitio(sc, track, "audio_write"); 2977 1.2 isaki if (error) { 2978 1.2 isaki mutex_exit(sc->sc_lock); 2979 1.2 isaki goto abort; 2980 1.2 isaki } 2981 1.2 isaki } 2982 1.2 isaki mutex_exit(sc->sc_lock); 2983 1.2 isaki 2984 1.9 isaki audio_track_lock_enter(track); 2985 1.9 isaki 2986 1.119 isaki /* uiomove to usrbuf as many bytes as possible. */ 2987 1.2 isaki bytes = uimin(track->usrbuf_usedhigh - usrbuf->used, 2988 1.2 isaki uio->uio_resid); 2989 1.2 isaki while (bytes > 0) { 2990 1.2 isaki int tail = auring_tail(usrbuf); 2991 1.2 isaki int len = uimin(bytes, usrbuf->capacity - tail); 2992 1.2 isaki error = uiomove((uint8_t *)usrbuf->mem + tail, len, 2993 1.2 isaki uio); 2994 1.2 isaki if (error) { 2995 1.9 isaki audio_track_lock_exit(track); 2996 1.2 isaki device_printf(sc->sc_dev, 2997 1.88 isaki "%s: uiomove(%d) failed: errno=%d\n", 2998 1.88 isaki __func__, len, error); 2999 1.2 isaki goto abort; 3000 1.2 isaki } 3001 1.2 isaki auring_push(usrbuf, len); 3002 1.2 isaki TRACET(3, track, "uiomove(len=%d) usrbuf=%d/%d/C%d", 3003 1.2 isaki len, 3004 1.2 isaki usrbuf->head, usrbuf->used, usrbuf->capacity); 3005 1.2 isaki bytes -= len; 3006 1.2 isaki } 3007 1.2 isaki 3008 1.119 isaki /* Convert them as many blocks as possible. */ 3009 1.2 isaki while (usrbuf->used >= track->usrbuf_blksize && 3010 1.2 isaki outbuf->used < outbuf->capacity) { 3011 1.2 isaki audio_track_play(track); 3012 1.2 isaki } 3013 1.9 isaki 3014 1.2 isaki audio_track_lock_exit(track); 3015 1.2 isaki } 3016 1.2 isaki 3017 1.2 isaki abort: 3018 1.2 isaki TRACET(3, track, "done error=%d", error); 3019 1.2 isaki return error; 3020 1.2 isaki } 3021 1.2 isaki 3022 1.42 isaki /* 3023 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 3024 1.42 isaki */ 3025 1.2 isaki int 3026 1.2 isaki audio_ioctl(dev_t dev, struct audio_softc *sc, u_long cmd, void *addr, int flag, 3027 1.2 isaki struct lwp *l, audio_file_t *file) 3028 1.2 isaki { 3029 1.2 isaki struct audio_offset *ao; 3030 1.2 isaki struct audio_info ai; 3031 1.2 isaki audio_track_t *track; 3032 1.2 isaki audio_encoding_t *ae; 3033 1.2 isaki audio_format_query_t *query; 3034 1.2 isaki u_int stamp; 3035 1.127 isaki u_int offset; 3036 1.125 isaki int val; 3037 1.2 isaki int index; 3038 1.2 isaki int error; 3039 1.2 isaki 3040 1.2 isaki #if defined(AUDIO_DEBUG) 3041 1.2 isaki const char *ioctlnames[] = { 3042 1.125 isaki "AUDIO_GETINFO", /* 21 */ 3043 1.125 isaki "AUDIO_SETINFO", /* 22 */ 3044 1.125 isaki "AUDIO_DRAIN", /* 23 */ 3045 1.125 isaki "AUDIO_FLUSH", /* 24 */ 3046 1.125 isaki "AUDIO_WSEEK", /* 25 */ 3047 1.125 isaki "AUDIO_RERROR", /* 26 */ 3048 1.125 isaki "AUDIO_GETDEV", /* 27 */ 3049 1.125 isaki "AUDIO_GETENC", /* 28 */ 3050 1.125 isaki "AUDIO_GETFD", /* 29 */ 3051 1.125 isaki "AUDIO_SETFD", /* 30 */ 3052 1.125 isaki "AUDIO_PERROR", /* 31 */ 3053 1.125 isaki "AUDIO_GETIOFFS", /* 32 */ 3054 1.125 isaki "AUDIO_GETOOFFS", /* 33 */ 3055 1.125 isaki "AUDIO_GETPROPS", /* 34 */ 3056 1.125 isaki "AUDIO_GETBUFINFO", /* 35 */ 3057 1.125 isaki "AUDIO_SETCHAN", /* 36 */ 3058 1.125 isaki "AUDIO_GETCHAN", /* 37 */ 3059 1.125 isaki "AUDIO_QUERYFORMAT", /* 38 */ 3060 1.125 isaki "AUDIO_GETFORMAT", /* 39 */ 3061 1.125 isaki "AUDIO_SETFORMAT", /* 40 */ 3062 1.2 isaki }; 3063 1.125 isaki char pre[64]; 3064 1.2 isaki int nameidx = (cmd & 0xff); 3065 1.125 isaki if (21 <= nameidx && nameidx <= 21 + __arraycount(ioctlnames)) { 3066 1.125 isaki snprintf(pre, sizeof(pre), "pid=%d.%d %s", 3067 1.125 isaki (int)curproc->p_pid, (int)l->l_lid, 3068 1.125 isaki ioctlnames[nameidx - 21]); 3069 1.125 isaki } else { 3070 1.125 isaki snprintf(pre, sizeof(pre), "pid=%d.%d (%lu,'%c',%u)", 3071 1.125 isaki (int)curproc->p_pid, (int)l->l_lid, 3072 1.125 isaki IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), nameidx); 3073 1.125 isaki } 3074 1.2 isaki #endif 3075 1.2 isaki 3076 1.2 isaki error = 0; 3077 1.2 isaki switch (cmd) { 3078 1.2 isaki case FIONBIO: 3079 1.2 isaki /* All handled in the upper FS layer. */ 3080 1.2 isaki break; 3081 1.2 isaki 3082 1.2 isaki case FIONREAD: 3083 1.2 isaki /* Get the number of bytes that can be read. */ 3084 1.125 isaki track = file->rtrack; 3085 1.125 isaki if (track) { 3086 1.125 isaki val = audio_track_readablebytes(track); 3087 1.125 isaki *(int *)addr = val; 3088 1.125 isaki TRACET(2, track, "pid=%d.%d FIONREAD bytes=%d", 3089 1.125 isaki (int)curproc->p_pid, (int)l->l_lid, val); 3090 1.2 isaki } else { 3091 1.125 isaki TRACEF(2, file, "pid=%d.%d FIONREAD no track", 3092 1.125 isaki (int)curproc->p_pid, (int)l->l_lid); 3093 1.2 isaki } 3094 1.2 isaki break; 3095 1.2 isaki 3096 1.2 isaki case FIOASYNC: 3097 1.2 isaki /* Set/Clear ASYNC I/O. */ 3098 1.2 isaki if (*(int *)addr) { 3099 1.2 isaki file->async_audio = curproc->p_pid; 3100 1.2 isaki } else { 3101 1.2 isaki file->async_audio = 0; 3102 1.2 isaki } 3103 1.125 isaki TRACEF(2, file, "pid=%d.%d FIOASYNC %s", 3104 1.125 isaki (int)curproc->p_pid, (int)l->l_lid, 3105 1.125 isaki file->async_audio ? "on" : "off"); 3106 1.2 isaki break; 3107 1.2 isaki 3108 1.2 isaki case AUDIO_FLUSH: 3109 1.2 isaki /* XXX TODO: clear errors and restart? */ 3110 1.125 isaki TRACEF(2, file, "%s", pre); 3111 1.2 isaki audio_file_clear(sc, file); 3112 1.2 isaki break; 3113 1.2 isaki 3114 1.125 isaki case AUDIO_PERROR: 3115 1.2 isaki case AUDIO_RERROR: 3116 1.2 isaki /* 3117 1.125 isaki * Number of dropped bytes during playback/record. We don't 3118 1.125 isaki * know where or when they were dropped (including conversion 3119 1.125 isaki * stage). Therefore, the number of accurate bytes or samples 3120 1.125 isaki * is also unknown. 3121 1.2 isaki */ 3122 1.125 isaki track = (cmd == AUDIO_PERROR) ? file->ptrack : file->rtrack; 3123 1.2 isaki if (track) { 3124 1.125 isaki val = frametobyte(&track->usrbuf.fmt, 3125 1.2 isaki track->dropframes); 3126 1.125 isaki *(int *)addr = val; 3127 1.125 isaki TRACET(2, track, "%s bytes=%d", pre, val); 3128 1.125 isaki } else { 3129 1.125 isaki TRACEF(2, file, "%s no track", pre); 3130 1.2 isaki } 3131 1.2 isaki break; 3132 1.2 isaki 3133 1.2 isaki case AUDIO_GETIOFFS: 3134 1.2 isaki ao = (struct audio_offset *)addr; 3135 1.130 isaki track = file->rtrack; 3136 1.130 isaki if (track == NULL) { 3137 1.130 isaki ao->samples = 0; 3138 1.130 isaki ao->deltablks = 0; 3139 1.130 isaki ao->offset = 0; 3140 1.130 isaki TRACEF(2, file, "%s no rtrack", pre); 3141 1.130 isaki break; 3142 1.130 isaki } 3143 1.130 isaki mutex_enter(sc->sc_lock); 3144 1.130 isaki mutex_enter(sc->sc_intr_lock); 3145 1.130 isaki /* figure out where next transfer will start */ 3146 1.130 isaki stamp = track->stamp; 3147 1.130 isaki offset = auring_tail(track->input); 3148 1.130 isaki mutex_exit(sc->sc_intr_lock); 3149 1.130 isaki mutex_exit(sc->sc_lock); 3150 1.130 isaki 3151 1.130 isaki /* samples will overflow soon but is as per spec. */ 3152 1.130 isaki ao->samples = stamp * track->usrbuf_blksize; 3153 1.130 isaki ao->deltablks = stamp - track->last_stamp; 3154 1.130 isaki ao->offset = audio_track_inputblk_as_usrbyte(track, offset); 3155 1.130 isaki TRACET(2, track, "%s samples=%u deltablks=%u offset=%u", 3156 1.130 isaki pre, ao->samples, ao->deltablks, ao->offset); 3157 1.130 isaki 3158 1.130 isaki track->last_stamp = stamp; 3159 1.2 isaki break; 3160 1.2 isaki 3161 1.2 isaki case AUDIO_GETOOFFS: 3162 1.2 isaki ao = (struct audio_offset *)addr; 3163 1.2 isaki track = file->ptrack; 3164 1.2 isaki if (track == NULL) { 3165 1.2 isaki ao->samples = 0; 3166 1.2 isaki ao->deltablks = 0; 3167 1.2 isaki ao->offset = 0; 3168 1.125 isaki TRACEF(2, file, "%s no ptrack", pre); 3169 1.2 isaki break; 3170 1.2 isaki } 3171 1.2 isaki mutex_enter(sc->sc_lock); 3172 1.2 isaki mutex_enter(sc->sc_intr_lock); 3173 1.127 isaki /* figure out where next transfer will start */ 3174 1.127 isaki stamp = track->stamp; 3175 1.127 isaki offset = track->usrbuf.head; 3176 1.2 isaki mutex_exit(sc->sc_intr_lock); 3177 1.2 isaki mutex_exit(sc->sc_lock); 3178 1.2 isaki 3179 1.127 isaki /* samples will overflow soon but is as per spec. */ 3180 1.127 isaki ao->samples = stamp * track->usrbuf_blksize; 3181 1.127 isaki ao->deltablks = stamp - track->last_stamp; 3182 1.127 isaki ao->offset = offset; 3183 1.125 isaki TRACET(2, track, "%s samples=%u deltablks=%u offset=%u", 3184 1.125 isaki pre, ao->samples, ao->deltablks, ao->offset); 3185 1.127 isaki 3186 1.127 isaki track->last_stamp = stamp; 3187 1.2 isaki break; 3188 1.2 isaki 3189 1.2 isaki case AUDIO_WSEEK: 3190 1.125 isaki track = file->ptrack; 3191 1.125 isaki if (track) { 3192 1.125 isaki val = track->usrbuf.used; 3193 1.125 isaki *(u_long *)addr = val; 3194 1.125 isaki TRACET(2, track, "%s bytes=%d", pre, val); 3195 1.125 isaki } else { 3196 1.125 isaki TRACEF(2, file, "%s no ptrack", pre); 3197 1.125 isaki } 3198 1.2 isaki break; 3199 1.2 isaki 3200 1.2 isaki case AUDIO_SETINFO: 3201 1.125 isaki TRACEF(2, file, "%s", pre); 3202 1.63 isaki error = audio_exlock_enter(sc); 3203 1.2 isaki if (error) 3204 1.2 isaki break; 3205 1.2 isaki error = audio_file_setinfo(sc, file, (struct audio_info *)addr); 3206 1.2 isaki if (error) { 3207 1.63 isaki audio_exlock_exit(sc); 3208 1.2 isaki break; 3209 1.2 isaki } 3210 1.2 isaki if (ISDEVSOUND(dev)) 3211 1.2 isaki error = audiogetinfo(sc, &sc->sc_ai, 0, file); 3212 1.63 isaki audio_exlock_exit(sc); 3213 1.2 isaki break; 3214 1.2 isaki 3215 1.2 isaki case AUDIO_GETINFO: 3216 1.125 isaki TRACEF(2, file, "%s", pre); 3217 1.63 isaki error = audio_exlock_enter(sc); 3218 1.2 isaki if (error) 3219 1.2 isaki break; 3220 1.2 isaki error = audiogetinfo(sc, (struct audio_info *)addr, 1, file); 3221 1.63 isaki audio_exlock_exit(sc); 3222 1.2 isaki break; 3223 1.2 isaki 3224 1.2 isaki case AUDIO_GETBUFINFO: 3225 1.125 isaki TRACEF(2, file, "%s", pre); 3226 1.63 isaki error = audio_exlock_enter(sc); 3227 1.63 isaki if (error) 3228 1.63 isaki break; 3229 1.2 isaki error = audiogetinfo(sc, (struct audio_info *)addr, 0, file); 3230 1.63 isaki audio_exlock_exit(sc); 3231 1.2 isaki break; 3232 1.2 isaki 3233 1.2 isaki case AUDIO_DRAIN: 3234 1.125 isaki track = file->ptrack; 3235 1.125 isaki if (track) { 3236 1.125 isaki TRACET(2, track, "%s", pre); 3237 1.2 isaki mutex_enter(sc->sc_lock); 3238 1.125 isaki error = audio_track_drain(sc, track); 3239 1.2 isaki mutex_exit(sc->sc_lock); 3240 1.125 isaki } else { 3241 1.125 isaki TRACEF(2, file, "%s no ptrack", pre); 3242 1.2 isaki } 3243 1.2 isaki break; 3244 1.2 isaki 3245 1.2 isaki case AUDIO_GETDEV: 3246 1.125 isaki TRACEF(2, file, "%s", pre); 3247 1.2 isaki error = sc->hw_if->getdev(sc->hw_hdl, (audio_device_t *)addr); 3248 1.2 isaki break; 3249 1.2 isaki 3250 1.2 isaki case AUDIO_GETENC: 3251 1.2 isaki ae = (audio_encoding_t *)addr; 3252 1.2 isaki index = ae->index; 3253 1.125 isaki TRACEF(2, file, "%s index=%d", pre, index); 3254 1.2 isaki if (index < 0 || index >= __arraycount(audio_encodings)) { 3255 1.2 isaki error = EINVAL; 3256 1.2 isaki break; 3257 1.2 isaki } 3258 1.2 isaki *ae = audio_encodings[index]; 3259 1.2 isaki ae->index = index; 3260 1.2 isaki /* 3261 1.2 isaki * EMULATED always. 3262 1.2 isaki * EMULATED flag at that time used to mean that it could 3263 1.2 isaki * not be passed directly to the hardware as-is. But 3264 1.2 isaki * currently, all formats including hardware native is not 3265 1.2 isaki * passed directly to the hardware. So I set EMULATED 3266 1.2 isaki * flag for all formats. 3267 1.2 isaki */ 3268 1.2 isaki ae->flags = AUDIO_ENCODINGFLAG_EMULATED; 3269 1.2 isaki break; 3270 1.2 isaki 3271 1.2 isaki case AUDIO_GETFD: 3272 1.2 isaki /* 3273 1.2 isaki * Returns the current setting of full duplex mode. 3274 1.2 isaki * If HW has full duplex mode and there are two mixers, 3275 1.2 isaki * it is full duplex. Otherwise half duplex. 3276 1.2 isaki */ 3277 1.63 isaki error = audio_exlock_enter(sc); 3278 1.63 isaki if (error) 3279 1.63 isaki break; 3280 1.125 isaki val = (sc->sc_props & AUDIO_PROP_FULLDUPLEX) 3281 1.2 isaki && (sc->sc_pmixer && sc->sc_rmixer); 3282 1.63 isaki audio_exlock_exit(sc); 3283 1.125 isaki *(int *)addr = val; 3284 1.125 isaki TRACEF(2, file, "%s fulldup=%d", pre, val); 3285 1.2 isaki break; 3286 1.2 isaki 3287 1.2 isaki case AUDIO_GETPROPS: 3288 1.125 isaki val = sc->sc_props; 3289 1.125 isaki *(int *)addr = val; 3290 1.125 isaki #if defined(AUDIO_DEBUG) 3291 1.125 isaki char pbuf[64]; 3292 1.125 isaki snprintb(pbuf, sizeof(pbuf), "\x10" 3293 1.125 isaki "\6CAPTURE" "\5PLAY" "\3INDEP" "\2MMAP" "\1FULLDUP", val); 3294 1.125 isaki TRACEF(2, file, "%s %s", pre, pbuf); 3295 1.125 isaki #endif 3296 1.2 isaki break; 3297 1.2 isaki 3298 1.2 isaki case AUDIO_QUERYFORMAT: 3299 1.2 isaki query = (audio_format_query_t *)addr; 3300 1.125 isaki TRACEF(2, file, "%s index=%u", pre, query->index); 3301 1.48 isaki mutex_enter(sc->sc_lock); 3302 1.48 isaki error = sc->hw_if->query_format(sc->hw_hdl, query); 3303 1.48 isaki mutex_exit(sc->sc_lock); 3304 1.79 isaki /* Hide internal information */ 3305 1.48 isaki query->fmt.driver_data = NULL; 3306 1.2 isaki break; 3307 1.2 isaki 3308 1.2 isaki case AUDIO_GETFORMAT: 3309 1.125 isaki TRACEF(2, file, "%s", pre); 3310 1.63 isaki error = audio_exlock_enter(sc); 3311 1.63 isaki if (error) 3312 1.63 isaki break; 3313 1.2 isaki audio_mixers_get_format(sc, (struct audio_info *)addr); 3314 1.63 isaki audio_exlock_exit(sc); 3315 1.2 isaki break; 3316 1.2 isaki 3317 1.2 isaki case AUDIO_SETFORMAT: 3318 1.125 isaki TRACEF(2, file, "%s", pre); 3319 1.63 isaki error = audio_exlock_enter(sc); 3320 1.2 isaki audio_mixers_get_format(sc, &ai); 3321 1.2 isaki error = audio_mixers_set_format(sc, (struct audio_info *)addr); 3322 1.2 isaki if (error) { 3323 1.2 isaki /* Rollback */ 3324 1.2 isaki audio_mixers_set_format(sc, &ai); 3325 1.2 isaki } 3326 1.63 isaki audio_exlock_exit(sc); 3327 1.2 isaki break; 3328 1.2 isaki 3329 1.2 isaki case AUDIO_SETFD: 3330 1.2 isaki case AUDIO_SETCHAN: 3331 1.2 isaki case AUDIO_GETCHAN: 3332 1.2 isaki /* Obsoleted */ 3333 1.125 isaki TRACEF(2, file, "%s", pre); 3334 1.2 isaki break; 3335 1.2 isaki 3336 1.2 isaki default: 3337 1.125 isaki TRACEF(2, file, "%s", pre); 3338 1.2 isaki if (sc->hw_if->dev_ioctl) { 3339 1.63 isaki mutex_enter(sc->sc_lock); 3340 1.2 isaki error = sc->hw_if->dev_ioctl(sc->hw_hdl, 3341 1.2 isaki cmd, addr, flag, l); 3342 1.63 isaki mutex_exit(sc->sc_lock); 3343 1.2 isaki } else { 3344 1.2 isaki error = EINVAL; 3345 1.2 isaki } 3346 1.2 isaki break; 3347 1.2 isaki } 3348 1.125 isaki 3349 1.125 isaki if (error) 3350 1.125 isaki TRACEF(2, file, "%s error=%d", pre, error); 3351 1.2 isaki return error; 3352 1.2 isaki } 3353 1.2 isaki 3354 1.2 isaki /* 3355 1.126 isaki * Convert n [frames] of the input buffer to bytes in the usrbuf format. 3356 1.126 isaki * n is in frames but should be a multiple of frame/block. Note that the 3357 1.126 isaki * usrbuf's frame/block and the input buffer's frame/block may be different 3358 1.126 isaki * (i.e., if frequencies are different). 3359 1.126 isaki * 3360 1.126 isaki * This function is for recording track only. 3361 1.126 isaki */ 3362 1.126 isaki static int 3363 1.126 isaki audio_track_inputblk_as_usrbyte(const audio_track_t *track, int n) 3364 1.126 isaki { 3365 1.126 isaki int input_fpb; 3366 1.126 isaki 3367 1.126 isaki /* 3368 1.126 isaki * In the input buffer on recording track, these are the same. 3369 1.126 isaki * input_fpb = frame_per_block(track->mixer, &track->input->fmt); 3370 1.126 isaki */ 3371 1.126 isaki input_fpb = track->mixer->frames_per_block; 3372 1.126 isaki 3373 1.126 isaki return (n / input_fpb) * track->usrbuf_blksize; 3374 1.126 isaki } 3375 1.126 isaki 3376 1.126 isaki /* 3377 1.2 isaki * Returns the number of bytes that can be read on recording buffer. 3378 1.2 isaki */ 3379 1.126 isaki static int 3380 1.2 isaki audio_track_readablebytes(const audio_track_t *track) 3381 1.2 isaki { 3382 1.2 isaki int bytes; 3383 1.2 isaki 3384 1.2 isaki KASSERT(track); 3385 1.2 isaki KASSERT(track->mode == AUMODE_RECORD); 3386 1.2 isaki 3387 1.2 isaki /* 3388 1.126 isaki * For recording, track->input is the main block-unit buffer and 3389 1.126 isaki * track->usrbuf holds less than one block of byte data ("fragment"). 3390 1.126 isaki * Note that the input buffer is in frames and the usrbuf is in bytes. 3391 1.126 isaki * 3392 1.126 isaki * Actual total capacity of these two buffers is 3393 1.126 isaki * input->capacity [frames] + usrbuf.capacity [bytes], 3394 1.126 isaki * but only input->capacity is reported to userland as buffer_size. 3395 1.126 isaki * So, even if the total used bytes exceed input->capacity, report it 3396 1.126 isaki * as input->capacity for consistency. 3397 1.126 isaki */ 3398 1.126 isaki bytes = audio_track_inputblk_as_usrbyte(track, track->input->used); 3399 1.126 isaki if (track->input->used < track->input->capacity) { 3400 1.126 isaki bytes += track->usrbuf.used; 3401 1.126 isaki } 3402 1.2 isaki return bytes; 3403 1.2 isaki } 3404 1.2 isaki 3405 1.42 isaki /* 3406 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 3407 1.42 isaki */ 3408 1.2 isaki int 3409 1.2 isaki audio_poll(struct audio_softc *sc, int events, struct lwp *l, 3410 1.2 isaki audio_file_t *file) 3411 1.2 isaki { 3412 1.2 isaki audio_track_t *track; 3413 1.2 isaki int revents; 3414 1.2 isaki bool in_is_valid; 3415 1.2 isaki bool out_is_valid; 3416 1.2 isaki 3417 1.2 isaki #if defined(AUDIO_DEBUG) 3418 1.2 isaki #define POLLEV_BITMAP "\177\020" \ 3419 1.2 isaki "b\10WRBAND\0" \ 3420 1.2 isaki "b\7RDBAND\0" "b\6RDNORM\0" "b\5NVAL\0" "b\4HUP\0" \ 3421 1.2 isaki "b\3ERR\0" "b\2OUT\0" "b\1PRI\0" "b\0IN\0" 3422 1.2 isaki char evbuf[64]; 3423 1.2 isaki snprintb(evbuf, sizeof(evbuf), POLLEV_BITMAP, events); 3424 1.2 isaki TRACEF(2, file, "pid=%d.%d events=%s", 3425 1.2 isaki (int)curproc->p_pid, (int)l->l_lid, evbuf); 3426 1.2 isaki #endif 3427 1.2 isaki 3428 1.2 isaki revents = 0; 3429 1.2 isaki in_is_valid = false; 3430 1.2 isaki out_is_valid = false; 3431 1.2 isaki if (events & (POLLIN | POLLRDNORM)) { 3432 1.2 isaki track = file->rtrack; 3433 1.2 isaki if (track) { 3434 1.2 isaki int used; 3435 1.2 isaki in_is_valid = true; 3436 1.2 isaki used = audio_track_readablebytes(track); 3437 1.2 isaki if (used > 0) 3438 1.2 isaki revents |= events & (POLLIN | POLLRDNORM); 3439 1.2 isaki } 3440 1.2 isaki } 3441 1.2 isaki if (events & (POLLOUT | POLLWRNORM)) { 3442 1.2 isaki track = file->ptrack; 3443 1.2 isaki if (track) { 3444 1.2 isaki out_is_valid = true; 3445 1.2 isaki if (track->usrbuf.used <= track->usrbuf_usedlow) 3446 1.2 isaki revents |= events & (POLLOUT | POLLWRNORM); 3447 1.2 isaki } 3448 1.2 isaki } 3449 1.2 isaki 3450 1.2 isaki if (revents == 0) { 3451 1.2 isaki mutex_enter(sc->sc_lock); 3452 1.2 isaki if (in_is_valid) { 3453 1.2 isaki TRACEF(3, file, "selrecord rsel"); 3454 1.2 isaki selrecord(l, &sc->sc_rsel); 3455 1.2 isaki } 3456 1.2 isaki if (out_is_valid) { 3457 1.2 isaki TRACEF(3, file, "selrecord wsel"); 3458 1.2 isaki selrecord(l, &sc->sc_wsel); 3459 1.2 isaki } 3460 1.2 isaki mutex_exit(sc->sc_lock); 3461 1.2 isaki } 3462 1.2 isaki 3463 1.2 isaki #if defined(AUDIO_DEBUG) 3464 1.2 isaki snprintb(evbuf, sizeof(evbuf), POLLEV_BITMAP, revents); 3465 1.2 isaki TRACEF(2, file, "revents=%s", evbuf); 3466 1.2 isaki #endif 3467 1.2 isaki return revents; 3468 1.2 isaki } 3469 1.2 isaki 3470 1.2 isaki static const struct filterops audioread_filtops = { 3471 1.108 thorpej .f_flags = FILTEROP_ISFD, 3472 1.2 isaki .f_attach = NULL, 3473 1.2 isaki .f_detach = filt_audioread_detach, 3474 1.2 isaki .f_event = filt_audioread_event, 3475 1.2 isaki }; 3476 1.2 isaki 3477 1.2 isaki static void 3478 1.2 isaki filt_audioread_detach(struct knote *kn) 3479 1.2 isaki { 3480 1.2 isaki struct audio_softc *sc; 3481 1.2 isaki audio_file_t *file; 3482 1.2 isaki 3483 1.2 isaki file = kn->kn_hook; 3484 1.2 isaki sc = file->sc; 3485 1.87 isaki TRACEF(3, file, "called"); 3486 1.2 isaki 3487 1.2 isaki mutex_enter(sc->sc_lock); 3488 1.86 thorpej selremove_knote(&sc->sc_rsel, kn); 3489 1.2 isaki mutex_exit(sc->sc_lock); 3490 1.2 isaki } 3491 1.2 isaki 3492 1.2 isaki static int 3493 1.2 isaki filt_audioread_event(struct knote *kn, long hint) 3494 1.2 isaki { 3495 1.2 isaki audio_file_t *file; 3496 1.2 isaki audio_track_t *track; 3497 1.2 isaki 3498 1.2 isaki file = kn->kn_hook; 3499 1.2 isaki track = file->rtrack; 3500 1.2 isaki 3501 1.2 isaki /* 3502 1.2 isaki * kn_data must contain the number of bytes can be read. 3503 1.2 isaki * The return value indicates whether the event occurs or not. 3504 1.2 isaki */ 3505 1.2 isaki 3506 1.2 isaki if (track == NULL) { 3507 1.2 isaki /* can not read with this descriptor. */ 3508 1.2 isaki kn->kn_data = 0; 3509 1.2 isaki return 0; 3510 1.2 isaki } 3511 1.2 isaki 3512 1.2 isaki kn->kn_data = audio_track_readablebytes(track); 3513 1.2 isaki TRACEF(3, file, "data=%" PRId64, kn->kn_data); 3514 1.2 isaki return kn->kn_data > 0; 3515 1.2 isaki } 3516 1.2 isaki 3517 1.2 isaki static const struct filterops audiowrite_filtops = { 3518 1.108 thorpej .f_flags = FILTEROP_ISFD, 3519 1.2 isaki .f_attach = NULL, 3520 1.2 isaki .f_detach = filt_audiowrite_detach, 3521 1.2 isaki .f_event = filt_audiowrite_event, 3522 1.2 isaki }; 3523 1.2 isaki 3524 1.2 isaki static void 3525 1.2 isaki filt_audiowrite_detach(struct knote *kn) 3526 1.2 isaki { 3527 1.2 isaki struct audio_softc *sc; 3528 1.2 isaki audio_file_t *file; 3529 1.2 isaki 3530 1.2 isaki file = kn->kn_hook; 3531 1.2 isaki sc = file->sc; 3532 1.87 isaki TRACEF(3, file, "called"); 3533 1.2 isaki 3534 1.2 isaki mutex_enter(sc->sc_lock); 3535 1.86 thorpej selremove_knote(&sc->sc_wsel, kn); 3536 1.2 isaki mutex_exit(sc->sc_lock); 3537 1.2 isaki } 3538 1.2 isaki 3539 1.2 isaki static int 3540 1.2 isaki filt_audiowrite_event(struct knote *kn, long hint) 3541 1.2 isaki { 3542 1.2 isaki audio_file_t *file; 3543 1.2 isaki audio_track_t *track; 3544 1.2 isaki 3545 1.2 isaki file = kn->kn_hook; 3546 1.2 isaki track = file->ptrack; 3547 1.2 isaki 3548 1.2 isaki /* 3549 1.2 isaki * kn_data must contain the number of bytes can be write. 3550 1.2 isaki * The return value indicates whether the event occurs or not. 3551 1.2 isaki */ 3552 1.2 isaki 3553 1.2 isaki if (track == NULL) { 3554 1.2 isaki /* can not write with this descriptor. */ 3555 1.2 isaki kn->kn_data = 0; 3556 1.2 isaki return 0; 3557 1.2 isaki } 3558 1.2 isaki 3559 1.2 isaki kn->kn_data = track->usrbuf_usedhigh - track->usrbuf.used; 3560 1.2 isaki TRACEF(3, file, "data=%" PRId64, kn->kn_data); 3561 1.2 isaki return (track->usrbuf.used < track->usrbuf_usedlow); 3562 1.2 isaki } 3563 1.2 isaki 3564 1.42 isaki /* 3565 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 3566 1.42 isaki */ 3567 1.2 isaki int 3568 1.2 isaki audio_kqfilter(struct audio_softc *sc, audio_file_t *file, struct knote *kn) 3569 1.2 isaki { 3570 1.86 thorpej struct selinfo *sip; 3571 1.2 isaki 3572 1.2 isaki TRACEF(3, file, "kn=%p kn_filter=%x", kn, (int)kn->kn_filter); 3573 1.2 isaki 3574 1.2 isaki switch (kn->kn_filter) { 3575 1.2 isaki case EVFILT_READ: 3576 1.86 thorpej sip = &sc->sc_rsel; 3577 1.2 isaki kn->kn_fop = &audioread_filtops; 3578 1.2 isaki break; 3579 1.2 isaki 3580 1.2 isaki case EVFILT_WRITE: 3581 1.86 thorpej sip = &sc->sc_wsel; 3582 1.2 isaki kn->kn_fop = &audiowrite_filtops; 3583 1.2 isaki break; 3584 1.2 isaki 3585 1.2 isaki default: 3586 1.2 isaki return EINVAL; 3587 1.2 isaki } 3588 1.2 isaki 3589 1.2 isaki kn->kn_hook = file; 3590 1.2 isaki 3591 1.86 thorpej mutex_enter(sc->sc_lock); 3592 1.86 thorpej selrecord_knote(sip, kn); 3593 1.2 isaki mutex_exit(sc->sc_lock); 3594 1.2 isaki 3595 1.2 isaki return 0; 3596 1.2 isaki } 3597 1.2 isaki 3598 1.42 isaki /* 3599 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 3600 1.42 isaki */ 3601 1.2 isaki int 3602 1.2 isaki audio_mmap(struct audio_softc *sc, off_t *offp, size_t len, int prot, 3603 1.2 isaki int *flagsp, int *advicep, struct uvm_object **uobjp, int *maxprotp, 3604 1.2 isaki audio_file_t *file) 3605 1.2 isaki { 3606 1.2 isaki audio_track_t *track; 3607 1.135 isaki struct uvm_object *uobj; 3608 1.135 isaki vaddr_t vstart; 3609 1.2 isaki vsize_t vsize; 3610 1.2 isaki int error; 3611 1.2 isaki 3612 1.135 isaki TRACEF(1, file, "off=%jd, len=%ju, prot=%d", 3613 1.135 isaki (intmax_t)(*offp), (uintmax_t)len, prot); 3614 1.2 isaki 3615 1.134 riastrad KASSERT(len > 0); 3616 1.134 riastrad 3617 1.2 isaki if (*offp < 0) 3618 1.2 isaki return EINVAL; 3619 1.2 isaki 3620 1.2 isaki #if 0 3621 1.2 isaki /* XXX 3622 1.2 isaki * The idea here was to use the protection to determine if 3623 1.2 isaki * we are mapping the read or write buffer, but it fails. 3624 1.2 isaki * The VM system is broken in (at least) two ways. 3625 1.2 isaki * 1) If you map memory VM_PROT_WRITE you SIGSEGV 3626 1.2 isaki * when writing to it, so VM_PROT_READ|VM_PROT_WRITE 3627 1.2 isaki * has to be used for mmapping the play buffer. 3628 1.2 isaki * 2) Even if calling mmap() with VM_PROT_READ|VM_PROT_WRITE 3629 1.2 isaki * audio_mmap will get called at some point with VM_PROT_READ 3630 1.2 isaki * only. 3631 1.2 isaki * So, alas, we always map the play buffer for now. 3632 1.2 isaki */ 3633 1.2 isaki if (prot == (VM_PROT_READ|VM_PROT_WRITE) || 3634 1.2 isaki prot == VM_PROT_WRITE) 3635 1.2 isaki track = file->ptrack; 3636 1.2 isaki else if (prot == VM_PROT_READ) 3637 1.2 isaki track = file->rtrack; 3638 1.2 isaki else 3639 1.2 isaki return EINVAL; 3640 1.2 isaki #else 3641 1.2 isaki track = file->ptrack; 3642 1.2 isaki #endif 3643 1.2 isaki if (track == NULL) 3644 1.2 isaki return EACCES; 3645 1.2 isaki 3646 1.135 isaki /* XXX TODO: what happens when mmap twice. */ 3647 1.135 isaki if (track->mmapped) 3648 1.135 isaki return EIO; 3649 1.135 isaki 3650 1.135 isaki /* Create a uvm anonymous object */ 3651 1.2 isaki vsize = roundup2(MAX(track->usrbuf.capacity, PAGE_SIZE), PAGE_SIZE); 3652 1.135 isaki if (*offp + len > vsize) 3653 1.2 isaki return EOVERFLOW; 3654 1.135 isaki uobj = uao_create(vsize, 0); 3655 1.2 isaki 3656 1.135 isaki /* Map it into the kernel virtual address space */ 3657 1.135 isaki vstart = 0; 3658 1.135 isaki error = uvm_map(kernel_map, &vstart, vsize, uobj, 0, 0, 3659 1.135 isaki UVM_MAPFLAG(UVM_PROT_RW, UVM_PROT_RW, UVM_INH_NONE, 3660 1.135 isaki UVM_ADV_RANDOM, 0)); 3661 1.135 isaki if (error) { 3662 1.135 isaki device_printf(sc->sc_dev, "uvm_map failed: errno=%d\n", error); 3663 1.135 isaki uao_detach(uobj); /* release reference */ 3664 1.135 isaki return error; 3665 1.135 isaki } 3666 1.2 isaki 3667 1.135 isaki error = uvm_map_pageable(kernel_map, vstart, vstart + vsize, 3668 1.135 isaki false, 0); 3669 1.135 isaki if (error) { 3670 1.135 isaki device_printf(sc->sc_dev, "uvm_map_pageable failed: errno=%d\n", 3671 1.135 isaki error); 3672 1.135 isaki goto abort; 3673 1.2 isaki } 3674 1.2 isaki 3675 1.135 isaki error = audio_exlock_mutex_enter(sc); 3676 1.135 isaki if (error) 3677 1.135 isaki goto abort; 3678 1.135 isaki 3679 1.135 isaki /* 3680 1.135 isaki * mmap() will start playing immediately. XXX Maybe we lack API... 3681 1.135 isaki * If no one has played yet, start pmixer here. 3682 1.135 isaki */ 3683 1.135 isaki if (sc->sc_pbusy == false) 3684 1.135 isaki audio_pmixer_start(sc, true); 3685 1.135 isaki audio_exlock_mutex_exit(sc); 3686 1.135 isaki 3687 1.135 isaki /* Finally, replace the usrbuf from kmem to uvm. */ 3688 1.135 isaki audio_track_lock_enter(track); 3689 1.135 isaki kmem_free(track->usrbuf.mem, track->usrbuf_allocsize); 3690 1.135 isaki track->usrbuf.mem = (void *)vstart; 3691 1.135 isaki track->usrbuf_allocsize = vsize; 3692 1.135 isaki memset(track->usrbuf.mem, 0, vsize); 3693 1.135 isaki track->mmapped = true; 3694 1.135 isaki audio_track_lock_exit(track); 3695 1.2 isaki 3696 1.2 isaki /* Acquire a reference for the mmap. munmap will release. */ 3697 1.135 isaki uao_reference(uobj); 3698 1.135 isaki *uobjp = uobj; 3699 1.2 isaki *maxprotp = prot; 3700 1.2 isaki *advicep = UVM_ADV_RANDOM; 3701 1.2 isaki *flagsp = MAP_SHARED; 3702 1.135 isaki 3703 1.2 isaki return 0; 3704 1.135 isaki 3705 1.135 isaki abort: 3706 1.135 isaki uvm_unmap(kernel_map, vstart, vstart + vsize); 3707 1.135 isaki /* uvm_unmap also detach uobj */ 3708 1.135 isaki return error; 3709 1.2 isaki } 3710 1.2 isaki 3711 1.2 isaki /* 3712 1.2 isaki * /dev/audioctl has to be able to open at any time without interference 3713 1.2 isaki * with any /dev/audio or /dev/sound. 3714 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 3715 1.2 isaki */ 3716 1.2 isaki static int 3717 1.2 isaki audioctl_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, 3718 1.2 isaki struct lwp *l) 3719 1.2 isaki { 3720 1.2 isaki struct file *fp; 3721 1.2 isaki audio_file_t *af; 3722 1.2 isaki int fd; 3723 1.2 isaki int error; 3724 1.2 isaki 3725 1.2 isaki KASSERT(sc->sc_exlock); 3726 1.2 isaki 3727 1.87 isaki TRACE(1, "called"); 3728 1.2 isaki 3729 1.2 isaki error = fd_allocfile(&fp, &fd); 3730 1.2 isaki if (error) 3731 1.2 isaki return error; 3732 1.2 isaki 3733 1.98 riastrad af = kmem_zalloc(sizeof(*af), KM_SLEEP); 3734 1.2 isaki af->sc = sc; 3735 1.2 isaki af->dev = dev; 3736 1.2 isaki 3737 1.101 riastrad mutex_enter(sc->sc_lock); 3738 1.101 riastrad if (sc->sc_dying) { 3739 1.101 riastrad mutex_exit(sc->sc_lock); 3740 1.101 riastrad kmem_free(af, sizeof(*af)); 3741 1.101 riastrad fd_abort(curproc, fp, fd); 3742 1.101 riastrad return ENXIO; 3743 1.101 riastrad } 3744 1.101 riastrad mutex_enter(sc->sc_intr_lock); 3745 1.101 riastrad SLIST_INSERT_HEAD(&sc->sc_files, af, entry); 3746 1.101 riastrad mutex_exit(sc->sc_intr_lock); 3747 1.101 riastrad mutex_exit(sc->sc_lock); 3748 1.2 isaki 3749 1.2 isaki error = fd_clone(fp, fd, flags, &audio_fileops, af); 3750 1.47 isaki KASSERTMSG(error == EMOVEFD, "error=%d", error); 3751 1.2 isaki 3752 1.2 isaki return error; 3753 1.2 isaki } 3754 1.2 isaki 3755 1.2 isaki /* 3756 1.2 isaki * Free 'mem' if available, and initialize the pointer. 3757 1.2 isaki * For this reason, this is implemented as macro. 3758 1.2 isaki */ 3759 1.2 isaki #define audio_free(mem) do { \ 3760 1.2 isaki if (mem != NULL) { \ 3761 1.2 isaki kern_free(mem); \ 3762 1.2 isaki mem = NULL; \ 3763 1.2 isaki } \ 3764 1.2 isaki } while (0) 3765 1.2 isaki 3766 1.2 isaki /* 3767 1.35 isaki * (Re)allocate 'memblock' with specified 'bytes'. 3768 1.35 isaki * bytes must not be 0. 3769 1.35 isaki * This function never returns NULL. 3770 1.35 isaki */ 3771 1.35 isaki static void * 3772 1.35 isaki audio_realloc(void *memblock, size_t bytes) 3773 1.35 isaki { 3774 1.35 isaki 3775 1.35 isaki KASSERT(bytes != 0); 3776 1.132 isaki if (memblock) 3777 1.132 isaki kern_free(memblock); 3778 1.35 isaki return kern_malloc(bytes, M_WAITOK); 3779 1.35 isaki } 3780 1.35 isaki 3781 1.35 isaki /* 3782 1.2 isaki * Free usrbuf (if available). 3783 1.2 isaki */ 3784 1.2 isaki static void 3785 1.2 isaki audio_free_usrbuf(audio_track_t *track) 3786 1.2 isaki { 3787 1.2 isaki vaddr_t vstart; 3788 1.2 isaki vsize_t vsize; 3789 1.2 isaki 3790 1.135 isaki if (track->usrbuf_allocsize != 0) { 3791 1.135 isaki if (track->mmapped) { 3792 1.135 isaki /* 3793 1.135 isaki * Unmap the kernel mapping. uvm_unmap releases the 3794 1.135 isaki * reference to the uvm object, and this should be the 3795 1.135 isaki * last virtual mapping of the uvm object, so no need 3796 1.135 isaki * to explicitly release (`detach') the object. 3797 1.135 isaki */ 3798 1.135 isaki vstart = (vaddr_t)track->usrbuf.mem; 3799 1.135 isaki vsize = track->usrbuf_allocsize; 3800 1.135 isaki uvm_unmap(kernel_map, vstart, vstart + vsize); 3801 1.135 isaki track->mmapped = false; 3802 1.135 isaki } else { 3803 1.135 isaki kmem_free(track->usrbuf.mem, track->usrbuf_allocsize); 3804 1.135 isaki } 3805 1.2 isaki } 3806 1.135 isaki track->usrbuf.mem = NULL; 3807 1.135 isaki track->usrbuf.capacity = 0; 3808 1.135 isaki track->usrbuf_allocsize = 0; 3809 1.2 isaki } 3810 1.2 isaki 3811 1.2 isaki /* 3812 1.2 isaki * This filter changes the volume for each channel. 3813 1.2 isaki * arg->context points track->ch_volume[]. 3814 1.2 isaki */ 3815 1.2 isaki static void 3816 1.2 isaki audio_track_chvol(audio_filter_arg_t *arg) 3817 1.2 isaki { 3818 1.2 isaki int16_t *ch_volume; 3819 1.2 isaki const aint_t *s; 3820 1.2 isaki aint_t *d; 3821 1.2 isaki u_int i; 3822 1.2 isaki u_int ch; 3823 1.2 isaki u_int channels; 3824 1.2 isaki 3825 1.2 isaki DIAGNOSTIC_filter_arg(arg); 3826 1.47 isaki KASSERTMSG(arg->srcfmt->channels == arg->dstfmt->channels, 3827 1.47 isaki "arg->srcfmt->channels=%d, arg->dstfmt->channels=%d", 3828 1.47 isaki arg->srcfmt->channels, arg->dstfmt->channels); 3829 1.2 isaki KASSERT(arg->context != NULL); 3830 1.47 isaki KASSERTMSG(arg->srcfmt->channels <= AUDIO_MAX_CHANNELS, 3831 1.47 isaki "arg->srcfmt->channels=%d", arg->srcfmt->channels); 3832 1.2 isaki 3833 1.2 isaki s = arg->src; 3834 1.2 isaki d = arg->dst; 3835 1.2 isaki ch_volume = arg->context; 3836 1.2 isaki 3837 1.2 isaki channels = arg->srcfmt->channels; 3838 1.2 isaki for (i = 0; i < arg->count; i++) { 3839 1.2 isaki for (ch = 0; ch < channels; ch++) { 3840 1.2 isaki aint2_t val; 3841 1.2 isaki val = *s++; 3842 1.16 isaki val = AUDIO_SCALEDOWN(val * ch_volume[ch], 8); 3843 1.2 isaki *d++ = (aint_t)val; 3844 1.2 isaki } 3845 1.2 isaki } 3846 1.2 isaki } 3847 1.2 isaki 3848 1.2 isaki /* 3849 1.2 isaki * This filter performs conversion from stereo (or more channels) to mono. 3850 1.2 isaki */ 3851 1.2 isaki static void 3852 1.2 isaki audio_track_chmix_mixLR(audio_filter_arg_t *arg) 3853 1.2 isaki { 3854 1.2 isaki const aint_t *s; 3855 1.2 isaki aint_t *d; 3856 1.2 isaki u_int i; 3857 1.2 isaki 3858 1.2 isaki DIAGNOSTIC_filter_arg(arg); 3859 1.2 isaki 3860 1.2 isaki s = arg->src; 3861 1.2 isaki d = arg->dst; 3862 1.2 isaki 3863 1.2 isaki for (i = 0; i < arg->count; i++) { 3864 1.16 isaki *d++ = AUDIO_SCALEDOWN(s[0], 1) + AUDIO_SCALEDOWN(s[1], 1); 3865 1.2 isaki s += arg->srcfmt->channels; 3866 1.2 isaki } 3867 1.2 isaki } 3868 1.2 isaki 3869 1.2 isaki /* 3870 1.2 isaki * This filter performs conversion from mono to stereo (or more channels). 3871 1.2 isaki */ 3872 1.2 isaki static void 3873 1.2 isaki audio_track_chmix_dupLR(audio_filter_arg_t *arg) 3874 1.2 isaki { 3875 1.2 isaki const aint_t *s; 3876 1.2 isaki aint_t *d; 3877 1.2 isaki u_int i; 3878 1.2 isaki u_int ch; 3879 1.2 isaki u_int dstchannels; 3880 1.2 isaki 3881 1.2 isaki DIAGNOSTIC_filter_arg(arg); 3882 1.2 isaki 3883 1.2 isaki s = arg->src; 3884 1.2 isaki d = arg->dst; 3885 1.2 isaki dstchannels = arg->dstfmt->channels; 3886 1.2 isaki 3887 1.2 isaki for (i = 0; i < arg->count; i++) { 3888 1.2 isaki d[0] = s[0]; 3889 1.2 isaki d[1] = s[0]; 3890 1.2 isaki s++; 3891 1.2 isaki d += dstchannels; 3892 1.2 isaki } 3893 1.2 isaki if (dstchannels > 2) { 3894 1.2 isaki d = arg->dst; 3895 1.2 isaki for (i = 0; i < arg->count; i++) { 3896 1.2 isaki for (ch = 2; ch < dstchannels; ch++) { 3897 1.2 isaki d[ch] = 0; 3898 1.2 isaki } 3899 1.2 isaki d += dstchannels; 3900 1.2 isaki } 3901 1.2 isaki } 3902 1.2 isaki } 3903 1.2 isaki 3904 1.2 isaki /* 3905 1.2 isaki * This filter shrinks M channels into N channels. 3906 1.2 isaki * Extra channels are discarded. 3907 1.2 isaki */ 3908 1.2 isaki static void 3909 1.2 isaki audio_track_chmix_shrink(audio_filter_arg_t *arg) 3910 1.2 isaki { 3911 1.2 isaki const aint_t *s; 3912 1.2 isaki aint_t *d; 3913 1.2 isaki u_int i; 3914 1.2 isaki u_int ch; 3915 1.2 isaki 3916 1.2 isaki DIAGNOSTIC_filter_arg(arg); 3917 1.2 isaki 3918 1.2 isaki s = arg->src; 3919 1.2 isaki d = arg->dst; 3920 1.2 isaki 3921 1.2 isaki for (i = 0; i < arg->count; i++) { 3922 1.2 isaki for (ch = 0; ch < arg->dstfmt->channels; ch++) { 3923 1.2 isaki *d++ = s[ch]; 3924 1.2 isaki } 3925 1.2 isaki s += arg->srcfmt->channels; 3926 1.2 isaki } 3927 1.2 isaki } 3928 1.2 isaki 3929 1.2 isaki /* 3930 1.2 isaki * This filter expands M channels into N channels. 3931 1.2 isaki * Silence is inserted for missing channels. 3932 1.2 isaki */ 3933 1.2 isaki static void 3934 1.2 isaki audio_track_chmix_expand(audio_filter_arg_t *arg) 3935 1.2 isaki { 3936 1.2 isaki const aint_t *s; 3937 1.2 isaki aint_t *d; 3938 1.2 isaki u_int i; 3939 1.2 isaki u_int ch; 3940 1.2 isaki u_int srcchannels; 3941 1.2 isaki u_int dstchannels; 3942 1.2 isaki 3943 1.2 isaki DIAGNOSTIC_filter_arg(arg); 3944 1.2 isaki 3945 1.2 isaki s = arg->src; 3946 1.2 isaki d = arg->dst; 3947 1.2 isaki 3948 1.2 isaki srcchannels = arg->srcfmt->channels; 3949 1.2 isaki dstchannels = arg->dstfmt->channels; 3950 1.2 isaki for (i = 0; i < arg->count; i++) { 3951 1.2 isaki for (ch = 0; ch < srcchannels; ch++) { 3952 1.2 isaki *d++ = *s++; 3953 1.2 isaki } 3954 1.2 isaki for (; ch < dstchannels; ch++) { 3955 1.2 isaki *d++ = 0; 3956 1.2 isaki } 3957 1.2 isaki } 3958 1.2 isaki } 3959 1.2 isaki 3960 1.2 isaki /* 3961 1.2 isaki * This filter performs frequency conversion (up sampling). 3962 1.2 isaki * It uses linear interpolation. 3963 1.2 isaki */ 3964 1.2 isaki static void 3965 1.2 isaki audio_track_freq_up(audio_filter_arg_t *arg) 3966 1.2 isaki { 3967 1.2 isaki audio_track_t *track; 3968 1.2 isaki audio_ring_t *src; 3969 1.2 isaki audio_ring_t *dst; 3970 1.2 isaki const aint_t *s; 3971 1.2 isaki aint_t *d; 3972 1.2 isaki aint_t prev[AUDIO_MAX_CHANNELS]; 3973 1.2 isaki aint_t curr[AUDIO_MAX_CHANNELS]; 3974 1.2 isaki aint_t grad[AUDIO_MAX_CHANNELS]; 3975 1.2 isaki u_int i; 3976 1.2 isaki u_int t; 3977 1.2 isaki u_int step; 3978 1.2 isaki u_int channels; 3979 1.2 isaki u_int ch; 3980 1.2 isaki int srcused; 3981 1.2 isaki 3982 1.2 isaki track = arg->context; 3983 1.2 isaki KASSERT(track); 3984 1.2 isaki src = &track->freq.srcbuf; 3985 1.2 isaki dst = track->freq.dst; 3986 1.2 isaki DIAGNOSTIC_ring(dst); 3987 1.2 isaki DIAGNOSTIC_ring(src); 3988 1.2 isaki KASSERT(src->used > 0); 3989 1.47 isaki KASSERTMSG(src->fmt.channels == dst->fmt.channels, 3990 1.47 isaki "src->fmt.channels=%d dst->fmt.channels=%d", 3991 1.47 isaki src->fmt.channels, dst->fmt.channels); 3992 1.47 isaki KASSERTMSG(src->head % track->mixer->frames_per_block == 0, 3993 1.47 isaki "src->head=%d track->mixer->frames_per_block=%d", 3994 1.47 isaki src->head, track->mixer->frames_per_block); 3995 1.2 isaki 3996 1.2 isaki s = arg->src; 3997 1.2 isaki d = arg->dst; 3998 1.2 isaki 3999 1.2 isaki /* 4000 1.111 msaitoh * In order to facilitate interpolation for each block, slide (delay) 4001 1.2 isaki * input by one sample. As a result, strictly speaking, the output 4002 1.2 isaki * phase is delayed by 1/dstfreq. However, I believe there is no 4003 1.2 isaki * observable impact. 4004 1.2 isaki * 4005 1.2 isaki * Example) 4006 1.2 isaki * srcfreq:dstfreq = 1:3 4007 1.2 isaki * 4008 1.2 isaki * A - - 4009 1.2 isaki * | 4010 1.2 isaki * | 4011 1.2 isaki * | B - - 4012 1.2 isaki * +-----+-----> input timeframe 4013 1.2 isaki * 0 1 4014 1.2 isaki * 4015 1.2 isaki * 0 1 4016 1.2 isaki * +-----+-----> input timeframe 4017 1.2 isaki * | A 4018 1.2 isaki * | x x 4019 1.2 isaki * | x x 4020 1.2 isaki * x (B) 4021 1.2 isaki * +-+-+-+-+-+-> output timeframe 4022 1.2 isaki * 0 1 2 3 4 5 4023 1.2 isaki */ 4024 1.2 isaki 4025 1.2 isaki /* Last samples in previous block */ 4026 1.2 isaki channels = src->fmt.channels; 4027 1.2 isaki for (ch = 0; ch < channels; ch++) { 4028 1.2 isaki prev[ch] = track->freq_prev[ch]; 4029 1.2 isaki curr[ch] = track->freq_curr[ch]; 4030 1.2 isaki grad[ch] = curr[ch] - prev[ch]; 4031 1.2 isaki } 4032 1.2 isaki 4033 1.2 isaki step = track->freq_step; 4034 1.2 isaki t = track->freq_current; 4035 1.2 isaki //#define FREQ_DEBUG 4036 1.2 isaki #if defined(FREQ_DEBUG) 4037 1.2 isaki #define PRINTF(fmt...) printf(fmt) 4038 1.2 isaki #else 4039 1.2 isaki #define PRINTF(fmt...) do { } while (0) 4040 1.2 isaki #endif 4041 1.2 isaki srcused = src->used; 4042 1.2 isaki PRINTF("upstart step=%d leap=%d", step, track->freq_leap); 4043 1.2 isaki PRINTF(" srcused=%d arg->count=%u", src->used, arg->count); 4044 1.2 isaki PRINTF(" prev=%d curr=%d grad=%d", prev[0], curr[0], grad[0]); 4045 1.2 isaki PRINTF(" t=%d\n", t); 4046 1.2 isaki 4047 1.2 isaki for (i = 0; i < arg->count; i++) { 4048 1.2 isaki PRINTF("i=%d t=%5d", i, t); 4049 1.2 isaki if (t >= 65536) { 4050 1.2 isaki for (ch = 0; ch < channels; ch++) { 4051 1.2 isaki prev[ch] = curr[ch]; 4052 1.2 isaki curr[ch] = *s++; 4053 1.2 isaki grad[ch] = curr[ch] - prev[ch]; 4054 1.2 isaki } 4055 1.2 isaki PRINTF(" prev=%d s[%d]=%d", 4056 1.2 isaki prev[0], src->used - srcused, curr[0]); 4057 1.2 isaki 4058 1.2 isaki /* Update */ 4059 1.2 isaki t -= 65536; 4060 1.2 isaki srcused--; 4061 1.2 isaki if (srcused < 0) { 4062 1.2 isaki PRINTF(" break\n"); 4063 1.2 isaki break; 4064 1.2 isaki } 4065 1.2 isaki } 4066 1.2 isaki 4067 1.2 isaki for (ch = 0; ch < channels; ch++) { 4068 1.2 isaki *d++ = prev[ch] + (aint2_t)grad[ch] * t / 65536; 4069 1.2 isaki #if defined(FREQ_DEBUG) 4070 1.2 isaki if (ch == 0) 4071 1.2 isaki printf(" t=%5d *d=%d", t, d[-1]); 4072 1.2 isaki #endif 4073 1.2 isaki } 4074 1.2 isaki t += step; 4075 1.2 isaki 4076 1.2 isaki PRINTF("\n"); 4077 1.2 isaki } 4078 1.2 isaki PRINTF("end prev=%d curr=%d\n", prev[0], curr[0]); 4079 1.2 isaki 4080 1.2 isaki auring_take(src, src->used); 4081 1.2 isaki auring_push(dst, i); 4082 1.2 isaki 4083 1.2 isaki /* Adjust */ 4084 1.2 isaki t += track->freq_leap; 4085 1.2 isaki 4086 1.2 isaki track->freq_current = t; 4087 1.2 isaki for (ch = 0; ch < channels; ch++) { 4088 1.2 isaki track->freq_prev[ch] = prev[ch]; 4089 1.2 isaki track->freq_curr[ch] = curr[ch]; 4090 1.2 isaki } 4091 1.2 isaki } 4092 1.2 isaki 4093 1.2 isaki /* 4094 1.2 isaki * This filter performs frequency conversion (down sampling). 4095 1.2 isaki * It uses simple thinning. 4096 1.2 isaki */ 4097 1.2 isaki static void 4098 1.2 isaki audio_track_freq_down(audio_filter_arg_t *arg) 4099 1.2 isaki { 4100 1.2 isaki audio_track_t *track; 4101 1.2 isaki audio_ring_t *src; 4102 1.2 isaki audio_ring_t *dst; 4103 1.2 isaki const aint_t *s0; 4104 1.2 isaki aint_t *d; 4105 1.2 isaki u_int i; 4106 1.2 isaki u_int t; 4107 1.2 isaki u_int step; 4108 1.2 isaki u_int ch; 4109 1.2 isaki u_int channels; 4110 1.2 isaki 4111 1.2 isaki track = arg->context; 4112 1.2 isaki KASSERT(track); 4113 1.2 isaki src = &track->freq.srcbuf; 4114 1.2 isaki dst = track->freq.dst; 4115 1.2 isaki 4116 1.2 isaki DIAGNOSTIC_ring(dst); 4117 1.2 isaki DIAGNOSTIC_ring(src); 4118 1.2 isaki KASSERT(src->used > 0); 4119 1.47 isaki KASSERTMSG(src->fmt.channels == dst->fmt.channels, 4120 1.47 isaki "src->fmt.channels=%d dst->fmt.channels=%d", 4121 1.47 isaki src->fmt.channels, dst->fmt.channels); 4122 1.2 isaki KASSERTMSG(src->head % track->mixer->frames_per_block == 0, 4123 1.47 isaki "src->head=%d track->mixer->frames_per_block=%d", 4124 1.2 isaki src->head, track->mixer->frames_per_block); 4125 1.2 isaki 4126 1.2 isaki s0 = arg->src; 4127 1.2 isaki d = arg->dst; 4128 1.2 isaki t = track->freq_current; 4129 1.2 isaki step = track->freq_step; 4130 1.2 isaki channels = dst->fmt.channels; 4131 1.2 isaki PRINTF("downstart step=%d leap=%d", step, track->freq_leap); 4132 1.2 isaki PRINTF(" srcused=%d arg->count=%u", src->used, arg->count); 4133 1.2 isaki PRINTF(" t=%d\n", t); 4134 1.2 isaki 4135 1.2 isaki for (i = 0; i < arg->count && t / 65536 < src->used; i++) { 4136 1.2 isaki const aint_t *s; 4137 1.2 isaki PRINTF("i=%4d t=%10d", i, t); 4138 1.2 isaki s = s0 + (t / 65536) * channels; 4139 1.2 isaki PRINTF(" s=%5ld", (s - s0) / channels); 4140 1.2 isaki for (ch = 0; ch < channels; ch++) { 4141 1.2 isaki if (ch == 0) PRINTF(" *s=%d", s[ch]); 4142 1.2 isaki *d++ = s[ch]; 4143 1.2 isaki } 4144 1.2 isaki PRINTF("\n"); 4145 1.2 isaki t += step; 4146 1.2 isaki } 4147 1.2 isaki t += track->freq_leap; 4148 1.2 isaki PRINTF("end t=%d\n", t); 4149 1.2 isaki auring_take(src, src->used); 4150 1.2 isaki auring_push(dst, i); 4151 1.2 isaki track->freq_current = t % 65536; 4152 1.2 isaki } 4153 1.2 isaki 4154 1.2 isaki /* 4155 1.2 isaki * Creates track and returns it. 4156 1.63 isaki * Must be called without sc_lock held. 4157 1.2 isaki */ 4158 1.2 isaki audio_track_t * 4159 1.2 isaki audio_track_create(struct audio_softc *sc, audio_trackmixer_t *mixer) 4160 1.2 isaki { 4161 1.2 isaki audio_track_t *track; 4162 1.2 isaki static int newid = 0; 4163 1.2 isaki 4164 1.2 isaki track = kmem_zalloc(sizeof(*track), KM_SLEEP); 4165 1.2 isaki 4166 1.2 isaki track->id = newid++; 4167 1.2 isaki track->mixer = mixer; 4168 1.2 isaki track->mode = mixer->mode; 4169 1.2 isaki 4170 1.2 isaki /* Do TRACE after id is assigned. */ 4171 1.2 isaki TRACET(3, track, "for %s", 4172 1.2 isaki mixer->mode == AUMODE_PLAY ? "playback" : "recording"); 4173 1.2 isaki 4174 1.2 isaki #if defined(AUDIO_SUPPORT_TRACK_VOLUME) 4175 1.2 isaki track->volume = 256; 4176 1.2 isaki #endif 4177 1.2 isaki for (int i = 0; i < AUDIO_MAX_CHANNELS; i++) { 4178 1.2 isaki track->ch_volume[i] = 256; 4179 1.2 isaki } 4180 1.2 isaki 4181 1.2 isaki return track; 4182 1.2 isaki } 4183 1.2 isaki 4184 1.2 isaki /* 4185 1.2 isaki * Release all resources of the track and track itself. 4186 1.2 isaki * track must not be NULL. Don't specify the track within the file 4187 1.2 isaki * structure linked from sc->sc_files. 4188 1.2 isaki */ 4189 1.2 isaki static void 4190 1.2 isaki audio_track_destroy(audio_track_t *track) 4191 1.2 isaki { 4192 1.2 isaki 4193 1.2 isaki KASSERT(track); 4194 1.2 isaki 4195 1.2 isaki audio_free_usrbuf(track); 4196 1.2 isaki audio_free(track->codec.srcbuf.mem); 4197 1.2 isaki audio_free(track->chvol.srcbuf.mem); 4198 1.2 isaki audio_free(track->chmix.srcbuf.mem); 4199 1.2 isaki audio_free(track->freq.srcbuf.mem); 4200 1.2 isaki audio_free(track->outbuf.mem); 4201 1.2 isaki 4202 1.2 isaki kmem_free(track, sizeof(*track)); 4203 1.2 isaki } 4204 1.2 isaki 4205 1.2 isaki /* 4206 1.2 isaki * It returns encoding conversion filter according to src and dst format. 4207 1.2 isaki * If it is not a convertible pair, it returns NULL. Either src or dst 4208 1.2 isaki * must be internal format. 4209 1.2 isaki */ 4210 1.2 isaki static audio_filter_t 4211 1.2 isaki audio_track_get_codec(audio_track_t *track, const audio_format2_t *src, 4212 1.2 isaki const audio_format2_t *dst) 4213 1.2 isaki { 4214 1.2 isaki 4215 1.2 isaki if (audio_format2_is_internal(src)) { 4216 1.2 isaki if (dst->encoding == AUDIO_ENCODING_ULAW) { 4217 1.2 isaki return audio_internal_to_mulaw; 4218 1.2 isaki } else if (dst->encoding == AUDIO_ENCODING_ALAW) { 4219 1.2 isaki return audio_internal_to_alaw; 4220 1.2 isaki } else if (audio_format2_is_linear(dst)) { 4221 1.2 isaki switch (dst->stride) { 4222 1.2 isaki case 8: 4223 1.2 isaki return audio_internal_to_linear8; 4224 1.2 isaki case 16: 4225 1.2 isaki return audio_internal_to_linear16; 4226 1.2 isaki #if defined(AUDIO_SUPPORT_LINEAR24) 4227 1.2 isaki case 24: 4228 1.2 isaki return audio_internal_to_linear24; 4229 1.2 isaki #endif 4230 1.2 isaki case 32: 4231 1.2 isaki return audio_internal_to_linear32; 4232 1.2 isaki default: 4233 1.2 isaki TRACET(1, track, "unsupported %s stride %d", 4234 1.2 isaki "dst", dst->stride); 4235 1.2 isaki goto abort; 4236 1.2 isaki } 4237 1.2 isaki } 4238 1.2 isaki } else if (audio_format2_is_internal(dst)) { 4239 1.2 isaki if (src->encoding == AUDIO_ENCODING_ULAW) { 4240 1.2 isaki return audio_mulaw_to_internal; 4241 1.2 isaki } else if (src->encoding == AUDIO_ENCODING_ALAW) { 4242 1.2 isaki return audio_alaw_to_internal; 4243 1.2 isaki } else if (audio_format2_is_linear(src)) { 4244 1.2 isaki switch (src->stride) { 4245 1.2 isaki case 8: 4246 1.2 isaki return audio_linear8_to_internal; 4247 1.2 isaki case 16: 4248 1.2 isaki return audio_linear16_to_internal; 4249 1.2 isaki #if defined(AUDIO_SUPPORT_LINEAR24) 4250 1.2 isaki case 24: 4251 1.2 isaki return audio_linear24_to_internal; 4252 1.2 isaki #endif 4253 1.2 isaki case 32: 4254 1.2 isaki return audio_linear32_to_internal; 4255 1.2 isaki default: 4256 1.2 isaki TRACET(1, track, "unsupported %s stride %d", 4257 1.2 isaki "src", src->stride); 4258 1.2 isaki goto abort; 4259 1.2 isaki } 4260 1.2 isaki } 4261 1.2 isaki } 4262 1.2 isaki 4263 1.2 isaki TRACET(1, track, "unsupported encoding"); 4264 1.2 isaki abort: 4265 1.2 isaki #if defined(AUDIO_DEBUG) 4266 1.2 isaki if (audiodebug >= 2) { 4267 1.2 isaki char buf[100]; 4268 1.2 isaki audio_format2_tostr(buf, sizeof(buf), src); 4269 1.2 isaki TRACET(2, track, "src %s", buf); 4270 1.2 isaki audio_format2_tostr(buf, sizeof(buf), dst); 4271 1.2 isaki TRACET(2, track, "dst %s", buf); 4272 1.2 isaki } 4273 1.2 isaki #endif 4274 1.2 isaki return NULL; 4275 1.2 isaki } 4276 1.2 isaki 4277 1.2 isaki /* 4278 1.2 isaki * Initialize the codec stage of this track as necessary. 4279 1.2 isaki * If successful, it initializes the codec stage as necessary, stores updated 4280 1.2 isaki * last_dst in *last_dstp in any case, and returns 0. 4281 1.2 isaki * Otherwise, it returns errno without modifying *last_dstp. 4282 1.2 isaki */ 4283 1.2 isaki static int 4284 1.2 isaki audio_track_init_codec(audio_track_t *track, audio_ring_t **last_dstp) 4285 1.2 isaki { 4286 1.2 isaki audio_ring_t *last_dst; 4287 1.2 isaki audio_ring_t *srcbuf; 4288 1.2 isaki audio_format2_t *srcfmt; 4289 1.2 isaki audio_format2_t *dstfmt; 4290 1.2 isaki audio_filter_arg_t *arg; 4291 1.2 isaki u_int len; 4292 1.2 isaki int error; 4293 1.2 isaki 4294 1.2 isaki KASSERT(track); 4295 1.2 isaki 4296 1.2 isaki last_dst = *last_dstp; 4297 1.2 isaki dstfmt = &last_dst->fmt; 4298 1.2 isaki srcfmt = &track->inputfmt; 4299 1.2 isaki srcbuf = &track->codec.srcbuf; 4300 1.2 isaki error = 0; 4301 1.2 isaki 4302 1.2 isaki if (srcfmt->encoding != dstfmt->encoding 4303 1.2 isaki || srcfmt->precision != dstfmt->precision 4304 1.2 isaki || srcfmt->stride != dstfmt->stride) { 4305 1.2 isaki track->codec.dst = last_dst; 4306 1.2 isaki 4307 1.2 isaki srcbuf->fmt = *dstfmt; 4308 1.2 isaki srcbuf->fmt.encoding = srcfmt->encoding; 4309 1.2 isaki srcbuf->fmt.precision = srcfmt->precision; 4310 1.2 isaki srcbuf->fmt.stride = srcfmt->stride; 4311 1.2 isaki 4312 1.2 isaki track->codec.filter = audio_track_get_codec(track, 4313 1.2 isaki &srcbuf->fmt, dstfmt); 4314 1.2 isaki if (track->codec.filter == NULL) { 4315 1.2 isaki error = EINVAL; 4316 1.2 isaki goto abort; 4317 1.2 isaki } 4318 1.2 isaki 4319 1.2 isaki srcbuf->head = 0; 4320 1.2 isaki srcbuf->used = 0; 4321 1.2 isaki srcbuf->capacity = frame_per_block(track->mixer, &srcbuf->fmt); 4322 1.2 isaki len = auring_bytelen(srcbuf); 4323 1.2 isaki srcbuf->mem = audio_realloc(srcbuf->mem, len); 4324 1.2 isaki 4325 1.2 isaki arg = &track->codec.arg; 4326 1.2 isaki arg->srcfmt = &srcbuf->fmt; 4327 1.2 isaki arg->dstfmt = dstfmt; 4328 1.2 isaki arg->context = NULL; 4329 1.2 isaki 4330 1.2 isaki *last_dstp = srcbuf; 4331 1.2 isaki return 0; 4332 1.2 isaki } 4333 1.2 isaki 4334 1.2 isaki abort: 4335 1.2 isaki track->codec.filter = NULL; 4336 1.2 isaki audio_free(srcbuf->mem); 4337 1.2 isaki return error; 4338 1.2 isaki } 4339 1.2 isaki 4340 1.2 isaki /* 4341 1.2 isaki * Initialize the chvol stage of this track as necessary. 4342 1.2 isaki * If successful, it initializes the chvol stage as necessary, stores updated 4343 1.2 isaki * last_dst in *last_dstp in any case, and returns 0. 4344 1.2 isaki * Otherwise, it returns errno without modifying *last_dstp. 4345 1.2 isaki */ 4346 1.2 isaki static int 4347 1.2 isaki audio_track_init_chvol(audio_track_t *track, audio_ring_t **last_dstp) 4348 1.2 isaki { 4349 1.2 isaki audio_ring_t *last_dst; 4350 1.2 isaki audio_ring_t *srcbuf; 4351 1.2 isaki audio_format2_t *srcfmt; 4352 1.2 isaki audio_format2_t *dstfmt; 4353 1.2 isaki audio_filter_arg_t *arg; 4354 1.2 isaki u_int len; 4355 1.2 isaki int error; 4356 1.2 isaki 4357 1.2 isaki KASSERT(track); 4358 1.2 isaki 4359 1.2 isaki last_dst = *last_dstp; 4360 1.2 isaki dstfmt = &last_dst->fmt; 4361 1.2 isaki srcfmt = &track->inputfmt; 4362 1.2 isaki srcbuf = &track->chvol.srcbuf; 4363 1.2 isaki error = 0; 4364 1.2 isaki 4365 1.2 isaki /* Check whether channel volume conversion is necessary. */ 4366 1.2 isaki bool use_chvol = false; 4367 1.2 isaki for (int ch = 0; ch < srcfmt->channels; ch++) { 4368 1.2 isaki if (track->ch_volume[ch] != 256) { 4369 1.2 isaki use_chvol = true; 4370 1.2 isaki break; 4371 1.2 isaki } 4372 1.2 isaki } 4373 1.2 isaki 4374 1.2 isaki if (use_chvol == true) { 4375 1.2 isaki track->chvol.dst = last_dst; 4376 1.2 isaki track->chvol.filter = audio_track_chvol; 4377 1.2 isaki 4378 1.2 isaki srcbuf->fmt = *dstfmt; 4379 1.2 isaki /* no format conversion occurs */ 4380 1.2 isaki 4381 1.2 isaki srcbuf->head = 0; 4382 1.2 isaki srcbuf->used = 0; 4383 1.2 isaki srcbuf->capacity = frame_per_block(track->mixer, &srcbuf->fmt); 4384 1.2 isaki len = auring_bytelen(srcbuf); 4385 1.2 isaki srcbuf->mem = audio_realloc(srcbuf->mem, len); 4386 1.2 isaki 4387 1.2 isaki arg = &track->chvol.arg; 4388 1.2 isaki arg->srcfmt = &srcbuf->fmt; 4389 1.2 isaki arg->dstfmt = dstfmt; 4390 1.2 isaki arg->context = track->ch_volume; 4391 1.2 isaki 4392 1.2 isaki *last_dstp = srcbuf; 4393 1.2 isaki return 0; 4394 1.2 isaki } 4395 1.2 isaki 4396 1.2 isaki track->chvol.filter = NULL; 4397 1.2 isaki audio_free(srcbuf->mem); 4398 1.2 isaki return error; 4399 1.2 isaki } 4400 1.2 isaki 4401 1.2 isaki /* 4402 1.2 isaki * Initialize the chmix stage of this track as necessary. 4403 1.2 isaki * If successful, it initializes the chmix stage as necessary, stores updated 4404 1.2 isaki * last_dst in *last_dstp in any case, and returns 0. 4405 1.2 isaki * Otherwise, it returns errno without modifying *last_dstp. 4406 1.2 isaki */ 4407 1.2 isaki static int 4408 1.2 isaki audio_track_init_chmix(audio_track_t *track, audio_ring_t **last_dstp) 4409 1.2 isaki { 4410 1.2 isaki audio_ring_t *last_dst; 4411 1.2 isaki audio_ring_t *srcbuf; 4412 1.2 isaki audio_format2_t *srcfmt; 4413 1.2 isaki audio_format2_t *dstfmt; 4414 1.2 isaki audio_filter_arg_t *arg; 4415 1.2 isaki u_int srcch; 4416 1.2 isaki u_int dstch; 4417 1.2 isaki u_int len; 4418 1.2 isaki int error; 4419 1.2 isaki 4420 1.2 isaki KASSERT(track); 4421 1.2 isaki 4422 1.2 isaki last_dst = *last_dstp; 4423 1.2 isaki dstfmt = &last_dst->fmt; 4424 1.2 isaki srcfmt = &track->inputfmt; 4425 1.2 isaki srcbuf = &track->chmix.srcbuf; 4426 1.2 isaki error = 0; 4427 1.2 isaki 4428 1.2 isaki srcch = srcfmt->channels; 4429 1.2 isaki dstch = dstfmt->channels; 4430 1.2 isaki if (srcch != dstch) { 4431 1.2 isaki track->chmix.dst = last_dst; 4432 1.2 isaki 4433 1.2 isaki if (srcch >= 2 && dstch == 1) { 4434 1.2 isaki track->chmix.filter = audio_track_chmix_mixLR; 4435 1.2 isaki } else if (srcch == 1 && dstch >= 2) { 4436 1.2 isaki track->chmix.filter = audio_track_chmix_dupLR; 4437 1.2 isaki } else if (srcch > dstch) { 4438 1.2 isaki track->chmix.filter = audio_track_chmix_shrink; 4439 1.2 isaki } else { 4440 1.2 isaki track->chmix.filter = audio_track_chmix_expand; 4441 1.2 isaki } 4442 1.2 isaki 4443 1.2 isaki srcbuf->fmt = *dstfmt; 4444 1.2 isaki srcbuf->fmt.channels = srcch; 4445 1.2 isaki 4446 1.2 isaki srcbuf->head = 0; 4447 1.2 isaki srcbuf->used = 0; 4448 1.2 isaki /* XXX The buffer size should be able to calculate. */ 4449 1.2 isaki srcbuf->capacity = frame_per_block(track->mixer, &srcbuf->fmt); 4450 1.2 isaki len = auring_bytelen(srcbuf); 4451 1.2 isaki srcbuf->mem = audio_realloc(srcbuf->mem, len); 4452 1.2 isaki 4453 1.2 isaki arg = &track->chmix.arg; 4454 1.2 isaki arg->srcfmt = &srcbuf->fmt; 4455 1.2 isaki arg->dstfmt = dstfmt; 4456 1.2 isaki arg->context = NULL; 4457 1.2 isaki 4458 1.2 isaki *last_dstp = srcbuf; 4459 1.2 isaki return 0; 4460 1.2 isaki } 4461 1.2 isaki 4462 1.2 isaki track->chmix.filter = NULL; 4463 1.2 isaki audio_free(srcbuf->mem); 4464 1.2 isaki return error; 4465 1.2 isaki } 4466 1.2 isaki 4467 1.2 isaki /* 4468 1.2 isaki * Initialize the freq stage of this track as necessary. 4469 1.2 isaki * If successful, it initializes the freq stage as necessary, stores updated 4470 1.2 isaki * last_dst in *last_dstp in any case, and returns 0. 4471 1.2 isaki * Otherwise, it returns errno without modifying *last_dstp. 4472 1.2 isaki */ 4473 1.2 isaki static int 4474 1.2 isaki audio_track_init_freq(audio_track_t *track, audio_ring_t **last_dstp) 4475 1.2 isaki { 4476 1.2 isaki audio_ring_t *last_dst; 4477 1.2 isaki audio_ring_t *srcbuf; 4478 1.2 isaki audio_format2_t *srcfmt; 4479 1.2 isaki audio_format2_t *dstfmt; 4480 1.2 isaki audio_filter_arg_t *arg; 4481 1.2 isaki uint32_t srcfreq; 4482 1.2 isaki uint32_t dstfreq; 4483 1.2 isaki u_int dst_capacity; 4484 1.2 isaki u_int mod; 4485 1.2 isaki u_int len; 4486 1.2 isaki int error; 4487 1.2 isaki 4488 1.2 isaki KASSERT(track); 4489 1.2 isaki 4490 1.2 isaki last_dst = *last_dstp; 4491 1.2 isaki dstfmt = &last_dst->fmt; 4492 1.2 isaki srcfmt = &track->inputfmt; 4493 1.2 isaki srcbuf = &track->freq.srcbuf; 4494 1.2 isaki error = 0; 4495 1.2 isaki 4496 1.2 isaki srcfreq = srcfmt->sample_rate; 4497 1.2 isaki dstfreq = dstfmt->sample_rate; 4498 1.2 isaki if (srcfreq != dstfreq) { 4499 1.2 isaki track->freq.dst = last_dst; 4500 1.2 isaki 4501 1.2 isaki memset(track->freq_prev, 0, sizeof(track->freq_prev)); 4502 1.2 isaki memset(track->freq_curr, 0, sizeof(track->freq_curr)); 4503 1.2 isaki 4504 1.2 isaki /* freq_step is the ratio of src/dst when let dst 65536. */ 4505 1.2 isaki track->freq_step = (uint64_t)srcfreq * 65536 / dstfreq; 4506 1.2 isaki 4507 1.2 isaki dst_capacity = frame_per_block(track->mixer, dstfmt); 4508 1.2 isaki mod = (uint64_t)srcfreq * 65536 % dstfreq; 4509 1.2 isaki track->freq_leap = (mod * dst_capacity + dstfreq / 2) / dstfreq; 4510 1.2 isaki 4511 1.2 isaki if (track->freq_step < 65536) { 4512 1.2 isaki track->freq.filter = audio_track_freq_up; 4513 1.2 isaki /* In order to carry at the first time. */ 4514 1.2 isaki track->freq_current = 65536; 4515 1.2 isaki } else { 4516 1.2 isaki track->freq.filter = audio_track_freq_down; 4517 1.2 isaki track->freq_current = 0; 4518 1.2 isaki } 4519 1.2 isaki 4520 1.2 isaki srcbuf->fmt = *dstfmt; 4521 1.2 isaki srcbuf->fmt.sample_rate = srcfreq; 4522 1.2 isaki 4523 1.2 isaki srcbuf->head = 0; 4524 1.2 isaki srcbuf->used = 0; 4525 1.2 isaki srcbuf->capacity = frame_per_block(track->mixer, &srcbuf->fmt); 4526 1.2 isaki len = auring_bytelen(srcbuf); 4527 1.2 isaki srcbuf->mem = audio_realloc(srcbuf->mem, len); 4528 1.2 isaki 4529 1.2 isaki arg = &track->freq.arg; 4530 1.2 isaki arg->srcfmt = &srcbuf->fmt; 4531 1.133 isaki arg->dstfmt = dstfmt; 4532 1.2 isaki arg->context = track; 4533 1.2 isaki 4534 1.2 isaki *last_dstp = srcbuf; 4535 1.2 isaki return 0; 4536 1.2 isaki } 4537 1.2 isaki 4538 1.2 isaki track->freq.filter = NULL; 4539 1.2 isaki audio_free(srcbuf->mem); 4540 1.2 isaki return error; 4541 1.2 isaki } 4542 1.2 isaki 4543 1.2 isaki /* 4544 1.126 isaki * There are two unit of buffers; A block buffer and a byte buffer. Both use 4545 1.126 isaki * audio_ring_t. Internally, audio data is always handled in block unit. 4546 1.126 isaki * Converting format, sythesizing tracks, transferring from/to the hardware, 4547 1.126 isaki * and etc. Only one exception is usrbuf. To transfer with userland, usrbuf 4548 1.126 isaki * is buffered in byte unit. 4549 1.126 isaki * For playing back, write(2) writes arbitrary length of data to usrbuf. 4550 1.126 isaki * When one block is filled, it is sent to the next stage (converting and/or 4551 1.126 isaki * synthesizing). 4552 1.126 isaki * For recording, the rmixer writes one block length of data to input buffer 4553 1.126 isaki * (the bottom stage buffer) each time. read(2) (converts one block if usrbuf 4554 1.126 isaki * is empty and then) reads arbitrary length of data from usrbuf. 4555 1.126 isaki * 4556 1.126 isaki * The following charts show the data flow and buffer types for playback and 4557 1.126 isaki * recording track. In this example, both have two conversion stages, codec 4558 1.126 isaki * and freq. Every [**] represents a buffer described below. 4559 1.2 isaki * 4560 1.126 isaki * On playback track: 4561 1.126 isaki * 4562 1.126 isaki * write(2) 4563 1.126 isaki * | 4564 1.2 isaki * | uiomove 4565 1.2 isaki * v 4566 1.126 isaki * usrbuf [BB|BB ... BB|BB] .. Byte ring buffer 4567 1.126 isaki * | 4568 1.126 isaki * | memcpy one block 4569 1.2 isaki * v 4570 1.126 isaki * codec.srcbuf [FF] .. 1 block (ring) buffer 4571 1.2 isaki * .dst ----+ 4572 1.126 isaki * | 4573 1.2 isaki * | convert 4574 1.2 isaki * v 4575 1.126 isaki * freq.srcbuf [FF] .. 1 block (ring) buffer 4576 1.2 isaki * .dst ----+ 4577 1.126 isaki * | 4578 1.2 isaki * | convert 4579 1.2 isaki * v 4580 1.126 isaki * outbuf [FF|FF|FF|FF] .. NBLKOUT blocks ring buffer 4581 1.126 isaki * | 4582 1.126 isaki * v 4583 1.126 isaki * pmixer 4584 1.126 isaki * 4585 1.126 isaki * There are three different types of buffers: 4586 1.126 isaki * 4587 1.126 isaki * [BB|BB ... BB|BB] usrbuf. Is the buffer closest to userland. Mandatory. 4588 1.126 isaki * This is a byte buffer and its length is basically less 4589 1.126 isaki * than or equal to 64KB or at least AUMINNOBLK blocks. 4590 1.126 isaki * 4591 1.126 isaki * [FF] Interim conversion stage's srcbuf if necessary. 4592 1.126 isaki * This is one block (ring) buffer counted in frames. 4593 1.126 isaki * 4594 1.126 isaki * [FF|FF|FF|FF] outbuf. Is the buffer closest to pmixer. Mandatory. 4595 1.126 isaki * This is NBLKOUT blocks ring buffer counted in frames. 4596 1.2 isaki * 4597 1.2 isaki * 4598 1.126 isaki * On recording track: 4599 1.2 isaki * 4600 1.126 isaki * read(2) 4601 1.126 isaki * ^ 4602 1.126 isaki * | uiomove 4603 1.126 isaki * | 4604 1.126 isaki * usrbuf [BB] .. Byte (ring) buffer 4605 1.126 isaki * ^ 4606 1.126 isaki * | memcpy one block 4607 1.126 isaki * | 4608 1.126 isaki * outbuf [FF] .. 1 block (ring) buffer 4609 1.126 isaki * ^ 4610 1.2 isaki * | convert 4611 1.126 isaki * | 4612 1.126 isaki * codec.dst ----+ 4613 1.126 isaki * .srcbuf [FF] .. 1 block (ring) buffer 4614 1.126 isaki * ^ 4615 1.2 isaki * | convert 4616 1.126 isaki * | 4617 1.126 isaki * freq.dst ----+ 4618 1.126 isaki * .srcbuf [FF|FF ... FF|FF] .. NBLKIN blocks ring buffer 4619 1.126 isaki * ^ 4620 1.126 isaki * | 4621 1.126 isaki * rmixer 4622 1.126 isaki * 4623 1.126 isaki * There are also three different types of buffers. 4624 1.126 isaki * 4625 1.126 isaki * [BB] usrbuf. Is the buffer closest to userland. Mandatory. 4626 1.126 isaki * This is a byte buffer and its length is one block. 4627 1.126 isaki * This buffer holds only "fragment". 4628 1.126 isaki * 4629 1.126 isaki * [FF] Interim conversion stage's srcbuf (or outbuf). 4630 1.126 isaki * This is one block (ring) buffer counted in frames. 4631 1.2 isaki * 4632 1.126 isaki * [FF|FF ... FF|FF] The bottom conversion stage's srcbuf (or outbuf). 4633 1.126 isaki * This is the buffer closest to rmixer, and mandatory. 4634 1.126 isaki * This is NBLKIN blocks ring buffer counted in frames. 4635 1.126 isaki * Also pointed by *input. 4636 1.2 isaki */ 4637 1.2 isaki 4638 1.2 isaki /* 4639 1.2 isaki * Set the userland format of this track. 4640 1.77 isaki * usrfmt argument should have been previously verified by 4641 1.77 isaki * audio_track_setinfo_check(). 4642 1.77 isaki * This function may release and reallocate all internal conversion buffers. 4643 1.2 isaki * It returns 0 if successful. Otherwise it returns errno with clearing all 4644 1.2 isaki * internal buffers. 4645 1.2 isaki * It must be called without sc_intr_lock since uvm_* routines require non 4646 1.2 isaki * intr_lock state. 4647 1.2 isaki * It must be called with track lock held since it may release and reallocate 4648 1.2 isaki * outbuf. 4649 1.2 isaki */ 4650 1.2 isaki static int 4651 1.2 isaki audio_track_set_format(audio_track_t *track, audio_format2_t *usrfmt) 4652 1.2 isaki { 4653 1.126 isaki audio_ring_t *last_dst; 4654 1.126 isaki int is_playback; 4655 1.2 isaki u_int newbufsize; 4656 1.135 isaki u_int newvsize; 4657 1.2 isaki u_int len; 4658 1.2 isaki int error; 4659 1.2 isaki 4660 1.2 isaki KASSERT(track); 4661 1.2 isaki 4662 1.126 isaki is_playback = audio_track_is_playback(track); 4663 1.126 isaki 4664 1.135 isaki /* Once mmap is called, the track format cannot be changed. */ 4665 1.135 isaki if (track->mmapped) 4666 1.135 isaki return EIO; 4667 1.135 isaki 4668 1.2 isaki /* usrbuf is the closest buffer to the userland. */ 4669 1.2 isaki track->usrbuf.fmt = *usrfmt; 4670 1.2 isaki 4671 1.2 isaki /* 4672 1.126 isaki * Usrbuf. 4673 1.126 isaki * On the playback track, its capacity is less than or equal to 64KB 4674 1.126 isaki * (for historical reason) and must be a multiple of a block 4675 1.126 isaki * (constraint in this implementation). But at least AUMINNOBLK 4676 1.126 isaki * blocks. 4677 1.126 isaki * On the recording track, its capacity is one block. 4678 1.126 isaki */ 4679 1.126 isaki /* 4680 1.2 isaki * For references, one block size (in 40msec) is: 4681 1.2 isaki * 320 bytes = 204 blocks/64KB for mulaw/8kHz/1ch 4682 1.2 isaki * 7680 bytes = 8 blocks/64KB for s16/48kHz/2ch 4683 1.2 isaki * 30720 bytes = 90 KB/3blocks for s16/48kHz/8ch 4684 1.2 isaki * 61440 bytes = 180 KB/3blocks for s16/96kHz/8ch 4685 1.2 isaki * 245760 bytes = 720 KB/3blocks for s32/192kHz/8ch 4686 1.2 isaki * 4687 1.2 isaki * For example, 4688 1.2 isaki * 1) If usrbuf_blksize = 7056 (s16/44.1k/2ch) and PAGE_SIZE = 8192, 4689 1.2 isaki * newbufsize = rounddown(65536 / 7056) = 63504 4690 1.2 isaki * newvsize = roundup2(63504, PAGE_SIZE) = 65536 4691 1.2 isaki * Therefore it maps 8 * 8K pages and usrbuf->capacity = 63504. 4692 1.2 isaki * 4693 1.2 isaki * 2) If usrbuf_blksize = 7680 (s16/48k/2ch) and PAGE_SIZE = 4096, 4694 1.2 isaki * newbufsize = rounddown(65536 / 7680) = 61440 4695 1.2 isaki * newvsize = roundup2(61440, PAGE_SIZE) = 61440 (= 15 pages) 4696 1.2 isaki * Therefore it maps 15 * 4K pages and usrbuf->capacity = 61440. 4697 1.2 isaki */ 4698 1.2 isaki track->usrbuf_blksize = frametobyte(&track->usrbuf.fmt, 4699 1.2 isaki frame_per_block(track->mixer, &track->usrbuf.fmt)); 4700 1.2 isaki track->usrbuf.head = 0; 4701 1.2 isaki track->usrbuf.used = 0; 4702 1.126 isaki if (is_playback) { 4703 1.135 isaki newbufsize = track->usrbuf_blksize * AUMINNOBLK; 4704 1.135 isaki if (newbufsize < 65536) 4705 1.126 isaki newbufsize = rounddown(65536, track->usrbuf_blksize); 4706 1.135 isaki newvsize = roundup2(newbufsize, PAGE_SIZE); 4707 1.126 isaki } else { 4708 1.126 isaki newbufsize = track->usrbuf_blksize; 4709 1.135 isaki newvsize = track->usrbuf_blksize; 4710 1.126 isaki } 4711 1.135 isaki /* 4712 1.135 isaki * Reallocate only if the number of pages changes. 4713 1.135 isaki * This is because we expect kmem to allocate memory on per page 4714 1.135 isaki * basis if the request size is about 64KB. 4715 1.135 isaki */ 4716 1.135 isaki if (newvsize != track->usrbuf_allocsize) { 4717 1.135 isaki if (track->usrbuf_allocsize != 0) { 4718 1.135 isaki kmem_free(track->usrbuf.mem, track->usrbuf_allocsize); 4719 1.126 isaki } 4720 1.135 isaki TRACET(2, track, "usrbuf_allocsize %d -> %d", 4721 1.135 isaki track->usrbuf_allocsize, newvsize); 4722 1.135 isaki track->usrbuf.mem = kmem_alloc(newvsize, KM_SLEEP); 4723 1.135 isaki track->usrbuf_allocsize = newvsize; 4724 1.2 isaki } 4725 1.135 isaki track->usrbuf.capacity = newbufsize; 4726 1.2 isaki 4727 1.2 isaki /* Recalc water mark. */ 4728 1.126 isaki if (is_playback) { 4729 1.126 isaki /* Set high at 100%, low at 75%. */ 4730 1.126 isaki track->usrbuf_usedhigh = track->usrbuf.capacity; 4731 1.126 isaki track->usrbuf_usedlow = track->usrbuf.capacity * 3 / 4; 4732 1.126 isaki } else { 4733 1.126 isaki /* Set high at 100%, low at 0%. (But not used) */ 4734 1.126 isaki track->usrbuf_usedhigh = track->usrbuf.capacity; 4735 1.126 isaki track->usrbuf_usedlow = 0; 4736 1.2 isaki } 4737 1.2 isaki 4738 1.2 isaki /* Stage buffer */ 4739 1.126 isaki last_dst = &track->outbuf; 4740 1.126 isaki if (is_playback) { 4741 1.2 isaki /* On playback, initialize from the mixer side in order. */ 4742 1.2 isaki track->inputfmt = *usrfmt; 4743 1.2 isaki track->outbuf.fmt = track->mixer->track_fmt; 4744 1.2 isaki 4745 1.2 isaki if ((error = audio_track_init_freq(track, &last_dst)) != 0) 4746 1.2 isaki goto error; 4747 1.2 isaki if ((error = audio_track_init_chmix(track, &last_dst)) != 0) 4748 1.2 isaki goto error; 4749 1.2 isaki if ((error = audio_track_init_chvol(track, &last_dst)) != 0) 4750 1.2 isaki goto error; 4751 1.2 isaki if ((error = audio_track_init_codec(track, &last_dst)) != 0) 4752 1.2 isaki goto error; 4753 1.2 isaki } else { 4754 1.2 isaki /* On recording, initialize from userland side in order. */ 4755 1.2 isaki track->inputfmt = track->mixer->track_fmt; 4756 1.2 isaki track->outbuf.fmt = *usrfmt; 4757 1.2 isaki 4758 1.2 isaki if ((error = audio_track_init_codec(track, &last_dst)) != 0) 4759 1.2 isaki goto error; 4760 1.2 isaki if ((error = audio_track_init_chvol(track, &last_dst)) != 0) 4761 1.2 isaki goto error; 4762 1.2 isaki if ((error = audio_track_init_chmix(track, &last_dst)) != 0) 4763 1.2 isaki goto error; 4764 1.2 isaki if ((error = audio_track_init_freq(track, &last_dst)) != 0) 4765 1.2 isaki goto error; 4766 1.2 isaki } 4767 1.143 mlelstv 4768 1.143 mlelstv #if defined(AUDIO_DEBUG) 4769 1.143 mlelstv if (audiodebug >= 3) { 4770 1.143 mlelstv if (track->freq.filter) { 4771 1.143 mlelstv audio_print_format2("freq src", 4772 1.143 mlelstv &track->freq.srcbuf.fmt); 4773 1.143 mlelstv audio_print_format2("freq dst", 4774 1.143 mlelstv &track->freq.dst->fmt); 4775 1.143 mlelstv } 4776 1.143 mlelstv if (track->chmix.filter) { 4777 1.143 mlelstv audio_print_format2("chmix src", 4778 1.143 mlelstv &track->chmix.srcbuf.fmt); 4779 1.143 mlelstv audio_print_format2("chmix dst", 4780 1.143 mlelstv &track->chmix.dst->fmt); 4781 1.143 mlelstv } 4782 1.143 mlelstv if (track->chvol.filter) { 4783 1.143 mlelstv audio_print_format2("chvol src", 4784 1.143 mlelstv &track->chvol.srcbuf.fmt); 4785 1.143 mlelstv audio_print_format2("chvol dst", 4786 1.143 mlelstv &track->chvol.dst->fmt); 4787 1.143 mlelstv } 4788 1.143 mlelstv if (track->codec.filter) { 4789 1.143 mlelstv audio_print_format2("codec src", 4790 1.143 mlelstv &track->codec.srcbuf.fmt); 4791 1.143 mlelstv audio_print_format2("codec dst", 4792 1.143 mlelstv &track->codec.dst->fmt); 4793 1.143 mlelstv } 4794 1.2 isaki } 4795 1.143 mlelstv #endif /* AUDIO_DEBUG */ 4796 1.2 isaki 4797 1.2 isaki /* Stage input buffer */ 4798 1.2 isaki track->input = last_dst; 4799 1.2 isaki 4800 1.2 isaki /* 4801 1.2 isaki * Output buffer. 4802 1.2 isaki * On the playback track, its capacity is NBLKOUT blocks. 4803 1.2 isaki * On the recording track, its capacity is 1 block. 4804 1.2 isaki */ 4805 1.2 isaki track->outbuf.head = 0; 4806 1.2 isaki track->outbuf.used = 0; 4807 1.2 isaki track->outbuf.capacity = frame_per_block(track->mixer, 4808 1.2 isaki &track->outbuf.fmt); 4809 1.126 isaki if (is_playback) 4810 1.2 isaki track->outbuf.capacity *= NBLKOUT; 4811 1.2 isaki len = auring_bytelen(&track->outbuf); 4812 1.2 isaki track->outbuf.mem = audio_realloc(track->outbuf.mem, len); 4813 1.2 isaki 4814 1.126 isaki /* 4815 1.126 isaki * On the recording track, expand the input stage buffer, which is 4816 1.133 isaki * the closest buffer to rmixer, to NBLKIN blocks. 4817 1.126 isaki * Note that input buffer may point to outbuf. 4818 1.126 isaki */ 4819 1.126 isaki if (!is_playback) { 4820 1.126 isaki int input_fpb; 4821 1.126 isaki 4822 1.126 isaki input_fpb = frame_per_block(track->mixer, &track->input->fmt); 4823 1.126 isaki track->input->capacity = input_fpb * NBLKIN; 4824 1.126 isaki len = auring_bytelen(track->input); 4825 1.126 isaki track->input->mem = audio_realloc(track->input->mem, len); 4826 1.126 isaki } 4827 1.126 isaki 4828 1.2 isaki #if defined(AUDIO_DEBUG) 4829 1.2 isaki if (audiodebug >= 3) { 4830 1.2 isaki struct audio_track_debugbuf m; 4831 1.2 isaki 4832 1.2 isaki memset(&m, 0, sizeof(m)); 4833 1.2 isaki snprintf(m.outbuf, sizeof(m.outbuf), " out=%d", 4834 1.2 isaki track->outbuf.capacity * frametobyte(&track->outbuf.fmt,1)); 4835 1.2 isaki if (track->freq.filter) 4836 1.2 isaki snprintf(m.freq, sizeof(m.freq), " freq=%d", 4837 1.2 isaki track->freq.srcbuf.capacity * 4838 1.2 isaki frametobyte(&track->freq.srcbuf.fmt, 1)); 4839 1.2 isaki if (track->chmix.filter) 4840 1.2 isaki snprintf(m.chmix, sizeof(m.chmix), " chmix=%d", 4841 1.2 isaki track->chmix.srcbuf.capacity * 4842 1.2 isaki frametobyte(&track->chmix.srcbuf.fmt, 1)); 4843 1.2 isaki if (track->chvol.filter) 4844 1.2 isaki snprintf(m.chvol, sizeof(m.chvol), " chvol=%d", 4845 1.2 isaki track->chvol.srcbuf.capacity * 4846 1.2 isaki frametobyte(&track->chvol.srcbuf.fmt, 1)); 4847 1.2 isaki if (track->codec.filter) 4848 1.2 isaki snprintf(m.codec, sizeof(m.codec), " codec=%d", 4849 1.2 isaki track->codec.srcbuf.capacity * 4850 1.2 isaki frametobyte(&track->codec.srcbuf.fmt, 1)); 4851 1.2 isaki snprintf(m.usrbuf, sizeof(m.usrbuf), 4852 1.2 isaki " usr=%d", track->usrbuf.capacity); 4853 1.2 isaki 4854 1.126 isaki if (is_playback) { 4855 1.2 isaki TRACET(0, track, "bufsize%s%s%s%s%s%s", 4856 1.2 isaki m.outbuf, m.freq, m.chmix, 4857 1.2 isaki m.chvol, m.codec, m.usrbuf); 4858 1.2 isaki } else { 4859 1.2 isaki TRACET(0, track, "bufsize%s%s%s%s%s%s", 4860 1.2 isaki m.freq, m.chmix, m.chvol, 4861 1.2 isaki m.codec, m.outbuf, m.usrbuf); 4862 1.2 isaki } 4863 1.2 isaki } 4864 1.2 isaki #endif 4865 1.2 isaki return 0; 4866 1.2 isaki 4867 1.2 isaki error: 4868 1.2 isaki audio_free_usrbuf(track); 4869 1.2 isaki audio_free(track->codec.srcbuf.mem); 4870 1.2 isaki audio_free(track->chvol.srcbuf.mem); 4871 1.2 isaki audio_free(track->chmix.srcbuf.mem); 4872 1.2 isaki audio_free(track->freq.srcbuf.mem); 4873 1.2 isaki audio_free(track->outbuf.mem); 4874 1.2 isaki return error; 4875 1.2 isaki } 4876 1.2 isaki 4877 1.2 isaki /* 4878 1.2 isaki * Fill silence frames (as the internal format) up to 1 block 4879 1.2 isaki * if the ring is not empty and less than 1 block. 4880 1.2 isaki * It returns the number of appended frames. 4881 1.2 isaki */ 4882 1.2 isaki static int 4883 1.2 isaki audio_append_silence(audio_track_t *track, audio_ring_t *ring) 4884 1.2 isaki { 4885 1.2 isaki int fpb; 4886 1.2 isaki int n; 4887 1.2 isaki 4888 1.2 isaki KASSERT(track); 4889 1.2 isaki KASSERT(audio_format2_is_internal(&ring->fmt)); 4890 1.2 isaki 4891 1.2 isaki /* XXX is n correct? */ 4892 1.2 isaki /* XXX memset uses frametobyte()? */ 4893 1.2 isaki 4894 1.2 isaki if (ring->used == 0) 4895 1.2 isaki return 0; 4896 1.2 isaki 4897 1.2 isaki fpb = frame_per_block(track->mixer, &ring->fmt); 4898 1.2 isaki if (ring->used >= fpb) 4899 1.2 isaki return 0; 4900 1.2 isaki 4901 1.2 isaki n = (ring->capacity - ring->used) % fpb; 4902 1.2 isaki 4903 1.47 isaki KASSERTMSG(auring_get_contig_free(ring) >= n, 4904 1.47 isaki "auring_get_contig_free(ring)=%d n=%d", 4905 1.47 isaki auring_get_contig_free(ring), n); 4906 1.2 isaki 4907 1.2 isaki memset(auring_tailptr_aint(ring), 0, 4908 1.2 isaki n * ring->fmt.channels * sizeof(aint_t)); 4909 1.2 isaki auring_push(ring, n); 4910 1.2 isaki return n; 4911 1.2 isaki } 4912 1.2 isaki 4913 1.2 isaki /* 4914 1.2 isaki * Execute the conversion stage. 4915 1.2 isaki * It prepares arg from this stage and executes stage->filter. 4916 1.2 isaki * It must be called only if stage->filter is not NULL. 4917 1.2 isaki * 4918 1.2 isaki * For stages other than frequency conversion, the function increments 4919 1.2 isaki * src and dst counters here. For frequency conversion stage, on the 4920 1.2 isaki * other hand, the function does not touch src and dst counters and 4921 1.2 isaki * filter side has to increment them. 4922 1.2 isaki */ 4923 1.2 isaki static void 4924 1.2 isaki audio_apply_stage(audio_track_t *track, audio_stage_t *stage, bool isfreq) 4925 1.2 isaki { 4926 1.2 isaki audio_filter_arg_t *arg; 4927 1.2 isaki int srccount; 4928 1.2 isaki int dstcount; 4929 1.2 isaki int count; 4930 1.2 isaki 4931 1.2 isaki KASSERT(track); 4932 1.2 isaki KASSERT(stage->filter); 4933 1.2 isaki 4934 1.2 isaki srccount = auring_get_contig_used(&stage->srcbuf); 4935 1.2 isaki dstcount = auring_get_contig_free(stage->dst); 4936 1.2 isaki 4937 1.2 isaki if (isfreq) { 4938 1.47 isaki KASSERTMSG(srccount > 0, "freq but srccount=%d", srccount); 4939 1.2 isaki count = uimin(dstcount, track->mixer->frames_per_block); 4940 1.2 isaki } else { 4941 1.2 isaki count = uimin(srccount, dstcount); 4942 1.2 isaki } 4943 1.2 isaki 4944 1.2 isaki if (count > 0) { 4945 1.2 isaki arg = &stage->arg; 4946 1.2 isaki arg->src = auring_headptr(&stage->srcbuf); 4947 1.2 isaki arg->dst = auring_tailptr(stage->dst); 4948 1.2 isaki arg->count = count; 4949 1.2 isaki 4950 1.2 isaki stage->filter(arg); 4951 1.2 isaki 4952 1.2 isaki if (!isfreq) { 4953 1.2 isaki auring_take(&stage->srcbuf, count); 4954 1.2 isaki auring_push(stage->dst, count); 4955 1.2 isaki } 4956 1.2 isaki } 4957 1.2 isaki } 4958 1.2 isaki 4959 1.2 isaki /* 4960 1.2 isaki * Produce output buffer for playback from user input buffer. 4961 1.2 isaki * It must be called only if usrbuf is not empty and outbuf is 4962 1.2 isaki * available at least one free block. 4963 1.2 isaki */ 4964 1.2 isaki static void 4965 1.2 isaki audio_track_play(audio_track_t *track) 4966 1.2 isaki { 4967 1.2 isaki audio_ring_t *usrbuf; 4968 1.2 isaki audio_ring_t *input; 4969 1.2 isaki int count; 4970 1.2 isaki int framesize; 4971 1.2 isaki int bytes; 4972 1.2 isaki 4973 1.2 isaki KASSERT(track); 4974 1.2 isaki KASSERT(track->lock); 4975 1.2 isaki TRACET(4, track, "start pstate=%d", track->pstate); 4976 1.2 isaki 4977 1.2 isaki /* At this point usrbuf must not be empty. */ 4978 1.2 isaki KASSERT(track->usrbuf.used > 0); 4979 1.2 isaki /* Also, outbuf must be available at least one block. */ 4980 1.2 isaki count = auring_get_contig_free(&track->outbuf); 4981 1.2 isaki KASSERTMSG(count >= frame_per_block(track->mixer, &track->outbuf.fmt), 4982 1.2 isaki "count=%d fpb=%d", 4983 1.2 isaki count, frame_per_block(track->mixer, &track->outbuf.fmt)); 4984 1.2 isaki 4985 1.2 isaki usrbuf = &track->usrbuf; 4986 1.2 isaki input = track->input; 4987 1.2 isaki 4988 1.2 isaki /* 4989 1.2 isaki * framesize is always 1 byte or more since all formats supported as 4990 1.2 isaki * usrfmt(=input) have 8bit or more stride. 4991 1.2 isaki */ 4992 1.2 isaki framesize = frametobyte(&input->fmt, 1); 4993 1.2 isaki KASSERT(framesize >= 1); 4994 1.2 isaki 4995 1.2 isaki /* The next stage of usrbuf (=input) must be available. */ 4996 1.2 isaki KASSERT(auring_get_contig_free(input) > 0); 4997 1.2 isaki 4998 1.2 isaki /* 4999 1.2 isaki * Copy usrbuf up to 1block to input buffer. 5000 1.2 isaki * count is the number of frames to copy from usrbuf. 5001 1.2 isaki * bytes is the number of bytes to copy from usrbuf. However it is 5002 1.2 isaki * not copied less than one frame. 5003 1.2 isaki */ 5004 1.2 isaki count = uimin(usrbuf->used, track->usrbuf_blksize) / framesize; 5005 1.2 isaki bytes = count * framesize; 5006 1.2 isaki 5007 1.2 isaki if (usrbuf->head + bytes < usrbuf->capacity) { 5008 1.2 isaki memcpy((uint8_t *)input->mem + auring_tail(input) * framesize, 5009 1.2 isaki (uint8_t *)usrbuf->mem + usrbuf->head, 5010 1.2 isaki bytes); 5011 1.2 isaki auring_push(input, count); 5012 1.2 isaki auring_take(usrbuf, bytes); 5013 1.2 isaki } else { 5014 1.2 isaki int bytes1; 5015 1.2 isaki int bytes2; 5016 1.2 isaki 5017 1.2 isaki bytes1 = auring_get_contig_used(usrbuf); 5018 1.47 isaki KASSERTMSG(bytes1 % framesize == 0, 5019 1.47 isaki "bytes1=%d framesize=%d", bytes1, framesize); 5020 1.2 isaki memcpy((uint8_t *)input->mem + auring_tail(input) * framesize, 5021 1.2 isaki (uint8_t *)usrbuf->mem + usrbuf->head, 5022 1.2 isaki bytes1); 5023 1.2 isaki auring_push(input, bytes1 / framesize); 5024 1.2 isaki auring_take(usrbuf, bytes1); 5025 1.2 isaki 5026 1.2 isaki bytes2 = bytes - bytes1; 5027 1.2 isaki memcpy((uint8_t *)input->mem + auring_tail(input) * framesize, 5028 1.2 isaki (uint8_t *)usrbuf->mem + usrbuf->head, 5029 1.2 isaki bytes2); 5030 1.2 isaki auring_push(input, bytes2 / framesize); 5031 1.2 isaki auring_take(usrbuf, bytes2); 5032 1.2 isaki } 5033 1.2 isaki 5034 1.2 isaki /* Encoding conversion */ 5035 1.2 isaki if (track->codec.filter) 5036 1.2 isaki audio_apply_stage(track, &track->codec, false); 5037 1.2 isaki 5038 1.2 isaki /* Channel volume */ 5039 1.2 isaki if (track->chvol.filter) 5040 1.2 isaki audio_apply_stage(track, &track->chvol, false); 5041 1.2 isaki 5042 1.2 isaki /* Channel mix */ 5043 1.2 isaki if (track->chmix.filter) 5044 1.2 isaki audio_apply_stage(track, &track->chmix, false); 5045 1.2 isaki 5046 1.2 isaki /* Frequency conversion */ 5047 1.2 isaki /* 5048 1.2 isaki * Since the frequency conversion needs correction for each block, 5049 1.2 isaki * it rounds up to 1 block. 5050 1.2 isaki */ 5051 1.2 isaki if (track->freq.filter) { 5052 1.2 isaki int n; 5053 1.2 isaki n = audio_append_silence(track, &track->freq.srcbuf); 5054 1.2 isaki if (n > 0) { 5055 1.2 isaki TRACET(4, track, 5056 1.2 isaki "freq.srcbuf add silence %d -> %d/%d/%d", 5057 1.2 isaki n, 5058 1.2 isaki track->freq.srcbuf.head, 5059 1.2 isaki track->freq.srcbuf.used, 5060 1.2 isaki track->freq.srcbuf.capacity); 5061 1.2 isaki } 5062 1.2 isaki if (track->freq.srcbuf.used > 0) { 5063 1.2 isaki audio_apply_stage(track, &track->freq, true); 5064 1.2 isaki } 5065 1.2 isaki } 5066 1.2 isaki 5067 1.18 isaki if (bytes < track->usrbuf_blksize) { 5068 1.2 isaki /* 5069 1.2 isaki * Clear all conversion buffer pointer if the conversion was 5070 1.2 isaki * not exactly one block. These conversion stage buffers are 5071 1.2 isaki * certainly circular buffers because of symmetry with the 5072 1.2 isaki * previous and next stage buffer. However, since they are 5073 1.2 isaki * treated as simple contiguous buffers in operation, so head 5074 1.2 isaki * always should point 0. This may happen during drain-age. 5075 1.2 isaki */ 5076 1.2 isaki TRACET(4, track, "reset stage"); 5077 1.2 isaki if (track->codec.filter) { 5078 1.2 isaki KASSERT(track->codec.srcbuf.used == 0); 5079 1.2 isaki track->codec.srcbuf.head = 0; 5080 1.2 isaki } 5081 1.2 isaki if (track->chvol.filter) { 5082 1.2 isaki KASSERT(track->chvol.srcbuf.used == 0); 5083 1.2 isaki track->chvol.srcbuf.head = 0; 5084 1.2 isaki } 5085 1.2 isaki if (track->chmix.filter) { 5086 1.2 isaki KASSERT(track->chmix.srcbuf.used == 0); 5087 1.2 isaki track->chmix.srcbuf.head = 0; 5088 1.2 isaki } 5089 1.2 isaki if (track->freq.filter) { 5090 1.2 isaki KASSERT(track->freq.srcbuf.used == 0); 5091 1.2 isaki track->freq.srcbuf.head = 0; 5092 1.2 isaki } 5093 1.2 isaki } 5094 1.2 isaki 5095 1.127 isaki track->stamp++; 5096 1.127 isaki 5097 1.2 isaki #if defined(AUDIO_DEBUG) 5098 1.2 isaki if (audiodebug >= 3) { 5099 1.2 isaki struct audio_track_debugbuf m; 5100 1.2 isaki audio_track_bufstat(track, &m); 5101 1.2 isaki TRACET(0, track, "end%s%s%s%s%s%s", 5102 1.2 isaki m.outbuf, m.freq, m.chvol, m.chmix, m.codec, m.usrbuf); 5103 1.2 isaki } 5104 1.2 isaki #endif 5105 1.2 isaki } 5106 1.2 isaki 5107 1.2 isaki /* 5108 1.2 isaki * Produce user output buffer for recording from input buffer. 5109 1.2 isaki */ 5110 1.2 isaki static void 5111 1.2 isaki audio_track_record(audio_track_t *track) 5112 1.2 isaki { 5113 1.2 isaki audio_ring_t *outbuf; 5114 1.2 isaki audio_ring_t *usrbuf; 5115 1.2 isaki int count; 5116 1.2 isaki int bytes; 5117 1.2 isaki int framesize; 5118 1.2 isaki 5119 1.2 isaki KASSERT(track); 5120 1.2 isaki KASSERT(track->lock); 5121 1.2 isaki 5122 1.118 isaki if (auring_get_contig_used(track->input) == 0) { 5123 1.118 isaki TRACET(4, track, "input->used == 0"); 5124 1.2 isaki return; 5125 1.2 isaki } 5126 1.2 isaki 5127 1.2 isaki /* Frequency conversion */ 5128 1.2 isaki if (track->freq.filter) { 5129 1.2 isaki if (track->freq.srcbuf.used > 0) { 5130 1.2 isaki audio_apply_stage(track, &track->freq, true); 5131 1.2 isaki /* XXX should input of freq be from beginning of buf? */ 5132 1.2 isaki } 5133 1.2 isaki } 5134 1.2 isaki 5135 1.2 isaki /* Channel mix */ 5136 1.2 isaki if (track->chmix.filter) 5137 1.2 isaki audio_apply_stage(track, &track->chmix, false); 5138 1.2 isaki 5139 1.2 isaki /* Channel volume */ 5140 1.2 isaki if (track->chvol.filter) 5141 1.2 isaki audio_apply_stage(track, &track->chvol, false); 5142 1.2 isaki 5143 1.2 isaki /* Encoding conversion */ 5144 1.2 isaki if (track->codec.filter) 5145 1.2 isaki audio_apply_stage(track, &track->codec, false); 5146 1.2 isaki 5147 1.2 isaki /* Copy outbuf to usrbuf */ 5148 1.2 isaki outbuf = &track->outbuf; 5149 1.2 isaki usrbuf = &track->usrbuf; 5150 1.126 isaki /* usrbuf should be empty. */ 5151 1.126 isaki KASSERT(usrbuf->used == 0); 5152 1.2 isaki /* 5153 1.2 isaki * framesize is always 1 byte or more since all formats supported 5154 1.2 isaki * as usrfmt(=output) have 8bit or more stride. 5155 1.2 isaki */ 5156 1.2 isaki framesize = frametobyte(&outbuf->fmt, 1); 5157 1.2 isaki KASSERT(framesize >= 1); 5158 1.2 isaki /* 5159 1.2 isaki * count is the number of frames to copy to usrbuf. 5160 1.2 isaki * bytes is the number of bytes to copy to usrbuf. 5161 1.2 isaki */ 5162 1.2 isaki count = outbuf->used; 5163 1.116 isaki count = uimin(count, track->usrbuf_blksize / framesize); 5164 1.2 isaki bytes = count * framesize; 5165 1.2 isaki if (auring_tail(usrbuf) + bytes < usrbuf->capacity) { 5166 1.2 isaki memcpy((uint8_t *)usrbuf->mem + auring_tail(usrbuf), 5167 1.2 isaki (uint8_t *)outbuf->mem + outbuf->head * framesize, 5168 1.2 isaki bytes); 5169 1.2 isaki auring_push(usrbuf, bytes); 5170 1.2 isaki auring_take(outbuf, count); 5171 1.2 isaki } else { 5172 1.2 isaki int bytes1; 5173 1.2 isaki int bytes2; 5174 1.2 isaki 5175 1.33 isaki bytes1 = auring_get_contig_free(usrbuf); 5176 1.47 isaki KASSERTMSG(bytes1 % framesize == 0, 5177 1.47 isaki "bytes1=%d framesize=%d", bytes1, framesize); 5178 1.2 isaki memcpy((uint8_t *)usrbuf->mem + auring_tail(usrbuf), 5179 1.2 isaki (uint8_t *)outbuf->mem + outbuf->head * framesize, 5180 1.2 isaki bytes1); 5181 1.2 isaki auring_push(usrbuf, bytes1); 5182 1.2 isaki auring_take(outbuf, bytes1 / framesize); 5183 1.2 isaki 5184 1.2 isaki bytes2 = bytes - bytes1; 5185 1.2 isaki memcpy((uint8_t *)usrbuf->mem + auring_tail(usrbuf), 5186 1.2 isaki (uint8_t *)outbuf->mem + outbuf->head * framesize, 5187 1.2 isaki bytes2); 5188 1.2 isaki auring_push(usrbuf, bytes2); 5189 1.2 isaki auring_take(outbuf, bytes2 / framesize); 5190 1.2 isaki } 5191 1.2 isaki 5192 1.2 isaki #if defined(AUDIO_DEBUG) 5193 1.2 isaki if (audiodebug >= 3) { 5194 1.2 isaki struct audio_track_debugbuf m; 5195 1.2 isaki audio_track_bufstat(track, &m); 5196 1.2 isaki TRACET(0, track, "end%s%s%s%s%s%s", 5197 1.2 isaki m.freq, m.chvol, m.chmix, m.codec, m.outbuf, m.usrbuf); 5198 1.2 isaki } 5199 1.2 isaki #endif 5200 1.2 isaki } 5201 1.2 isaki 5202 1.2 isaki /* 5203 1.79 isaki * Calculate blktime [msec] from mixer(.hwbuf.fmt). 5204 1.63 isaki * Must be called with sc_exlock held. 5205 1.2 isaki */ 5206 1.2 isaki static u_int 5207 1.2 isaki audio_mixer_calc_blktime(struct audio_softc *sc, audio_trackmixer_t *mixer) 5208 1.2 isaki { 5209 1.2 isaki audio_format2_t *fmt; 5210 1.2 isaki u_int blktime; 5211 1.2 isaki u_int frames_per_block; 5212 1.2 isaki 5213 1.63 isaki KASSERT(sc->sc_exlock); 5214 1.2 isaki 5215 1.2 isaki fmt = &mixer->hwbuf.fmt; 5216 1.2 isaki blktime = sc->sc_blk_ms; 5217 1.2 isaki 5218 1.2 isaki /* 5219 1.2 isaki * If stride is not multiples of 8, special treatment is necessary. 5220 1.2 isaki * For now, it is only x68k's vs(4), 4 bit/sample ADPCM. 5221 1.2 isaki */ 5222 1.2 isaki if (fmt->stride == 4) { 5223 1.2 isaki frames_per_block = fmt->sample_rate * blktime / 1000; 5224 1.2 isaki if ((frames_per_block & 1) != 0) 5225 1.2 isaki blktime *= 2; 5226 1.2 isaki } 5227 1.2 isaki #ifdef DIAGNOSTIC 5228 1.2 isaki else if (fmt->stride % NBBY != 0) { 5229 1.2 isaki panic("unsupported HW stride %d", fmt->stride); 5230 1.2 isaki } 5231 1.2 isaki #endif 5232 1.2 isaki 5233 1.2 isaki return blktime; 5234 1.2 isaki } 5235 1.2 isaki 5236 1.2 isaki /* 5237 1.2 isaki * Initialize the mixer corresponding to the mode. 5238 1.2 isaki * Set AUMODE_PLAY to the 'mode' for playback or AUMODE_RECORD for recording. 5239 1.2 isaki * sc->sc_[pr]mixer (corresponding to the 'mode') must be zero-filled. 5240 1.36 msaitoh * This function returns 0 on successful. Otherwise returns errno. 5241 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 5242 1.2 isaki */ 5243 1.2 isaki static int 5244 1.2 isaki audio_mixer_init(struct audio_softc *sc, int mode, 5245 1.2 isaki const audio_format2_t *hwfmt, const audio_filter_reg_t *reg) 5246 1.2 isaki { 5247 1.2 isaki char codecbuf[64]; 5248 1.67 isaki char blkdmsbuf[8]; 5249 1.2 isaki audio_trackmixer_t *mixer; 5250 1.2 isaki void (*softint_handler)(void *); 5251 1.2 isaki int len; 5252 1.2 isaki int blksize; 5253 1.2 isaki int capacity; 5254 1.2 isaki size_t bufsize; 5255 1.2 isaki int hwblks; 5256 1.2 isaki int blkms; 5257 1.67 isaki int blkdms; 5258 1.2 isaki int error; 5259 1.2 isaki 5260 1.2 isaki KASSERT(hwfmt != NULL); 5261 1.2 isaki KASSERT(reg != NULL); 5262 1.63 isaki KASSERT(sc->sc_exlock); 5263 1.2 isaki 5264 1.2 isaki error = 0; 5265 1.2 isaki if (mode == AUMODE_PLAY) 5266 1.2 isaki mixer = sc->sc_pmixer; 5267 1.2 isaki else 5268 1.2 isaki mixer = sc->sc_rmixer; 5269 1.2 isaki 5270 1.2 isaki mixer->sc = sc; 5271 1.2 isaki mixer->mode = mode; 5272 1.2 isaki 5273 1.2 isaki mixer->hwbuf.fmt = *hwfmt; 5274 1.2 isaki mixer->volume = 256; 5275 1.2 isaki mixer->blktime_d = 1000; 5276 1.2 isaki mixer->blktime_n = audio_mixer_calc_blktime(sc, mixer); 5277 1.2 isaki sc->sc_blk_ms = mixer->blktime_n; 5278 1.2 isaki hwblks = NBLKHW; 5279 1.2 isaki 5280 1.2 isaki mixer->frames_per_block = frame_per_block(mixer, &mixer->hwbuf.fmt); 5281 1.2 isaki blksize = frametobyte(&mixer->hwbuf.fmt, mixer->frames_per_block); 5282 1.2 isaki if (sc->hw_if->round_blocksize) { 5283 1.2 isaki int rounded; 5284 1.2 isaki audio_params_t p = format2_to_params(&mixer->hwbuf.fmt); 5285 1.63 isaki mutex_enter(sc->sc_lock); 5286 1.2 isaki rounded = sc->hw_if->round_blocksize(sc->hw_hdl, blksize, 5287 1.2 isaki mode, &p); 5288 1.63 isaki mutex_exit(sc->sc_lock); 5289 1.31 isaki TRACE(1, "round_blocksize %d -> %d", blksize, rounded); 5290 1.2 isaki if (rounded != blksize) { 5291 1.2 isaki if ((rounded * NBBY) % (mixer->hwbuf.fmt.stride * 5292 1.2 isaki mixer->hwbuf.fmt.channels) != 0) { 5293 1.88 isaki audio_printf(sc, 5294 1.88 isaki "round_blocksize returned blocksize " 5295 1.88 isaki "indivisible by framesize: " 5296 1.61 isaki "blksize=%d rounded=%d " 5297 1.61 isaki "stride=%ubit channels=%u\n", 5298 1.61 isaki blksize, rounded, 5299 1.61 isaki mixer->hwbuf.fmt.stride, 5300 1.61 isaki mixer->hwbuf.fmt.channels); 5301 1.2 isaki return EINVAL; 5302 1.2 isaki } 5303 1.2 isaki /* Recalculation */ 5304 1.2 isaki blksize = rounded; 5305 1.2 isaki mixer->frames_per_block = blksize * NBBY / 5306 1.2 isaki (mixer->hwbuf.fmt.stride * 5307 1.2 isaki mixer->hwbuf.fmt.channels); 5308 1.2 isaki } 5309 1.2 isaki } 5310 1.2 isaki mixer->blktime_n = mixer->frames_per_block; 5311 1.2 isaki mixer->blktime_d = mixer->hwbuf.fmt.sample_rate; 5312 1.2 isaki 5313 1.2 isaki capacity = mixer->frames_per_block * hwblks; 5314 1.2 isaki bufsize = frametobyte(&mixer->hwbuf.fmt, capacity); 5315 1.2 isaki if (sc->hw_if->round_buffersize) { 5316 1.2 isaki size_t rounded; 5317 1.63 isaki mutex_enter(sc->sc_lock); 5318 1.2 isaki rounded = sc->hw_if->round_buffersize(sc->hw_hdl, mode, 5319 1.2 isaki bufsize); 5320 1.63 isaki mutex_exit(sc->sc_lock); 5321 1.31 isaki TRACE(1, "round_buffersize %zd -> %zd", bufsize, rounded); 5322 1.2 isaki if (rounded < bufsize) { 5323 1.2 isaki /* buffersize needs NBLKHW blocks at least. */ 5324 1.88 isaki audio_printf(sc, 5325 1.88 isaki "round_buffersize returned too small buffersize: " 5326 1.88 isaki "buffersize=%zd blksize=%d\n", 5327 1.2 isaki rounded, blksize); 5328 1.2 isaki return EINVAL; 5329 1.2 isaki } 5330 1.2 isaki if (rounded % blksize != 0) { 5331 1.2 isaki /* buffersize/blksize constraint mismatch? */ 5332 1.88 isaki audio_printf(sc, 5333 1.88 isaki "round_buffersize returned buffersize indivisible " 5334 1.88 isaki "by blksize: buffersize=%zu blksize=%d\n", 5335 1.2 isaki rounded, blksize); 5336 1.2 isaki return EINVAL; 5337 1.2 isaki } 5338 1.2 isaki if (rounded != bufsize) { 5339 1.79 isaki /* Recalculation */ 5340 1.2 isaki bufsize = rounded; 5341 1.2 isaki hwblks = bufsize / blksize; 5342 1.2 isaki capacity = mixer->frames_per_block * hwblks; 5343 1.2 isaki } 5344 1.2 isaki } 5345 1.31 isaki TRACE(1, "buffersize for %s = %zu", 5346 1.2 isaki (mode == AUMODE_PLAY) ? "playback" : "recording", 5347 1.2 isaki bufsize); 5348 1.2 isaki mixer->hwbuf.capacity = capacity; 5349 1.2 isaki 5350 1.2 isaki if (sc->hw_if->allocm) { 5351 1.64 isaki /* sc_lock is not necessary for allocm */ 5352 1.2 isaki mixer->hwbuf.mem = sc->hw_if->allocm(sc->hw_hdl, mode, bufsize); 5353 1.2 isaki if (mixer->hwbuf.mem == NULL) { 5354 1.88 isaki audio_printf(sc, "allocm(%zu) failed\n", bufsize); 5355 1.2 isaki return ENOMEM; 5356 1.2 isaki } 5357 1.2 isaki } else { 5358 1.28 isaki mixer->hwbuf.mem = kmem_alloc(bufsize, KM_SLEEP); 5359 1.2 isaki } 5360 1.2 isaki 5361 1.2 isaki /* From here, audio_mixer_destroy is necessary to exit. */ 5362 1.2 isaki if (mode == AUMODE_PLAY) { 5363 1.2 isaki cv_init(&mixer->outcv, "audiowr"); 5364 1.2 isaki } else { 5365 1.2 isaki cv_init(&mixer->outcv, "audiord"); 5366 1.2 isaki } 5367 1.2 isaki 5368 1.2 isaki if (mode == AUMODE_PLAY) { 5369 1.2 isaki softint_handler = audio_softintr_wr; 5370 1.2 isaki } else { 5371 1.2 isaki softint_handler = audio_softintr_rd; 5372 1.2 isaki } 5373 1.2 isaki mixer->sih = softint_establish(SOFTINT_SERIAL | SOFTINT_MPSAFE, 5374 1.2 isaki softint_handler, sc); 5375 1.2 isaki if (mixer->sih == NULL) { 5376 1.2 isaki device_printf(sc->sc_dev, "softint_establish failed\n"); 5377 1.2 isaki goto abort; 5378 1.2 isaki } 5379 1.2 isaki 5380 1.2 isaki mixer->track_fmt.encoding = AUDIO_ENCODING_SLINEAR_NE; 5381 1.2 isaki mixer->track_fmt.precision = AUDIO_INTERNAL_BITS; 5382 1.2 isaki mixer->track_fmt.stride = AUDIO_INTERNAL_BITS; 5383 1.2 isaki mixer->track_fmt.channels = mixer->hwbuf.fmt.channels; 5384 1.2 isaki mixer->track_fmt.sample_rate = mixer->hwbuf.fmt.sample_rate; 5385 1.2 isaki 5386 1.2 isaki if (mixer->hwbuf.fmt.encoding == AUDIO_ENCODING_SLINEAR_OE && 5387 1.2 isaki mixer->hwbuf.fmt.precision == AUDIO_INTERNAL_BITS) { 5388 1.2 isaki mixer->swap_endian = true; 5389 1.2 isaki TRACE(1, "swap_endian"); 5390 1.2 isaki } 5391 1.2 isaki 5392 1.2 isaki if (mode == AUMODE_PLAY) { 5393 1.2 isaki /* Mixing buffer */ 5394 1.2 isaki mixer->mixfmt = mixer->track_fmt; 5395 1.2 isaki mixer->mixfmt.precision *= 2; 5396 1.2 isaki mixer->mixfmt.stride *= 2; 5397 1.2 isaki /* XXX TODO: use some macros? */ 5398 1.2 isaki len = mixer->frames_per_block * mixer->mixfmt.channels * 5399 1.2 isaki mixer->mixfmt.stride / NBBY; 5400 1.2 isaki mixer->mixsample = audio_realloc(mixer->mixsample, len); 5401 1.140 mlelstv } else if (reg->codec == NULL) { 5402 1.140 mlelstv /* 5403 1.140 mlelstv * Recording requires an input conversion buffer 5404 1.140 mlelstv * unless the hardware provides a codec itself 5405 1.140 mlelstv */ 5406 1.140 mlelstv mixer->mixfmt = mixer->track_fmt; 5407 1.140 mlelstv len = mixer->frames_per_block * mixer->mixfmt.channels * 5408 1.140 mlelstv mixer->mixfmt.stride / NBBY; 5409 1.140 mlelstv mixer->mixsample = audio_realloc(mixer->mixsample, len); 5410 1.2 isaki } 5411 1.2 isaki 5412 1.2 isaki if (reg->codec) { 5413 1.2 isaki mixer->codec = reg->codec; 5414 1.2 isaki mixer->codecarg.context = reg->context; 5415 1.2 isaki if (mode == AUMODE_PLAY) { 5416 1.2 isaki mixer->codecarg.srcfmt = &mixer->track_fmt; 5417 1.2 isaki mixer->codecarg.dstfmt = &mixer->hwbuf.fmt; 5418 1.2 isaki } else { 5419 1.2 isaki mixer->codecarg.srcfmt = &mixer->hwbuf.fmt; 5420 1.2 isaki mixer->codecarg.dstfmt = &mixer->track_fmt; 5421 1.2 isaki } 5422 1.2 isaki mixer->codecbuf.fmt = mixer->track_fmt; 5423 1.2 isaki mixer->codecbuf.capacity = mixer->frames_per_block; 5424 1.2 isaki len = auring_bytelen(&mixer->codecbuf); 5425 1.2 isaki mixer->codecbuf.mem = audio_realloc(mixer->codecbuf.mem, len); 5426 1.2 isaki } 5427 1.2 isaki 5428 1.2 isaki /* Succeeded so display it. */ 5429 1.2 isaki codecbuf[0] = '\0'; 5430 1.2 isaki if (mixer->codec || mixer->swap_endian) { 5431 1.2 isaki snprintf(codecbuf, sizeof(codecbuf), " %s %s:%d", 5432 1.2 isaki (mode == AUMODE_PLAY) ? "->" : "<-", 5433 1.2 isaki audio_encoding_name(mixer->hwbuf.fmt.encoding), 5434 1.2 isaki mixer->hwbuf.fmt.precision); 5435 1.2 isaki } 5436 1.2 isaki blkms = mixer->blktime_n * 1000 / mixer->blktime_d; 5437 1.67 isaki blkdms = (mixer->blktime_n * 10000 / mixer->blktime_d) % 10; 5438 1.67 isaki blkdmsbuf[0] = '\0'; 5439 1.67 isaki if (blkdms != 0) { 5440 1.67 isaki snprintf(blkdmsbuf, sizeof(blkdmsbuf), ".%1d", blkdms); 5441 1.67 isaki } 5442 1.67 isaki aprint_normal_dev(sc->sc_dev, 5443 1.67 isaki "%s:%d%s %dch %dHz, blk %d bytes (%d%sms) for %s\n", 5444 1.2 isaki audio_encoding_name(mixer->track_fmt.encoding), 5445 1.2 isaki mixer->track_fmt.precision, 5446 1.2 isaki codecbuf, 5447 1.2 isaki mixer->track_fmt.channels, 5448 1.2 isaki mixer->track_fmt.sample_rate, 5449 1.67 isaki blksize, 5450 1.67 isaki blkms, blkdmsbuf, 5451 1.2 isaki (mode == AUMODE_PLAY) ? "playback" : "recording"); 5452 1.2 isaki 5453 1.2 isaki return 0; 5454 1.2 isaki 5455 1.2 isaki abort: 5456 1.2 isaki audio_mixer_destroy(sc, mixer); 5457 1.2 isaki return error; 5458 1.2 isaki } 5459 1.2 isaki 5460 1.2 isaki /* 5461 1.2 isaki * Releases all resources of 'mixer'. 5462 1.2 isaki * Note that it does not release the memory area of 'mixer' itself. 5463 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 5464 1.2 isaki */ 5465 1.2 isaki static void 5466 1.2 isaki audio_mixer_destroy(struct audio_softc *sc, audio_trackmixer_t *mixer) 5467 1.2 isaki { 5468 1.27 isaki int bufsize; 5469 1.2 isaki 5470 1.63 isaki KASSERT(sc->sc_exlock == 1); 5471 1.2 isaki 5472 1.27 isaki bufsize = frametobyte(&mixer->hwbuf.fmt, mixer->hwbuf.capacity); 5473 1.2 isaki 5474 1.2 isaki if (mixer->hwbuf.mem != NULL) { 5475 1.2 isaki if (sc->hw_if->freem) { 5476 1.64 isaki /* sc_lock is not necessary for freem */ 5477 1.27 isaki sc->hw_if->freem(sc->hw_hdl, mixer->hwbuf.mem, bufsize); 5478 1.2 isaki } else { 5479 1.28 isaki kmem_free(mixer->hwbuf.mem, bufsize); 5480 1.2 isaki } 5481 1.2 isaki mixer->hwbuf.mem = NULL; 5482 1.2 isaki } 5483 1.2 isaki 5484 1.2 isaki audio_free(mixer->codecbuf.mem); 5485 1.2 isaki audio_free(mixer->mixsample); 5486 1.2 isaki 5487 1.2 isaki cv_destroy(&mixer->outcv); 5488 1.2 isaki 5489 1.2 isaki if (mixer->sih) { 5490 1.2 isaki softint_disestablish(mixer->sih); 5491 1.2 isaki mixer->sih = NULL; 5492 1.2 isaki } 5493 1.2 isaki } 5494 1.2 isaki 5495 1.2 isaki /* 5496 1.2 isaki * Starts playback mixer. 5497 1.2 isaki * Must be called only if sc_pbusy is false. 5498 1.50 isaki * Must be called with sc_lock && sc_exlock held. 5499 1.2 isaki * Must not be called from the interrupt context. 5500 1.2 isaki */ 5501 1.2 isaki static void 5502 1.2 isaki audio_pmixer_start(struct audio_softc *sc, bool force) 5503 1.2 isaki { 5504 1.2 isaki audio_trackmixer_t *mixer; 5505 1.2 isaki int minimum; 5506 1.2 isaki 5507 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 5508 1.50 isaki KASSERT(sc->sc_exlock); 5509 1.2 isaki KASSERT(sc->sc_pbusy == false); 5510 1.2 isaki 5511 1.2 isaki mutex_enter(sc->sc_intr_lock); 5512 1.2 isaki 5513 1.2 isaki mixer = sc->sc_pmixer; 5514 1.2 isaki TRACE(2, "%smixseq=%d hwseq=%d hwbuf=%d/%d/%d%s", 5515 1.2 isaki (audiodebug >= 3) ? "begin " : "", 5516 1.2 isaki (int)mixer->mixseq, (int)mixer->hwseq, 5517 1.2 isaki mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity, 5518 1.2 isaki force ? " force" : ""); 5519 1.2 isaki 5520 1.2 isaki /* Need two blocks to start normally. */ 5521 1.2 isaki minimum = (force) ? 1 : 2; 5522 1.2 isaki while (mixer->hwbuf.used < mixer->frames_per_block * minimum) { 5523 1.2 isaki audio_pmixer_process(sc); 5524 1.2 isaki } 5525 1.2 isaki 5526 1.2 isaki /* Start output */ 5527 1.2 isaki audio_pmixer_output(sc); 5528 1.2 isaki sc->sc_pbusy = true; 5529 1.2 isaki 5530 1.2 isaki TRACE(3, "end mixseq=%d hwseq=%d hwbuf=%d/%d/%d", 5531 1.2 isaki (int)mixer->mixseq, (int)mixer->hwseq, 5532 1.2 isaki mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity); 5533 1.2 isaki 5534 1.2 isaki mutex_exit(sc->sc_intr_lock); 5535 1.2 isaki } 5536 1.2 isaki 5537 1.2 isaki /* 5538 1.2 isaki * When playing back with MD filter: 5539 1.2 isaki * 5540 1.2 isaki * track track ... 5541 1.2 isaki * v v 5542 1.2 isaki * + mix (with aint2_t) 5543 1.2 isaki * | master volume (with aint2_t) 5544 1.2 isaki * v 5545 1.2 isaki * mixsample [::::] wide-int 1 block (ring) buffer 5546 1.2 isaki * | 5547 1.2 isaki * | convert aint2_t -> aint_t 5548 1.2 isaki * v 5549 1.2 isaki * codecbuf [....] 1 block (ring) buffer 5550 1.2 isaki * | 5551 1.2 isaki * | convert to hw format 5552 1.2 isaki * v 5553 1.2 isaki * hwbuf [............] NBLKHW blocks ring buffer 5554 1.2 isaki * 5555 1.2 isaki * When playing back without MD filter: 5556 1.2 isaki * 5557 1.2 isaki * mixsample [::::] wide-int 1 block (ring) buffer 5558 1.2 isaki * | 5559 1.2 isaki * | convert aint2_t -> aint_t 5560 1.2 isaki * | (with byte swap if necessary) 5561 1.2 isaki * v 5562 1.2 isaki * hwbuf [............] NBLKHW blocks ring buffer 5563 1.2 isaki * 5564 1.2 isaki * mixsample: slinear_NE, wide internal precision, HW ch, HW freq. 5565 1.2 isaki * codecbuf: slinear_NE, internal precision, HW ch, HW freq. 5566 1.2 isaki * hwbuf: HW encoding, HW precision, HW ch, HW freq. 5567 1.2 isaki */ 5568 1.2 isaki 5569 1.2 isaki /* 5570 1.2 isaki * Performs track mixing and converts it to hwbuf. 5571 1.2 isaki * Note that this function doesn't transfer hwbuf to hardware. 5572 1.2 isaki * Must be called with sc_intr_lock held. 5573 1.2 isaki */ 5574 1.2 isaki static void 5575 1.2 isaki audio_pmixer_process(struct audio_softc *sc) 5576 1.2 isaki { 5577 1.2 isaki audio_trackmixer_t *mixer; 5578 1.2 isaki audio_file_t *f; 5579 1.2 isaki int frame_count; 5580 1.2 isaki int sample_count; 5581 1.2 isaki int mixed; 5582 1.2 isaki int i; 5583 1.2 isaki aint2_t *m; 5584 1.2 isaki aint_t *h; 5585 1.2 isaki 5586 1.2 isaki mixer = sc->sc_pmixer; 5587 1.2 isaki 5588 1.2 isaki frame_count = mixer->frames_per_block; 5589 1.47 isaki KASSERTMSG(auring_get_contig_free(&mixer->hwbuf) >= frame_count, 5590 1.47 isaki "auring_get_contig_free()=%d frame_count=%d", 5591 1.47 isaki auring_get_contig_free(&mixer->hwbuf), frame_count); 5592 1.2 isaki sample_count = frame_count * mixer->mixfmt.channels; 5593 1.2 isaki 5594 1.2 isaki mixer->mixseq++; 5595 1.2 isaki 5596 1.2 isaki /* Mix all tracks */ 5597 1.2 isaki mixed = 0; 5598 1.2 isaki SLIST_FOREACH(f, &sc->sc_files, entry) { 5599 1.2 isaki audio_track_t *track = f->ptrack; 5600 1.2 isaki 5601 1.2 isaki if (track == NULL) 5602 1.2 isaki continue; 5603 1.2 isaki 5604 1.2 isaki if (track->is_pause) { 5605 1.2 isaki TRACET(4, track, "skip; paused"); 5606 1.2 isaki continue; 5607 1.2 isaki } 5608 1.2 isaki 5609 1.2 isaki /* Skip if the track is used by process context. */ 5610 1.2 isaki if (audio_track_lock_tryenter(track) == false) { 5611 1.2 isaki TRACET(4, track, "skip; in use"); 5612 1.2 isaki continue; 5613 1.2 isaki } 5614 1.2 isaki 5615 1.2 isaki /* Emulate mmap'ped track */ 5616 1.2 isaki if (track->mmapped) { 5617 1.2 isaki auring_push(&track->usrbuf, track->usrbuf_blksize); 5618 1.2 isaki TRACET(4, track, "mmap; usr=%d/%d/C%d", 5619 1.2 isaki track->usrbuf.head, 5620 1.2 isaki track->usrbuf.used, 5621 1.2 isaki track->usrbuf.capacity); 5622 1.2 isaki } 5623 1.2 isaki 5624 1.2 isaki if (track->outbuf.used < mixer->frames_per_block && 5625 1.2 isaki track->usrbuf.used > 0) { 5626 1.2 isaki TRACET(4, track, "process"); 5627 1.2 isaki audio_track_play(track); 5628 1.2 isaki } 5629 1.2 isaki 5630 1.2 isaki if (track->outbuf.used > 0) { 5631 1.2 isaki mixed = audio_pmixer_mix_track(mixer, track, mixed); 5632 1.2 isaki } else { 5633 1.2 isaki TRACET(4, track, "skip; empty"); 5634 1.2 isaki } 5635 1.2 isaki 5636 1.2 isaki audio_track_lock_exit(track); 5637 1.2 isaki } 5638 1.2 isaki 5639 1.2 isaki if (mixed == 0) { 5640 1.2 isaki /* Silence */ 5641 1.2 isaki memset(mixer->mixsample, 0, 5642 1.2 isaki frametobyte(&mixer->mixfmt, frame_count)); 5643 1.2 isaki } else { 5644 1.23 isaki if (mixed > 1) { 5645 1.23 isaki /* If there are multiple tracks, do auto gain control */ 5646 1.23 isaki audio_pmixer_agc(mixer, sample_count); 5647 1.2 isaki } 5648 1.2 isaki 5649 1.23 isaki /* Apply master volume */ 5650 1.23 isaki if (mixer->volume < 256) { 5651 1.2 isaki m = mixer->mixsample; 5652 1.2 isaki for (i = 0; i < sample_count; i++) { 5653 1.23 isaki *m = AUDIO_SCALEDOWN(*m * mixer->volume, 8); 5654 1.2 isaki m++; 5655 1.2 isaki } 5656 1.23 isaki 5657 1.23 isaki /* 5658 1.23 isaki * Recover the volume gradually at the pace of 5659 1.23 isaki * several times per second. If it's too fast, you 5660 1.23 isaki * can recognize that the volume changes up and down 5661 1.23 isaki * quickly and it's not so comfortable. 5662 1.23 isaki */ 5663 1.23 isaki mixer->voltimer += mixer->blktime_n; 5664 1.23 isaki if (mixer->voltimer * 4 >= mixer->blktime_d) { 5665 1.23 isaki mixer->volume++; 5666 1.23 isaki mixer->voltimer = 0; 5667 1.23 isaki #if defined(AUDIO_DEBUG_AGC) 5668 1.23 isaki TRACE(1, "volume recover: %d", mixer->volume); 5669 1.23 isaki #endif 5670 1.23 isaki } 5671 1.2 isaki } 5672 1.2 isaki } 5673 1.2 isaki 5674 1.2 isaki /* 5675 1.2 isaki * The rest is the hardware part. 5676 1.2 isaki */ 5677 1.2 isaki 5678 1.140 mlelstv m = mixer->mixsample; 5679 1.140 mlelstv 5680 1.2 isaki if (mixer->codec) { 5681 1.140 mlelstv TRACE(4, "codec count=%d", frame_count); 5682 1.140 mlelstv 5683 1.2 isaki h = auring_tailptr_aint(&mixer->codecbuf); 5684 1.140 mlelstv for (i=0; i<sample_count; ++i) 5685 1.2 isaki *h++ = *m++; 5686 1.2 isaki 5687 1.140 mlelstv /* Hardware driver's codec */ 5688 1.2 isaki auring_push(&mixer->codecbuf, frame_count); 5689 1.2 isaki mixer->codecarg.src = auring_headptr(&mixer->codecbuf); 5690 1.2 isaki mixer->codecarg.dst = auring_tailptr(&mixer->hwbuf); 5691 1.2 isaki mixer->codecarg.count = frame_count; 5692 1.2 isaki mixer->codec(&mixer->codecarg); 5693 1.2 isaki auring_take(&mixer->codecbuf, mixer->codecarg.count); 5694 1.140 mlelstv } else { 5695 1.140 mlelstv TRACE(4, "direct count=%d", frame_count); 5696 1.140 mlelstv 5697 1.140 mlelstv /* Direct conversion to linear output */ 5698 1.140 mlelstv mixer->codecarg.src = m; 5699 1.140 mlelstv mixer->codecarg.dst = auring_tailptr(&mixer->hwbuf); 5700 1.140 mlelstv mixer->codecarg.count = frame_count; 5701 1.140 mlelstv mixer->codecarg.srcfmt = &mixer->mixfmt; 5702 1.140 mlelstv mixer->codecarg.dstfmt = &mixer->hwbuf.fmt; 5703 1.140 mlelstv audio_mixsample_to_linear(&mixer->codecarg); 5704 1.2 isaki } 5705 1.2 isaki 5706 1.2 isaki auring_push(&mixer->hwbuf, frame_count); 5707 1.2 isaki 5708 1.2 isaki TRACE(4, "done mixseq=%d hwbuf=%d/%d/%d%s", 5709 1.2 isaki (int)mixer->mixseq, 5710 1.2 isaki mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity, 5711 1.2 isaki (mixed == 0) ? " silent" : ""); 5712 1.2 isaki } 5713 1.2 isaki 5714 1.2 isaki /* 5715 1.23 isaki * Do auto gain control. 5716 1.23 isaki * Must be called sc_intr_lock held. 5717 1.23 isaki */ 5718 1.23 isaki static void 5719 1.23 isaki audio_pmixer_agc(audio_trackmixer_t *mixer, int sample_count) 5720 1.23 isaki { 5721 1.23 isaki struct audio_softc *sc __unused; 5722 1.23 isaki aint2_t val; 5723 1.23 isaki aint2_t maxval; 5724 1.23 isaki aint2_t minval; 5725 1.23 isaki aint2_t over_plus; 5726 1.23 isaki aint2_t over_minus; 5727 1.23 isaki aint2_t *m; 5728 1.23 isaki int newvol; 5729 1.23 isaki int i; 5730 1.23 isaki 5731 1.23 isaki sc = mixer->sc; 5732 1.23 isaki 5733 1.23 isaki /* Overflow detection */ 5734 1.23 isaki maxval = AINT_T_MAX; 5735 1.23 isaki minval = AINT_T_MIN; 5736 1.23 isaki m = mixer->mixsample; 5737 1.23 isaki for (i = 0; i < sample_count; i++) { 5738 1.23 isaki val = *m++; 5739 1.23 isaki if (val > maxval) 5740 1.23 isaki maxval = val; 5741 1.23 isaki else if (val < minval) 5742 1.23 isaki minval = val; 5743 1.23 isaki } 5744 1.23 isaki 5745 1.23 isaki /* Absolute value of overflowed amount */ 5746 1.23 isaki over_plus = maxval - AINT_T_MAX; 5747 1.23 isaki over_minus = AINT_T_MIN - minval; 5748 1.23 isaki 5749 1.23 isaki if (over_plus > 0 || over_minus > 0) { 5750 1.23 isaki if (over_plus > over_minus) { 5751 1.23 isaki newvol = (int)((aint2_t)AINT_T_MAX * 256 / maxval); 5752 1.23 isaki } else { 5753 1.23 isaki newvol = (int)((aint2_t)AINT_T_MIN * 256 / minval); 5754 1.23 isaki } 5755 1.23 isaki 5756 1.23 isaki /* 5757 1.23 isaki * Change the volume only if new one is smaller. 5758 1.23 isaki * Reset the timer even if the volume isn't changed. 5759 1.23 isaki */ 5760 1.23 isaki if (newvol <= mixer->volume) { 5761 1.23 isaki mixer->volume = newvol; 5762 1.23 isaki mixer->voltimer = 0; 5763 1.23 isaki #if defined(AUDIO_DEBUG_AGC) 5764 1.23 isaki TRACE(1, "auto volume adjust: %d", mixer->volume); 5765 1.23 isaki #endif 5766 1.23 isaki } 5767 1.23 isaki } 5768 1.23 isaki } 5769 1.23 isaki 5770 1.23 isaki /* 5771 1.2 isaki * Mix one track. 5772 1.2 isaki * 'mixed' specifies the number of tracks mixed so far. 5773 1.2 isaki * It returns the number of tracks mixed. In other words, it returns 5774 1.2 isaki * mixed + 1 if this track is mixed. 5775 1.2 isaki */ 5776 1.2 isaki static int 5777 1.2 isaki audio_pmixer_mix_track(audio_trackmixer_t *mixer, audio_track_t *track, 5778 1.2 isaki int mixed) 5779 1.2 isaki { 5780 1.2 isaki int count; 5781 1.2 isaki int sample_count; 5782 1.2 isaki int remain; 5783 1.2 isaki int i; 5784 1.2 isaki const aint_t *s; 5785 1.2 isaki aint2_t *d; 5786 1.2 isaki 5787 1.2 isaki /* XXX TODO: Is this necessary for now? */ 5788 1.2 isaki if (mixer->mixseq < track->seq) 5789 1.2 isaki return mixed; 5790 1.2 isaki 5791 1.2 isaki count = auring_get_contig_used(&track->outbuf); 5792 1.2 isaki count = uimin(count, mixer->frames_per_block); 5793 1.2 isaki 5794 1.2 isaki s = auring_headptr_aint(&track->outbuf); 5795 1.2 isaki d = mixer->mixsample; 5796 1.2 isaki 5797 1.2 isaki /* 5798 1.2 isaki * Apply track volume with double-sized integer and perform 5799 1.2 isaki * additive synthesis. 5800 1.2 isaki * 5801 1.2 isaki * XXX If you limit the track volume to 1.0 or less (<= 256), 5802 1.2 isaki * it would be better to do this in the track conversion stage 5803 1.2 isaki * rather than here. However, if you accept the volume to 5804 1.2 isaki * be greater than 1.0 (> 256), it's better to do it here. 5805 1.2 isaki * Because the operation here is done by double-sized integer. 5806 1.2 isaki */ 5807 1.2 isaki sample_count = count * mixer->mixfmt.channels; 5808 1.2 isaki if (mixed == 0) { 5809 1.2 isaki /* If this is the first track, assignment can be used. */ 5810 1.2 isaki #if defined(AUDIO_SUPPORT_TRACK_VOLUME) 5811 1.2 isaki if (track->volume != 256) { 5812 1.2 isaki for (i = 0; i < sample_count; i++) { 5813 1.16 isaki aint2_t v; 5814 1.16 isaki v = *s++; 5815 1.16 isaki *d++ = AUDIO_SCALEDOWN(v * track->volume, 8) 5816 1.2 isaki } 5817 1.2 isaki } else 5818 1.2 isaki #endif 5819 1.2 isaki { 5820 1.2 isaki for (i = 0; i < sample_count; i++) { 5821 1.2 isaki *d++ = ((aint2_t)*s++); 5822 1.2 isaki } 5823 1.2 isaki } 5824 1.17 isaki /* Fill silence if the first track is not filled. */ 5825 1.17 isaki for (; i < mixer->frames_per_block * mixer->mixfmt.channels; i++) 5826 1.17 isaki *d++ = 0; 5827 1.2 isaki } else { 5828 1.2 isaki /* If this is the second or later, add it. */ 5829 1.2 isaki #if defined(AUDIO_SUPPORT_TRACK_VOLUME) 5830 1.2 isaki if (track->volume != 256) { 5831 1.2 isaki for (i = 0; i < sample_count; i++) { 5832 1.16 isaki aint2_t v; 5833 1.16 isaki v = *s++; 5834 1.16 isaki *d++ += AUDIO_SCALEDOWN(v * track->volume, 8); 5835 1.2 isaki } 5836 1.2 isaki } else 5837 1.2 isaki #endif 5838 1.2 isaki { 5839 1.2 isaki for (i = 0; i < sample_count; i++) { 5840 1.2 isaki *d++ += ((aint2_t)*s++); 5841 1.2 isaki } 5842 1.2 isaki } 5843 1.2 isaki } 5844 1.2 isaki 5845 1.2 isaki auring_take(&track->outbuf, count); 5846 1.2 isaki /* 5847 1.2 isaki * The counters have to align block even if outbuf is less than 5848 1.2 isaki * one block. XXX Is this still necessary? 5849 1.2 isaki */ 5850 1.2 isaki remain = mixer->frames_per_block - count; 5851 1.2 isaki if (__predict_false(remain != 0)) { 5852 1.2 isaki auring_push(&track->outbuf, remain); 5853 1.2 isaki auring_take(&track->outbuf, remain); 5854 1.2 isaki } 5855 1.2 isaki 5856 1.2 isaki /* 5857 1.2 isaki * Update track sequence. 5858 1.2 isaki * mixseq has previous value yet at this point. 5859 1.2 isaki */ 5860 1.2 isaki track->seq = mixer->mixseq + 1; 5861 1.2 isaki 5862 1.2 isaki return mixed + 1; 5863 1.2 isaki } 5864 1.2 isaki 5865 1.2 isaki /* 5866 1.2 isaki * Output one block from hwbuf to HW. 5867 1.2 isaki * Must be called with sc_intr_lock held. 5868 1.2 isaki */ 5869 1.2 isaki static void 5870 1.2 isaki audio_pmixer_output(struct audio_softc *sc) 5871 1.2 isaki { 5872 1.2 isaki audio_trackmixer_t *mixer; 5873 1.2 isaki audio_params_t params; 5874 1.2 isaki void *start; 5875 1.2 isaki void *end; 5876 1.2 isaki int blksize; 5877 1.2 isaki int error; 5878 1.2 isaki 5879 1.2 isaki mixer = sc->sc_pmixer; 5880 1.2 isaki TRACE(4, "pbusy=%d hwbuf=%d/%d/%d", 5881 1.2 isaki sc->sc_pbusy, 5882 1.2 isaki mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity); 5883 1.47 isaki KASSERTMSG(mixer->hwbuf.used >= mixer->frames_per_block, 5884 1.47 isaki "mixer->hwbuf.used=%d mixer->frames_per_block=%d", 5885 1.47 isaki mixer->hwbuf.used, mixer->frames_per_block); 5886 1.2 isaki 5887 1.2 isaki blksize = frametobyte(&mixer->hwbuf.fmt, mixer->frames_per_block); 5888 1.2 isaki 5889 1.2 isaki if (sc->hw_if->trigger_output) { 5890 1.2 isaki /* trigger (at once) */ 5891 1.2 isaki if (!sc->sc_pbusy) { 5892 1.2 isaki start = mixer->hwbuf.mem; 5893 1.2 isaki end = (uint8_t *)start + auring_bytelen(&mixer->hwbuf); 5894 1.2 isaki params = format2_to_params(&mixer->hwbuf.fmt); 5895 1.2 isaki 5896 1.2 isaki error = sc->hw_if->trigger_output(sc->hw_hdl, 5897 1.2 isaki start, end, blksize, audio_pintr, sc, ¶ms); 5898 1.2 isaki if (error) { 5899 1.88 isaki audio_printf(sc, 5900 1.88 isaki "trigger_output failed: errno=%d\n", 5901 1.88 isaki error); 5902 1.2 isaki return; 5903 1.2 isaki } 5904 1.2 isaki } 5905 1.2 isaki } else { 5906 1.2 isaki /* start (everytime) */ 5907 1.2 isaki start = auring_headptr(&mixer->hwbuf); 5908 1.2 isaki 5909 1.2 isaki error = sc->hw_if->start_output(sc->hw_hdl, 5910 1.2 isaki start, blksize, audio_pintr, sc); 5911 1.2 isaki if (error) { 5912 1.88 isaki audio_printf(sc, 5913 1.88 isaki "start_output failed: errno=%d\n", error); 5914 1.2 isaki return; 5915 1.2 isaki } 5916 1.2 isaki } 5917 1.2 isaki } 5918 1.2 isaki 5919 1.2 isaki /* 5920 1.2 isaki * This is an interrupt handler for playback. 5921 1.2 isaki * It is called with sc_intr_lock held. 5922 1.2 isaki * 5923 1.2 isaki * It is usually called from hardware interrupt. However, note that 5924 1.2 isaki * for some drivers (e.g. uaudio) it is called from software interrupt. 5925 1.2 isaki */ 5926 1.2 isaki static void 5927 1.2 isaki audio_pintr(void *arg) 5928 1.2 isaki { 5929 1.2 isaki struct audio_softc *sc; 5930 1.2 isaki audio_trackmixer_t *mixer; 5931 1.2 isaki 5932 1.2 isaki sc = arg; 5933 1.2 isaki KASSERT(mutex_owned(sc->sc_intr_lock)); 5934 1.2 isaki 5935 1.2 isaki if (sc->sc_dying) 5936 1.2 isaki return; 5937 1.49 isaki if (sc->sc_pbusy == false) { 5938 1.2 isaki #if defined(DIAGNOSTIC) 5939 1.88 isaki audio_printf(sc, "DIAGNOSTIC: %s raised stray interrupt\n", 5940 1.66 isaki device_xname(sc->hw_dev)); 5941 1.49 isaki #endif 5942 1.2 isaki return; 5943 1.2 isaki } 5944 1.2 isaki 5945 1.2 isaki mixer = sc->sc_pmixer; 5946 1.2 isaki mixer->hw_complete_counter += mixer->frames_per_block; 5947 1.2 isaki mixer->hwseq++; 5948 1.2 isaki 5949 1.2 isaki auring_take(&mixer->hwbuf, mixer->frames_per_block); 5950 1.2 isaki 5951 1.2 isaki TRACE(4, 5952 1.2 isaki "HW_INT ++hwseq=%" PRIu64 " cmplcnt=%" PRIu64 " hwbuf=%d/%d/%d", 5953 1.2 isaki mixer->hwseq, mixer->hw_complete_counter, 5954 1.2 isaki mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity); 5955 1.2 isaki 5956 1.2 isaki #if defined(AUDIO_HW_SINGLE_BUFFER) 5957 1.2 isaki /* 5958 1.2 isaki * Create a new block here and output it immediately. 5959 1.2 isaki * It makes a latency lower but needs machine power. 5960 1.2 isaki */ 5961 1.2 isaki audio_pmixer_process(sc); 5962 1.2 isaki audio_pmixer_output(sc); 5963 1.2 isaki #else 5964 1.2 isaki /* 5965 1.2 isaki * It is called when block N output is done. 5966 1.2 isaki * Output immediately block N+1 created by the last interrupt. 5967 1.2 isaki * And then create block N+2 for the next interrupt. 5968 1.2 isaki * This method makes playback robust even on slower machines. 5969 1.2 isaki * Instead the latency is increased by one block. 5970 1.2 isaki */ 5971 1.2 isaki 5972 1.2 isaki /* At first, output ready block. */ 5973 1.2 isaki if (mixer->hwbuf.used >= mixer->frames_per_block) { 5974 1.2 isaki audio_pmixer_output(sc); 5975 1.2 isaki } 5976 1.2 isaki 5977 1.2 isaki bool later = false; 5978 1.2 isaki 5979 1.2 isaki if (mixer->hwbuf.used < mixer->frames_per_block) { 5980 1.2 isaki later = true; 5981 1.2 isaki } 5982 1.2 isaki 5983 1.2 isaki /* Then, process next block. */ 5984 1.2 isaki audio_pmixer_process(sc); 5985 1.2 isaki 5986 1.2 isaki if (later) { 5987 1.2 isaki audio_pmixer_output(sc); 5988 1.2 isaki } 5989 1.2 isaki #endif 5990 1.2 isaki 5991 1.2 isaki /* 5992 1.2 isaki * When this interrupt is the real hardware interrupt, disabling 5993 1.2 isaki * preemption here is not necessary. But some drivers (e.g. uaudio) 5994 1.2 isaki * emulate it by software interrupt, so kpreempt_disable is necessary. 5995 1.2 isaki */ 5996 1.2 isaki kpreempt_disable(); 5997 1.2 isaki softint_schedule(mixer->sih); 5998 1.2 isaki kpreempt_enable(); 5999 1.2 isaki } 6000 1.2 isaki 6001 1.2 isaki /* 6002 1.2 isaki * Starts record mixer. 6003 1.2 isaki * Must be called only if sc_rbusy is false. 6004 1.50 isaki * Must be called with sc_lock && sc_exlock held. 6005 1.2 isaki * Must not be called from the interrupt context. 6006 1.2 isaki */ 6007 1.2 isaki static void 6008 1.2 isaki audio_rmixer_start(struct audio_softc *sc) 6009 1.2 isaki { 6010 1.2 isaki 6011 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 6012 1.50 isaki KASSERT(sc->sc_exlock); 6013 1.2 isaki KASSERT(sc->sc_rbusy == false); 6014 1.2 isaki 6015 1.2 isaki mutex_enter(sc->sc_intr_lock); 6016 1.2 isaki 6017 1.2 isaki TRACE(2, "%s", (audiodebug >= 3) ? "begin" : ""); 6018 1.2 isaki audio_rmixer_input(sc); 6019 1.2 isaki sc->sc_rbusy = true; 6020 1.2 isaki TRACE(3, "end"); 6021 1.2 isaki 6022 1.2 isaki mutex_exit(sc->sc_intr_lock); 6023 1.2 isaki } 6024 1.2 isaki 6025 1.2 isaki /* 6026 1.2 isaki * When recording with MD filter: 6027 1.2 isaki * 6028 1.2 isaki * hwbuf [............] NBLKHW blocks ring buffer 6029 1.2 isaki * | 6030 1.2 isaki * | convert from hw format 6031 1.2 isaki * v 6032 1.2 isaki * codecbuf [....] 1 block (ring) buffer 6033 1.2 isaki * | | 6034 1.2 isaki * v v 6035 1.2 isaki * track track ... 6036 1.2 isaki * 6037 1.2 isaki * When recording without MD filter: 6038 1.2 isaki * 6039 1.2 isaki * hwbuf [............] NBLKHW blocks ring buffer 6040 1.2 isaki * | | 6041 1.2 isaki * v v 6042 1.2 isaki * track track ... 6043 1.2 isaki * 6044 1.2 isaki * hwbuf: HW encoding, HW precision, HW ch, HW freq. 6045 1.2 isaki * codecbuf: slinear_NE, internal precision, HW ch, HW freq. 6046 1.2 isaki */ 6047 1.2 isaki 6048 1.2 isaki /* 6049 1.2 isaki * Distribute a recorded block to all recording tracks. 6050 1.2 isaki */ 6051 1.2 isaki static void 6052 1.2 isaki audio_rmixer_process(struct audio_softc *sc) 6053 1.2 isaki { 6054 1.2 isaki audio_trackmixer_t *mixer; 6055 1.2 isaki audio_ring_t *mixersrc; 6056 1.140 mlelstv audio_ring_t tmpsrc; 6057 1.140 mlelstv audio_filter_t codec; 6058 1.140 mlelstv audio_filter_arg_t codecarg; 6059 1.2 isaki audio_file_t *f; 6060 1.2 isaki int count; 6061 1.2 isaki int bytes; 6062 1.2 isaki 6063 1.2 isaki mixer = sc->sc_rmixer; 6064 1.2 isaki 6065 1.2 isaki /* 6066 1.2 isaki * count is the number of frames to be retrieved this time. 6067 1.2 isaki * count should be one block. 6068 1.2 isaki */ 6069 1.2 isaki count = auring_get_contig_used(&mixer->hwbuf); 6070 1.2 isaki count = uimin(count, mixer->frames_per_block); 6071 1.2 isaki if (count <= 0) { 6072 1.2 isaki TRACE(4, "count %d: too short", count); 6073 1.2 isaki return; 6074 1.2 isaki } 6075 1.2 isaki bytes = frametobyte(&mixer->track_fmt, count); 6076 1.2 isaki 6077 1.2 isaki /* Hardware driver's codec */ 6078 1.2 isaki if (mixer->codec) { 6079 1.140 mlelstv TRACE(4, "codec count=%d", count); 6080 1.2 isaki mixer->codecarg.src = auring_headptr(&mixer->hwbuf); 6081 1.2 isaki mixer->codecarg.dst = auring_tailptr(&mixer->codecbuf); 6082 1.2 isaki mixer->codecarg.count = count; 6083 1.2 isaki mixer->codec(&mixer->codecarg); 6084 1.2 isaki mixersrc = &mixer->codecbuf; 6085 1.2 isaki } else { 6086 1.140 mlelstv TRACE(4, "direct count=%d", count); 6087 1.140 mlelstv /* temporary ring using mixsample buffer */ 6088 1.140 mlelstv tmpsrc.fmt = mixer->mixfmt; 6089 1.140 mlelstv tmpsrc.capacity = mixer->frames_per_block; 6090 1.140 mlelstv tmpsrc.mem = mixer->mixsample; 6091 1.140 mlelstv tmpsrc.head = 0; 6092 1.140 mlelstv tmpsrc.used = 0; 6093 1.141 mlelstv 6094 1.140 mlelstv /* ad-hoc codec */ 6095 1.140 mlelstv codecarg.srcfmt = &mixer->hwbuf.fmt; 6096 1.140 mlelstv codecarg.dstfmt = &mixer->mixfmt; 6097 1.140 mlelstv codec = NULL; 6098 1.144 mlelstv if (audio_format2_is_linear(codecarg.srcfmt) && 6099 1.144 mlelstv codecarg.srcfmt->stride == codecarg.srcfmt->precision) { 6100 1.140 mlelstv switch (codecarg.srcfmt->stride) { 6101 1.140 mlelstv case 8: 6102 1.140 mlelstv codec = audio_linear8_to_internal; 6103 1.140 mlelstv break; 6104 1.140 mlelstv case 16: 6105 1.140 mlelstv codec = audio_linear16_to_internal; 6106 1.140 mlelstv break; 6107 1.140 mlelstv #if defined(AUDIO_SUPPORT_LINEAR24) 6108 1.140 mlelstv case 24: 6109 1.140 mlelstv codec = audio_linear24_to_internal; 6110 1.140 mlelstv break; 6111 1.140 mlelstv #endif 6112 1.140 mlelstv case 32: 6113 1.140 mlelstv codec = audio_linear32_to_internal; 6114 1.140 mlelstv break; 6115 1.140 mlelstv } 6116 1.140 mlelstv } 6117 1.140 mlelstv if (codec == NULL) { 6118 1.140 mlelstv TRACE(4, "unsupported hw format"); 6119 1.144 mlelstv /* drain hwbuf */ 6120 1.144 mlelstv auring_take(&mixer->hwbuf, count); 6121 1.140 mlelstv return; 6122 1.140 mlelstv } 6123 1.141 mlelstv 6124 1.140 mlelstv codecarg.src = auring_headptr(&mixer->hwbuf); 6125 1.140 mlelstv codecarg.dst = auring_tailptr(&tmpsrc); 6126 1.140 mlelstv codecarg.count = count; 6127 1.140 mlelstv codec(&codecarg); 6128 1.140 mlelstv mixersrc = &tmpsrc; 6129 1.2 isaki } 6130 1.2 isaki 6131 1.140 mlelstv auring_take(&mixer->hwbuf, count); 6132 1.140 mlelstv auring_push(mixersrc, count); 6133 1.141 mlelstv 6134 1.140 mlelstv TRACE(4, "distribute"); 6135 1.2 isaki 6136 1.2 isaki /* Distribute to all tracks. */ 6137 1.2 isaki SLIST_FOREACH(f, &sc->sc_files, entry) { 6138 1.2 isaki audio_track_t *track = f->rtrack; 6139 1.2 isaki audio_ring_t *input; 6140 1.2 isaki 6141 1.2 isaki if (track == NULL) 6142 1.2 isaki continue; 6143 1.2 isaki 6144 1.2 isaki if (track->is_pause) { 6145 1.2 isaki TRACET(4, track, "skip; paused"); 6146 1.2 isaki continue; 6147 1.2 isaki } 6148 1.2 isaki 6149 1.2 isaki if (audio_track_lock_tryenter(track) == false) { 6150 1.2 isaki TRACET(4, track, "skip; in use"); 6151 1.2 isaki continue; 6152 1.2 isaki } 6153 1.2 isaki 6154 1.119 isaki /* 6155 1.119 isaki * If the track buffer has less than one block of free space, 6156 1.119 isaki * make one block free. 6157 1.119 isaki */ 6158 1.2 isaki input = track->input; 6159 1.2 isaki if (input->capacity - input->used < mixer->frames_per_block) { 6160 1.2 isaki int drops = mixer->frames_per_block - 6161 1.2 isaki (input->capacity - input->used); 6162 1.2 isaki track->dropframes += drops; 6163 1.2 isaki TRACET(4, track, "drop %d frames: inp=%d/%d/%d", 6164 1.2 isaki drops, 6165 1.2 isaki input->head, input->used, input->capacity); 6166 1.2 isaki auring_take(input, drops); 6167 1.2 isaki } 6168 1.2 isaki 6169 1.117 isaki KASSERTMSG(auring_tail(input) % mixer->frames_per_block == 0, 6170 1.117 isaki "inputtail=%d mixer->frames_per_block=%d", 6171 1.117 isaki auring_tail(input), mixer->frames_per_block); 6172 1.2 isaki memcpy(auring_tailptr_aint(input), 6173 1.2 isaki auring_headptr_aint(mixersrc), 6174 1.2 isaki bytes); 6175 1.2 isaki auring_push(input, count); 6176 1.2 isaki 6177 1.130 isaki track->stamp++; 6178 1.2 isaki 6179 1.2 isaki audio_track_lock_exit(track); 6180 1.2 isaki } 6181 1.2 isaki 6182 1.2 isaki auring_take(mixersrc, count); 6183 1.2 isaki } 6184 1.2 isaki 6185 1.2 isaki /* 6186 1.2 isaki * Input one block from HW to hwbuf. 6187 1.2 isaki * Must be called with sc_intr_lock held. 6188 1.2 isaki */ 6189 1.2 isaki static void 6190 1.2 isaki audio_rmixer_input(struct audio_softc *sc) 6191 1.2 isaki { 6192 1.2 isaki audio_trackmixer_t *mixer; 6193 1.2 isaki audio_params_t params; 6194 1.2 isaki void *start; 6195 1.2 isaki void *end; 6196 1.2 isaki int blksize; 6197 1.2 isaki int error; 6198 1.2 isaki 6199 1.2 isaki mixer = sc->sc_rmixer; 6200 1.2 isaki blksize = frametobyte(&mixer->hwbuf.fmt, mixer->frames_per_block); 6201 1.2 isaki 6202 1.2 isaki if (sc->hw_if->trigger_input) { 6203 1.2 isaki /* trigger (at once) */ 6204 1.2 isaki if (!sc->sc_rbusy) { 6205 1.2 isaki start = mixer->hwbuf.mem; 6206 1.2 isaki end = (uint8_t *)start + auring_bytelen(&mixer->hwbuf); 6207 1.2 isaki params = format2_to_params(&mixer->hwbuf.fmt); 6208 1.2 isaki 6209 1.2 isaki error = sc->hw_if->trigger_input(sc->hw_hdl, 6210 1.2 isaki start, end, blksize, audio_rintr, sc, ¶ms); 6211 1.2 isaki if (error) { 6212 1.88 isaki audio_printf(sc, 6213 1.88 isaki "trigger_input failed: errno=%d\n", 6214 1.88 isaki error); 6215 1.2 isaki return; 6216 1.2 isaki } 6217 1.2 isaki } 6218 1.2 isaki } else { 6219 1.2 isaki /* start (everytime) */ 6220 1.2 isaki start = auring_tailptr(&mixer->hwbuf); 6221 1.2 isaki 6222 1.2 isaki error = sc->hw_if->start_input(sc->hw_hdl, 6223 1.2 isaki start, blksize, audio_rintr, sc); 6224 1.2 isaki if (error) { 6225 1.88 isaki audio_printf(sc, 6226 1.88 isaki "start_input failed: errno=%d\n", error); 6227 1.2 isaki return; 6228 1.2 isaki } 6229 1.2 isaki } 6230 1.2 isaki } 6231 1.2 isaki 6232 1.2 isaki /* 6233 1.2 isaki * This is an interrupt handler for recording. 6234 1.2 isaki * It is called with sc_intr_lock. 6235 1.2 isaki * 6236 1.2 isaki * It is usually called from hardware interrupt. However, note that 6237 1.2 isaki * for some drivers (e.g. uaudio) it is called from software interrupt. 6238 1.2 isaki */ 6239 1.2 isaki static void 6240 1.2 isaki audio_rintr(void *arg) 6241 1.2 isaki { 6242 1.2 isaki struct audio_softc *sc; 6243 1.2 isaki audio_trackmixer_t *mixer; 6244 1.2 isaki 6245 1.2 isaki sc = arg; 6246 1.2 isaki KASSERT(mutex_owned(sc->sc_intr_lock)); 6247 1.2 isaki 6248 1.2 isaki if (sc->sc_dying) 6249 1.2 isaki return; 6250 1.49 isaki if (sc->sc_rbusy == false) { 6251 1.2 isaki #if defined(DIAGNOSTIC) 6252 1.88 isaki audio_printf(sc, "DIAGNOSTIC: %s raised stray interrupt\n", 6253 1.66 isaki device_xname(sc->hw_dev)); 6254 1.49 isaki #endif 6255 1.2 isaki return; 6256 1.2 isaki } 6257 1.2 isaki 6258 1.2 isaki mixer = sc->sc_rmixer; 6259 1.2 isaki mixer->hw_complete_counter += mixer->frames_per_block; 6260 1.2 isaki mixer->hwseq++; 6261 1.2 isaki 6262 1.2 isaki auring_push(&mixer->hwbuf, mixer->frames_per_block); 6263 1.2 isaki 6264 1.2 isaki TRACE(4, 6265 1.2 isaki "HW_INT ++hwseq=%" PRIu64 " cmplcnt=%" PRIu64 " hwbuf=%d/%d/%d", 6266 1.2 isaki mixer->hwseq, mixer->hw_complete_counter, 6267 1.2 isaki mixer->hwbuf.head, mixer->hwbuf.used, mixer->hwbuf.capacity); 6268 1.2 isaki 6269 1.2 isaki /* Distrubute recorded block */ 6270 1.2 isaki audio_rmixer_process(sc); 6271 1.2 isaki 6272 1.2 isaki /* Request next block */ 6273 1.2 isaki audio_rmixer_input(sc); 6274 1.2 isaki 6275 1.2 isaki /* 6276 1.2 isaki * When this interrupt is the real hardware interrupt, disabling 6277 1.2 isaki * preemption here is not necessary. But some drivers (e.g. uaudio) 6278 1.2 isaki * emulate it by software interrupt, so kpreempt_disable is necessary. 6279 1.2 isaki */ 6280 1.2 isaki kpreempt_disable(); 6281 1.2 isaki softint_schedule(mixer->sih); 6282 1.2 isaki kpreempt_enable(); 6283 1.2 isaki } 6284 1.2 isaki 6285 1.2 isaki /* 6286 1.2 isaki * Halts playback mixer. 6287 1.2 isaki * This function also clears related parameters, so call this function 6288 1.2 isaki * instead of calling halt_output directly. 6289 1.2 isaki * Must be called only if sc_pbusy is true. 6290 1.2 isaki * Must be called with sc_lock && sc_exlock held. 6291 1.2 isaki */ 6292 1.2 isaki static int 6293 1.2 isaki audio_pmixer_halt(struct audio_softc *sc) 6294 1.2 isaki { 6295 1.2 isaki int error; 6296 1.2 isaki 6297 1.87 isaki TRACE(2, "called"); 6298 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 6299 1.2 isaki KASSERT(sc->sc_exlock); 6300 1.2 isaki 6301 1.2 isaki mutex_enter(sc->sc_intr_lock); 6302 1.2 isaki error = sc->hw_if->halt_output(sc->hw_hdl); 6303 1.2 isaki 6304 1.2 isaki /* Halts anyway even if some error has occurred. */ 6305 1.2 isaki sc->sc_pbusy = false; 6306 1.2 isaki sc->sc_pmixer->hwbuf.head = 0; 6307 1.2 isaki sc->sc_pmixer->hwbuf.used = 0; 6308 1.2 isaki sc->sc_pmixer->mixseq = 0; 6309 1.2 isaki sc->sc_pmixer->hwseq = 0; 6310 1.51 isaki mutex_exit(sc->sc_intr_lock); 6311 1.2 isaki 6312 1.2 isaki return error; 6313 1.2 isaki } 6314 1.2 isaki 6315 1.2 isaki /* 6316 1.2 isaki * Halts recording mixer. 6317 1.2 isaki * This function also clears related parameters, so call this function 6318 1.2 isaki * instead of calling halt_input directly. 6319 1.2 isaki * Must be called only if sc_rbusy is true. 6320 1.2 isaki * Must be called with sc_lock && sc_exlock held. 6321 1.2 isaki */ 6322 1.2 isaki static int 6323 1.2 isaki audio_rmixer_halt(struct audio_softc *sc) 6324 1.2 isaki { 6325 1.2 isaki int error; 6326 1.2 isaki 6327 1.87 isaki TRACE(2, "called"); 6328 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 6329 1.2 isaki KASSERT(sc->sc_exlock); 6330 1.2 isaki 6331 1.2 isaki mutex_enter(sc->sc_intr_lock); 6332 1.2 isaki error = sc->hw_if->halt_input(sc->hw_hdl); 6333 1.2 isaki 6334 1.2 isaki /* Halts anyway even if some error has occurred. */ 6335 1.2 isaki sc->sc_rbusy = false; 6336 1.2 isaki sc->sc_rmixer->hwbuf.head = 0; 6337 1.2 isaki sc->sc_rmixer->hwbuf.used = 0; 6338 1.2 isaki sc->sc_rmixer->mixseq = 0; 6339 1.2 isaki sc->sc_rmixer->hwseq = 0; 6340 1.51 isaki mutex_exit(sc->sc_intr_lock); 6341 1.2 isaki 6342 1.2 isaki return error; 6343 1.2 isaki } 6344 1.2 isaki 6345 1.2 isaki /* 6346 1.2 isaki * Flush this track. 6347 1.2 isaki * Halts all operations, clears all buffers, reset error counters. 6348 1.2 isaki * XXX I'm not sure... 6349 1.2 isaki */ 6350 1.2 isaki static void 6351 1.2 isaki audio_track_clear(struct audio_softc *sc, audio_track_t *track) 6352 1.2 isaki { 6353 1.2 isaki 6354 1.2 isaki KASSERT(track); 6355 1.2 isaki TRACET(3, track, "clear"); 6356 1.2 isaki 6357 1.2 isaki audio_track_lock_enter(track); 6358 1.2 isaki 6359 1.129 isaki /* Clear all internal parameters. */ 6360 1.2 isaki track->usrbuf.used = 0; 6361 1.129 isaki track->usrbuf.head = 0; 6362 1.2 isaki if (track->codec.filter) { 6363 1.2 isaki track->codec.srcbuf.used = 0; 6364 1.2 isaki track->codec.srcbuf.head = 0; 6365 1.2 isaki } 6366 1.2 isaki if (track->chvol.filter) { 6367 1.2 isaki track->chvol.srcbuf.used = 0; 6368 1.2 isaki track->chvol.srcbuf.head = 0; 6369 1.2 isaki } 6370 1.2 isaki if (track->chmix.filter) { 6371 1.2 isaki track->chmix.srcbuf.used = 0; 6372 1.2 isaki track->chmix.srcbuf.head = 0; 6373 1.2 isaki } 6374 1.2 isaki if (track->freq.filter) { 6375 1.2 isaki track->freq.srcbuf.used = 0; 6376 1.2 isaki track->freq.srcbuf.head = 0; 6377 1.2 isaki if (track->freq_step < 65536) 6378 1.2 isaki track->freq_current = 65536; 6379 1.2 isaki else 6380 1.2 isaki track->freq_current = 0; 6381 1.2 isaki memset(track->freq_prev, 0, sizeof(track->freq_prev)); 6382 1.2 isaki memset(track->freq_curr, 0, sizeof(track->freq_curr)); 6383 1.2 isaki } 6384 1.2 isaki /* Clear buffer, then operation halts naturally. */ 6385 1.2 isaki track->outbuf.used = 0; 6386 1.2 isaki 6387 1.2 isaki /* Clear counters. */ 6388 1.127 isaki track->stamp = 0; 6389 1.127 isaki track->last_stamp = 0; 6390 1.2 isaki track->dropframes = 0; 6391 1.2 isaki 6392 1.2 isaki audio_track_lock_exit(track); 6393 1.2 isaki } 6394 1.2 isaki 6395 1.2 isaki /* 6396 1.2 isaki * Drain the track. 6397 1.2 isaki * track must be present and for playback. 6398 1.2 isaki * If successful, it returns 0. Otherwise returns errno. 6399 1.2 isaki * Must be called with sc_lock held. 6400 1.2 isaki */ 6401 1.2 isaki static int 6402 1.2 isaki audio_track_drain(struct audio_softc *sc, audio_track_t *track) 6403 1.2 isaki { 6404 1.2 isaki audio_trackmixer_t *mixer; 6405 1.2 isaki int done; 6406 1.2 isaki int error; 6407 1.2 isaki 6408 1.2 isaki KASSERT(track); 6409 1.2 isaki TRACET(3, track, "start"); 6410 1.2 isaki mixer = track->mixer; 6411 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 6412 1.2 isaki 6413 1.2 isaki /* Ignore them if pause. */ 6414 1.2 isaki if (track->is_pause) { 6415 1.2 isaki TRACET(3, track, "pause -> clear"); 6416 1.2 isaki track->pstate = AUDIO_STATE_CLEAR; 6417 1.2 isaki } 6418 1.2 isaki /* Terminate early here if there is no data in the track. */ 6419 1.2 isaki if (track->pstate == AUDIO_STATE_CLEAR) { 6420 1.2 isaki TRACET(3, track, "no need to drain"); 6421 1.2 isaki return 0; 6422 1.2 isaki } 6423 1.2 isaki track->pstate = AUDIO_STATE_DRAINING; 6424 1.2 isaki 6425 1.2 isaki for (;;) { 6426 1.10 isaki /* I want to display it before condition evaluation. */ 6427 1.2 isaki TRACET(3, track, "pid=%d.%d trkseq=%d hwseq=%d out=%d/%d/%d", 6428 1.2 isaki (int)curproc->p_pid, (int)curlwp->l_lid, 6429 1.2 isaki (int)track->seq, (int)mixer->hwseq, 6430 1.2 isaki track->outbuf.head, track->outbuf.used, 6431 1.2 isaki track->outbuf.capacity); 6432 1.2 isaki 6433 1.2 isaki /* Condition to terminate */ 6434 1.2 isaki audio_track_lock_enter(track); 6435 1.2 isaki done = (track->usrbuf.used < frametobyte(&track->inputfmt, 1) && 6436 1.2 isaki track->outbuf.used == 0 && 6437 1.2 isaki track->seq <= mixer->hwseq); 6438 1.2 isaki audio_track_lock_exit(track); 6439 1.2 isaki if (done) 6440 1.2 isaki break; 6441 1.2 isaki 6442 1.2 isaki TRACET(3, track, "sleep"); 6443 1.142 mlelstv error = audio_track_waitio(sc, track, "audio_drain"); 6444 1.2 isaki if (error) 6445 1.2 isaki return error; 6446 1.2 isaki 6447 1.2 isaki /* XXX call audio_track_play here ? */ 6448 1.2 isaki } 6449 1.2 isaki 6450 1.2 isaki track->pstate = AUDIO_STATE_CLEAR; 6451 1.131 isaki TRACET(3, track, "done"); 6452 1.2 isaki return 0; 6453 1.2 isaki } 6454 1.2 isaki 6455 1.2 isaki /* 6456 1.30 isaki * Send signal to process. 6457 1.30 isaki * This is intended to be called only from audio_softintr_{rd,wr}. 6458 1.63 isaki * Must be called without sc_intr_lock held. 6459 1.30 isaki */ 6460 1.30 isaki static inline void 6461 1.30 isaki audio_psignal(struct audio_softc *sc, pid_t pid, int signum) 6462 1.30 isaki { 6463 1.30 isaki proc_t *p; 6464 1.30 isaki 6465 1.30 isaki KASSERT(pid != 0); 6466 1.30 isaki 6467 1.30 isaki /* 6468 1.30 isaki * psignal() must be called without spin lock held. 6469 1.30 isaki */ 6470 1.30 isaki 6471 1.70 ad mutex_enter(&proc_lock); 6472 1.30 isaki p = proc_find(pid); 6473 1.30 isaki if (p) 6474 1.30 isaki psignal(p, signum); 6475 1.70 ad mutex_exit(&proc_lock); 6476 1.30 isaki } 6477 1.30 isaki 6478 1.30 isaki /* 6479 1.2 isaki * This is software interrupt handler for record. 6480 1.2 isaki * It is called from recording hardware interrupt everytime. 6481 1.2 isaki * It does: 6482 1.2 isaki * - Deliver SIGIO for all async processes. 6483 1.2 isaki * - Notify to audio_read() that data has arrived. 6484 1.2 isaki * - selnotify() for select/poll-ing processes. 6485 1.2 isaki */ 6486 1.2 isaki /* 6487 1.2 isaki * XXX If a process issues FIOASYNC between hardware interrupt and 6488 1.2 isaki * software interrupt, (stray) SIGIO will be sent to the process 6489 1.2 isaki * despite the fact that it has not receive recorded data yet. 6490 1.2 isaki */ 6491 1.2 isaki static void 6492 1.2 isaki audio_softintr_rd(void *cookie) 6493 1.2 isaki { 6494 1.2 isaki struct audio_softc *sc = cookie; 6495 1.2 isaki audio_file_t *f; 6496 1.2 isaki pid_t pid; 6497 1.2 isaki 6498 1.2 isaki mutex_enter(sc->sc_lock); 6499 1.2 isaki 6500 1.2 isaki SLIST_FOREACH(f, &sc->sc_files, entry) { 6501 1.2 isaki audio_track_t *track = f->rtrack; 6502 1.2 isaki 6503 1.2 isaki if (track == NULL) 6504 1.2 isaki continue; 6505 1.2 isaki 6506 1.2 isaki TRACET(4, track, "broadcast; inp=%d/%d/%d", 6507 1.2 isaki track->input->head, 6508 1.2 isaki track->input->used, 6509 1.2 isaki track->input->capacity); 6510 1.2 isaki 6511 1.2 isaki pid = f->async_audio; 6512 1.2 isaki if (pid != 0) { 6513 1.2 isaki TRACEF(4, f, "sending SIGIO %d", pid); 6514 1.30 isaki audio_psignal(sc, pid, SIGIO); 6515 1.2 isaki } 6516 1.2 isaki } 6517 1.2 isaki 6518 1.2 isaki /* Notify that data has arrived. */ 6519 1.2 isaki selnotify(&sc->sc_rsel, 0, NOTE_SUBMIT); 6520 1.2 isaki cv_broadcast(&sc->sc_rmixer->outcv); 6521 1.2 isaki 6522 1.2 isaki mutex_exit(sc->sc_lock); 6523 1.2 isaki } 6524 1.2 isaki 6525 1.2 isaki /* 6526 1.2 isaki * This is software interrupt handler for playback. 6527 1.2 isaki * It is called from playback hardware interrupt everytime. 6528 1.2 isaki * It does: 6529 1.2 isaki * - Deliver SIGIO for all async and writable (used < lowat) processes. 6530 1.2 isaki * - Notify to audio_write() that outbuf block available. 6531 1.2 isaki * - selnotify() for select/poll-ing processes if there are any writable 6532 1.2 isaki * (used < lowat) processes. Checking each descriptor will be done by 6533 1.2 isaki * filt_audiowrite_event(). 6534 1.2 isaki */ 6535 1.2 isaki static void 6536 1.2 isaki audio_softintr_wr(void *cookie) 6537 1.2 isaki { 6538 1.2 isaki struct audio_softc *sc = cookie; 6539 1.2 isaki audio_file_t *f; 6540 1.2 isaki bool found; 6541 1.2 isaki pid_t pid; 6542 1.2 isaki 6543 1.2 isaki TRACE(4, "called"); 6544 1.2 isaki found = false; 6545 1.2 isaki 6546 1.2 isaki mutex_enter(sc->sc_lock); 6547 1.2 isaki 6548 1.2 isaki SLIST_FOREACH(f, &sc->sc_files, entry) { 6549 1.2 isaki audio_track_t *track = f->ptrack; 6550 1.2 isaki 6551 1.2 isaki if (track == NULL) 6552 1.2 isaki continue; 6553 1.2 isaki 6554 1.78 isaki TRACET(4, track, "broadcast; trkseq=%d out=%d/%d/%d", 6555 1.2 isaki (int)track->seq, 6556 1.2 isaki track->outbuf.head, 6557 1.2 isaki track->outbuf.used, 6558 1.2 isaki track->outbuf.capacity); 6559 1.2 isaki 6560 1.2 isaki /* 6561 1.2 isaki * Send a signal if the process is async mode and 6562 1.2 isaki * used is lower than lowat. 6563 1.2 isaki */ 6564 1.2 isaki if (track->usrbuf.used <= track->usrbuf_usedlow && 6565 1.2 isaki !track->is_pause) { 6566 1.30 isaki /* For selnotify */ 6567 1.2 isaki found = true; 6568 1.30 isaki /* For SIGIO */ 6569 1.2 isaki pid = f->async_audio; 6570 1.2 isaki if (pid != 0) { 6571 1.2 isaki TRACEF(4, f, "sending SIGIO %d", pid); 6572 1.30 isaki audio_psignal(sc, pid, SIGIO); 6573 1.2 isaki } 6574 1.2 isaki } 6575 1.2 isaki } 6576 1.2 isaki 6577 1.2 isaki /* 6578 1.2 isaki * Notify for select/poll when someone become writable. 6579 1.2 isaki * It needs sc_lock (and not sc_intr_lock). 6580 1.2 isaki */ 6581 1.2 isaki if (found) { 6582 1.2 isaki TRACE(4, "selnotify"); 6583 1.2 isaki selnotify(&sc->sc_wsel, 0, NOTE_SUBMIT); 6584 1.2 isaki } 6585 1.2 isaki 6586 1.2 isaki /* Notify to audio_write() that outbuf available. */ 6587 1.2 isaki cv_broadcast(&sc->sc_pmixer->outcv); 6588 1.2 isaki 6589 1.2 isaki mutex_exit(sc->sc_lock); 6590 1.2 isaki } 6591 1.2 isaki 6592 1.2 isaki /* 6593 1.2 isaki * Check (and convert) the format *p came from userland. 6594 1.85 isaki * If successful, it writes back the converted format to *p if necessary and 6595 1.85 isaki * returns 0. Otherwise returns errno (*p may be changed even in this case). 6596 1.2 isaki */ 6597 1.2 isaki static int 6598 1.2 isaki audio_check_params(audio_format2_t *p) 6599 1.2 isaki { 6600 1.2 isaki 6601 1.72 nia /* 6602 1.72 nia * Convert obsolete AUDIO_ENCODING_PCM encodings. 6603 1.76 isaki * 6604 1.72 nia * AUDIO_ENCODING_PCM16 == AUDIO_ENCODING_LINEAR 6605 1.72 nia * So, it's always signed, as in SunOS. 6606 1.72 nia * 6607 1.72 nia * AUDIO_ENCODING_PCM8 == AUDIO_ENCODING_LINEAR8 6608 1.72 nia * So, it's always unsigned, as in SunOS. 6609 1.72 nia */ 6610 1.2 isaki if (p->encoding == AUDIO_ENCODING_PCM16) { 6611 1.72 nia p->encoding = AUDIO_ENCODING_SLINEAR; 6612 1.2 isaki } else if (p->encoding == AUDIO_ENCODING_PCM8) { 6613 1.2 isaki if (p->precision == 8) 6614 1.2 isaki p->encoding = AUDIO_ENCODING_ULINEAR; 6615 1.2 isaki else 6616 1.2 isaki return EINVAL; 6617 1.2 isaki } 6618 1.2 isaki 6619 1.2 isaki /* 6620 1.2 isaki * Convert obsoleted AUDIO_ENCODING_[SU]LINEAR without endianness 6621 1.2 isaki * suffix. 6622 1.2 isaki */ 6623 1.2 isaki if (p->encoding == AUDIO_ENCODING_SLINEAR) 6624 1.2 isaki p->encoding = AUDIO_ENCODING_SLINEAR_NE; 6625 1.2 isaki if (p->encoding == AUDIO_ENCODING_ULINEAR) 6626 1.2 isaki p->encoding = AUDIO_ENCODING_ULINEAR_NE; 6627 1.2 isaki 6628 1.2 isaki switch (p->encoding) { 6629 1.2 isaki case AUDIO_ENCODING_ULAW: 6630 1.2 isaki case AUDIO_ENCODING_ALAW: 6631 1.2 isaki if (p->precision != 8) 6632 1.2 isaki return EINVAL; 6633 1.2 isaki break; 6634 1.2 isaki case AUDIO_ENCODING_ADPCM: 6635 1.2 isaki if (p->precision != 4 && p->precision != 8) 6636 1.2 isaki return EINVAL; 6637 1.2 isaki break; 6638 1.2 isaki case AUDIO_ENCODING_SLINEAR_LE: 6639 1.2 isaki case AUDIO_ENCODING_SLINEAR_BE: 6640 1.2 isaki case AUDIO_ENCODING_ULINEAR_LE: 6641 1.2 isaki case AUDIO_ENCODING_ULINEAR_BE: 6642 1.2 isaki if (p->precision != 8 && p->precision != 16 && 6643 1.2 isaki p->precision != 24 && p->precision != 32) 6644 1.2 isaki return EINVAL; 6645 1.2 isaki 6646 1.2 isaki /* 8bit format does not have endianness. */ 6647 1.2 isaki if (p->precision == 8) { 6648 1.2 isaki if (p->encoding == AUDIO_ENCODING_SLINEAR_OE) 6649 1.2 isaki p->encoding = AUDIO_ENCODING_SLINEAR_NE; 6650 1.2 isaki if (p->encoding == AUDIO_ENCODING_ULINEAR_OE) 6651 1.2 isaki p->encoding = AUDIO_ENCODING_ULINEAR_NE; 6652 1.2 isaki } 6653 1.2 isaki 6654 1.2 isaki if (p->precision > p->stride) 6655 1.2 isaki return EINVAL; 6656 1.2 isaki break; 6657 1.2 isaki case AUDIO_ENCODING_MPEG_L1_STREAM: 6658 1.2 isaki case AUDIO_ENCODING_MPEG_L1_PACKETS: 6659 1.2 isaki case AUDIO_ENCODING_MPEG_L1_SYSTEM: 6660 1.2 isaki case AUDIO_ENCODING_MPEG_L2_STREAM: 6661 1.2 isaki case AUDIO_ENCODING_MPEG_L2_PACKETS: 6662 1.2 isaki case AUDIO_ENCODING_MPEG_L2_SYSTEM: 6663 1.2 isaki case AUDIO_ENCODING_AC3: 6664 1.2 isaki break; 6665 1.2 isaki default: 6666 1.2 isaki return EINVAL; 6667 1.2 isaki } 6668 1.2 isaki 6669 1.2 isaki /* sanity check # of channels*/ 6670 1.2 isaki if (p->channels < 1 || p->channels > AUDIO_MAX_CHANNELS) 6671 1.2 isaki return EINVAL; 6672 1.2 isaki 6673 1.2 isaki return 0; 6674 1.2 isaki } 6675 1.2 isaki 6676 1.2 isaki /* 6677 1.2 isaki * Initialize playback and record mixers. 6678 1.32 msaitoh * mode (AUMODE_{PLAY,RECORD}) indicates the mixer to be initialized. 6679 1.2 isaki * phwfmt and rhwfmt indicate the hardware format. pfil and rfil indicate 6680 1.2 isaki * the filter registration information. These four must not be NULL. 6681 1.2 isaki * If successful returns 0. Otherwise returns errno. 6682 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 6683 1.2 isaki * Must not be called if there are any tracks. 6684 1.2 isaki * Caller should check that the initialization succeed by whether 6685 1.2 isaki * sc_[pr]mixer is not NULL. 6686 1.2 isaki */ 6687 1.2 isaki static int 6688 1.2 isaki audio_mixers_init(struct audio_softc *sc, int mode, 6689 1.2 isaki const audio_format2_t *phwfmt, const audio_format2_t *rhwfmt, 6690 1.2 isaki const audio_filter_reg_t *pfil, const audio_filter_reg_t *rfil) 6691 1.2 isaki { 6692 1.2 isaki int error; 6693 1.2 isaki 6694 1.2 isaki KASSERT(phwfmt != NULL); 6695 1.2 isaki KASSERT(rhwfmt != NULL); 6696 1.2 isaki KASSERT(pfil != NULL); 6697 1.2 isaki KASSERT(rfil != NULL); 6698 1.63 isaki KASSERT(sc->sc_exlock); 6699 1.2 isaki 6700 1.2 isaki if ((mode & AUMODE_PLAY)) { 6701 1.26 isaki if (sc->sc_pmixer == NULL) { 6702 1.26 isaki sc->sc_pmixer = kmem_zalloc(sizeof(*sc->sc_pmixer), 6703 1.26 isaki KM_SLEEP); 6704 1.26 isaki } else { 6705 1.26 isaki /* destroy() doesn't free memory. */ 6706 1.2 isaki audio_mixer_destroy(sc, sc->sc_pmixer); 6707 1.26 isaki memset(sc->sc_pmixer, 0, sizeof(*sc->sc_pmixer)); 6708 1.2 isaki } 6709 1.2 isaki error = audio_mixer_init(sc, AUMODE_PLAY, phwfmt, pfil); 6710 1.2 isaki if (error) { 6711 1.88 isaki /* audio_mixer_init already displayed error code */ 6712 1.88 isaki audio_printf(sc, "configuring playback mode failed\n"); 6713 1.2 isaki kmem_free(sc->sc_pmixer, sizeof(*sc->sc_pmixer)); 6714 1.2 isaki sc->sc_pmixer = NULL; 6715 1.2 isaki return error; 6716 1.2 isaki } 6717 1.2 isaki } 6718 1.2 isaki if ((mode & AUMODE_RECORD)) { 6719 1.26 isaki if (sc->sc_rmixer == NULL) { 6720 1.26 isaki sc->sc_rmixer = kmem_zalloc(sizeof(*sc->sc_rmixer), 6721 1.26 isaki KM_SLEEP); 6722 1.26 isaki } else { 6723 1.26 isaki /* destroy() doesn't free memory. */ 6724 1.2 isaki audio_mixer_destroy(sc, sc->sc_rmixer); 6725 1.26 isaki memset(sc->sc_rmixer, 0, sizeof(*sc->sc_rmixer)); 6726 1.2 isaki } 6727 1.2 isaki error = audio_mixer_init(sc, AUMODE_RECORD, rhwfmt, rfil); 6728 1.2 isaki if (error) { 6729 1.88 isaki /* audio_mixer_init already displayed error code */ 6730 1.88 isaki audio_printf(sc, "configuring record mode failed\n"); 6731 1.2 isaki kmem_free(sc->sc_rmixer, sizeof(*sc->sc_rmixer)); 6732 1.2 isaki sc->sc_rmixer = NULL; 6733 1.2 isaki return error; 6734 1.2 isaki } 6735 1.2 isaki } 6736 1.2 isaki 6737 1.2 isaki return 0; 6738 1.2 isaki } 6739 1.2 isaki 6740 1.2 isaki /* 6741 1.2 isaki * Select a frequency. 6742 1.2 isaki * Prioritize 48kHz and 44.1kHz. Otherwise choose the highest one. 6743 1.2 isaki * XXX Better algorithm? 6744 1.2 isaki */ 6745 1.2 isaki static int 6746 1.2 isaki audio_select_freq(const struct audio_format *fmt) 6747 1.2 isaki { 6748 1.2 isaki int freq; 6749 1.2 isaki int high; 6750 1.2 isaki int low; 6751 1.2 isaki int j; 6752 1.2 isaki 6753 1.2 isaki if (fmt->frequency_type == 0) { 6754 1.2 isaki low = fmt->frequency[0]; 6755 1.2 isaki high = fmt->frequency[1]; 6756 1.2 isaki freq = 48000; 6757 1.2 isaki if (low <= freq && freq <= high) { 6758 1.2 isaki return freq; 6759 1.2 isaki } 6760 1.2 isaki freq = 44100; 6761 1.2 isaki if (low <= freq && freq <= high) { 6762 1.2 isaki return freq; 6763 1.2 isaki } 6764 1.2 isaki return high; 6765 1.2 isaki } else { 6766 1.2 isaki for (j = 0; j < fmt->frequency_type; j++) { 6767 1.2 isaki if (fmt->frequency[j] == 48000) { 6768 1.2 isaki return fmt->frequency[j]; 6769 1.2 isaki } 6770 1.2 isaki } 6771 1.2 isaki high = 0; 6772 1.2 isaki for (j = 0; j < fmt->frequency_type; j++) { 6773 1.2 isaki if (fmt->frequency[j] == 44100) { 6774 1.2 isaki return fmt->frequency[j]; 6775 1.2 isaki } 6776 1.2 isaki if (fmt->frequency[j] > high) { 6777 1.2 isaki high = fmt->frequency[j]; 6778 1.2 isaki } 6779 1.2 isaki } 6780 1.2 isaki return high; 6781 1.2 isaki } 6782 1.2 isaki } 6783 1.2 isaki 6784 1.2 isaki /* 6785 1.2 isaki * Choose the most preferred hardware format. 6786 1.2 isaki * If successful, it will store the chosen format into *cand and return 0. 6787 1.2 isaki * Otherwise, return errno. 6788 1.55 isaki * Must be called without sc_lock held. 6789 1.2 isaki */ 6790 1.2 isaki static int 6791 1.55 isaki audio_hw_probe(struct audio_softc *sc, audio_format2_t *cand, int mode) 6792 1.2 isaki { 6793 1.2 isaki audio_format_query_t query; 6794 1.2 isaki int cand_score; 6795 1.2 isaki int score; 6796 1.2 isaki int i; 6797 1.2 isaki int error; 6798 1.2 isaki 6799 1.2 isaki /* 6800 1.2 isaki * Score each formats and choose the highest one. 6801 1.2 isaki * 6802 1.2 isaki * +---- priority(0-3) 6803 1.2 isaki * |+--- encoding/precision 6804 1.2 isaki * ||+-- channels 6805 1.2 isaki * score = 0x000000PEC 6806 1.2 isaki */ 6807 1.2 isaki 6808 1.2 isaki cand_score = 0; 6809 1.2 isaki for (i = 0; ; i++) { 6810 1.2 isaki memset(&query, 0, sizeof(query)); 6811 1.2 isaki query.index = i; 6812 1.2 isaki 6813 1.55 isaki mutex_enter(sc->sc_lock); 6814 1.2 isaki error = sc->hw_if->query_format(sc->hw_hdl, &query); 6815 1.55 isaki mutex_exit(sc->sc_lock); 6816 1.2 isaki if (error == EINVAL) 6817 1.2 isaki break; 6818 1.2 isaki if (error) 6819 1.2 isaki return error; 6820 1.2 isaki 6821 1.2 isaki #if defined(AUDIO_DEBUG) 6822 1.2 isaki DPRINTF(1, "fmt[%d] %c%c pri=%d %s,%d/%dbit,%dch,", i, 6823 1.2 isaki (query.fmt.mode & AUMODE_PLAY) ? 'P' : '-', 6824 1.2 isaki (query.fmt.mode & AUMODE_RECORD) ? 'R' : '-', 6825 1.2 isaki query.fmt.priority, 6826 1.2 isaki audio_encoding_name(query.fmt.encoding), 6827 1.2 isaki query.fmt.validbits, 6828 1.2 isaki query.fmt.precision, 6829 1.2 isaki query.fmt.channels); 6830 1.2 isaki if (query.fmt.frequency_type == 0) { 6831 1.2 isaki DPRINTF(1, "{%d-%d", 6832 1.2 isaki query.fmt.frequency[0], query.fmt.frequency[1]); 6833 1.2 isaki } else { 6834 1.2 isaki int j; 6835 1.2 isaki for (j = 0; j < query.fmt.frequency_type; j++) { 6836 1.2 isaki DPRINTF(1, "%c%d", 6837 1.2 isaki (j == 0) ? '{' : ',', 6838 1.2 isaki query.fmt.frequency[j]); 6839 1.2 isaki } 6840 1.2 isaki } 6841 1.2 isaki DPRINTF(1, "}\n"); 6842 1.2 isaki #endif 6843 1.2 isaki 6844 1.2 isaki if ((query.fmt.mode & mode) == 0) { 6845 1.2 isaki DPRINTF(1, "fmt[%d] skip; mode not match %d\n", i, 6846 1.2 isaki mode); 6847 1.2 isaki continue; 6848 1.2 isaki } 6849 1.2 isaki 6850 1.2 isaki if (query.fmt.priority < 0) { 6851 1.2 isaki DPRINTF(1, "fmt[%d] skip; unsupported encoding\n", i); 6852 1.2 isaki continue; 6853 1.2 isaki } 6854 1.2 isaki 6855 1.2 isaki /* Score */ 6856 1.2 isaki score = (query.fmt.priority & 3) * 0x100; 6857 1.2 isaki if (query.fmt.encoding == AUDIO_ENCODING_SLINEAR_NE && 6858 1.2 isaki query.fmt.validbits == AUDIO_INTERNAL_BITS && 6859 1.2 isaki query.fmt.precision == AUDIO_INTERNAL_BITS) { 6860 1.2 isaki score += 0x20; 6861 1.2 isaki } else if (query.fmt.encoding == AUDIO_ENCODING_SLINEAR_OE && 6862 1.2 isaki query.fmt.validbits == AUDIO_INTERNAL_BITS && 6863 1.2 isaki query.fmt.precision == AUDIO_INTERNAL_BITS) { 6864 1.2 isaki score += 0x10; 6865 1.2 isaki } 6866 1.95 nia 6867 1.95 nia /* Do not prefer surround formats */ 6868 1.95 nia if (query.fmt.channels <= 2) 6869 1.95 nia score += query.fmt.channels; 6870 1.2 isaki 6871 1.2 isaki if (score < cand_score) { 6872 1.2 isaki DPRINTF(1, "fmt[%d] skip; score 0x%x < 0x%x\n", i, 6873 1.2 isaki score, cand_score); 6874 1.2 isaki continue; 6875 1.2 isaki } 6876 1.2 isaki 6877 1.2 isaki /* Update candidate */ 6878 1.2 isaki cand_score = score; 6879 1.2 isaki cand->encoding = query.fmt.encoding; 6880 1.2 isaki cand->precision = query.fmt.validbits; 6881 1.2 isaki cand->stride = query.fmt.precision; 6882 1.2 isaki cand->channels = query.fmt.channels; 6883 1.2 isaki cand->sample_rate = audio_select_freq(&query.fmt); 6884 1.2 isaki DPRINTF(1, "fmt[%d] candidate (score=0x%x)" 6885 1.2 isaki " pri=%d %s,%d/%d,%dch,%dHz\n", i, 6886 1.2 isaki cand_score, query.fmt.priority, 6887 1.2 isaki audio_encoding_name(query.fmt.encoding), 6888 1.2 isaki cand->precision, cand->stride, 6889 1.2 isaki cand->channels, cand->sample_rate); 6890 1.2 isaki } 6891 1.2 isaki 6892 1.2 isaki if (cand_score == 0) { 6893 1.2 isaki DPRINTF(1, "%s no fmt\n", __func__); 6894 1.2 isaki return ENXIO; 6895 1.2 isaki } 6896 1.2 isaki DPRINTF(1, "%s selected: %s,%d/%d,%dch,%dHz\n", __func__, 6897 1.2 isaki audio_encoding_name(cand->encoding), 6898 1.2 isaki cand->precision, cand->stride, cand->channels, cand->sample_rate); 6899 1.2 isaki return 0; 6900 1.2 isaki } 6901 1.2 isaki 6902 1.2 isaki /* 6903 1.2 isaki * Validate fmt with query_format. 6904 1.2 isaki * If fmt is included in the result of query_format, returns 0. 6905 1.2 isaki * Otherwise returns EINVAL. 6906 1.63 isaki * Must be called without sc_lock held. 6907 1.76 isaki */ 6908 1.2 isaki static int 6909 1.2 isaki audio_hw_validate_format(struct audio_softc *sc, int mode, 6910 1.2 isaki const audio_format2_t *fmt) 6911 1.2 isaki { 6912 1.2 isaki audio_format_query_t query; 6913 1.2 isaki struct audio_format *q; 6914 1.2 isaki int index; 6915 1.2 isaki int error; 6916 1.2 isaki int j; 6917 1.2 isaki 6918 1.2 isaki for (index = 0; ; index++) { 6919 1.2 isaki query.index = index; 6920 1.63 isaki mutex_enter(sc->sc_lock); 6921 1.2 isaki error = sc->hw_if->query_format(sc->hw_hdl, &query); 6922 1.63 isaki mutex_exit(sc->sc_lock); 6923 1.2 isaki if (error == EINVAL) 6924 1.2 isaki break; 6925 1.2 isaki if (error) 6926 1.2 isaki return error; 6927 1.2 isaki 6928 1.2 isaki q = &query.fmt; 6929 1.2 isaki /* 6930 1.2 isaki * Note that fmt is audio_format2_t (precision/stride) but 6931 1.2 isaki * q is audio_format_t (validbits/precision). 6932 1.2 isaki */ 6933 1.2 isaki if ((q->mode & mode) == 0) { 6934 1.2 isaki continue; 6935 1.2 isaki } 6936 1.2 isaki if (fmt->encoding != q->encoding) { 6937 1.2 isaki continue; 6938 1.2 isaki } 6939 1.2 isaki if (fmt->precision != q->validbits) { 6940 1.2 isaki continue; 6941 1.2 isaki } 6942 1.2 isaki if (fmt->stride != q->precision) { 6943 1.2 isaki continue; 6944 1.2 isaki } 6945 1.2 isaki if (fmt->channels != q->channels) { 6946 1.2 isaki continue; 6947 1.2 isaki } 6948 1.2 isaki if (q->frequency_type == 0) { 6949 1.2 isaki if (fmt->sample_rate < q->frequency[0] || 6950 1.2 isaki fmt->sample_rate > q->frequency[1]) { 6951 1.2 isaki continue; 6952 1.2 isaki } 6953 1.2 isaki } else { 6954 1.2 isaki for (j = 0; j < q->frequency_type; j++) { 6955 1.2 isaki if (fmt->sample_rate == q->frequency[j]) 6956 1.2 isaki break; 6957 1.2 isaki } 6958 1.2 isaki if (j == query.fmt.frequency_type) { 6959 1.2 isaki continue; 6960 1.2 isaki } 6961 1.2 isaki } 6962 1.2 isaki 6963 1.2 isaki /* Matched. */ 6964 1.2 isaki return 0; 6965 1.2 isaki } 6966 1.2 isaki 6967 1.2 isaki return EINVAL; 6968 1.2 isaki } 6969 1.2 isaki 6970 1.2 isaki /* 6971 1.2 isaki * Set track mixer's format depending on ai->mode. 6972 1.2 isaki * If AUMODE_PLAY is set in ai->mode, it set up the playback mixer 6973 1.44 isaki * with ai.play.*. 6974 1.2 isaki * If AUMODE_RECORD is set in ai->mode, it set up the recording mixer 6975 1.44 isaki * with ai.record.*. 6976 1.2 isaki * All other fields in ai are ignored. 6977 1.2 isaki * If successful returns 0. Otherwise returns errno. 6978 1.2 isaki * This function does not roll back even if it fails. 6979 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 6980 1.2 isaki */ 6981 1.2 isaki static int 6982 1.2 isaki audio_mixers_set_format(struct audio_softc *sc, const struct audio_info *ai) 6983 1.2 isaki { 6984 1.2 isaki audio_format2_t phwfmt; 6985 1.2 isaki audio_format2_t rhwfmt; 6986 1.2 isaki audio_filter_reg_t pfil; 6987 1.2 isaki audio_filter_reg_t rfil; 6988 1.2 isaki int mode; 6989 1.2 isaki int error; 6990 1.2 isaki 6991 1.63 isaki KASSERT(sc->sc_exlock); 6992 1.2 isaki 6993 1.2 isaki /* 6994 1.2 isaki * Even when setting either one of playback and recording, 6995 1.2 isaki * both must be halted. 6996 1.2 isaki */ 6997 1.2 isaki if (sc->sc_popens + sc->sc_ropens > 0) 6998 1.2 isaki return EBUSY; 6999 1.2 isaki 7000 1.2 isaki if (!SPECIFIED(ai->mode) || ai->mode == 0) 7001 1.2 isaki return ENOTTY; 7002 1.2 isaki 7003 1.2 isaki mode = ai->mode; 7004 1.2 isaki if ((mode & AUMODE_PLAY)) { 7005 1.2 isaki phwfmt.encoding = ai->play.encoding; 7006 1.2 isaki phwfmt.precision = ai->play.precision; 7007 1.2 isaki phwfmt.stride = ai->play.precision; 7008 1.2 isaki phwfmt.channels = ai->play.channels; 7009 1.2 isaki phwfmt.sample_rate = ai->play.sample_rate; 7010 1.2 isaki } 7011 1.2 isaki if ((mode & AUMODE_RECORD)) { 7012 1.2 isaki rhwfmt.encoding = ai->record.encoding; 7013 1.2 isaki rhwfmt.precision = ai->record.precision; 7014 1.2 isaki rhwfmt.stride = ai->record.precision; 7015 1.2 isaki rhwfmt.channels = ai->record.channels; 7016 1.2 isaki rhwfmt.sample_rate = ai->record.sample_rate; 7017 1.2 isaki } 7018 1.2 isaki 7019 1.2 isaki /* On non-independent devices, use the same format for both. */ 7020 1.14 isaki if ((sc->sc_props & AUDIO_PROP_INDEPENDENT) == 0) { 7021 1.2 isaki if (mode == AUMODE_RECORD) { 7022 1.2 isaki phwfmt = rhwfmt; 7023 1.2 isaki } else { 7024 1.2 isaki rhwfmt = phwfmt; 7025 1.2 isaki } 7026 1.2 isaki mode = AUMODE_PLAY | AUMODE_RECORD; 7027 1.2 isaki } 7028 1.2 isaki 7029 1.2 isaki /* Then, unset the direction not exist on the hardware. */ 7030 1.14 isaki if ((sc->sc_props & AUDIO_PROP_PLAYBACK) == 0) 7031 1.2 isaki mode &= ~AUMODE_PLAY; 7032 1.14 isaki if ((sc->sc_props & AUDIO_PROP_CAPTURE) == 0) 7033 1.2 isaki mode &= ~AUMODE_RECORD; 7034 1.2 isaki 7035 1.2 isaki /* debug */ 7036 1.2 isaki if ((mode & AUMODE_PLAY)) { 7037 1.2 isaki TRACE(1, "play=%s/%d/%d/%dch/%dHz", 7038 1.2 isaki audio_encoding_name(phwfmt.encoding), 7039 1.2 isaki phwfmt.precision, 7040 1.2 isaki phwfmt.stride, 7041 1.2 isaki phwfmt.channels, 7042 1.2 isaki phwfmt.sample_rate); 7043 1.2 isaki } 7044 1.2 isaki if ((mode & AUMODE_RECORD)) { 7045 1.2 isaki TRACE(1, "rec =%s/%d/%d/%dch/%dHz", 7046 1.2 isaki audio_encoding_name(rhwfmt.encoding), 7047 1.2 isaki rhwfmt.precision, 7048 1.2 isaki rhwfmt.stride, 7049 1.2 isaki rhwfmt.channels, 7050 1.2 isaki rhwfmt.sample_rate); 7051 1.2 isaki } 7052 1.2 isaki 7053 1.2 isaki /* Check the format */ 7054 1.2 isaki if ((mode & AUMODE_PLAY)) { 7055 1.2 isaki if (audio_hw_validate_format(sc, AUMODE_PLAY, &phwfmt)) { 7056 1.2 isaki TRACE(1, "invalid format"); 7057 1.2 isaki return EINVAL; 7058 1.2 isaki } 7059 1.2 isaki } 7060 1.2 isaki if ((mode & AUMODE_RECORD)) { 7061 1.2 isaki if (audio_hw_validate_format(sc, AUMODE_RECORD, &rhwfmt)) { 7062 1.2 isaki TRACE(1, "invalid format"); 7063 1.2 isaki return EINVAL; 7064 1.2 isaki } 7065 1.2 isaki } 7066 1.2 isaki 7067 1.2 isaki /* Configure the mixers. */ 7068 1.2 isaki memset(&pfil, 0, sizeof(pfil)); 7069 1.2 isaki memset(&rfil, 0, sizeof(rfil)); 7070 1.2 isaki error = audio_hw_set_format(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 7071 1.2 isaki if (error) 7072 1.2 isaki return error; 7073 1.2 isaki 7074 1.2 isaki error = audio_mixers_init(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 7075 1.2 isaki if (error) 7076 1.2 isaki return error; 7077 1.2 isaki 7078 1.59 isaki /* 7079 1.59 isaki * Reinitialize the sticky parameters for /dev/sound. 7080 1.59 isaki * If the number of the hardware channels becomes less than the number 7081 1.59 isaki * of channels that sticky parameters remember, subsequent /dev/sound 7082 1.59 isaki * open will fail. To prevent this, reinitialize the sticky 7083 1.59 isaki * parameters whenever the hardware format is changed. 7084 1.59 isaki */ 7085 1.59 isaki sc->sc_sound_pparams = params_to_format2(&audio_default); 7086 1.59 isaki sc->sc_sound_rparams = params_to_format2(&audio_default); 7087 1.59 isaki sc->sc_sound_ppause = false; 7088 1.59 isaki sc->sc_sound_rpause = false; 7089 1.59 isaki 7090 1.2 isaki return 0; 7091 1.2 isaki } 7092 1.2 isaki 7093 1.2 isaki /* 7094 1.2 isaki * Store current mixers format into *ai. 7095 1.63 isaki * Must be called with sc_exlock held. 7096 1.2 isaki */ 7097 1.2 isaki static void 7098 1.2 isaki audio_mixers_get_format(struct audio_softc *sc, struct audio_info *ai) 7099 1.2 isaki { 7100 1.63 isaki 7101 1.63 isaki KASSERT(sc->sc_exlock); 7102 1.63 isaki 7103 1.2 isaki /* 7104 1.2 isaki * There is no stride information in audio_info but it doesn't matter. 7105 1.2 isaki * trackmixer always treats stride and precision as the same. 7106 1.2 isaki */ 7107 1.2 isaki AUDIO_INITINFO(ai); 7108 1.2 isaki ai->mode = 0; 7109 1.2 isaki if (sc->sc_pmixer) { 7110 1.2 isaki audio_format2_t *fmt = &sc->sc_pmixer->track_fmt; 7111 1.2 isaki ai->play.encoding = fmt->encoding; 7112 1.2 isaki ai->play.precision = fmt->precision; 7113 1.2 isaki ai->play.channels = fmt->channels; 7114 1.2 isaki ai->play.sample_rate = fmt->sample_rate; 7115 1.2 isaki ai->mode |= AUMODE_PLAY; 7116 1.2 isaki } 7117 1.2 isaki if (sc->sc_rmixer) { 7118 1.2 isaki audio_format2_t *fmt = &sc->sc_rmixer->track_fmt; 7119 1.2 isaki ai->record.encoding = fmt->encoding; 7120 1.2 isaki ai->record.precision = fmt->precision; 7121 1.2 isaki ai->record.channels = fmt->channels; 7122 1.2 isaki ai->record.sample_rate = fmt->sample_rate; 7123 1.2 isaki ai->mode |= AUMODE_RECORD; 7124 1.2 isaki } 7125 1.2 isaki } 7126 1.2 isaki 7127 1.2 isaki /* 7128 1.2 isaki * audio_info details: 7129 1.2 isaki * 7130 1.2 isaki * ai.{play,record}.sample_rate (R/W) 7131 1.2 isaki * ai.{play,record}.encoding (R/W) 7132 1.2 isaki * ai.{play,record}.precision (R/W) 7133 1.2 isaki * ai.{play,record}.channels (R/W) 7134 1.2 isaki * These specify the playback or recording format. 7135 1.2 isaki * Ignore members within an inactive track. 7136 1.2 isaki * 7137 1.2 isaki * ai.mode (R/W) 7138 1.2 isaki * It specifies the playback or recording mode, AUMODE_*. 7139 1.2 isaki * Currently, a mode change operation by ai.mode after opening is 7140 1.2 isaki * prohibited. In addition, AUMODE_PLAY_ALL no longer makes sense. 7141 1.2 isaki * However, it's possible to get or to set for backward compatibility. 7142 1.2 isaki * 7143 1.2 isaki * ai.{hiwat,lowat} (R/W) 7144 1.2 isaki * These specify the high water mark and low water mark for playback 7145 1.2 isaki * track. The unit is block. 7146 1.2 isaki * 7147 1.2 isaki * ai.{play,record}.gain (R/W) 7148 1.2 isaki * It specifies the HW mixer volume in 0-255. 7149 1.2 isaki * It is historical reason that the gain is connected to HW mixer. 7150 1.2 isaki * 7151 1.2 isaki * ai.{play,record}.balance (R/W) 7152 1.2 isaki * It specifies the left-right balance of HW mixer in 0-64. 7153 1.2 isaki * 32 means the center. 7154 1.2 isaki * It is historical reason that the balance is connected to HW mixer. 7155 1.2 isaki * 7156 1.2 isaki * ai.{play,record}.port (R/W) 7157 1.2 isaki * It specifies the input/output port of HW mixer. 7158 1.2 isaki * 7159 1.2 isaki * ai.monitor_gain (R/W) 7160 1.2 isaki * It specifies the recording monitor gain(?) of HW mixer. 7161 1.2 isaki * 7162 1.2 isaki * ai.{play,record}.pause (R/W) 7163 1.2 isaki * Non-zero means the track is paused. 7164 1.2 isaki * 7165 1.2 isaki * ai.play.seek (R/-) 7166 1.2 isaki * It indicates the number of bytes written but not processed. 7167 1.2 isaki * ai.record.seek (R/-) 7168 1.2 isaki * It indicates the number of bytes to be able to read. 7169 1.2 isaki * 7170 1.2 isaki * ai.{play,record}.avail_ports (R/-) 7171 1.2 isaki * Mixer info. 7172 1.2 isaki * 7173 1.2 isaki * ai.{play,record}.buffer_size (R/-) 7174 1.2 isaki * It indicates the buffer size in bytes. Internally it means usrbuf. 7175 1.2 isaki * 7176 1.2 isaki * ai.{play,record}.samples (R/-) 7177 1.2 isaki * It indicates the total number of bytes played or recorded. 7178 1.2 isaki * 7179 1.2 isaki * ai.{play,record}.eof (R/-) 7180 1.2 isaki * It indicates the number of times reached EOF(?). 7181 1.2 isaki * 7182 1.2 isaki * ai.{play,record}.error (R/-) 7183 1.112 andvar * Non-zero indicates overflow/underflow has occurred. 7184 1.2 isaki * 7185 1.2 isaki * ai.{play,record}.waiting (R/-) 7186 1.2 isaki * Non-zero indicates that other process waits to open. 7187 1.2 isaki * It will never happen anymore. 7188 1.2 isaki * 7189 1.2 isaki * ai.{play,record}.open (R/-) 7190 1.2 isaki * Non-zero indicates the direction is opened by this process(?). 7191 1.2 isaki * XXX Is this better to indicate that "the device is opened by 7192 1.2 isaki * at least one process"? 7193 1.2 isaki * 7194 1.2 isaki * ai.{play,record}.active (R/-) 7195 1.2 isaki * Non-zero indicates that I/O is currently active. 7196 1.2 isaki * 7197 1.2 isaki * ai.blocksize (R/-) 7198 1.2 isaki * It indicates the block size in bytes. 7199 1.2 isaki * XXX The blocksize of playback and recording may be different. 7200 1.2 isaki */ 7201 1.2 isaki 7202 1.2 isaki /* 7203 1.2 isaki * Pause consideration: 7204 1.2 isaki * 7205 1.65 isaki * Pausing/unpausing never affect [pr]mixer. This single rule makes 7206 1.65 isaki * operation simple. Note that playback and recording are asymmetric. 7207 1.65 isaki * 7208 1.65 isaki * For playback, 7209 1.65 isaki * 1. Any playback open doesn't start pmixer regardless of initial pause 7210 1.65 isaki * state of this track. 7211 1.65 isaki * 2. The first write access among playback tracks only starts pmixer 7212 1.65 isaki * regardless of this track's pause state. 7213 1.65 isaki * 3. Even a pause of the last playback track doesn't stop pmixer. 7214 1.65 isaki * 4. The last close of all playback tracks only stops pmixer. 7215 1.65 isaki * 7216 1.65 isaki * For recording, 7217 1.65 isaki * 1. The first recording open only starts rmixer regardless of initial 7218 1.65 isaki * pause state of this track. 7219 1.65 isaki * 2. Even a pause of the last track doesn't stop rmixer. 7220 1.65 isaki * 3. The last close of all recording tracks only stops rmixer. 7221 1.2 isaki */ 7222 1.2 isaki 7223 1.2 isaki /* 7224 1.2 isaki * Set both track's parameters within a file depending on ai. 7225 1.2 isaki * Update sc_sound_[pr]* if set. 7226 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 7227 1.2 isaki */ 7228 1.2 isaki static int 7229 1.2 isaki audio_file_setinfo(struct audio_softc *sc, audio_file_t *file, 7230 1.2 isaki const struct audio_info *ai) 7231 1.2 isaki { 7232 1.2 isaki const struct audio_prinfo *pi; 7233 1.2 isaki const struct audio_prinfo *ri; 7234 1.2 isaki audio_track_t *ptrack; 7235 1.2 isaki audio_track_t *rtrack; 7236 1.2 isaki audio_format2_t pfmt; 7237 1.2 isaki audio_format2_t rfmt; 7238 1.2 isaki int pchanges; 7239 1.2 isaki int rchanges; 7240 1.2 isaki int mode; 7241 1.2 isaki struct audio_info saved_ai; 7242 1.2 isaki audio_format2_t saved_pfmt; 7243 1.2 isaki audio_format2_t saved_rfmt; 7244 1.2 isaki int error; 7245 1.2 isaki 7246 1.2 isaki KASSERT(sc->sc_exlock); 7247 1.2 isaki 7248 1.2 isaki pi = &ai->play; 7249 1.2 isaki ri = &ai->record; 7250 1.2 isaki pchanges = 0; 7251 1.2 isaki rchanges = 0; 7252 1.2 isaki 7253 1.2 isaki ptrack = file->ptrack; 7254 1.2 isaki rtrack = file->rtrack; 7255 1.2 isaki 7256 1.2 isaki #if defined(AUDIO_DEBUG) 7257 1.2 isaki if (audiodebug >= 2) { 7258 1.2 isaki char buf[256]; 7259 1.2 isaki char p[64]; 7260 1.2 isaki int buflen; 7261 1.2 isaki int plen; 7262 1.2 isaki #define SPRINTF(var, fmt...) do { \ 7263 1.2 isaki var##len += snprintf(var + var##len, sizeof(var) - var##len, fmt); \ 7264 1.2 isaki } while (0) 7265 1.2 isaki 7266 1.2 isaki buflen = 0; 7267 1.2 isaki plen = 0; 7268 1.2 isaki if (SPECIFIED(pi->encoding)) 7269 1.2 isaki SPRINTF(p, "/%s", audio_encoding_name(pi->encoding)); 7270 1.2 isaki if (SPECIFIED(pi->precision)) 7271 1.2 isaki SPRINTF(p, "/%dbit", pi->precision); 7272 1.2 isaki if (SPECIFIED(pi->channels)) 7273 1.2 isaki SPRINTF(p, "/%dch", pi->channels); 7274 1.2 isaki if (SPECIFIED(pi->sample_rate)) 7275 1.2 isaki SPRINTF(p, "/%dHz", pi->sample_rate); 7276 1.2 isaki if (plen > 0) 7277 1.2 isaki SPRINTF(buf, ",play.param=%s", p + 1); 7278 1.2 isaki 7279 1.2 isaki plen = 0; 7280 1.2 isaki if (SPECIFIED(ri->encoding)) 7281 1.2 isaki SPRINTF(p, "/%s", audio_encoding_name(ri->encoding)); 7282 1.2 isaki if (SPECIFIED(ri->precision)) 7283 1.2 isaki SPRINTF(p, "/%dbit", ri->precision); 7284 1.2 isaki if (SPECIFIED(ri->channels)) 7285 1.2 isaki SPRINTF(p, "/%dch", ri->channels); 7286 1.2 isaki if (SPECIFIED(ri->sample_rate)) 7287 1.2 isaki SPRINTF(p, "/%dHz", ri->sample_rate); 7288 1.2 isaki if (plen > 0) 7289 1.2 isaki SPRINTF(buf, ",record.param=%s", p + 1); 7290 1.2 isaki 7291 1.2 isaki if (SPECIFIED(ai->mode)) 7292 1.2 isaki SPRINTF(buf, ",mode=%d", ai->mode); 7293 1.2 isaki if (SPECIFIED(ai->hiwat)) 7294 1.2 isaki SPRINTF(buf, ",hiwat=%d", ai->hiwat); 7295 1.2 isaki if (SPECIFIED(ai->lowat)) 7296 1.2 isaki SPRINTF(buf, ",lowat=%d", ai->lowat); 7297 1.2 isaki if (SPECIFIED(ai->play.gain)) 7298 1.2 isaki SPRINTF(buf, ",play.gain=%d", ai->play.gain); 7299 1.2 isaki if (SPECIFIED(ai->record.gain)) 7300 1.2 isaki SPRINTF(buf, ",record.gain=%d", ai->record.gain); 7301 1.2 isaki if (SPECIFIED_CH(ai->play.balance)) 7302 1.2 isaki SPRINTF(buf, ",play.balance=%d", ai->play.balance); 7303 1.2 isaki if (SPECIFIED_CH(ai->record.balance)) 7304 1.2 isaki SPRINTF(buf, ",record.balance=%d", ai->record.balance); 7305 1.2 isaki if (SPECIFIED(ai->play.port)) 7306 1.2 isaki SPRINTF(buf, ",play.port=%d", ai->play.port); 7307 1.2 isaki if (SPECIFIED(ai->record.port)) 7308 1.2 isaki SPRINTF(buf, ",record.port=%d", ai->record.port); 7309 1.2 isaki if (SPECIFIED(ai->monitor_gain)) 7310 1.2 isaki SPRINTF(buf, ",monitor_gain=%d", ai->monitor_gain); 7311 1.2 isaki if (SPECIFIED_CH(ai->play.pause)) 7312 1.2 isaki SPRINTF(buf, ",play.pause=%d", ai->play.pause); 7313 1.2 isaki if (SPECIFIED_CH(ai->record.pause)) 7314 1.2 isaki SPRINTF(buf, ",record.pause=%d", ai->record.pause); 7315 1.2 isaki 7316 1.2 isaki if (buflen > 0) 7317 1.2 isaki TRACE(2, "specified %s", buf + 1); 7318 1.2 isaki } 7319 1.2 isaki #endif 7320 1.2 isaki 7321 1.2 isaki AUDIO_INITINFO(&saved_ai); 7322 1.2 isaki /* XXX shut up gcc */ 7323 1.2 isaki memset(&saved_pfmt, 0, sizeof(saved_pfmt)); 7324 1.2 isaki memset(&saved_rfmt, 0, sizeof(saved_rfmt)); 7325 1.2 isaki 7326 1.62 isaki /* 7327 1.62 isaki * Set default value and save current parameters. 7328 1.62 isaki * For backward compatibility, use sticky parameters for nonexistent 7329 1.62 isaki * track. 7330 1.62 isaki */ 7331 1.2 isaki if (ptrack) { 7332 1.2 isaki pfmt = ptrack->usrbuf.fmt; 7333 1.2 isaki saved_pfmt = ptrack->usrbuf.fmt; 7334 1.2 isaki saved_ai.play.pause = ptrack->is_pause; 7335 1.62 isaki } else { 7336 1.62 isaki pfmt = sc->sc_sound_pparams; 7337 1.2 isaki } 7338 1.2 isaki if (rtrack) { 7339 1.2 isaki rfmt = rtrack->usrbuf.fmt; 7340 1.2 isaki saved_rfmt = rtrack->usrbuf.fmt; 7341 1.2 isaki saved_ai.record.pause = rtrack->is_pause; 7342 1.62 isaki } else { 7343 1.62 isaki rfmt = sc->sc_sound_rparams; 7344 1.2 isaki } 7345 1.2 isaki saved_ai.mode = file->mode; 7346 1.2 isaki 7347 1.62 isaki /* 7348 1.62 isaki * Overwrite if specified. 7349 1.62 isaki */ 7350 1.2 isaki mode = file->mode; 7351 1.2 isaki if (SPECIFIED(ai->mode)) { 7352 1.2 isaki /* 7353 1.2 isaki * Setting ai->mode no longer does anything because it's 7354 1.2 isaki * prohibited to change playback/recording mode after open 7355 1.2 isaki * and AUMODE_PLAY_ALL is obsoleted. However, it still 7356 1.2 isaki * keeps the state of AUMODE_PLAY_ALL itself for backward 7357 1.2 isaki * compatibility. 7358 1.2 isaki * In the internal, only file->mode has the state of 7359 1.2 isaki * AUMODE_PLAY_ALL flag and track->mode in both track does 7360 1.2 isaki * not have. 7361 1.2 isaki */ 7362 1.2 isaki if ((file->mode & AUMODE_PLAY)) { 7363 1.2 isaki mode = (file->mode & (AUMODE_PLAY | AUMODE_RECORD)) 7364 1.2 isaki | (ai->mode & AUMODE_PLAY_ALL); 7365 1.2 isaki } 7366 1.2 isaki } 7367 1.2 isaki 7368 1.62 isaki pchanges = audio_track_setinfo_check(ptrack, &pfmt, pi); 7369 1.62 isaki if (pchanges == -1) { 7370 1.8 isaki #if defined(AUDIO_DEBUG) 7371 1.62 isaki TRACEF(1, file, "check play.params failed: " 7372 1.62 isaki "%s %ubit %uch %uHz", 7373 1.62 isaki audio_encoding_name(pi->encoding), 7374 1.62 isaki pi->precision, 7375 1.62 isaki pi->channels, 7376 1.62 isaki pi->sample_rate); 7377 1.8 isaki #endif 7378 1.62 isaki return EINVAL; 7379 1.2 isaki } 7380 1.62 isaki 7381 1.62 isaki rchanges = audio_track_setinfo_check(rtrack, &rfmt, ri); 7382 1.62 isaki if (rchanges == -1) { 7383 1.8 isaki #if defined(AUDIO_DEBUG) 7384 1.62 isaki TRACEF(1, file, "check record.params failed: " 7385 1.62 isaki "%s %ubit %uch %uHz", 7386 1.62 isaki audio_encoding_name(ri->encoding), 7387 1.62 isaki ri->precision, 7388 1.62 isaki ri->channels, 7389 1.62 isaki ri->sample_rate); 7390 1.8 isaki #endif 7391 1.62 isaki return EINVAL; 7392 1.62 isaki } 7393 1.62 isaki 7394 1.62 isaki if (SPECIFIED(ai->mode)) { 7395 1.62 isaki pchanges = 1; 7396 1.62 isaki rchanges = 1; 7397 1.2 isaki } 7398 1.2 isaki 7399 1.2 isaki /* 7400 1.2 isaki * Even when setting either one of playback and recording, 7401 1.2 isaki * both track must be halted. 7402 1.2 isaki */ 7403 1.2 isaki if (pchanges || rchanges) { 7404 1.2 isaki audio_file_clear(sc, file); 7405 1.2 isaki #if defined(AUDIO_DEBUG) 7406 1.62 isaki char nbuf[16]; 7407 1.2 isaki char fmtbuf[64]; 7408 1.2 isaki if (pchanges) { 7409 1.62 isaki if (ptrack) { 7410 1.62 isaki snprintf(nbuf, sizeof(nbuf), "%d", ptrack->id); 7411 1.62 isaki } else { 7412 1.62 isaki snprintf(nbuf, sizeof(nbuf), "-"); 7413 1.62 isaki } 7414 1.2 isaki audio_format2_tostr(fmtbuf, sizeof(fmtbuf), &pfmt); 7415 1.62 isaki DPRINTF(1, "audio track#%s play mode: %s\n", 7416 1.62 isaki nbuf, fmtbuf); 7417 1.2 isaki } 7418 1.2 isaki if (rchanges) { 7419 1.62 isaki if (rtrack) { 7420 1.62 isaki snprintf(nbuf, sizeof(nbuf), "%d", rtrack->id); 7421 1.62 isaki } else { 7422 1.62 isaki snprintf(nbuf, sizeof(nbuf), "-"); 7423 1.62 isaki } 7424 1.2 isaki audio_format2_tostr(fmtbuf, sizeof(fmtbuf), &rfmt); 7425 1.62 isaki DPRINTF(1, "audio track#%s rec mode: %s\n", 7426 1.62 isaki nbuf, fmtbuf); 7427 1.2 isaki } 7428 1.2 isaki #endif 7429 1.2 isaki } 7430 1.2 isaki 7431 1.2 isaki /* Set mixer parameters */ 7432 1.63 isaki mutex_enter(sc->sc_lock); 7433 1.2 isaki error = audio_hw_setinfo(sc, ai, &saved_ai); 7434 1.63 isaki mutex_exit(sc->sc_lock); 7435 1.2 isaki if (error) 7436 1.2 isaki goto abort1; 7437 1.2 isaki 7438 1.62 isaki /* 7439 1.62 isaki * Set to track and update sticky parameters. 7440 1.62 isaki */ 7441 1.2 isaki error = 0; 7442 1.2 isaki file->mode = mode; 7443 1.62 isaki 7444 1.62 isaki if (SPECIFIED_CH(pi->pause)) { 7445 1.62 isaki if (ptrack) 7446 1.2 isaki ptrack->is_pause = pi->pause; 7447 1.62 isaki sc->sc_sound_ppause = pi->pause; 7448 1.62 isaki } 7449 1.62 isaki if (pchanges) { 7450 1.62 isaki if (ptrack) { 7451 1.2 isaki audio_track_lock_enter(ptrack); 7452 1.2 isaki error = audio_track_set_format(ptrack, &pfmt); 7453 1.2 isaki audio_track_lock_exit(ptrack); 7454 1.2 isaki if (error) { 7455 1.2 isaki TRACET(1, ptrack, "set play.params failed"); 7456 1.2 isaki goto abort2; 7457 1.2 isaki } 7458 1.2 isaki } 7459 1.62 isaki sc->sc_sound_pparams = pfmt; 7460 1.62 isaki } 7461 1.62 isaki /* Change water marks after initializing the buffers. */ 7462 1.62 isaki if (SPECIFIED(ai->hiwat) || SPECIFIED(ai->lowat)) { 7463 1.62 isaki if (ptrack) 7464 1.2 isaki audio_track_setinfo_water(ptrack, ai); 7465 1.2 isaki } 7466 1.62 isaki 7467 1.62 isaki if (SPECIFIED_CH(ri->pause)) { 7468 1.62 isaki if (rtrack) 7469 1.2 isaki rtrack->is_pause = ri->pause; 7470 1.62 isaki sc->sc_sound_rpause = ri->pause; 7471 1.62 isaki } 7472 1.62 isaki if (rchanges) { 7473 1.62 isaki if (rtrack) { 7474 1.2 isaki audio_track_lock_enter(rtrack); 7475 1.2 isaki error = audio_track_set_format(rtrack, &rfmt); 7476 1.2 isaki audio_track_lock_exit(rtrack); 7477 1.2 isaki if (error) { 7478 1.2 isaki TRACET(1, rtrack, "set record.params failed"); 7479 1.2 isaki goto abort3; 7480 1.2 isaki } 7481 1.2 isaki } 7482 1.62 isaki sc->sc_sound_rparams = rfmt; 7483 1.2 isaki } 7484 1.2 isaki 7485 1.2 isaki return 0; 7486 1.2 isaki 7487 1.2 isaki /* Rollback */ 7488 1.2 isaki abort3: 7489 1.2 isaki if (error != ENOMEM) { 7490 1.2 isaki rtrack->is_pause = saved_ai.record.pause; 7491 1.2 isaki audio_track_lock_enter(rtrack); 7492 1.2 isaki audio_track_set_format(rtrack, &saved_rfmt); 7493 1.2 isaki audio_track_lock_exit(rtrack); 7494 1.2 isaki } 7495 1.62 isaki sc->sc_sound_rpause = saved_ai.record.pause; 7496 1.62 isaki sc->sc_sound_rparams = saved_rfmt; 7497 1.2 isaki abort2: 7498 1.2 isaki if (ptrack && error != ENOMEM) { 7499 1.2 isaki ptrack->is_pause = saved_ai.play.pause; 7500 1.2 isaki audio_track_lock_enter(ptrack); 7501 1.2 isaki audio_track_set_format(ptrack, &saved_pfmt); 7502 1.2 isaki audio_track_lock_exit(ptrack); 7503 1.2 isaki } 7504 1.62 isaki sc->sc_sound_ppause = saved_ai.play.pause; 7505 1.62 isaki sc->sc_sound_pparams = saved_pfmt; 7506 1.2 isaki file->mode = saved_ai.mode; 7507 1.2 isaki abort1: 7508 1.63 isaki mutex_enter(sc->sc_lock); 7509 1.2 isaki audio_hw_setinfo(sc, &saved_ai, NULL); 7510 1.63 isaki mutex_exit(sc->sc_lock); 7511 1.2 isaki 7512 1.2 isaki return error; 7513 1.2 isaki } 7514 1.2 isaki 7515 1.2 isaki /* 7516 1.2 isaki * Write SPECIFIED() parameters within info back to fmt. 7517 1.62 isaki * Note that track can be NULL here. 7518 1.2 isaki * Return value of 1 indicates that fmt is modified. 7519 1.2 isaki * Return value of 0 indicates that fmt is not modified. 7520 1.2 isaki * Return value of -1 indicates that error EINVAL has occurred. 7521 1.2 isaki */ 7522 1.2 isaki static int 7523 1.62 isaki audio_track_setinfo_check(audio_track_t *track, 7524 1.62 isaki audio_format2_t *fmt, const struct audio_prinfo *info) 7525 1.2 isaki { 7526 1.62 isaki const audio_format2_t *hwfmt; 7527 1.2 isaki int changes; 7528 1.2 isaki 7529 1.2 isaki changes = 0; 7530 1.2 isaki if (SPECIFIED(info->sample_rate)) { 7531 1.2 isaki if (info->sample_rate < AUDIO_MIN_FREQUENCY) 7532 1.2 isaki return -1; 7533 1.2 isaki if (info->sample_rate > AUDIO_MAX_FREQUENCY) 7534 1.2 isaki return -1; 7535 1.2 isaki fmt->sample_rate = info->sample_rate; 7536 1.2 isaki changes = 1; 7537 1.2 isaki } 7538 1.2 isaki if (SPECIFIED(info->encoding)) { 7539 1.2 isaki fmt->encoding = info->encoding; 7540 1.2 isaki changes = 1; 7541 1.2 isaki } 7542 1.2 isaki if (SPECIFIED(info->precision)) { 7543 1.2 isaki fmt->precision = info->precision; 7544 1.2 isaki /* we don't have API to specify stride */ 7545 1.2 isaki fmt->stride = info->precision; 7546 1.2 isaki changes = 1; 7547 1.2 isaki } 7548 1.2 isaki if (SPECIFIED(info->channels)) { 7549 1.43 isaki /* 7550 1.43 isaki * We can convert between monaural and stereo each other. 7551 1.43 isaki * We can reduce than the number of channels that the hardware 7552 1.43 isaki * supports. 7553 1.43 isaki */ 7554 1.62 isaki if (info->channels > 2) { 7555 1.62 isaki if (track) { 7556 1.62 isaki hwfmt = &track->mixer->hwbuf.fmt; 7557 1.62 isaki if (info->channels > hwfmt->channels) 7558 1.62 isaki return -1; 7559 1.62 isaki } else { 7560 1.62 isaki /* 7561 1.62 isaki * This should never happen. 7562 1.62 isaki * If track == NULL, channels should be <= 2. 7563 1.62 isaki */ 7564 1.62 isaki return -1; 7565 1.62 isaki } 7566 1.62 isaki } 7567 1.2 isaki fmt->channels = info->channels; 7568 1.2 isaki changes = 1; 7569 1.2 isaki } 7570 1.2 isaki 7571 1.2 isaki if (changes) { 7572 1.8 isaki if (audio_check_params(fmt) != 0) 7573 1.2 isaki return -1; 7574 1.2 isaki } 7575 1.2 isaki 7576 1.2 isaki return changes; 7577 1.2 isaki } 7578 1.2 isaki 7579 1.2 isaki /* 7580 1.113 andvar * Change water marks for playback track if specified. 7581 1.2 isaki */ 7582 1.2 isaki static void 7583 1.2 isaki audio_track_setinfo_water(audio_track_t *track, const struct audio_info *ai) 7584 1.2 isaki { 7585 1.2 isaki u_int blks; 7586 1.2 isaki u_int maxblks; 7587 1.2 isaki u_int blksize; 7588 1.2 isaki 7589 1.2 isaki KASSERT(audio_track_is_playback(track)); 7590 1.2 isaki 7591 1.2 isaki blksize = track->usrbuf_blksize; 7592 1.2 isaki maxblks = track->usrbuf.capacity / blksize; 7593 1.2 isaki 7594 1.2 isaki if (SPECIFIED(ai->hiwat)) { 7595 1.2 isaki blks = ai->hiwat; 7596 1.2 isaki if (blks > maxblks) 7597 1.2 isaki blks = maxblks; 7598 1.2 isaki if (blks < 2) 7599 1.2 isaki blks = 2; 7600 1.2 isaki track->usrbuf_usedhigh = blks * blksize; 7601 1.2 isaki } 7602 1.2 isaki if (SPECIFIED(ai->lowat)) { 7603 1.2 isaki blks = ai->lowat; 7604 1.2 isaki if (blks > maxblks - 1) 7605 1.2 isaki blks = maxblks - 1; 7606 1.2 isaki track->usrbuf_usedlow = blks * blksize; 7607 1.2 isaki } 7608 1.2 isaki if (SPECIFIED(ai->hiwat) || SPECIFIED(ai->lowat)) { 7609 1.2 isaki if (track->usrbuf_usedlow > track->usrbuf_usedhigh - blksize) { 7610 1.2 isaki track->usrbuf_usedlow = track->usrbuf_usedhigh - 7611 1.2 isaki blksize; 7612 1.2 isaki } 7613 1.2 isaki } 7614 1.2 isaki } 7615 1.2 isaki 7616 1.2 isaki /* 7617 1.44 isaki * Set hardware part of *newai. 7618 1.2 isaki * The parameters handled here are *.port, *.gain, *.balance and monitor_gain. 7619 1.2 isaki * If oldai is specified, previous parameters are stored. 7620 1.2 isaki * This function itself does not roll back if error occurred. 7621 1.63 isaki * Must be called with sc_lock && sc_exlock held. 7622 1.2 isaki */ 7623 1.2 isaki static int 7624 1.2 isaki audio_hw_setinfo(struct audio_softc *sc, const struct audio_info *newai, 7625 1.2 isaki struct audio_info *oldai) 7626 1.2 isaki { 7627 1.2 isaki const struct audio_prinfo *newpi; 7628 1.2 isaki const struct audio_prinfo *newri; 7629 1.2 isaki struct audio_prinfo *oldpi; 7630 1.2 isaki struct audio_prinfo *oldri; 7631 1.2 isaki u_int pgain; 7632 1.2 isaki u_int rgain; 7633 1.2 isaki u_char pbalance; 7634 1.2 isaki u_char rbalance; 7635 1.2 isaki int error; 7636 1.2 isaki 7637 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 7638 1.2 isaki KASSERT(sc->sc_exlock); 7639 1.2 isaki 7640 1.2 isaki /* XXX shut up gcc */ 7641 1.2 isaki oldpi = NULL; 7642 1.2 isaki oldri = NULL; 7643 1.2 isaki 7644 1.2 isaki newpi = &newai->play; 7645 1.2 isaki newri = &newai->record; 7646 1.2 isaki if (oldai) { 7647 1.2 isaki oldpi = &oldai->play; 7648 1.2 isaki oldri = &oldai->record; 7649 1.2 isaki } 7650 1.2 isaki error = 0; 7651 1.2 isaki 7652 1.2 isaki /* 7653 1.2 isaki * It looks like unnecessary to halt HW mixers to set HW mixers. 7654 1.2 isaki * mixer_ioctl(MIXER_WRITE) also doesn't halt. 7655 1.2 isaki */ 7656 1.2 isaki 7657 1.2 isaki if (SPECIFIED(newpi->port)) { 7658 1.2 isaki if (oldai) 7659 1.2 isaki oldpi->port = au_get_port(sc, &sc->sc_outports); 7660 1.2 isaki error = au_set_port(sc, &sc->sc_outports, newpi->port); 7661 1.2 isaki if (error) { 7662 1.88 isaki audio_printf(sc, 7663 1.88 isaki "setting play.port=%d failed: errno=%d\n", 7664 1.2 isaki newpi->port, error); 7665 1.2 isaki goto abort; 7666 1.2 isaki } 7667 1.2 isaki } 7668 1.2 isaki if (SPECIFIED(newri->port)) { 7669 1.2 isaki if (oldai) 7670 1.2 isaki oldri->port = au_get_port(sc, &sc->sc_inports); 7671 1.2 isaki error = au_set_port(sc, &sc->sc_inports, newri->port); 7672 1.2 isaki if (error) { 7673 1.88 isaki audio_printf(sc, 7674 1.88 isaki "setting record.port=%d failed: errno=%d\n", 7675 1.2 isaki newri->port, error); 7676 1.2 isaki goto abort; 7677 1.2 isaki } 7678 1.2 isaki } 7679 1.2 isaki 7680 1.105 isaki /* play.{gain,balance} */ 7681 1.2 isaki if (SPECIFIED(newpi->gain) || SPECIFIED_CH(newpi->balance)) { 7682 1.2 isaki au_get_gain(sc, &sc->sc_outports, &pgain, &pbalance); 7683 1.2 isaki if (oldai) { 7684 1.2 isaki oldpi->gain = pgain; 7685 1.2 isaki oldpi->balance = pbalance; 7686 1.2 isaki } 7687 1.105 isaki 7688 1.105 isaki if (SPECIFIED(newpi->gain)) 7689 1.105 isaki pgain = newpi->gain; 7690 1.105 isaki if (SPECIFIED_CH(newpi->balance)) 7691 1.105 isaki pbalance = newpi->balance; 7692 1.105 isaki error = au_set_gain(sc, &sc->sc_outports, pgain, pbalance); 7693 1.105 isaki if (error) { 7694 1.105 isaki audio_printf(sc, 7695 1.105 isaki "setting play.gain=%d/balance=%d failed: " 7696 1.105 isaki "errno=%d\n", 7697 1.105 isaki pgain, pbalance, error); 7698 1.105 isaki goto abort; 7699 1.105 isaki } 7700 1.2 isaki } 7701 1.105 isaki 7702 1.105 isaki /* record.{gain,balance} */ 7703 1.2 isaki if (SPECIFIED(newri->gain) || SPECIFIED_CH(newri->balance)) { 7704 1.2 isaki au_get_gain(sc, &sc->sc_inports, &rgain, &rbalance); 7705 1.2 isaki if (oldai) { 7706 1.2 isaki oldri->gain = rgain; 7707 1.2 isaki oldri->balance = rbalance; 7708 1.2 isaki } 7709 1.105 isaki 7710 1.105 isaki if (SPECIFIED(newri->gain)) 7711 1.105 isaki rgain = newri->gain; 7712 1.105 isaki if (SPECIFIED_CH(newri->balance)) 7713 1.105 isaki rbalance = newri->balance; 7714 1.105 isaki error = au_set_gain(sc, &sc->sc_inports, rgain, rbalance); 7715 1.2 isaki if (error) { 7716 1.88 isaki audio_printf(sc, 7717 1.105 isaki "setting record.gain=%d/balance=%d failed: " 7718 1.105 isaki "errno=%d\n", 7719 1.105 isaki rgain, rbalance, error); 7720 1.2 isaki goto abort; 7721 1.2 isaki } 7722 1.2 isaki } 7723 1.2 isaki 7724 1.2 isaki if (SPECIFIED(newai->monitor_gain) && sc->sc_monitor_port != -1) { 7725 1.2 isaki if (oldai) 7726 1.2 isaki oldai->monitor_gain = au_get_monitor_gain(sc); 7727 1.2 isaki error = au_set_monitor_gain(sc, newai->monitor_gain); 7728 1.2 isaki if (error) { 7729 1.88 isaki audio_printf(sc, 7730 1.88 isaki "setting monitor_gain=%d failed: errno=%d\n", 7731 1.2 isaki newai->monitor_gain, error); 7732 1.2 isaki goto abort; 7733 1.2 isaki } 7734 1.2 isaki } 7735 1.2 isaki 7736 1.2 isaki /* XXX TODO */ 7737 1.2 isaki /* sc->sc_ai = *ai; */ 7738 1.2 isaki 7739 1.2 isaki error = 0; 7740 1.2 isaki abort: 7741 1.2 isaki return error; 7742 1.2 isaki } 7743 1.2 isaki 7744 1.2 isaki /* 7745 1.2 isaki * Setup the hardware with mixer format phwfmt, rhwfmt. 7746 1.2 isaki * The arguments have following restrictions: 7747 1.2 isaki * - setmode is the direction you want to set, AUMODE_PLAY or AUMODE_RECORD, 7748 1.2 isaki * or both. 7749 1.2 isaki * - phwfmt and rhwfmt must not be NULL regardless of setmode. 7750 1.2 isaki * - On non-independent devices, phwfmt and rhwfmt must have the same 7751 1.2 isaki * parameters. 7752 1.2 isaki * - pfil and rfil must be zero-filled. 7753 1.2 isaki * If successful, 7754 1.2 isaki * - pfil, rfil will be filled with filter information specified by the 7755 1.77 isaki * hardware driver if necessary. 7756 1.2 isaki * and then returns 0. Otherwise returns errno. 7757 1.63 isaki * Must be called without sc_lock held. 7758 1.2 isaki */ 7759 1.2 isaki static int 7760 1.2 isaki audio_hw_set_format(struct audio_softc *sc, int setmode, 7761 1.45 isaki const audio_format2_t *phwfmt, const audio_format2_t *rhwfmt, 7762 1.2 isaki audio_filter_reg_t *pfil, audio_filter_reg_t *rfil) 7763 1.2 isaki { 7764 1.2 isaki audio_params_t pp, rp; 7765 1.2 isaki int error; 7766 1.2 isaki 7767 1.2 isaki KASSERT(phwfmt != NULL); 7768 1.2 isaki KASSERT(rhwfmt != NULL); 7769 1.2 isaki 7770 1.2 isaki pp = format2_to_params(phwfmt); 7771 1.2 isaki rp = format2_to_params(rhwfmt); 7772 1.2 isaki 7773 1.63 isaki mutex_enter(sc->sc_lock); 7774 1.2 isaki error = sc->hw_if->set_format(sc->hw_hdl, setmode, 7775 1.2 isaki &pp, &rp, pfil, rfil); 7776 1.2 isaki if (error) { 7777 1.63 isaki mutex_exit(sc->sc_lock); 7778 1.88 isaki audio_printf(sc, "set_format failed: errno=%d\n", error); 7779 1.2 isaki return error; 7780 1.2 isaki } 7781 1.2 isaki 7782 1.2 isaki if (sc->hw_if->commit_settings) { 7783 1.2 isaki error = sc->hw_if->commit_settings(sc->hw_hdl); 7784 1.2 isaki if (error) { 7785 1.63 isaki mutex_exit(sc->sc_lock); 7786 1.88 isaki audio_printf(sc, 7787 1.88 isaki "commit_settings failed: errno=%d\n", error); 7788 1.2 isaki return error; 7789 1.2 isaki } 7790 1.2 isaki } 7791 1.63 isaki mutex_exit(sc->sc_lock); 7792 1.2 isaki 7793 1.2 isaki return 0; 7794 1.2 isaki } 7795 1.2 isaki 7796 1.2 isaki /* 7797 1.2 isaki * Fill audio_info structure. If need_mixerinfo is true, it will also 7798 1.2 isaki * fill the hardware mixer information. 7799 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 7800 1.2 isaki */ 7801 1.2 isaki static int 7802 1.2 isaki audiogetinfo(struct audio_softc *sc, struct audio_info *ai, int need_mixerinfo, 7803 1.2 isaki audio_file_t *file) 7804 1.2 isaki { 7805 1.2 isaki struct audio_prinfo *ri, *pi; 7806 1.2 isaki audio_track_t *track; 7807 1.2 isaki audio_track_t *ptrack; 7808 1.2 isaki audio_track_t *rtrack; 7809 1.2 isaki int gain; 7810 1.2 isaki 7811 1.63 isaki KASSERT(sc->sc_exlock); 7812 1.2 isaki 7813 1.2 isaki ri = &ai->record; 7814 1.2 isaki pi = &ai->play; 7815 1.2 isaki ptrack = file->ptrack; 7816 1.2 isaki rtrack = file->rtrack; 7817 1.2 isaki 7818 1.2 isaki memset(ai, 0, sizeof(*ai)); 7819 1.2 isaki 7820 1.2 isaki if (ptrack) { 7821 1.2 isaki pi->sample_rate = ptrack->usrbuf.fmt.sample_rate; 7822 1.2 isaki pi->channels = ptrack->usrbuf.fmt.channels; 7823 1.2 isaki pi->precision = ptrack->usrbuf.fmt.precision; 7824 1.2 isaki pi->encoding = ptrack->usrbuf.fmt.encoding; 7825 1.62 isaki pi->pause = ptrack->is_pause; 7826 1.2 isaki } else { 7827 1.62 isaki /* Use sticky parameters if the track is not available. */ 7828 1.62 isaki pi->sample_rate = sc->sc_sound_pparams.sample_rate; 7829 1.62 isaki pi->channels = sc->sc_sound_pparams.channels; 7830 1.62 isaki pi->precision = sc->sc_sound_pparams.precision; 7831 1.62 isaki pi->encoding = sc->sc_sound_pparams.encoding; 7832 1.62 isaki pi->pause = sc->sc_sound_ppause; 7833 1.2 isaki } 7834 1.2 isaki if (rtrack) { 7835 1.2 isaki ri->sample_rate = rtrack->usrbuf.fmt.sample_rate; 7836 1.2 isaki ri->channels = rtrack->usrbuf.fmt.channels; 7837 1.2 isaki ri->precision = rtrack->usrbuf.fmt.precision; 7838 1.2 isaki ri->encoding = rtrack->usrbuf.fmt.encoding; 7839 1.62 isaki ri->pause = rtrack->is_pause; 7840 1.2 isaki } else { 7841 1.62 isaki /* Use sticky parameters if the track is not available. */ 7842 1.62 isaki ri->sample_rate = sc->sc_sound_rparams.sample_rate; 7843 1.62 isaki ri->channels = sc->sc_sound_rparams.channels; 7844 1.62 isaki ri->precision = sc->sc_sound_rparams.precision; 7845 1.62 isaki ri->encoding = sc->sc_sound_rparams.encoding; 7846 1.62 isaki ri->pause = sc->sc_sound_rpause; 7847 1.2 isaki } 7848 1.2 isaki 7849 1.2 isaki if (ptrack) { 7850 1.2 isaki pi->seek = ptrack->usrbuf.used; 7851 1.127 isaki pi->samples = ptrack->stamp * ptrack->usrbuf_blksize; 7852 1.2 isaki pi->eof = ptrack->eofcounter; 7853 1.2 isaki pi->error = (ptrack->dropframes != 0) ? 1 : 0; 7854 1.2 isaki pi->open = 1; 7855 1.2 isaki pi->buffer_size = ptrack->usrbuf.capacity; 7856 1.2 isaki } 7857 1.62 isaki pi->waiting = 0; /* open never hangs */ 7858 1.62 isaki pi->active = sc->sc_pbusy; 7859 1.62 isaki 7860 1.2 isaki if (rtrack) { 7861 1.126 isaki ri->seek = audio_track_readablebytes(rtrack); 7862 1.127 isaki ri->samples = rtrack->stamp * rtrack->usrbuf_blksize; 7863 1.2 isaki ri->eof = 0; 7864 1.2 isaki ri->error = (rtrack->dropframes != 0) ? 1 : 0; 7865 1.2 isaki ri->open = 1; 7866 1.126 isaki ri->buffer_size = audio_track_inputblk_as_usrbyte(rtrack, 7867 1.126 isaki rtrack->input->capacity); 7868 1.2 isaki } 7869 1.62 isaki ri->waiting = 0; /* open never hangs */ 7870 1.62 isaki ri->active = sc->sc_rbusy; 7871 1.2 isaki 7872 1.2 isaki /* 7873 1.2 isaki * XXX There may be different number of channels between playback 7874 1.2 isaki * and recording, so that blocksize also may be different. 7875 1.2 isaki * But struct audio_info has an united blocksize... 7876 1.2 isaki * Here, I use play info precedencely if ptrack is available, 7877 1.2 isaki * otherwise record info. 7878 1.2 isaki * 7879 1.2 isaki * XXX hiwat/lowat is a playback-only parameter. What should I 7880 1.2 isaki * return for a record-only descriptor? 7881 1.2 isaki */ 7882 1.3 maya track = ptrack ? ptrack : rtrack; 7883 1.2 isaki if (track) { 7884 1.2 isaki ai->blocksize = track->usrbuf_blksize; 7885 1.2 isaki ai->hiwat = track->usrbuf_usedhigh / track->usrbuf_blksize; 7886 1.2 isaki ai->lowat = track->usrbuf_usedlow / track->usrbuf_blksize; 7887 1.2 isaki } 7888 1.2 isaki ai->mode = file->mode; 7889 1.2 isaki 7890 1.62 isaki /* 7891 1.62 isaki * For backward compatibility, we have to pad these five fields 7892 1.62 isaki * a fake non-zero value even if there are no tracks. 7893 1.62 isaki */ 7894 1.62 isaki if (ptrack == NULL) 7895 1.62 isaki pi->buffer_size = 65536; 7896 1.62 isaki if (rtrack == NULL) 7897 1.62 isaki ri->buffer_size = 65536; 7898 1.62 isaki if (ptrack == NULL && rtrack == NULL) { 7899 1.62 isaki ai->blocksize = 2048; 7900 1.62 isaki ai->hiwat = ai->play.buffer_size / ai->blocksize; 7901 1.62 isaki ai->lowat = ai->hiwat * 3 / 4; 7902 1.62 isaki } 7903 1.62 isaki 7904 1.2 isaki if (need_mixerinfo) { 7905 1.63 isaki mutex_enter(sc->sc_lock); 7906 1.2 isaki 7907 1.2 isaki pi->port = au_get_port(sc, &sc->sc_outports); 7908 1.2 isaki ri->port = au_get_port(sc, &sc->sc_inports); 7909 1.2 isaki 7910 1.2 isaki pi->avail_ports = sc->sc_outports.allports; 7911 1.2 isaki ri->avail_ports = sc->sc_inports.allports; 7912 1.2 isaki 7913 1.2 isaki au_get_gain(sc, &sc->sc_outports, &pi->gain, &pi->balance); 7914 1.2 isaki au_get_gain(sc, &sc->sc_inports, &ri->gain, &ri->balance); 7915 1.2 isaki 7916 1.2 isaki if (sc->sc_monitor_port != -1) { 7917 1.2 isaki gain = au_get_monitor_gain(sc); 7918 1.2 isaki if (gain != -1) 7919 1.2 isaki ai->monitor_gain = gain; 7920 1.2 isaki } 7921 1.63 isaki mutex_exit(sc->sc_lock); 7922 1.2 isaki } 7923 1.2 isaki 7924 1.2 isaki return 0; 7925 1.2 isaki } 7926 1.2 isaki 7927 1.2 isaki /* 7928 1.2 isaki * Return true if playback is configured. 7929 1.2 isaki * This function can be used after audioattach. 7930 1.2 isaki */ 7931 1.2 isaki static bool 7932 1.2 isaki audio_can_playback(struct audio_softc *sc) 7933 1.2 isaki { 7934 1.2 isaki 7935 1.2 isaki return (sc->sc_pmixer != NULL); 7936 1.2 isaki } 7937 1.2 isaki 7938 1.2 isaki /* 7939 1.2 isaki * Return true if recording is configured. 7940 1.2 isaki * This function can be used after audioattach. 7941 1.2 isaki */ 7942 1.2 isaki static bool 7943 1.2 isaki audio_can_capture(struct audio_softc *sc) 7944 1.2 isaki { 7945 1.2 isaki 7946 1.2 isaki return (sc->sc_rmixer != NULL); 7947 1.2 isaki } 7948 1.2 isaki 7949 1.2 isaki /* 7950 1.2 isaki * Get the afp->index'th item from the valid one of format[]. 7951 1.2 isaki * If found, stores it to afp->fmt and returns 0. Otherwise return EINVAL. 7952 1.2 isaki * 7953 1.2 isaki * This is common routines for query_format. 7954 1.2 isaki * If your hardware driver has struct audio_format[], the simplest case 7955 1.2 isaki * you can write your query_format interface as follows: 7956 1.2 isaki * 7957 1.2 isaki * struct audio_format foo_format[] = { ... }; 7958 1.2 isaki * 7959 1.2 isaki * int 7960 1.2 isaki * foo_query_format(void *hdl, audio_format_query_t *afp) 7961 1.2 isaki * { 7962 1.2 isaki * return audio_query_format(foo_format, __arraycount(foo_format), afp); 7963 1.2 isaki * } 7964 1.2 isaki */ 7965 1.2 isaki int 7966 1.2 isaki audio_query_format(const struct audio_format *format, int nformats, 7967 1.2 isaki audio_format_query_t *afp) 7968 1.2 isaki { 7969 1.2 isaki const struct audio_format *f; 7970 1.2 isaki int idx; 7971 1.2 isaki int i; 7972 1.2 isaki 7973 1.2 isaki idx = 0; 7974 1.2 isaki for (i = 0; i < nformats; i++) { 7975 1.2 isaki f = &format[i]; 7976 1.2 isaki if (!AUFMT_IS_VALID(f)) 7977 1.2 isaki continue; 7978 1.2 isaki if (afp->index == idx) { 7979 1.2 isaki afp->fmt = *f; 7980 1.2 isaki return 0; 7981 1.2 isaki } 7982 1.2 isaki idx++; 7983 1.2 isaki } 7984 1.2 isaki return EINVAL; 7985 1.2 isaki } 7986 1.2 isaki 7987 1.2 isaki /* 7988 1.2 isaki * This function is provided for the hardware driver's set_format() to 7989 1.2 isaki * find index matches with 'param' from array of audio_format_t 'formats'. 7990 1.2 isaki * 'mode' is either of AUMODE_PLAY or AUMODE_RECORD. 7991 1.2 isaki * It returns the matched index and never fails. Because param passed to 7992 1.2 isaki * set_format() is selected from query_format(). 7993 1.2 isaki * This function will be an alternative to auconv_set_converter() to 7994 1.2 isaki * find index. 7995 1.2 isaki */ 7996 1.2 isaki int 7997 1.2 isaki audio_indexof_format(const struct audio_format *formats, int nformats, 7998 1.2 isaki int mode, const audio_params_t *param) 7999 1.2 isaki { 8000 1.2 isaki const struct audio_format *f; 8001 1.2 isaki int index; 8002 1.2 isaki int j; 8003 1.2 isaki 8004 1.2 isaki for (index = 0; index < nformats; index++) { 8005 1.2 isaki f = &formats[index]; 8006 1.2 isaki 8007 1.2 isaki if (!AUFMT_IS_VALID(f)) 8008 1.2 isaki continue; 8009 1.2 isaki if ((f->mode & mode) == 0) 8010 1.2 isaki continue; 8011 1.2 isaki if (f->encoding != param->encoding) 8012 1.2 isaki continue; 8013 1.2 isaki if (f->validbits != param->precision) 8014 1.2 isaki continue; 8015 1.2 isaki if (f->channels != param->channels) 8016 1.2 isaki continue; 8017 1.2 isaki 8018 1.2 isaki if (f->frequency_type == 0) { 8019 1.2 isaki if (param->sample_rate < f->frequency[0] || 8020 1.2 isaki param->sample_rate > f->frequency[1]) 8021 1.2 isaki continue; 8022 1.2 isaki } else { 8023 1.2 isaki for (j = 0; j < f->frequency_type; j++) { 8024 1.2 isaki if (param->sample_rate == f->frequency[j]) 8025 1.2 isaki break; 8026 1.2 isaki } 8027 1.2 isaki if (j == f->frequency_type) 8028 1.2 isaki continue; 8029 1.2 isaki } 8030 1.2 isaki 8031 1.2 isaki /* Then, matched */ 8032 1.2 isaki return index; 8033 1.2 isaki } 8034 1.2 isaki 8035 1.2 isaki /* Not matched. This should not be happened. */ 8036 1.2 isaki panic("%s: cannot find matched format\n", __func__); 8037 1.2 isaki } 8038 1.2 isaki 8039 1.2 isaki /* 8040 1.2 isaki * Get or set hardware blocksize in msec. 8041 1.2 isaki * XXX It's for debug. 8042 1.2 isaki */ 8043 1.2 isaki static int 8044 1.2 isaki audio_sysctl_blk_ms(SYSCTLFN_ARGS) 8045 1.2 isaki { 8046 1.2 isaki struct sysctlnode node; 8047 1.2 isaki struct audio_softc *sc; 8048 1.2 isaki audio_format2_t phwfmt; 8049 1.2 isaki audio_format2_t rhwfmt; 8050 1.2 isaki audio_filter_reg_t pfil; 8051 1.2 isaki audio_filter_reg_t rfil; 8052 1.2 isaki int t; 8053 1.2 isaki int old_blk_ms; 8054 1.2 isaki int mode; 8055 1.2 isaki int error; 8056 1.2 isaki 8057 1.2 isaki node = *rnode; 8058 1.2 isaki sc = node.sysctl_data; 8059 1.2 isaki 8060 1.63 isaki error = audio_exlock_enter(sc); 8061 1.63 isaki if (error) 8062 1.63 isaki return error; 8063 1.2 isaki 8064 1.2 isaki old_blk_ms = sc->sc_blk_ms; 8065 1.2 isaki t = old_blk_ms; 8066 1.2 isaki node.sysctl_data = &t; 8067 1.2 isaki error = sysctl_lookup(SYSCTLFN_CALL(&node)); 8068 1.2 isaki if (error || newp == NULL) 8069 1.2 isaki goto abort; 8070 1.2 isaki 8071 1.2 isaki if (t < 0) { 8072 1.2 isaki error = EINVAL; 8073 1.2 isaki goto abort; 8074 1.2 isaki } 8075 1.2 isaki 8076 1.2 isaki if (sc->sc_popens + sc->sc_ropens > 0) { 8077 1.2 isaki error = EBUSY; 8078 1.2 isaki goto abort; 8079 1.2 isaki } 8080 1.2 isaki sc->sc_blk_ms = t; 8081 1.2 isaki mode = 0; 8082 1.2 isaki if (sc->sc_pmixer) { 8083 1.2 isaki mode |= AUMODE_PLAY; 8084 1.2 isaki phwfmt = sc->sc_pmixer->hwbuf.fmt; 8085 1.2 isaki } 8086 1.2 isaki if (sc->sc_rmixer) { 8087 1.2 isaki mode |= AUMODE_RECORD; 8088 1.2 isaki rhwfmt = sc->sc_rmixer->hwbuf.fmt; 8089 1.2 isaki } 8090 1.2 isaki 8091 1.2 isaki /* re-init hardware */ 8092 1.2 isaki memset(&pfil, 0, sizeof(pfil)); 8093 1.2 isaki memset(&rfil, 0, sizeof(rfil)); 8094 1.2 isaki error = audio_hw_set_format(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 8095 1.2 isaki if (error) { 8096 1.2 isaki goto abort; 8097 1.2 isaki } 8098 1.2 isaki 8099 1.2 isaki /* re-init track mixer */ 8100 1.2 isaki error = audio_mixers_init(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 8101 1.2 isaki if (error) { 8102 1.2 isaki /* Rollback */ 8103 1.2 isaki sc->sc_blk_ms = old_blk_ms; 8104 1.2 isaki audio_mixers_init(sc, mode, &phwfmt, &rhwfmt, &pfil, &rfil); 8105 1.2 isaki goto abort; 8106 1.2 isaki } 8107 1.2 isaki error = 0; 8108 1.2 isaki abort: 8109 1.63 isaki audio_exlock_exit(sc); 8110 1.2 isaki return error; 8111 1.2 isaki } 8112 1.2 isaki 8113 1.2 isaki /* 8114 1.2 isaki * Get or set multiuser mode. 8115 1.2 isaki */ 8116 1.2 isaki static int 8117 1.2 isaki audio_sysctl_multiuser(SYSCTLFN_ARGS) 8118 1.2 isaki { 8119 1.2 isaki struct sysctlnode node; 8120 1.2 isaki struct audio_softc *sc; 8121 1.6 nakayama bool t; 8122 1.6 nakayama int error; 8123 1.2 isaki 8124 1.2 isaki node = *rnode; 8125 1.2 isaki sc = node.sysctl_data; 8126 1.2 isaki 8127 1.63 isaki error = audio_exlock_enter(sc); 8128 1.63 isaki if (error) 8129 1.63 isaki return error; 8130 1.2 isaki 8131 1.2 isaki t = sc->sc_multiuser; 8132 1.2 isaki node.sysctl_data = &t; 8133 1.2 isaki error = sysctl_lookup(SYSCTLFN_CALL(&node)); 8134 1.2 isaki if (error || newp == NULL) 8135 1.2 isaki goto abort; 8136 1.2 isaki 8137 1.2 isaki sc->sc_multiuser = t; 8138 1.2 isaki error = 0; 8139 1.2 isaki abort: 8140 1.63 isaki audio_exlock_exit(sc); 8141 1.2 isaki return error; 8142 1.2 isaki } 8143 1.2 isaki 8144 1.2 isaki #if defined(AUDIO_DEBUG) 8145 1.2 isaki /* 8146 1.2 isaki * Get or set debug verbose level. (0..4) 8147 1.2 isaki * XXX It's for debug. 8148 1.2 isaki * XXX It is not separated per device. 8149 1.2 isaki */ 8150 1.2 isaki static int 8151 1.2 isaki audio_sysctl_debug(SYSCTLFN_ARGS) 8152 1.2 isaki { 8153 1.2 isaki struct sysctlnode node; 8154 1.2 isaki int t; 8155 1.2 isaki int error; 8156 1.2 isaki 8157 1.2 isaki node = *rnode; 8158 1.2 isaki t = audiodebug; 8159 1.2 isaki node.sysctl_data = &t; 8160 1.2 isaki error = sysctl_lookup(SYSCTLFN_CALL(&node)); 8161 1.2 isaki if (error || newp == NULL) 8162 1.2 isaki return error; 8163 1.2 isaki 8164 1.2 isaki if (t < 0 || t > 4) 8165 1.2 isaki return EINVAL; 8166 1.2 isaki audiodebug = t; 8167 1.2 isaki printf("audio: audiodebug = %d\n", audiodebug); 8168 1.2 isaki return 0; 8169 1.2 isaki } 8170 1.2 isaki #endif /* AUDIO_DEBUG */ 8171 1.2 isaki 8172 1.2 isaki #ifdef AUDIO_PM_IDLE 8173 1.2 isaki static void 8174 1.2 isaki audio_idle(void *arg) 8175 1.2 isaki { 8176 1.2 isaki device_t dv = arg; 8177 1.2 isaki struct audio_softc *sc = device_private(dv); 8178 1.2 isaki 8179 1.2 isaki #ifdef PNP_DEBUG 8180 1.2 isaki extern int pnp_debug_idle; 8181 1.2 isaki if (pnp_debug_idle) 8182 1.2 isaki printf("%s: idle handler called\n", device_xname(dv)); 8183 1.2 isaki #endif 8184 1.2 isaki 8185 1.2 isaki sc->sc_idle = true; 8186 1.2 isaki 8187 1.2 isaki /* XXX joerg Make pmf_device_suspend handle children? */ 8188 1.2 isaki if (!pmf_device_suspend(dv, PMF_Q_SELF)) 8189 1.2 isaki return; 8190 1.2 isaki 8191 1.2 isaki if (!pmf_device_suspend(sc->hw_dev, PMF_Q_SELF)) 8192 1.2 isaki pmf_device_resume(dv, PMF_Q_SELF); 8193 1.2 isaki } 8194 1.2 isaki 8195 1.2 isaki static void 8196 1.2 isaki audio_activity(device_t dv, devactive_t type) 8197 1.2 isaki { 8198 1.2 isaki struct audio_softc *sc = device_private(dv); 8199 1.2 isaki 8200 1.2 isaki if (type != DVA_SYSTEM) 8201 1.2 isaki return; 8202 1.2 isaki 8203 1.2 isaki callout_schedule(&sc->sc_idle_counter, audio_idle_timeout * hz); 8204 1.2 isaki 8205 1.2 isaki sc->sc_idle = false; 8206 1.2 isaki if (!device_is_active(dv)) { 8207 1.2 isaki /* XXX joerg How to deal with a failing resume... */ 8208 1.2 isaki pmf_device_resume(sc->hw_dev, PMF_Q_SELF); 8209 1.2 isaki pmf_device_resume(dv, PMF_Q_SELF); 8210 1.2 isaki } 8211 1.2 isaki } 8212 1.2 isaki #endif 8213 1.2 isaki 8214 1.2 isaki static bool 8215 1.2 isaki audio_suspend(device_t dv, const pmf_qual_t *qual) 8216 1.2 isaki { 8217 1.2 isaki struct audio_softc *sc = device_private(dv); 8218 1.2 isaki int error; 8219 1.2 isaki 8220 1.63 isaki error = audio_exlock_mutex_enter(sc); 8221 1.2 isaki if (error) 8222 1.2 isaki return error; 8223 1.75 isaki sc->sc_suspending = true; 8224 1.2 isaki audio_mixer_capture(sc); 8225 1.2 isaki 8226 1.2 isaki if (sc->sc_pbusy) { 8227 1.2 isaki audio_pmixer_halt(sc); 8228 1.75 isaki /* Reuse this as need-to-restart flag while suspending */ 8229 1.75 isaki sc->sc_pbusy = true; 8230 1.2 isaki } 8231 1.2 isaki if (sc->sc_rbusy) { 8232 1.2 isaki audio_rmixer_halt(sc); 8233 1.75 isaki /* Reuse this as need-to-restart flag while suspending */ 8234 1.75 isaki sc->sc_rbusy = true; 8235 1.2 isaki } 8236 1.2 isaki 8237 1.2 isaki #ifdef AUDIO_PM_IDLE 8238 1.2 isaki callout_halt(&sc->sc_idle_counter, sc->sc_lock); 8239 1.2 isaki #endif 8240 1.63 isaki audio_exlock_mutex_exit(sc); 8241 1.2 isaki 8242 1.2 isaki return true; 8243 1.2 isaki } 8244 1.2 isaki 8245 1.2 isaki static bool 8246 1.2 isaki audio_resume(device_t dv, const pmf_qual_t *qual) 8247 1.2 isaki { 8248 1.2 isaki struct audio_softc *sc = device_private(dv); 8249 1.2 isaki struct audio_info ai; 8250 1.2 isaki int error; 8251 1.2 isaki 8252 1.63 isaki error = audio_exlock_mutex_enter(sc); 8253 1.2 isaki if (error) 8254 1.2 isaki return error; 8255 1.2 isaki 8256 1.75 isaki sc->sc_suspending = false; 8257 1.2 isaki audio_mixer_restore(sc); 8258 1.2 isaki /* XXX ? */ 8259 1.2 isaki AUDIO_INITINFO(&ai); 8260 1.2 isaki audio_hw_setinfo(sc, &ai, NULL); 8261 1.2 isaki 8262 1.75 isaki /* 8263 1.75 isaki * During from suspend to resume here, sc_[pr]busy is used as 8264 1.75 isaki * need-to-restart flag temporarily. After this point, 8265 1.75 isaki * sc_[pr]busy is returned to its original usage (busy flag). 8266 1.75 isaki * And note that sc_[pr]busy must be false to call [pr]mixer_start(). 8267 1.75 isaki */ 8268 1.75 isaki if (sc->sc_pbusy) { 8269 1.75 isaki /* pmixer_start() requires pbusy is false */ 8270 1.75 isaki sc->sc_pbusy = false; 8271 1.2 isaki audio_pmixer_start(sc, true); 8272 1.75 isaki } 8273 1.75 isaki if (sc->sc_rbusy) { 8274 1.75 isaki /* rmixer_start() requires rbusy is false */ 8275 1.75 isaki sc->sc_rbusy = false; 8276 1.2 isaki audio_rmixer_start(sc); 8277 1.75 isaki } 8278 1.2 isaki 8279 1.63 isaki audio_exlock_mutex_exit(sc); 8280 1.2 isaki 8281 1.2 isaki return true; 8282 1.2 isaki } 8283 1.2 isaki 8284 1.8 isaki #if defined(AUDIO_DEBUG) 8285 1.2 isaki static void 8286 1.2 isaki audio_format2_tostr(char *buf, size_t bufsize, const audio_format2_t *fmt) 8287 1.2 isaki { 8288 1.2 isaki int n; 8289 1.2 isaki 8290 1.2 isaki n = 0; 8291 1.2 isaki n += snprintf(buf + n, bufsize - n, "%s", 8292 1.2 isaki audio_encoding_name(fmt->encoding)); 8293 1.2 isaki if (fmt->precision == fmt->stride) { 8294 1.2 isaki n += snprintf(buf + n, bufsize - n, " %dbit", fmt->precision); 8295 1.2 isaki } else { 8296 1.2 isaki n += snprintf(buf + n, bufsize - n, " %d/%dbit", 8297 1.2 isaki fmt->precision, fmt->stride); 8298 1.2 isaki } 8299 1.2 isaki 8300 1.2 isaki snprintf(buf + n, bufsize - n, " %uch %uHz", 8301 1.2 isaki fmt->channels, fmt->sample_rate); 8302 1.2 isaki } 8303 1.2 isaki #endif 8304 1.2 isaki 8305 1.2 isaki #if defined(AUDIO_DEBUG) 8306 1.2 isaki static void 8307 1.2 isaki audio_print_format2(const char *s, const audio_format2_t *fmt) 8308 1.2 isaki { 8309 1.2 isaki char fmtstr[64]; 8310 1.2 isaki 8311 1.2 isaki audio_format2_tostr(fmtstr, sizeof(fmtstr), fmt); 8312 1.2 isaki printf("%s %s\n", s, fmtstr); 8313 1.2 isaki } 8314 1.2 isaki #endif 8315 1.2 isaki 8316 1.2 isaki #ifdef DIAGNOSTIC 8317 1.2 isaki void 8318 1.47 isaki audio_diagnostic_format2(const char *where, const audio_format2_t *fmt) 8319 1.2 isaki { 8320 1.2 isaki 8321 1.47 isaki KASSERTMSG(fmt, "called from %s", where); 8322 1.2 isaki 8323 1.2 isaki /* XXX MSM6258 vs(4) only has 4bit stride format. */ 8324 1.2 isaki if (fmt->encoding == AUDIO_ENCODING_ADPCM) { 8325 1.2 isaki KASSERTMSG(fmt->stride == 4 || fmt->stride == 8, 8326 1.47 isaki "called from %s: fmt->stride=%d", where, fmt->stride); 8327 1.2 isaki } else { 8328 1.2 isaki KASSERTMSG(fmt->stride % NBBY == 0, 8329 1.47 isaki "called from %s: fmt->stride=%d", where, fmt->stride); 8330 1.2 isaki } 8331 1.2 isaki KASSERTMSG(fmt->precision <= fmt->stride, 8332 1.47 isaki "called from %s: fmt->precision=%d fmt->stride=%d", 8333 1.47 isaki where, fmt->precision, fmt->stride); 8334 1.2 isaki KASSERTMSG(1 <= fmt->channels && fmt->channels <= AUDIO_MAX_CHANNELS, 8335 1.47 isaki "called from %s: fmt->channels=%d", where, fmt->channels); 8336 1.2 isaki 8337 1.2 isaki /* XXX No check for encodings? */ 8338 1.2 isaki } 8339 1.2 isaki 8340 1.2 isaki void 8341 1.47 isaki audio_diagnostic_filter_arg(const char *where, const audio_filter_arg_t *arg) 8342 1.2 isaki { 8343 1.2 isaki 8344 1.2 isaki KASSERT(arg != NULL); 8345 1.2 isaki KASSERT(arg->src != NULL); 8346 1.2 isaki KASSERT(arg->dst != NULL); 8347 1.47 isaki audio_diagnostic_format2(where, arg->srcfmt); 8348 1.47 isaki audio_diagnostic_format2(where, arg->dstfmt); 8349 1.47 isaki KASSERT(arg->count > 0); 8350 1.2 isaki } 8351 1.2 isaki 8352 1.2 isaki void 8353 1.47 isaki audio_diagnostic_ring(const char *where, const audio_ring_t *ring) 8354 1.2 isaki { 8355 1.2 isaki 8356 1.47 isaki KASSERTMSG(ring, "called from %s", where); 8357 1.47 isaki audio_diagnostic_format2(where, &ring->fmt); 8358 1.2 isaki KASSERTMSG(0 <= ring->capacity && ring->capacity < INT_MAX / 2, 8359 1.47 isaki "called from %s: ring->capacity=%d", where, ring->capacity); 8360 1.2 isaki KASSERTMSG(0 <= ring->used && ring->used <= ring->capacity, 8361 1.47 isaki "called from %s: ring->used=%d ring->capacity=%d", 8362 1.47 isaki where, ring->used, ring->capacity); 8363 1.2 isaki if (ring->capacity == 0) { 8364 1.2 isaki KASSERTMSG(ring->mem == NULL, 8365 1.47 isaki "called from %s: capacity == 0 but mem != NULL", where); 8366 1.2 isaki } else { 8367 1.2 isaki KASSERTMSG(ring->mem != NULL, 8368 1.47 isaki "called from %s: capacity != 0 but mem == NULL", where); 8369 1.2 isaki KASSERTMSG(0 <= ring->head && ring->head < ring->capacity, 8370 1.47 isaki "called from %s: ring->head=%d ring->capacity=%d", 8371 1.47 isaki where, ring->head, ring->capacity); 8372 1.2 isaki } 8373 1.2 isaki } 8374 1.2 isaki #endif /* DIAGNOSTIC */ 8375 1.2 isaki 8376 1.2 isaki 8377 1.2 isaki /* 8378 1.2 isaki * Mixer driver 8379 1.2 isaki */ 8380 1.63 isaki 8381 1.63 isaki /* 8382 1.63 isaki * Must be called without sc_lock held. 8383 1.63 isaki */ 8384 1.2 isaki int 8385 1.2 isaki mixer_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, 8386 1.2 isaki struct lwp *l) 8387 1.2 isaki { 8388 1.2 isaki struct file *fp; 8389 1.2 isaki audio_file_t *af; 8390 1.2 isaki int error, fd; 8391 1.2 isaki 8392 1.2 isaki TRACE(1, "flags=0x%x", flags); 8393 1.2 isaki 8394 1.2 isaki error = fd_allocfile(&fp, &fd); 8395 1.2 isaki if (error) 8396 1.2 isaki return error; 8397 1.2 isaki 8398 1.2 isaki af = kmem_zalloc(sizeof(*af), KM_SLEEP); 8399 1.2 isaki af->sc = sc; 8400 1.2 isaki af->dev = dev; 8401 1.2 isaki 8402 1.101 riastrad mutex_enter(sc->sc_lock); 8403 1.101 riastrad if (sc->sc_dying) { 8404 1.101 riastrad mutex_exit(sc->sc_lock); 8405 1.101 riastrad kmem_free(af, sizeof(*af)); 8406 1.101 riastrad fd_abort(curproc, fp, fd); 8407 1.101 riastrad return ENXIO; 8408 1.101 riastrad } 8409 1.101 riastrad mutex_enter(sc->sc_intr_lock); 8410 1.101 riastrad SLIST_INSERT_HEAD(&sc->sc_files, af, entry); 8411 1.101 riastrad mutex_exit(sc->sc_intr_lock); 8412 1.101 riastrad mutex_exit(sc->sc_lock); 8413 1.101 riastrad 8414 1.2 isaki error = fd_clone(fp, fd, flags, &audio_fileops, af); 8415 1.2 isaki KASSERT(error == EMOVEFD); 8416 1.2 isaki 8417 1.2 isaki return error; 8418 1.2 isaki } 8419 1.2 isaki 8420 1.2 isaki /* 8421 1.41 isaki * Add a process to those to be signalled on mixer activity. 8422 1.41 isaki * If the process has already been added, do nothing. 8423 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 8424 1.41 isaki */ 8425 1.41 isaki static void 8426 1.41 isaki mixer_async_add(struct audio_softc *sc, pid_t pid) 8427 1.41 isaki { 8428 1.41 isaki int i; 8429 1.41 isaki 8430 1.63 isaki KASSERT(sc->sc_exlock); 8431 1.41 isaki 8432 1.41 isaki /* If already exists, returns without doing anything. */ 8433 1.41 isaki for (i = 0; i < sc->sc_am_used; i++) { 8434 1.41 isaki if (sc->sc_am[i] == pid) 8435 1.41 isaki return; 8436 1.41 isaki } 8437 1.41 isaki 8438 1.41 isaki /* Extend array if necessary. */ 8439 1.41 isaki if (sc->sc_am_used >= sc->sc_am_capacity) { 8440 1.41 isaki sc->sc_am_capacity += AM_CAPACITY; 8441 1.41 isaki sc->sc_am = kern_realloc(sc->sc_am, 8442 1.41 isaki sc->sc_am_capacity * sizeof(pid_t), M_WAITOK); 8443 1.41 isaki TRACE(2, "realloc am_capacity=%d", sc->sc_am_capacity); 8444 1.41 isaki } 8445 1.41 isaki 8446 1.41 isaki TRACE(2, "am[%d]=%d", sc->sc_am_used, (int)pid); 8447 1.41 isaki sc->sc_am[sc->sc_am_used++] = pid; 8448 1.41 isaki } 8449 1.41 isaki 8450 1.41 isaki /* 8451 1.2 isaki * Remove a process from those to be signalled on mixer activity. 8452 1.41 isaki * If the process has not been added, do nothing. 8453 1.63 isaki * Must be called with sc_exlock held and without sc_lock held. 8454 1.2 isaki */ 8455 1.2 isaki static void 8456 1.41 isaki mixer_async_remove(struct audio_softc *sc, pid_t pid) 8457 1.2 isaki { 8458 1.41 isaki int i; 8459 1.2 isaki 8460 1.63 isaki KASSERT(sc->sc_exlock); 8461 1.2 isaki 8462 1.41 isaki for (i = 0; i < sc->sc_am_used; i++) { 8463 1.41 isaki if (sc->sc_am[i] == pid) { 8464 1.41 isaki sc->sc_am[i] = sc->sc_am[--sc->sc_am_used]; 8465 1.41 isaki TRACE(2, "am[%d](%d) removed, used=%d", 8466 1.41 isaki i, (int)pid, sc->sc_am_used); 8467 1.41 isaki 8468 1.41 isaki /* Empty array if no longer necessary. */ 8469 1.41 isaki if (sc->sc_am_used == 0) { 8470 1.41 isaki kern_free(sc->sc_am); 8471 1.41 isaki sc->sc_am = NULL; 8472 1.41 isaki sc->sc_am_capacity = 0; 8473 1.41 isaki TRACE(2, "released"); 8474 1.41 isaki } 8475 1.2 isaki return; 8476 1.2 isaki } 8477 1.2 isaki } 8478 1.2 isaki } 8479 1.2 isaki 8480 1.2 isaki /* 8481 1.2 isaki * Signal all processes waiting for the mixer. 8482 1.63 isaki * Must be called with sc_exlock held. 8483 1.2 isaki */ 8484 1.2 isaki static void 8485 1.2 isaki mixer_signal(struct audio_softc *sc) 8486 1.2 isaki { 8487 1.2 isaki proc_t *p; 8488 1.41 isaki int i; 8489 1.41 isaki 8490 1.63 isaki KASSERT(sc->sc_exlock); 8491 1.2 isaki 8492 1.41 isaki for (i = 0; i < sc->sc_am_used; i++) { 8493 1.70 ad mutex_enter(&proc_lock); 8494 1.41 isaki p = proc_find(sc->sc_am[i]); 8495 1.41 isaki if (p) 8496 1.2 isaki psignal(p, SIGIO); 8497 1.70 ad mutex_exit(&proc_lock); 8498 1.2 isaki } 8499 1.2 isaki } 8500 1.2 isaki 8501 1.2 isaki /* 8502 1.2 isaki * Close a mixer device 8503 1.2 isaki */ 8504 1.2 isaki int 8505 1.2 isaki mixer_close(struct audio_softc *sc, audio_file_t *file) 8506 1.2 isaki { 8507 1.63 isaki int error; 8508 1.2 isaki 8509 1.63 isaki error = audio_exlock_enter(sc); 8510 1.63 isaki if (error) 8511 1.63 isaki return error; 8512 1.87 isaki TRACE(1, "called"); 8513 1.41 isaki mixer_async_remove(sc, curproc->p_pid); 8514 1.63 isaki audio_exlock_exit(sc); 8515 1.2 isaki 8516 1.2 isaki return 0; 8517 1.2 isaki } 8518 1.2 isaki 8519 1.42 isaki /* 8520 1.42 isaki * Must be called without sc_lock nor sc_exlock held. 8521 1.42 isaki */ 8522 1.2 isaki int 8523 1.2 isaki mixer_ioctl(struct audio_softc *sc, u_long cmd, void *addr, int flag, 8524 1.2 isaki struct lwp *l) 8525 1.2 isaki { 8526 1.2 isaki mixer_devinfo_t *mi; 8527 1.2 isaki mixer_ctrl_t *mc; 8528 1.125 isaki int val; 8529 1.2 isaki int error; 8530 1.2 isaki 8531 1.125 isaki #if defined(AUDIO_DEBUG) 8532 1.125 isaki char pre[64]; 8533 1.125 isaki snprintf(pre, sizeof(pre), "pid=%d.%d", 8534 1.125 isaki (int)curproc->p_pid, (int)l->l_lid); 8535 1.125 isaki #endif 8536 1.2 isaki error = EINVAL; 8537 1.2 isaki 8538 1.2 isaki /* we can return cached values if we are sleeping */ 8539 1.2 isaki if (cmd != AUDIO_MIXER_READ) { 8540 1.2 isaki mutex_enter(sc->sc_lock); 8541 1.2 isaki device_active(sc->sc_dev, DVA_SYSTEM); 8542 1.2 isaki mutex_exit(sc->sc_lock); 8543 1.2 isaki } 8544 1.2 isaki 8545 1.2 isaki switch (cmd) { 8546 1.2 isaki case FIOASYNC: 8547 1.125 isaki val = *(int *)addr; 8548 1.125 isaki TRACE(2, "%s FIOASYNC %s", pre, val ? "on" : "off"); 8549 1.63 isaki error = audio_exlock_enter(sc); 8550 1.63 isaki if (error) 8551 1.63 isaki break; 8552 1.125 isaki if (val) { 8553 1.41 isaki mixer_async_add(sc, curproc->p_pid); 8554 1.2 isaki } else { 8555 1.41 isaki mixer_async_remove(sc, curproc->p_pid); 8556 1.2 isaki } 8557 1.63 isaki audio_exlock_exit(sc); 8558 1.2 isaki break; 8559 1.2 isaki 8560 1.2 isaki case AUDIO_GETDEV: 8561 1.125 isaki TRACE(2, "%s AUDIO_GETDEV", pre); 8562 1.2 isaki error = sc->hw_if->getdev(sc->hw_hdl, (audio_device_t *)addr); 8563 1.2 isaki break; 8564 1.2 isaki 8565 1.2 isaki case AUDIO_MIXER_DEVINFO: 8566 1.125 isaki TRACE(2, "%s AUDIO_MIXER_DEVINFO", pre); 8567 1.2 isaki mi = (mixer_devinfo_t *)addr; 8568 1.2 isaki 8569 1.2 isaki mi->un.v.delta = 0; /* default */ 8570 1.2 isaki mutex_enter(sc->sc_lock); 8571 1.2 isaki error = audio_query_devinfo(sc, mi); 8572 1.2 isaki mutex_exit(sc->sc_lock); 8573 1.2 isaki break; 8574 1.2 isaki 8575 1.2 isaki case AUDIO_MIXER_READ: 8576 1.125 isaki TRACE(2, "%s AUDIO_MIXER_READ", pre); 8577 1.2 isaki mc = (mixer_ctrl_t *)addr; 8578 1.2 isaki 8579 1.63 isaki error = audio_exlock_mutex_enter(sc); 8580 1.2 isaki if (error) 8581 1.2 isaki break; 8582 1.2 isaki if (device_is_active(sc->hw_dev)) 8583 1.2 isaki error = audio_get_port(sc, mc); 8584 1.2 isaki else if (mc->dev < 0 || mc->dev >= sc->sc_nmixer_states) 8585 1.2 isaki error = ENXIO; 8586 1.2 isaki else { 8587 1.2 isaki int dev = mc->dev; 8588 1.2 isaki memcpy(mc, &sc->sc_mixer_state[dev], 8589 1.2 isaki sizeof(mixer_ctrl_t)); 8590 1.2 isaki error = 0; 8591 1.2 isaki } 8592 1.63 isaki audio_exlock_mutex_exit(sc); 8593 1.2 isaki break; 8594 1.2 isaki 8595 1.2 isaki case AUDIO_MIXER_WRITE: 8596 1.125 isaki TRACE(2, "%s AUDIO_MIXER_WRITE", pre); 8597 1.63 isaki error = audio_exlock_mutex_enter(sc); 8598 1.2 isaki if (error) 8599 1.2 isaki break; 8600 1.2 isaki error = audio_set_port(sc, (mixer_ctrl_t *)addr); 8601 1.2 isaki if (error) { 8602 1.63 isaki audio_exlock_mutex_exit(sc); 8603 1.2 isaki break; 8604 1.2 isaki } 8605 1.2 isaki 8606 1.2 isaki if (sc->hw_if->commit_settings) { 8607 1.2 isaki error = sc->hw_if->commit_settings(sc->hw_hdl); 8608 1.2 isaki if (error) { 8609 1.63 isaki audio_exlock_mutex_exit(sc); 8610 1.2 isaki break; 8611 1.2 isaki } 8612 1.2 isaki } 8613 1.63 isaki mutex_exit(sc->sc_lock); 8614 1.2 isaki mixer_signal(sc); 8615 1.63 isaki audio_exlock_exit(sc); 8616 1.2 isaki break; 8617 1.2 isaki 8618 1.2 isaki default: 8619 1.125 isaki TRACE(2, "(%lu,'%c',%lu)", 8620 1.125 isaki IOCPARM_LEN(cmd), (char)IOCGROUP(cmd), cmd & 0xff); 8621 1.2 isaki if (sc->hw_if->dev_ioctl) { 8622 1.63 isaki mutex_enter(sc->sc_lock); 8623 1.2 isaki error = sc->hw_if->dev_ioctl(sc->hw_hdl, 8624 1.2 isaki cmd, addr, flag, l); 8625 1.63 isaki mutex_exit(sc->sc_lock); 8626 1.2 isaki } else 8627 1.2 isaki error = EINVAL; 8628 1.2 isaki break; 8629 1.2 isaki } 8630 1.125 isaki 8631 1.125 isaki if (error) 8632 1.125 isaki TRACE(2, "error=%d", error); 8633 1.2 isaki return error; 8634 1.2 isaki } 8635 1.2 isaki 8636 1.2 isaki /* 8637 1.2 isaki * Must be called with sc_lock held. 8638 1.2 isaki */ 8639 1.2 isaki int 8640 1.2 isaki au_portof(struct audio_softc *sc, char *name, int class) 8641 1.2 isaki { 8642 1.2 isaki mixer_devinfo_t mi; 8643 1.2 isaki 8644 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8645 1.2 isaki 8646 1.2 isaki for (mi.index = 0; audio_query_devinfo(sc, &mi) == 0; mi.index++) { 8647 1.2 isaki if (mi.mixer_class == class && strcmp(mi.label.name, name) == 0) 8648 1.2 isaki return mi.index; 8649 1.2 isaki } 8650 1.2 isaki return -1; 8651 1.2 isaki } 8652 1.2 isaki 8653 1.2 isaki /* 8654 1.2 isaki * Must be called with sc_lock held. 8655 1.2 isaki */ 8656 1.2 isaki void 8657 1.2 isaki au_setup_ports(struct audio_softc *sc, struct au_mixer_ports *ports, 8658 1.2 isaki mixer_devinfo_t *mi, const struct portname *tbl) 8659 1.2 isaki { 8660 1.2 isaki int i, j; 8661 1.2 isaki 8662 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8663 1.2 isaki 8664 1.2 isaki ports->index = mi->index; 8665 1.2 isaki if (mi->type == AUDIO_MIXER_ENUM) { 8666 1.2 isaki ports->isenum = true; 8667 1.2 isaki for(i = 0; tbl[i].name; i++) 8668 1.2 isaki for(j = 0; j < mi->un.e.num_mem; j++) 8669 1.2 isaki if (strcmp(mi->un.e.member[j].label.name, 8670 1.2 isaki tbl[i].name) == 0) { 8671 1.2 isaki ports->allports |= tbl[i].mask; 8672 1.2 isaki ports->aumask[ports->nports] = tbl[i].mask; 8673 1.2 isaki ports->misel[ports->nports] = 8674 1.2 isaki mi->un.e.member[j].ord; 8675 1.2 isaki ports->miport[ports->nports] = 8676 1.2 isaki au_portof(sc, mi->un.e.member[j].label.name, 8677 1.2 isaki mi->mixer_class); 8678 1.2 isaki if (ports->mixerout != -1 && 8679 1.2 isaki ports->miport[ports->nports] != -1) 8680 1.2 isaki ports->isdual = true; 8681 1.2 isaki ++ports->nports; 8682 1.2 isaki } 8683 1.2 isaki } else if (mi->type == AUDIO_MIXER_SET) { 8684 1.2 isaki for(i = 0; tbl[i].name; i++) 8685 1.2 isaki for(j = 0; j < mi->un.s.num_mem; j++) 8686 1.2 isaki if (strcmp(mi->un.s.member[j].label.name, 8687 1.2 isaki tbl[i].name) == 0) { 8688 1.2 isaki ports->allports |= tbl[i].mask; 8689 1.2 isaki ports->aumask[ports->nports] = tbl[i].mask; 8690 1.2 isaki ports->misel[ports->nports] = 8691 1.2 isaki mi->un.s.member[j].mask; 8692 1.2 isaki ports->miport[ports->nports] = 8693 1.2 isaki au_portof(sc, mi->un.s.member[j].label.name, 8694 1.2 isaki mi->mixer_class); 8695 1.2 isaki ++ports->nports; 8696 1.2 isaki } 8697 1.2 isaki } 8698 1.2 isaki } 8699 1.2 isaki 8700 1.2 isaki /* 8701 1.2 isaki * Must be called with sc_lock && sc_exlock held. 8702 1.2 isaki */ 8703 1.2 isaki int 8704 1.2 isaki au_set_lr_value(struct audio_softc *sc, mixer_ctrl_t *ct, int l, int r) 8705 1.2 isaki { 8706 1.2 isaki 8707 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8708 1.2 isaki KASSERT(sc->sc_exlock); 8709 1.2 isaki 8710 1.2 isaki ct->type = AUDIO_MIXER_VALUE; 8711 1.2 isaki ct->un.value.num_channels = 2; 8712 1.2 isaki ct->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = l; 8713 1.2 isaki ct->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = r; 8714 1.2 isaki if (audio_set_port(sc, ct) == 0) 8715 1.2 isaki return 0; 8716 1.2 isaki ct->un.value.num_channels = 1; 8717 1.2 isaki ct->un.value.level[AUDIO_MIXER_LEVEL_MONO] = (l+r)/2; 8718 1.2 isaki return audio_set_port(sc, ct); 8719 1.2 isaki } 8720 1.2 isaki 8721 1.2 isaki /* 8722 1.2 isaki * Must be called with sc_lock && sc_exlock held. 8723 1.2 isaki */ 8724 1.2 isaki int 8725 1.2 isaki au_get_lr_value(struct audio_softc *sc, mixer_ctrl_t *ct, int *l, int *r) 8726 1.2 isaki { 8727 1.2 isaki int error; 8728 1.2 isaki 8729 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8730 1.2 isaki KASSERT(sc->sc_exlock); 8731 1.2 isaki 8732 1.2 isaki ct->un.value.num_channels = 2; 8733 1.2 isaki if (audio_get_port(sc, ct) == 0) { 8734 1.2 isaki *l = ct->un.value.level[AUDIO_MIXER_LEVEL_LEFT]; 8735 1.2 isaki *r = ct->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]; 8736 1.2 isaki } else { 8737 1.2 isaki ct->un.value.num_channels = 1; 8738 1.2 isaki error = audio_get_port(sc, ct); 8739 1.2 isaki if (error) 8740 1.2 isaki return error; 8741 1.2 isaki *r = *l = ct->un.value.level[AUDIO_MIXER_LEVEL_MONO]; 8742 1.2 isaki } 8743 1.2 isaki return 0; 8744 1.2 isaki } 8745 1.2 isaki 8746 1.2 isaki /* 8747 1.2 isaki * Must be called with sc_lock && sc_exlock held. 8748 1.2 isaki */ 8749 1.2 isaki int 8750 1.2 isaki au_set_gain(struct audio_softc *sc, struct au_mixer_ports *ports, 8751 1.2 isaki int gain, int balance) 8752 1.2 isaki { 8753 1.2 isaki mixer_ctrl_t ct; 8754 1.2 isaki int i, error; 8755 1.2 isaki int l, r; 8756 1.2 isaki u_int mask; 8757 1.2 isaki int nset; 8758 1.2 isaki 8759 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8760 1.2 isaki KASSERT(sc->sc_exlock); 8761 1.2 isaki 8762 1.2 isaki if (balance == AUDIO_MID_BALANCE) { 8763 1.2 isaki l = r = gain; 8764 1.2 isaki } else if (balance < AUDIO_MID_BALANCE) { 8765 1.2 isaki l = gain; 8766 1.2 isaki r = (balance * gain) / AUDIO_MID_BALANCE; 8767 1.2 isaki } else { 8768 1.2 isaki r = gain; 8769 1.2 isaki l = ((AUDIO_RIGHT_BALANCE - balance) * gain) 8770 1.2 isaki / AUDIO_MID_BALANCE; 8771 1.2 isaki } 8772 1.2 isaki TRACE(2, "gain=%d balance=%d, l=%d r=%d", gain, balance, l, r); 8773 1.2 isaki 8774 1.2 isaki if (ports->index == -1) { 8775 1.2 isaki usemaster: 8776 1.2 isaki if (ports->master == -1) 8777 1.2 isaki return 0; /* just ignore it silently */ 8778 1.2 isaki ct.dev = ports->master; 8779 1.2 isaki error = au_set_lr_value(sc, &ct, l, r); 8780 1.2 isaki } else { 8781 1.2 isaki ct.dev = ports->index; 8782 1.2 isaki if (ports->isenum) { 8783 1.2 isaki ct.type = AUDIO_MIXER_ENUM; 8784 1.2 isaki error = audio_get_port(sc, &ct); 8785 1.2 isaki if (error) 8786 1.2 isaki return error; 8787 1.2 isaki if (ports->isdual) { 8788 1.2 isaki if (ports->cur_port == -1) 8789 1.2 isaki ct.dev = ports->master; 8790 1.2 isaki else 8791 1.2 isaki ct.dev = ports->miport[ports->cur_port]; 8792 1.2 isaki error = au_set_lr_value(sc, &ct, l, r); 8793 1.2 isaki } else { 8794 1.2 isaki for(i = 0; i < ports->nports; i++) 8795 1.2 isaki if (ports->misel[i] == ct.un.ord) { 8796 1.2 isaki ct.dev = ports->miport[i]; 8797 1.2 isaki if (ct.dev == -1 || 8798 1.2 isaki au_set_lr_value(sc, &ct, l, r)) 8799 1.2 isaki goto usemaster; 8800 1.2 isaki else 8801 1.2 isaki break; 8802 1.2 isaki } 8803 1.2 isaki } 8804 1.2 isaki } else { 8805 1.2 isaki ct.type = AUDIO_MIXER_SET; 8806 1.2 isaki error = audio_get_port(sc, &ct); 8807 1.2 isaki if (error) 8808 1.2 isaki return error; 8809 1.2 isaki mask = ct.un.mask; 8810 1.2 isaki nset = 0; 8811 1.2 isaki for(i = 0; i < ports->nports; i++) { 8812 1.2 isaki if (ports->misel[i] & mask) { 8813 1.2 isaki ct.dev = ports->miport[i]; 8814 1.2 isaki if (ct.dev != -1 && 8815 1.2 isaki au_set_lr_value(sc, &ct, l, r) == 0) 8816 1.2 isaki nset++; 8817 1.2 isaki } 8818 1.2 isaki } 8819 1.2 isaki if (nset == 0) 8820 1.2 isaki goto usemaster; 8821 1.2 isaki } 8822 1.2 isaki } 8823 1.2 isaki if (!error) 8824 1.2 isaki mixer_signal(sc); 8825 1.2 isaki return error; 8826 1.2 isaki } 8827 1.2 isaki 8828 1.2 isaki /* 8829 1.2 isaki * Must be called with sc_lock && sc_exlock held. 8830 1.2 isaki */ 8831 1.2 isaki void 8832 1.2 isaki au_get_gain(struct audio_softc *sc, struct au_mixer_ports *ports, 8833 1.2 isaki u_int *pgain, u_char *pbalance) 8834 1.2 isaki { 8835 1.2 isaki mixer_ctrl_t ct; 8836 1.2 isaki int i, l, r, n; 8837 1.2 isaki int lgain, rgain; 8838 1.2 isaki 8839 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8840 1.2 isaki KASSERT(sc->sc_exlock); 8841 1.2 isaki 8842 1.2 isaki lgain = AUDIO_MAX_GAIN / 2; 8843 1.2 isaki rgain = AUDIO_MAX_GAIN / 2; 8844 1.2 isaki if (ports->index == -1) { 8845 1.2 isaki usemaster: 8846 1.2 isaki if (ports->master == -1) 8847 1.2 isaki goto bad; 8848 1.2 isaki ct.dev = ports->master; 8849 1.2 isaki ct.type = AUDIO_MIXER_VALUE; 8850 1.2 isaki if (au_get_lr_value(sc, &ct, &lgain, &rgain)) 8851 1.2 isaki goto bad; 8852 1.2 isaki } else { 8853 1.2 isaki ct.dev = ports->index; 8854 1.2 isaki if (ports->isenum) { 8855 1.2 isaki ct.type = AUDIO_MIXER_ENUM; 8856 1.2 isaki if (audio_get_port(sc, &ct)) 8857 1.2 isaki goto bad; 8858 1.2 isaki ct.type = AUDIO_MIXER_VALUE; 8859 1.2 isaki if (ports->isdual) { 8860 1.2 isaki if (ports->cur_port == -1) 8861 1.2 isaki ct.dev = ports->master; 8862 1.2 isaki else 8863 1.2 isaki ct.dev = ports->miport[ports->cur_port]; 8864 1.2 isaki au_get_lr_value(sc, &ct, &lgain, &rgain); 8865 1.2 isaki } else { 8866 1.2 isaki for(i = 0; i < ports->nports; i++) 8867 1.2 isaki if (ports->misel[i] == ct.un.ord) { 8868 1.2 isaki ct.dev = ports->miport[i]; 8869 1.2 isaki if (ct.dev == -1 || 8870 1.2 isaki au_get_lr_value(sc, &ct, 8871 1.2 isaki &lgain, &rgain)) 8872 1.2 isaki goto usemaster; 8873 1.2 isaki else 8874 1.2 isaki break; 8875 1.2 isaki } 8876 1.2 isaki } 8877 1.2 isaki } else { 8878 1.2 isaki ct.type = AUDIO_MIXER_SET; 8879 1.2 isaki if (audio_get_port(sc, &ct)) 8880 1.2 isaki goto bad; 8881 1.2 isaki ct.type = AUDIO_MIXER_VALUE; 8882 1.2 isaki lgain = rgain = n = 0; 8883 1.2 isaki for(i = 0; i < ports->nports; i++) { 8884 1.2 isaki if (ports->misel[i] & ct.un.mask) { 8885 1.2 isaki ct.dev = ports->miport[i]; 8886 1.2 isaki if (ct.dev == -1 || 8887 1.2 isaki au_get_lr_value(sc, &ct, &l, &r)) 8888 1.2 isaki goto usemaster; 8889 1.2 isaki else { 8890 1.2 isaki lgain += l; 8891 1.2 isaki rgain += r; 8892 1.2 isaki n++; 8893 1.2 isaki } 8894 1.2 isaki } 8895 1.2 isaki } 8896 1.2 isaki if (n != 0) { 8897 1.2 isaki lgain /= n; 8898 1.2 isaki rgain /= n; 8899 1.2 isaki } 8900 1.2 isaki } 8901 1.2 isaki } 8902 1.2 isaki bad: 8903 1.2 isaki if (lgain == rgain) { /* handles lgain==rgain==0 */ 8904 1.2 isaki *pgain = lgain; 8905 1.2 isaki *pbalance = AUDIO_MID_BALANCE; 8906 1.2 isaki } else if (lgain < rgain) { 8907 1.2 isaki *pgain = rgain; 8908 1.2 isaki /* balance should be > AUDIO_MID_BALANCE */ 8909 1.2 isaki *pbalance = AUDIO_RIGHT_BALANCE - 8910 1.2 isaki (AUDIO_MID_BALANCE * lgain) / rgain; 8911 1.2 isaki } else /* lgain > rgain */ { 8912 1.2 isaki *pgain = lgain; 8913 1.2 isaki /* balance should be < AUDIO_MID_BALANCE */ 8914 1.2 isaki *pbalance = (AUDIO_MID_BALANCE * rgain) / lgain; 8915 1.2 isaki } 8916 1.2 isaki } 8917 1.2 isaki 8918 1.2 isaki /* 8919 1.2 isaki * Must be called with sc_lock && sc_exlock held. 8920 1.2 isaki */ 8921 1.2 isaki int 8922 1.2 isaki au_set_port(struct audio_softc *sc, struct au_mixer_ports *ports, u_int port) 8923 1.2 isaki { 8924 1.2 isaki mixer_ctrl_t ct; 8925 1.2 isaki int i, error, use_mixerout; 8926 1.2 isaki 8927 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8928 1.2 isaki KASSERT(sc->sc_exlock); 8929 1.2 isaki 8930 1.2 isaki use_mixerout = 1; 8931 1.2 isaki if (port == 0) { 8932 1.2 isaki if (ports->allports == 0) 8933 1.2 isaki return 0; /* Allow this special case. */ 8934 1.2 isaki else if (ports->isdual) { 8935 1.2 isaki if (ports->cur_port == -1) { 8936 1.2 isaki return 0; 8937 1.2 isaki } else { 8938 1.2 isaki port = ports->aumask[ports->cur_port]; 8939 1.2 isaki ports->cur_port = -1; 8940 1.2 isaki use_mixerout = 0; 8941 1.2 isaki } 8942 1.2 isaki } 8943 1.2 isaki } 8944 1.2 isaki if (ports->index == -1) 8945 1.2 isaki return EINVAL; 8946 1.2 isaki ct.dev = ports->index; 8947 1.2 isaki if (ports->isenum) { 8948 1.2 isaki if (port & (port-1)) 8949 1.2 isaki return EINVAL; /* Only one port allowed */ 8950 1.2 isaki ct.type = AUDIO_MIXER_ENUM; 8951 1.2 isaki error = EINVAL; 8952 1.2 isaki for(i = 0; i < ports->nports; i++) 8953 1.2 isaki if (ports->aumask[i] == port) { 8954 1.2 isaki if (ports->isdual && use_mixerout) { 8955 1.2 isaki ct.un.ord = ports->mixerout; 8956 1.2 isaki ports->cur_port = i; 8957 1.2 isaki } else { 8958 1.2 isaki ct.un.ord = ports->misel[i]; 8959 1.2 isaki } 8960 1.2 isaki error = audio_set_port(sc, &ct); 8961 1.2 isaki break; 8962 1.2 isaki } 8963 1.2 isaki } else { 8964 1.2 isaki ct.type = AUDIO_MIXER_SET; 8965 1.2 isaki ct.un.mask = 0; 8966 1.2 isaki for(i = 0; i < ports->nports; i++) 8967 1.2 isaki if (ports->aumask[i] & port) 8968 1.2 isaki ct.un.mask |= ports->misel[i]; 8969 1.2 isaki if (port != 0 && ct.un.mask == 0) 8970 1.2 isaki error = EINVAL; 8971 1.2 isaki else 8972 1.2 isaki error = audio_set_port(sc, &ct); 8973 1.2 isaki } 8974 1.2 isaki if (!error) 8975 1.2 isaki mixer_signal(sc); 8976 1.2 isaki return error; 8977 1.2 isaki } 8978 1.2 isaki 8979 1.2 isaki /* 8980 1.2 isaki * Must be called with sc_lock && sc_exlock held. 8981 1.2 isaki */ 8982 1.2 isaki int 8983 1.2 isaki au_get_port(struct audio_softc *sc, struct au_mixer_ports *ports) 8984 1.2 isaki { 8985 1.2 isaki mixer_ctrl_t ct; 8986 1.2 isaki int i, aumask; 8987 1.2 isaki 8988 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 8989 1.2 isaki KASSERT(sc->sc_exlock); 8990 1.2 isaki 8991 1.2 isaki if (ports->index == -1) 8992 1.2 isaki return 0; 8993 1.2 isaki ct.dev = ports->index; 8994 1.2 isaki ct.type = ports->isenum ? AUDIO_MIXER_ENUM : AUDIO_MIXER_SET; 8995 1.2 isaki if (audio_get_port(sc, &ct)) 8996 1.2 isaki return 0; 8997 1.2 isaki aumask = 0; 8998 1.2 isaki if (ports->isenum) { 8999 1.2 isaki if (ports->isdual && ports->cur_port != -1) { 9000 1.2 isaki if (ports->mixerout == ct.un.ord) 9001 1.2 isaki aumask = ports->aumask[ports->cur_port]; 9002 1.2 isaki else 9003 1.2 isaki ports->cur_port = -1; 9004 1.2 isaki } 9005 1.2 isaki if (aumask == 0) 9006 1.2 isaki for(i = 0; i < ports->nports; i++) 9007 1.2 isaki if (ports->misel[i] == ct.un.ord) 9008 1.2 isaki aumask = ports->aumask[i]; 9009 1.2 isaki } else { 9010 1.2 isaki for(i = 0; i < ports->nports; i++) 9011 1.2 isaki if (ct.un.mask & ports->misel[i]) 9012 1.2 isaki aumask |= ports->aumask[i]; 9013 1.2 isaki } 9014 1.2 isaki return aumask; 9015 1.2 isaki } 9016 1.2 isaki 9017 1.2 isaki /* 9018 1.2 isaki * It returns 0 if success, otherwise errno. 9019 1.2 isaki * Must be called only if sc->sc_monitor_port != -1. 9020 1.2 isaki * Must be called with sc_lock && sc_exlock held. 9021 1.2 isaki */ 9022 1.2 isaki static int 9023 1.2 isaki au_set_monitor_gain(struct audio_softc *sc, int monitor_gain) 9024 1.2 isaki { 9025 1.2 isaki mixer_ctrl_t ct; 9026 1.2 isaki 9027 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9028 1.2 isaki KASSERT(sc->sc_exlock); 9029 1.2 isaki 9030 1.2 isaki ct.dev = sc->sc_monitor_port; 9031 1.2 isaki ct.type = AUDIO_MIXER_VALUE; 9032 1.2 isaki ct.un.value.num_channels = 1; 9033 1.2 isaki ct.un.value.level[AUDIO_MIXER_LEVEL_MONO] = monitor_gain; 9034 1.2 isaki return audio_set_port(sc, &ct); 9035 1.2 isaki } 9036 1.2 isaki 9037 1.2 isaki /* 9038 1.2 isaki * It returns monitor gain if success, otherwise -1. 9039 1.2 isaki * Must be called only if sc->sc_monitor_port != -1. 9040 1.2 isaki * Must be called with sc_lock && sc_exlock held. 9041 1.2 isaki */ 9042 1.2 isaki static int 9043 1.2 isaki au_get_monitor_gain(struct audio_softc *sc) 9044 1.2 isaki { 9045 1.2 isaki mixer_ctrl_t ct; 9046 1.2 isaki 9047 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9048 1.2 isaki KASSERT(sc->sc_exlock); 9049 1.2 isaki 9050 1.2 isaki ct.dev = sc->sc_monitor_port; 9051 1.2 isaki ct.type = AUDIO_MIXER_VALUE; 9052 1.2 isaki ct.un.value.num_channels = 1; 9053 1.2 isaki if (audio_get_port(sc, &ct)) 9054 1.2 isaki return -1; 9055 1.2 isaki return ct.un.value.level[AUDIO_MIXER_LEVEL_MONO]; 9056 1.2 isaki } 9057 1.2 isaki 9058 1.2 isaki /* 9059 1.2 isaki * Must be called with sc_lock && sc_exlock held. 9060 1.2 isaki */ 9061 1.2 isaki static int 9062 1.2 isaki audio_set_port(struct audio_softc *sc, mixer_ctrl_t *mc) 9063 1.2 isaki { 9064 1.2 isaki 9065 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9066 1.2 isaki KASSERT(sc->sc_exlock); 9067 1.2 isaki 9068 1.2 isaki return sc->hw_if->set_port(sc->hw_hdl, mc); 9069 1.2 isaki } 9070 1.2 isaki 9071 1.2 isaki /* 9072 1.2 isaki * Must be called with sc_lock && sc_exlock held. 9073 1.2 isaki */ 9074 1.2 isaki static int 9075 1.2 isaki audio_get_port(struct audio_softc *sc, mixer_ctrl_t *mc) 9076 1.2 isaki { 9077 1.2 isaki 9078 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9079 1.2 isaki KASSERT(sc->sc_exlock); 9080 1.2 isaki 9081 1.2 isaki return sc->hw_if->get_port(sc->hw_hdl, mc); 9082 1.2 isaki } 9083 1.2 isaki 9084 1.2 isaki /* 9085 1.2 isaki * Must be called with sc_lock && sc_exlock held. 9086 1.2 isaki */ 9087 1.2 isaki static void 9088 1.2 isaki audio_mixer_capture(struct audio_softc *sc) 9089 1.2 isaki { 9090 1.2 isaki mixer_devinfo_t mi; 9091 1.2 isaki mixer_ctrl_t *mc; 9092 1.2 isaki 9093 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9094 1.2 isaki KASSERT(sc->sc_exlock); 9095 1.2 isaki 9096 1.2 isaki for (mi.index = 0;; mi.index++) { 9097 1.2 isaki if (audio_query_devinfo(sc, &mi) != 0) 9098 1.2 isaki break; 9099 1.2 isaki KASSERT(mi.index < sc->sc_nmixer_states); 9100 1.2 isaki if (mi.type == AUDIO_MIXER_CLASS) 9101 1.2 isaki continue; 9102 1.2 isaki mc = &sc->sc_mixer_state[mi.index]; 9103 1.2 isaki mc->dev = mi.index; 9104 1.2 isaki mc->type = mi.type; 9105 1.2 isaki mc->un.value.num_channels = mi.un.v.num_channels; 9106 1.2 isaki (void)audio_get_port(sc, mc); 9107 1.2 isaki } 9108 1.2 isaki 9109 1.2 isaki return; 9110 1.2 isaki } 9111 1.2 isaki 9112 1.2 isaki /* 9113 1.2 isaki * Must be called with sc_lock && sc_exlock held. 9114 1.2 isaki */ 9115 1.2 isaki static void 9116 1.2 isaki audio_mixer_restore(struct audio_softc *sc) 9117 1.2 isaki { 9118 1.2 isaki mixer_devinfo_t mi; 9119 1.2 isaki mixer_ctrl_t *mc; 9120 1.2 isaki 9121 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9122 1.2 isaki KASSERT(sc->sc_exlock); 9123 1.2 isaki 9124 1.2 isaki for (mi.index = 0; ; mi.index++) { 9125 1.2 isaki if (audio_query_devinfo(sc, &mi) != 0) 9126 1.2 isaki break; 9127 1.2 isaki if (mi.type == AUDIO_MIXER_CLASS) 9128 1.2 isaki continue; 9129 1.2 isaki mc = &sc->sc_mixer_state[mi.index]; 9130 1.2 isaki (void)audio_set_port(sc, mc); 9131 1.2 isaki } 9132 1.2 isaki if (sc->hw_if->commit_settings) 9133 1.2 isaki sc->hw_if->commit_settings(sc->hw_hdl); 9134 1.2 isaki 9135 1.2 isaki return; 9136 1.2 isaki } 9137 1.2 isaki 9138 1.2 isaki static void 9139 1.2 isaki audio_volume_down(device_t dv) 9140 1.2 isaki { 9141 1.2 isaki struct audio_softc *sc = device_private(dv); 9142 1.2 isaki mixer_devinfo_t mi; 9143 1.2 isaki int newgain; 9144 1.2 isaki u_int gain; 9145 1.2 isaki u_char balance; 9146 1.2 isaki 9147 1.63 isaki if (audio_exlock_mutex_enter(sc) != 0) 9148 1.2 isaki return; 9149 1.2 isaki if (sc->sc_outports.index == -1 && sc->sc_outports.master != -1) { 9150 1.2 isaki mi.index = sc->sc_outports.master; 9151 1.2 isaki mi.un.v.delta = 0; 9152 1.2 isaki if (audio_query_devinfo(sc, &mi) == 0) { 9153 1.2 isaki au_get_gain(sc, &sc->sc_outports, &gain, &balance); 9154 1.146 nia /* 9155 1.146 nia * delta is optional. 16 gives us about 16 increments 9156 1.146 nia * to reach max or minimum gain which seems reasonable 9157 1.146 nia * for keyboard key presses. 9158 1.146 nia */ 9159 1.146 nia if (mi.un.v.delta == 0) 9160 1.146 nia mi.un.v.delta = 16; 9161 1.2 isaki newgain = gain - mi.un.v.delta; 9162 1.2 isaki if (newgain < AUDIO_MIN_GAIN) 9163 1.2 isaki newgain = AUDIO_MIN_GAIN; 9164 1.2 isaki au_set_gain(sc, &sc->sc_outports, newgain, balance); 9165 1.2 isaki } 9166 1.2 isaki } 9167 1.63 isaki audio_exlock_mutex_exit(sc); 9168 1.2 isaki } 9169 1.2 isaki 9170 1.2 isaki static void 9171 1.2 isaki audio_volume_up(device_t dv) 9172 1.2 isaki { 9173 1.2 isaki struct audio_softc *sc = device_private(dv); 9174 1.2 isaki mixer_devinfo_t mi; 9175 1.2 isaki u_int gain, newgain; 9176 1.2 isaki u_char balance; 9177 1.2 isaki 9178 1.63 isaki if (audio_exlock_mutex_enter(sc) != 0) 9179 1.2 isaki return; 9180 1.2 isaki if (sc->sc_outports.index == -1 && sc->sc_outports.master != -1) { 9181 1.2 isaki mi.index = sc->sc_outports.master; 9182 1.2 isaki mi.un.v.delta = 0; 9183 1.2 isaki if (audio_query_devinfo(sc, &mi) == 0) { 9184 1.2 isaki au_get_gain(sc, &sc->sc_outports, &gain, &balance); 9185 1.146 nia if (mi.un.v.delta == 0) 9186 1.146 nia mi.un.v.delta = 16; 9187 1.2 isaki newgain = gain + mi.un.v.delta; 9188 1.2 isaki if (newgain > AUDIO_MAX_GAIN) 9189 1.2 isaki newgain = AUDIO_MAX_GAIN; 9190 1.2 isaki au_set_gain(sc, &sc->sc_outports, newgain, balance); 9191 1.2 isaki } 9192 1.2 isaki } 9193 1.63 isaki audio_exlock_mutex_exit(sc); 9194 1.2 isaki } 9195 1.2 isaki 9196 1.2 isaki static void 9197 1.2 isaki audio_volume_toggle(device_t dv) 9198 1.2 isaki { 9199 1.2 isaki struct audio_softc *sc = device_private(dv); 9200 1.2 isaki u_int gain, newgain; 9201 1.2 isaki u_char balance; 9202 1.2 isaki 9203 1.63 isaki if (audio_exlock_mutex_enter(sc) != 0) 9204 1.2 isaki return; 9205 1.2 isaki au_get_gain(sc, &sc->sc_outports, &gain, &balance); 9206 1.2 isaki if (gain != 0) { 9207 1.2 isaki sc->sc_lastgain = gain; 9208 1.2 isaki newgain = 0; 9209 1.2 isaki } else 9210 1.2 isaki newgain = sc->sc_lastgain; 9211 1.2 isaki au_set_gain(sc, &sc->sc_outports, newgain, balance); 9212 1.63 isaki audio_exlock_mutex_exit(sc); 9213 1.2 isaki } 9214 1.2 isaki 9215 1.63 isaki /* 9216 1.63 isaki * Must be called with sc_lock held. 9217 1.63 isaki */ 9218 1.2 isaki static int 9219 1.2 isaki audio_query_devinfo(struct audio_softc *sc, mixer_devinfo_t *di) 9220 1.2 isaki { 9221 1.2 isaki 9222 1.2 isaki KASSERT(mutex_owned(sc->sc_lock)); 9223 1.2 isaki 9224 1.2 isaki return sc->hw_if->query_devinfo(sc->hw_hdl, di); 9225 1.2 isaki } 9226 1.2 isaki 9227 1.140 mlelstv void 9228 1.140 mlelstv audio_mixsample_to_linear(audio_filter_arg_t *arg) 9229 1.140 mlelstv { 9230 1.140 mlelstv const audio_format2_t *fmt; 9231 1.140 mlelstv const aint2_t *m; 9232 1.140 mlelstv uint8_t *p; 9233 1.140 mlelstv u_int sample_count; 9234 1.140 mlelstv aint2_t v, xor; 9235 1.140 mlelstv u_int i, bps; 9236 1.140 mlelstv bool little; 9237 1.140 mlelstv 9238 1.140 mlelstv DIAGNOSTIC_filter_arg(arg); 9239 1.140 mlelstv KASSERT(audio_format2_is_linear(arg->dstfmt)); 9240 1.140 mlelstv KASSERT(arg->srcfmt->channels == arg->dstfmt->channels); 9241 1.140 mlelstv 9242 1.140 mlelstv fmt = arg->dstfmt; 9243 1.140 mlelstv m = arg->src; 9244 1.140 mlelstv p = arg->dst; 9245 1.140 mlelstv sample_count = arg->count * fmt->channels; 9246 1.145 mlelstv little = arg->dstfmt->encoding == AUDIO_ENCODING_SLINEAR_LE; 9247 1.140 mlelstv 9248 1.140 mlelstv bps = fmt->stride / NBBY; 9249 1.145 mlelstv xor = audio_format2_is_signed(fmt) ? 0 : (aint2_t)1 << 31; 9250 1.140 mlelstv 9251 1.145 mlelstv #if AUDIO_INTERNAL_BITS == 16 9252 1.145 mlelstv if (little) { 9253 1.145 mlelstv switch (bps) { 9254 1.145 mlelstv case 4: 9255 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9256 1.145 mlelstv v = *m++ ^ xor; 9257 1.145 mlelstv *p++ = 0; 9258 1.145 mlelstv *p++ = 0; 9259 1.145 mlelstv *p++ = v; 9260 1.145 mlelstv *p++ = v >> 8; 9261 1.145 mlelstv } 9262 1.145 mlelstv break; 9263 1.145 mlelstv case 3: 9264 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9265 1.145 mlelstv v = *m++ ^ xor; 9266 1.145 mlelstv *p++ = 0; 9267 1.145 mlelstv *p++ = v; 9268 1.145 mlelstv *p++ = v >> 8; 9269 1.145 mlelstv } 9270 1.145 mlelstv break; 9271 1.145 mlelstv case 2: 9272 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9273 1.145 mlelstv v = *m++ ^ xor; 9274 1.145 mlelstv *p++ = v; 9275 1.145 mlelstv *p++ = v >> 8; 9276 1.145 mlelstv } 9277 1.145 mlelstv break; 9278 1.145 mlelstv case 1: 9279 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9280 1.145 mlelstv v = *m++ ^ xor; 9281 1.145 mlelstv *p++ = v >> 8; 9282 1.145 mlelstv } 9283 1.145 mlelstv break; 9284 1.145 mlelstv } 9285 1.145 mlelstv } else { 9286 1.145 mlelstv switch (bps) { 9287 1.145 mlelstv case 4: 9288 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9289 1.145 mlelstv v = *m++ ^ xor; 9290 1.145 mlelstv *p++ = v >> 8; 9291 1.145 mlelstv *p++ = v; 9292 1.145 mlelstv *p++ = 0; 9293 1.145 mlelstv *p++ = 0; 9294 1.145 mlelstv } 9295 1.145 mlelstv break; 9296 1.145 mlelstv case 3: 9297 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9298 1.145 mlelstv v = *m++ ^ xor; 9299 1.145 mlelstv *p++ = v >> 8; 9300 1.145 mlelstv *p++ = v; 9301 1.145 mlelstv *p++ = 0; 9302 1.145 mlelstv } 9303 1.145 mlelstv break; 9304 1.145 mlelstv case 2: 9305 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9306 1.145 mlelstv v = *m++ ^ xor; 9307 1.145 mlelstv *p++ = v >> 8; 9308 1.145 mlelstv *p++ = v; 9309 1.145 mlelstv } 9310 1.145 mlelstv break; 9311 1.145 mlelstv case 1: 9312 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9313 1.145 mlelstv v = *m++ ^ xor; 9314 1.145 mlelstv *p++ = v >> 8; 9315 1.145 mlelstv } 9316 1.145 mlelstv break; 9317 1.145 mlelstv } 9318 1.145 mlelstv } 9319 1.145 mlelstv #elif AUDIO_INTERNAL_BITS == 32 9320 1.145 mlelstv if (little) { 9321 1.145 mlelstv switch (bps) { 9322 1.145 mlelstv case 4: 9323 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9324 1.145 mlelstv v = *m++ ^ xor; 9325 1.145 mlelstv *p++ = v; 9326 1.145 mlelstv *p++ = v >> 8; 9327 1.145 mlelstv *p++ = v >> 16; 9328 1.145 mlelstv *p++ = v >> 24; 9329 1.145 mlelstv } 9330 1.145 mlelstv break; 9331 1.145 mlelstv case 3: 9332 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9333 1.145 mlelstv v = *m++ ^ xor; 9334 1.145 mlelstv *p++ = v >> 8; 9335 1.145 mlelstv *p++ = v >> 16; 9336 1.145 mlelstv *p++ = v >> 24; 9337 1.145 mlelstv } 9338 1.145 mlelstv break; 9339 1.145 mlelstv case 2: 9340 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9341 1.145 mlelstv v = *m++ ^ xor; 9342 1.145 mlelstv *p++ = v >> 16; 9343 1.145 mlelstv *p++ = v >> 24; 9344 1.145 mlelstv } 9345 1.145 mlelstv break; 9346 1.145 mlelstv case 1: 9347 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9348 1.145 mlelstv v = *m++ ^ xor; 9349 1.145 mlelstv *p++ = v >> 24; 9350 1.145 mlelstv } 9351 1.145 mlelstv break; 9352 1.145 mlelstv } 9353 1.145 mlelstv } else { 9354 1.145 mlelstv switch (bps) { 9355 1.145 mlelstv case 4: 9356 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9357 1.145 mlelstv v = *m++ ^ xor; 9358 1.145 mlelstv *p++ = v >> 24; 9359 1.145 mlelstv *p++ = v >> 16; 9360 1.145 mlelstv *p++ = v >> 8; 9361 1.145 mlelstv *p++ = v; 9362 1.145 mlelstv } 9363 1.145 mlelstv break; 9364 1.145 mlelstv case 3: 9365 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9366 1.145 mlelstv v = *m++ ^ xor; 9367 1.145 mlelstv *p++ = v >> 24; 9368 1.145 mlelstv *p++ = v >> 16; 9369 1.145 mlelstv *p++ = v >> 8; 9370 1.145 mlelstv } 9371 1.145 mlelstv break; 9372 1.145 mlelstv case 2: 9373 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9374 1.145 mlelstv v = *m++ ^ xor; 9375 1.145 mlelstv *p++ = v >> 24; 9376 1.145 mlelstv *p++ = v >> 16; 9377 1.140 mlelstv } 9378 1.145 mlelstv break; 9379 1.145 mlelstv case 1: 9380 1.145 mlelstv for (i=0; i<sample_count; ++i) { 9381 1.145 mlelstv v = *m++ ^ xor; 9382 1.145 mlelstv *p++ = v >> 24; 9383 1.140 mlelstv } 9384 1.145 mlelstv break; 9385 1.140 mlelstv } 9386 1.140 mlelstv } 9387 1.145 mlelstv #endif /* AUDIO_INTERNAL_BITS */ 9388 1.145 mlelstv 9389 1.140 mlelstv } 9390 1.140 mlelstv 9391 1.2 isaki #endif /* NAUDIO > 0 */ 9392 1.2 isaki 9393 1.2 isaki #if NAUDIO == 0 && (NMIDI > 0 || NMIDIBUS > 0) 9394 1.2 isaki #include <sys/param.h> 9395 1.2 isaki #include <sys/systm.h> 9396 1.2 isaki #include <sys/device.h> 9397 1.2 isaki #include <sys/audioio.h> 9398 1.2 isaki #include <dev/audio/audio_if.h> 9399 1.2 isaki #endif 9400 1.2 isaki 9401 1.2 isaki #if NAUDIO > 0 || (NMIDI > 0 || NMIDIBUS > 0) 9402 1.2 isaki int 9403 1.2 isaki audioprint(void *aux, const char *pnp) 9404 1.2 isaki { 9405 1.2 isaki struct audio_attach_args *arg; 9406 1.2 isaki const char *type; 9407 1.2 isaki 9408 1.2 isaki if (pnp != NULL) { 9409 1.2 isaki arg = aux; 9410 1.2 isaki switch (arg->type) { 9411 1.2 isaki case AUDIODEV_TYPE_AUDIO: 9412 1.2 isaki type = "audio"; 9413 1.2 isaki break; 9414 1.2 isaki case AUDIODEV_TYPE_MIDI: 9415 1.2 isaki type = "midi"; 9416 1.2 isaki break; 9417 1.2 isaki case AUDIODEV_TYPE_OPL: 9418 1.2 isaki type = "opl"; 9419 1.2 isaki break; 9420 1.2 isaki case AUDIODEV_TYPE_MPU: 9421 1.2 isaki type = "mpu"; 9422 1.2 isaki break; 9423 1.94 thorpej case AUDIODEV_TYPE_AUX: 9424 1.94 thorpej type = "aux"; 9425 1.94 thorpej break; 9426 1.2 isaki default: 9427 1.2 isaki panic("audioprint: unknown type %d", arg->type); 9428 1.2 isaki } 9429 1.2 isaki aprint_normal("%s at %s", type, pnp); 9430 1.2 isaki } 9431 1.2 isaki return UNCONF; 9432 1.2 isaki } 9433 1.2 isaki 9434 1.2 isaki #endif /* NAUDIO > 0 || (NMIDI > 0 || NMIDIBUS > 0) */ 9435 1.2 isaki 9436 1.2 isaki #ifdef _MODULE 9437 1.2 isaki 9438 1.2 isaki devmajor_t audio_bmajor = -1, audio_cmajor = -1; 9439 1.2 isaki 9440 1.2 isaki #include "ioconf.c" 9441 1.2 isaki 9442 1.2 isaki #endif 9443 1.2 isaki 9444 1.2 isaki MODULE(MODULE_CLASS_DRIVER, audio, NULL); 9445 1.2 isaki 9446 1.2 isaki static int 9447 1.2 isaki audio_modcmd(modcmd_t cmd, void *arg) 9448 1.2 isaki { 9449 1.2 isaki int error = 0; 9450 1.2 isaki 9451 1.2 isaki switch (cmd) { 9452 1.2 isaki case MODULE_CMD_INIT: 9453 1.56 isaki /* XXX interrupt level? */ 9454 1.56 isaki audio_psref_class = psref_class_create("audio", IPL_SOFTSERIAL); 9455 1.56 isaki #ifdef _MODULE 9456 1.2 isaki error = devsw_attach(audio_cd.cd_name, NULL, &audio_bmajor, 9457 1.2 isaki &audio_cdevsw, &audio_cmajor); 9458 1.2 isaki if (error) 9459 1.2 isaki break; 9460 1.2 isaki 9461 1.2 isaki error = config_init_component(cfdriver_ioconf_audio, 9462 1.2 isaki cfattach_ioconf_audio, cfdata_ioconf_audio); 9463 1.2 isaki if (error) { 9464 1.2 isaki devsw_detach(NULL, &audio_cdevsw); 9465 1.2 isaki } 9466 1.56 isaki #endif 9467 1.2 isaki break; 9468 1.2 isaki case MODULE_CMD_FINI: 9469 1.56 isaki #ifdef _MODULE 9470 1.2 isaki error = config_fini_component(cfdriver_ioconf_audio, 9471 1.2 isaki cfattach_ioconf_audio, cfdata_ioconf_audio); 9472 1.122 pgoyette if (error == 0) 9473 1.122 pgoyette devsw_detach(NULL, &audio_cdevsw); 9474 1.56 isaki #endif 9475 1.122 pgoyette if (error == 0) 9476 1.122 pgoyette psref_class_destroy(audio_psref_class); 9477 1.2 isaki break; 9478 1.2 isaki default: 9479 1.2 isaki error = ENOTTY; 9480 1.2 isaki break; 9481 1.2 isaki } 9482 1.2 isaki 9483 1.2 isaki return error; 9484 1.2 isaki } 9485