jcs's openbsd hax
openbsd
at jcs 2516 lines 59 kB view raw
1/* $OpenBSD: audio.c,v 1.213 2025/11/18 09:30:27 ratchov Exp $ */ 2/* 3 * Copyright (c) 2015 Alexandre Ratchov <alex@caoua.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17#include <sys/param.h> 18#include <sys/fcntl.h> 19#include <sys/systm.h> 20#include <sys/ioctl.h> 21#include <sys/conf.h> 22#include <sys/kernel.h> 23#include <sys/event.h> 24#include <sys/mutex.h> 25#include <sys/task.h> 26#include <sys/vnode.h> 27#include <sys/malloc.h> 28#include <sys/device.h> 29#include <sys/audioio.h> 30#include <sys/atomic.h> 31#include <dev/audio_if.h> 32#include <dev/mulaw.h> 33#include "audio.h" 34#include "wskbd.h" 35 36/* 37 * Locks used to protect data: 38 * a atomic 39 */ 40 41#ifdef AUDIO_DEBUG 42#define DPRINTF(...) \ 43 do { \ 44 if (audio_debug) \ 45 printf(__VA_ARGS__); \ 46 } while(0) 47#define DPRINTFN(n, ...) \ 48 do { \ 49 if (audio_debug > (n)) \ 50 printf(__VA_ARGS__); \ 51 } while(0) 52#else 53#define DPRINTF(...) do {} while(0) 54#define DPRINTFN(n, ...) do {} while(0) 55#endif 56 57#define DEVNAME(sc) ((sc)->dev.dv_xname) 58#define AUDIO_UNIT(n) (minor(n) & 0x0f) 59#define AUDIO_DEV(n) (minor(n) & 0xf0) 60#define AUDIO_DEV_AUDIO 0 /* minor of /dev/audio0 */ 61#define AUDIO_DEV_AUDIOCTL 0xc0 /* minor of /dev/audioctl */ 62#define AUDIO_BUFSZ 65536 /* buffer size in bytes */ 63 64/* 65 * mixer entries added by the audio(4) layer 66 */ 67#define MIXER_RECORD 0 /* record class */ 68#define MIXER_RECORD_ENABLE 1 /* record.enable control */ 69#define MIXER_RECORD_ENABLE_OFF 0 /* record.enable=off value */ 70#define MIXER_RECORD_ENABLE_ON 1 /* record.enable=on value */ 71#define MIXER_RECORD_ENABLE_SYSCTL 2 /* record.enable=sysctl val */ 72 73/* 74 * dma buffer 75 */ 76struct audio_buf { 77 unsigned char *data; /* DMA memory block */ 78 size_t datalen; /* size of DMA memory block */ 79 size_t klen; /* size of DMA FIFO */ 80 size_t ulen; /* size of the userland FIFO */ 81 size_t start; /* first byte used in the FIFO */ 82 size_t used; /* bytes used in the FIFO */ 83 size_t blksz; /* DMA block size */ 84 unsigned int nblks; /* number of blocks */ 85 struct klist klist; /* list of knotes */ 86 unsigned int pos; /* bytes transferred */ 87 unsigned int xrun; /* bytes lost by xruns */ 88 int blocking; /* read/write blocking */ 89}; 90 91#if NWSKBD > 0 92struct wskbd_vol { 93 int val; /* index of the value control */ 94 int mute; /* index of the mute control */ 95 int step; /* increment/decrement step */ 96 int nch; /* channels in the value control */ 97 int val_pending; /* pending change of val */ 98 int mute_pending; /* pending change of mute */ 99#define WSKBD_MUTE_TOGGLE 1 100#define WSKBD_MUTE_DISABLE 2 101#define WSKBD_MUTE_ENABLE 3 102}; 103 104int wskbd_set_mixervolume_unit(int, long, long); 105#endif 106 107/* 108 * event indicating that a control was changed 109 */ 110struct mixer_ev { 111 struct mixer_ev *next; 112 int pending; 113}; 114 115/* 116 * device structure 117 */ 118struct audio_softc { 119 struct device dev; 120 const struct audio_hw_if *ops; /* driver funcs */ 121 void *cookie; /* wskbd cookie */ 122 void *arg; /* first arg to driver funcs */ 123 int mode; /* bitmask of AUMODE_* */ 124 int quiesce; /* device suspended */ 125 struct audio_buf play, rec; 126 unsigned int sw_enc; /* user exposed AUDIO_ENCODING_* */ 127 unsigned int hw_enc; /* hardware AUDIO_ENCODING_* */ 128 unsigned int bits; /* bits per sample */ 129 unsigned int bps; /* bytes-per-sample */ 130 unsigned int msb; /* sample are MSB aligned */ 131 unsigned int rate; /* rate in Hz */ 132 unsigned int round; /* block size in frames */ 133 unsigned int pchan, rchan; /* number of channels */ 134 unsigned char silence[4]; /* a sample of silence */ 135 int pause; /* not trying to start DMA */ 136 int active; /* DMA in process */ 137 int offs; /* offset between play & rec dir */ 138 void (*conv_enc)(unsigned char *, int); /* encode to native */ 139 void (*conv_dec)(unsigned char *, int); /* decode to user */ 140 struct mixer_ctrl *mix_ents; /* mixer state for suspend/resume */ 141 int mix_nent; /* size of mixer state */ 142 int mix_isopen; /* mixer open for reading */ 143 int mix_blocking; /* read() blocking */ 144 struct klist mix_klist; /* list of knotes */ 145 struct mixer_ev *mix_evbuf; /* per mixer-control event */ 146 struct mixer_ev *mix_pending; /* list of changed controls */ 147#if NWSKBD > 0 148 struct wskbd_vol spkr, mic; 149 struct task wskbd_task; 150#endif 151 int record_enable; /* mixer record.enable value */ 152}; 153 154int audio_match(struct device *, void *, void *); 155void audio_attach(struct device *, struct device *, void *); 156int audio_activate(struct device *, int); 157int audio_detach(struct device *, int); 158void audio_pintr(void *); 159void audio_rintr(void *); 160void audio_buf_wakeup(struct audio_buf *); 161void audio_mixer_wakeup(struct audio_softc *); 162#if NWSKBD > 0 163void wskbd_mixer_init(struct audio_softc *); 164void wskbd_mixer_cb(void *); 165#endif 166 167const struct cfattach audio_ca = { 168 sizeof(struct audio_softc), audio_match, audio_attach, 169 audio_detach, audio_activate 170}; 171 172struct cfdriver audio_cd = { 173 NULL, "audio", DV_DULL 174}; 175 176void filt_audioctlrdetach(struct knote *); 177int filt_audioctlread(struct knote *, long); 178int filt_audiomodify(struct kevent *, struct knote *); 179int filt_audioprocess(struct knote *, struct kevent *); 180 181const struct filterops audioctlread_filtops = { 182 .f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE, 183 .f_attach = NULL, 184 .f_detach = filt_audioctlrdetach, 185 .f_event = filt_audioctlread, 186 .f_modify = filt_audiomodify, 187 .f_process = filt_audioprocess, 188}; 189 190void filt_audiowdetach(struct knote *); 191int filt_audiowrite(struct knote *, long); 192 193const struct filterops audiowrite_filtops = { 194 .f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE, 195 .f_attach = NULL, 196 .f_detach = filt_audiowdetach, 197 .f_event = filt_audiowrite, 198 .f_modify = filt_audiomodify, 199 .f_process = filt_audioprocess, 200}; 201 202void filt_audiordetach(struct knote *); 203int filt_audioread(struct knote *, long); 204 205const struct filterops audioread_filtops = { 206 .f_flags = FILTEROP_ISFD | FILTEROP_MPSAFE, 207 .f_attach = NULL, 208 .f_detach = filt_audiordetach, 209 .f_event = filt_audioread, 210 .f_modify = filt_audiomodify, 211 .f_process = filt_audioprocess, 212}; 213 214/* 215 * This mutex protects data structures (including registers on the 216 * sound-card) that are manipulated by both the interrupt handler and 217 * syscall code-paths. 218 * 219 * Note that driver methods may sleep (e.g. in malloc); consequently the 220 * audio layer calls them with the mutex unlocked. Driver methods are 221 * responsible for locking the mutex when they manipulate data used by 222 * the interrupt handler and interrupts may occur. 223 * 224 * Similarly, the driver is responsible for locking the mutex in its 225 * interrupt handler and to call the audio layer call-backs (i.e. 226 * audio_{p,r}int()) with the mutex locked. 227 */ 228struct mutex audio_lock = MUTEX_INITIALIZER(IPL_AUDIO); 229 230/* 231 * Global flag to control if audio recording is enabled when the 232 * mixerctl setting is record.enable=sysctl 233 */ 234int audio_record_enable = 0; /* [a] */ 235#if NWSKBD > 0 236int audio_kbdcontrol_enable = 1; /* [a] */ 237#endif 238 239#ifdef AUDIO_DEBUG 240/* 241 * 0 - nothing, as if AUDIO_DEBUG isn't defined 242 * 1 - initialisations & setup 243 * 2 - blocks & interrupts 244 */ 245int audio_debug = 1; 246#endif 247 248unsigned int 249audio_gcd(unsigned int a, unsigned int b) 250{ 251 unsigned int r; 252 253 while (b > 0) { 254 r = a % b; 255 a = b; 256 b = r; 257 } 258 return a; 259} 260 261/* 262 * Calculate the least block size (in frames) such that both the 263 * corresponding play and/or record block sizes (in bytes) are multiple 264 * of the given number of bytes. 265 */ 266int 267audio_blksz_bytes(int mode, 268 struct audio_params *p, struct audio_params *r, int bytes) 269{ 270 unsigned int np, nr; 271 272 if (mode & AUMODE_PLAY) { 273 np = bytes / audio_gcd(p->bps * p->channels, bytes); 274 if (!(mode & AUMODE_RECORD)) 275 nr = np; 276 } 277 if (mode & AUMODE_RECORD) { 278 nr = bytes / audio_gcd(r->bps * r->channels, bytes); 279 if (!(mode & AUMODE_PLAY)) 280 np = nr; 281 } 282 283 return nr * np / audio_gcd(nr, np); 284} 285 286void 287audio_mixer_wakeup(struct audio_softc *sc) 288{ 289 MUTEX_ASSERT_LOCKED(&audio_lock); 290 291 if (sc->mix_blocking) { 292 wakeup(&sc->mix_blocking); 293 sc->mix_blocking = 0; 294 } 295 knote_locked(&sc->mix_klist, 0); 296} 297 298void 299audio_buf_wakeup(struct audio_buf *buf) 300{ 301 MUTEX_ASSERT_LOCKED(&audio_lock); 302 303 if (buf->blocking) { 304 wakeup(&buf->blocking); 305 buf->blocking = 0; 306 } 307 knote_locked(&buf->klist, 0); 308} 309 310int 311audio_buf_init(struct audio_softc *sc, struct audio_buf *buf, int dir) 312{ 313 klist_init_mutex(&buf->klist, &audio_lock); 314 if (sc->ops->round_buffersize) { 315 buf->datalen = sc->ops->round_buffersize(sc->arg, 316 dir, AUDIO_BUFSZ); 317 } else 318 buf->datalen = AUDIO_BUFSZ; 319 if (sc->ops->allocm) { 320 buf->data = sc->ops->allocm(sc->arg, dir, buf->datalen, 321 M_DEVBUF, M_WAITOK); 322 } else 323 buf->data = malloc(buf->datalen, M_DEVBUF, M_WAITOK); 324 if (buf->data == NULL) { 325 klist_free(&buf->klist); 326 return ENOMEM; 327 } 328 return 0; 329} 330 331void 332audio_buf_done(struct audio_softc *sc, struct audio_buf *buf) 333{ 334 if (sc->ops->freem) 335 sc->ops->freem(sc->arg, buf->data, M_DEVBUF); 336 else 337 free(buf->data, M_DEVBUF, buf->datalen); 338 klist_free(&buf->klist); 339} 340 341/* 342 * return the reader pointer and the number of bytes available 343 */ 344unsigned char * 345audio_buf_rgetblk(struct audio_buf *buf, size_t *rsize) 346{ 347 size_t count; 348 349 count = buf->ulen - buf->start; 350 if (count > buf->used) 351 count = buf->used; 352 *rsize = count; 353 return buf->data + buf->start; 354} 355 356/* 357 * discard "count" bytes at the start position. 358 */ 359void 360audio_buf_rdiscard(struct audio_buf *buf, size_t count) 361{ 362#ifdef AUDIO_DEBUG 363 if (count > buf->used) { 364 panic("audio_buf_rdiscard: bad count = %zu, " 365 "start = %zu, used = %zu", count, buf->start, buf->used); 366 } 367#endif 368 buf->used -= count; 369 buf->start += count; 370 if (buf->start >= buf->klen) 371 buf->start -= buf->klen; 372} 373 374/* 375 * advance the writer pointer by "count" bytes 376 */ 377void 378audio_buf_wcommit(struct audio_buf *buf, size_t count) 379{ 380#ifdef AUDIO_DEBUG 381 if (count > (buf->klen - buf->used)) { 382 panic("audio_buf_wcommit: bad count = %zu, " 383 "start = %zu, used = %zu", count, buf->start, buf->used); 384 } 385#endif 386 buf->used += count; 387} 388 389/* 390 * get writer pointer and the number of bytes writable 391 */ 392unsigned char * 393audio_buf_wgetblk(struct audio_buf *buf, size_t *rsize) 394{ 395 size_t end, avail, count; 396 397 end = buf->start + buf->used; 398 if (end >= buf->klen) 399 end -= buf->klen; 400 avail = buf->ulen - buf->used; 401 count = buf->klen - end; 402 if (count > avail) 403 count = avail; 404 *rsize = count; 405 return buf->data + end; 406} 407 408void 409audio_calc_sil(struct audio_softc *sc) 410{ 411 unsigned char *q; 412 unsigned int s, i; 413 int d, e; 414 415 e = sc->sw_enc; 416#ifdef AUDIO_DEBUG 417 switch (e) { 418 case AUDIO_ENCODING_SLINEAR_LE: 419 case AUDIO_ENCODING_ULINEAR_LE: 420 case AUDIO_ENCODING_SLINEAR_BE: 421 case AUDIO_ENCODING_ULINEAR_BE: 422 break; 423 default: 424 printf("%s: unhandled play encoding %d\n", DEVNAME(sc), e); 425 memset(sc->silence, 0, sc->bps); 426 return; 427 } 428#endif 429 if (e == AUDIO_ENCODING_SLINEAR_BE || e == AUDIO_ENCODING_ULINEAR_BE) { 430 d = -1; 431 q = sc->silence + sc->bps - 1; 432 } else { 433 d = 1; 434 q = sc->silence; 435 } 436 if (e == AUDIO_ENCODING_SLINEAR_LE || e == AUDIO_ENCODING_SLINEAR_BE) { 437 s = 0; 438 } else { 439 s = 0x80000000; 440 if (sc->msb) 441 s >>= 32 - 8 * sc->bps; 442 else 443 s >>= 32 - sc->bits; 444 } 445 for (i = 0; i < sc->bps; i++) { 446 *q = s; 447 q += d; 448 s >>= 8; 449 } 450 if (sc->conv_enc) 451 sc->conv_enc(sc->silence, sc->bps); 452} 453 454void 455audio_fill_sil(struct audio_softc *sc, unsigned char *ptr, size_t count) 456{ 457 unsigned char *q, *p; 458 size_t i, j; 459 460 q = ptr; 461 for (j = count / sc->bps; j > 0; j--) { 462 p = sc->silence; 463 for (i = sc->bps; i > 0; i--) 464 *q++ = *p++; 465 } 466} 467 468void 469audio_clear(struct audio_softc *sc) 470{ 471 if (sc->mode & AUMODE_PLAY) { 472 sc->play.used = sc->play.start = 0; 473 sc->play.pos = sc->play.xrun = 0; 474 audio_fill_sil(sc, sc->play.data, sc->play.klen); 475 } 476 if (sc->mode & AUMODE_RECORD) { 477 sc->rec.used = sc->rec.start = 0; 478 sc->rec.pos = sc->rec.xrun = 0; 479 audio_fill_sil(sc, sc->rec.data, sc->rec.klen); 480 } 481} 482 483/* 484 * called whenever a block is consumed by the driver 485 */ 486void 487audio_pintr(void *addr) 488{ 489 struct audio_softc *sc = addr; 490 unsigned char *ptr; 491 size_t count; 492 int error, nblk, todo; 493 494 MUTEX_ASSERT_LOCKED(&audio_lock); 495 if (!(sc->mode & AUMODE_PLAY) || !sc->active) { 496 printf("%s: play interrupt but not playing\n", DEVNAME(sc)); 497 return; 498 } 499 if (sc->quiesce) { 500 DPRINTF("%s: quiesced, skipping play intr\n", DEVNAME(sc)); 501 return; 502 } 503 504 /* 505 * check if record pointer wrapped, see explanation 506 * in audio_rintr() 507 */ 508 if ((sc->mode & AUMODE_RECORD) && sc->ops->underrun == NULL) { 509 sc->offs--; 510 nblk = sc->rec.klen / sc->rec.blksz; 511 todo = -sc->offs; 512 if (todo >= nblk) { 513 todo -= todo % nblk; 514 DPRINTFN(1, "%s: rec ptr wrapped, moving %d blocks\n", 515 DEVNAME(sc), todo); 516 while (todo-- > 0) 517 audio_rintr(sc); 518 } 519 } 520 521 sc->play.pos += sc->play.blksz; 522 if (!sc->ops->underrun) { 523 audio_fill_sil(sc, sc->play.data + sc->play.start, 524 sc->play.blksz); 525 } 526 audio_buf_rdiscard(&sc->play, sc->play.blksz); 527 if (sc->play.used < sc->play.blksz) { 528 DPRINTFN(1, "%s: play underrun\n", DEVNAME(sc)); 529 sc->play.xrun += sc->play.blksz; 530 audio_buf_wcommit(&sc->play, sc->play.blksz); 531 if (sc->ops->underrun) 532 sc->ops->underrun(sc->arg); 533 } 534 535 DPRINTFN(1, "%s: play intr, used -> %zu, start -> %zu\n", 536 DEVNAME(sc), sc->play.used, sc->play.start); 537 538 if (!sc->ops->trigger_output) { 539 ptr = audio_buf_rgetblk(&sc->play, &count); 540 error = sc->ops->start_output(sc->arg, 541 ptr, sc->play.blksz, audio_pintr, sc); 542 if (error) { 543 printf("%s: play restart failed: %d\n", 544 DEVNAME(sc), error); 545 } 546 } 547 548 if (sc->play.used < sc->play.ulen) { 549 DPRINTFN(1, "%s: play wakeup, chan = %d\n", 550 DEVNAME(sc), sc->play.blocking); 551 audio_buf_wakeup(&sc->play); 552 } 553} 554 555/* 556 * called whenever a block is produced by the driver 557 */ 558void 559audio_rintr(void *addr) 560{ 561 struct audio_softc *sc = addr; 562 unsigned char *ptr; 563 size_t count; 564 int error, nblk, todo; 565 566 MUTEX_ASSERT_LOCKED(&audio_lock); 567 if (!(sc->mode & AUMODE_RECORD) || !sc->active) { 568 printf("%s: rec interrupt but not recording\n", DEVNAME(sc)); 569 return; 570 } 571 if (sc->quiesce) { 572 DPRINTF("%s: quiesced, skipping rec intr\n", DEVNAME(sc)); 573 return; 574 } 575 576 /* 577 * Interrupts may be masked by other sub-systems during 320ms 578 * and more. During such a delay the hardware doesn't stop 579 * playing and the play buffer pointers may wrap, this can't be 580 * detected and corrected by low level drivers. This makes the 581 * record stream ahead of the play stream; this is detected as a 582 * hardware anomaly by userland and cause programs to misbehave. 583 * 584 * We fix this by advancing play position by an integer count of 585 * full buffers, so it reaches the record position. 586 */ 587 if ((sc->mode & AUMODE_PLAY) && sc->ops->underrun == NULL) { 588 sc->offs++; 589 nblk = sc->play.klen / sc->play.blksz; 590 todo = sc->offs; 591 if (todo >= nblk) { 592 todo -= todo % nblk; 593 DPRINTFN(1, "%s: play ptr wrapped, moving %d blocks\n", 594 DEVNAME(sc), todo); 595 while (todo-- > 0) 596 audio_pintr(sc); 597 } 598 } 599 600 sc->rec.pos += sc->rec.blksz; 601 if ((sc->record_enable == MIXER_RECORD_ENABLE_SYSCTL && 602 atomic_load_int(&audio_record_enable) == 0) || 603 sc->record_enable == MIXER_RECORD_ENABLE_OFF) { 604 ptr = audio_buf_wgetblk(&sc->rec, &count); 605 audio_fill_sil(sc, ptr, sc->rec.blksz); 606 } 607 audio_buf_wcommit(&sc->rec, sc->rec.blksz); 608 if (sc->rec.used > sc->rec.ulen - sc->rec.blksz) { 609 DPRINTFN(1, "%s: rec overrun\n", DEVNAME(sc)); 610 sc->rec.xrun += sc->rec.blksz; 611 audio_buf_rdiscard(&sc->rec, sc->rec.blksz); 612 } 613 DPRINTFN(1, "%s: rec intr, used -> %zu\n", DEVNAME(sc), sc->rec.used); 614 615 if (!sc->ops->trigger_input) { 616 ptr = audio_buf_wgetblk(&sc->rec, &count); 617 error = sc->ops->start_input(sc->arg, 618 ptr, sc->rec.blksz, audio_rintr, sc); 619 if (error) { 620 printf("%s: rec restart failed: %d\n", 621 DEVNAME(sc), error); 622 } 623 } 624 625 if (sc->rec.used > 0) { 626 DPRINTFN(1, "%s: rec wakeup, chan = %d\n", 627 DEVNAME(sc), sc->rec.blocking); 628 audio_buf_wakeup(&sc->rec); 629 } 630} 631 632int 633audio_start_do(struct audio_softc *sc) 634{ 635 int error; 636 struct audio_params p; 637 unsigned char *ptr; 638 size_t count; 639 640 DPRINTF("%s: starting\n", DEVNAME(sc)); 641 642 error = 0; 643 sc->offs = 0; 644 if (sc->mode & AUMODE_PLAY) { 645 if (sc->ops->trigger_output) { 646 p.encoding = sc->hw_enc; 647 p.precision = sc->bits; 648 p.bps = sc->bps; 649 p.msb = sc->msb; 650 p.sample_rate = sc->rate; 651 p.channels = sc->pchan; 652 error = sc->ops->trigger_output(sc->arg, 653 sc->play.data, 654 sc->play.data + sc->play.klen, 655 sc->play.blksz, 656 audio_pintr, sc, &p); 657 } else { 658 mtx_enter(&audio_lock); 659 ptr = audio_buf_rgetblk(&sc->play, &count); 660 error = sc->ops->start_output(sc->arg, 661 ptr, sc->play.blksz, audio_pintr, sc); 662 mtx_leave(&audio_lock); 663 } 664 if (error) 665 printf("%s: failed to start playback\n", DEVNAME(sc)); 666 } 667 if (sc->mode & AUMODE_RECORD) { 668 if (sc->ops->trigger_input) { 669 p.encoding = sc->hw_enc; 670 p.precision = sc->bits; 671 p.bps = sc->bps; 672 p.msb = sc->msb; 673 p.sample_rate = sc->rate; 674 p.channels = sc->rchan; 675 error = sc->ops->trigger_input(sc->arg, 676 sc->rec.data, 677 sc->rec.data + sc->rec.klen, 678 sc->rec.blksz, 679 audio_rintr, sc, &p); 680 } else { 681 mtx_enter(&audio_lock); 682 ptr = audio_buf_wgetblk(&sc->rec, &count); 683 error = sc->ops->start_input(sc->arg, 684 ptr, sc->rec.blksz, audio_rintr, sc); 685 mtx_leave(&audio_lock); 686 } 687 if (error) 688 printf("%s: failed to start recording\n", DEVNAME(sc)); 689 } 690 return error; 691} 692 693int 694audio_stop_do(struct audio_softc *sc) 695{ 696 if (sc->mode & AUMODE_PLAY) 697 sc->ops->halt_output(sc->arg); 698 if (sc->mode & AUMODE_RECORD) 699 sc->ops->halt_input(sc->arg); 700 DPRINTF("%s: stopped\n", DEVNAME(sc)); 701 return 0; 702} 703 704int 705audio_start(struct audio_softc *sc) 706{ 707 sc->active = 1; 708 sc->play.xrun = sc->play.pos = sc->rec.xrun = sc->rec.pos = 0; 709 return audio_start_do(sc); 710} 711 712int 713audio_stop(struct audio_softc *sc) 714{ 715 int error; 716 717 error = audio_stop_do(sc); 718 if (error) 719 return error; 720 audio_clear(sc); 721 sc->active = 0; 722 return 0; 723} 724 725int 726audio_canstart(struct audio_softc *sc) 727{ 728 if (sc->active || sc->pause) 729 return 0; 730 if ((sc->mode & AUMODE_RECORD) && sc->rec.used != 0) 731 return 0; 732 if ((sc->mode & AUMODE_PLAY) && sc->play.used != sc->play.ulen) 733 return 0; 734 return 1; 735} 736 737int 738audio_setpar_blksz(struct audio_softc *sc, 739 struct audio_params *p, struct audio_params *r) 740{ 741 unsigned int nr, np, max, min, mult; 742 unsigned int blk_mult, blk_max; 743 744 if (sc->ops->set_blksz) { 745 /* 746 * Don't allow block size of exceed half the buffer size 747 */ 748 if (sc->mode & AUMODE_PLAY) { 749 max = sc->play.datalen / 2 / (sc->pchan * sc->bps); 750 if (sc->round > max) 751 sc->round = max; 752 } 753 if (sc->mode & AUMODE_RECORD) { 754 max = sc->rec.datalen / 2 / (sc->rchan * sc->bps); 755 if (sc->round > max) 756 sc->round = max; 757 } 758 759 sc->round = sc->ops->set_blksz(sc->arg, sc->mode, 760 p, r, sc->round); 761 762 DPRINTF("%s: block size set to: %u\n", DEVNAME(sc), sc->round); 763 return 0; 764 } 765 766 /* 767 * get least multiplier of the number of frames per block 768 */ 769 if (sc->ops->round_blocksize) { 770 blk_mult = sc->ops->round_blocksize(sc->arg, 1); 771 if (blk_mult == 0) { 772 printf("%s: 0x%x: bad block size multiplier\n", 773 DEVNAME(sc), blk_mult); 774 return ENODEV; 775 } 776 } else 777 blk_mult = 1; 778 DPRINTF("%s: hw block size multiplier: %u\n", DEVNAME(sc), blk_mult); 779 if (sc->mode & AUMODE_PLAY) { 780 np = blk_mult / audio_gcd(sc->pchan * sc->bps, blk_mult); 781 if (!(sc->mode & AUMODE_RECORD)) 782 nr = np; 783 DPRINTF("%s: play number of frames multiplier: %u\n", 784 DEVNAME(sc), np); 785 } 786 if (sc->mode & AUMODE_RECORD) { 787 nr = blk_mult / audio_gcd(sc->rchan * sc->bps, blk_mult); 788 if (!(sc->mode & AUMODE_PLAY)) 789 np = nr; 790 DPRINTF("%s: record number of frames multiplier: %u\n", 791 DEVNAME(sc), nr); 792 } 793 mult = nr * np / audio_gcd(nr, np); 794 DPRINTF("%s: least common number of frames multiplier: %u\n", 795 DEVNAME(sc), mult); 796 797 /* 798 * get minimum and maximum frames per block 799 */ 800 if (sc->ops->round_blocksize) 801 blk_max = sc->ops->round_blocksize(sc->arg, AUDIO_BUFSZ); 802 else 803 blk_max = AUDIO_BUFSZ; 804 if ((sc->mode & AUMODE_PLAY) && blk_max > sc->play.datalen / 2) 805 blk_max = sc->play.datalen / 2; 806 if ((sc->mode & AUMODE_RECORD) && blk_max > sc->rec.datalen / 2) 807 blk_max = sc->rec.datalen / 2; 808 if (sc->mode & AUMODE_PLAY) { 809 np = blk_max / (sc->pchan * sc->bps); 810 if (!(sc->mode & AUMODE_RECORD)) 811 nr = np; 812 } 813 if (sc->mode & AUMODE_RECORD) { 814 nr = blk_max / (sc->rchan * sc->bps); 815 if (!(sc->mode & AUMODE_PLAY)) 816 np = nr; 817 } 818 max = np < nr ? np : nr; 819 max -= max % mult; 820 min = sc->rate / 1000 + mult - 1; 821 min -= min % mult; 822 DPRINTF("%s: frame number range: %u..%u\n", DEVNAME(sc), min, max); 823 if (max < min) { 824 printf("%s: %u: bad max frame number\n", DEVNAME(sc), max); 825 return EIO; 826 } 827 828 /* 829 * adjust the frame per block to match our constraints 830 */ 831 sc->round += mult / 2; 832 sc->round -= sc->round % mult; 833 if (sc->round > max) 834 sc->round = max; 835 else if (sc->round < min) 836 sc->round = min; 837 838 return 0; 839} 840 841int 842audio_setpar_nblks(struct audio_softc *sc, 843 struct audio_params *p, struct audio_params *r) 844{ 845 unsigned int max; 846 847 /* 848 * set buffer size (number of blocks) 849 */ 850 if (sc->mode & AUMODE_PLAY) { 851 max = sc->play.datalen / (sc->round * sc->pchan * sc->bps); 852 if (sc->play.nblks > max) 853 sc->play.nblks = max; 854 else if (sc->play.nblks < 2) 855 sc->play.nblks = 2; 856 if (sc->ops->set_nblks) { 857 sc->play.nblks = sc->ops->set_nblks(sc->arg, sc->mode, 858 p, sc->round, sc->play.nblks); 859 DPRINTF("%s: play nblks -> %u\n", DEVNAME(sc), 860 sc->play.nblks); 861 } 862 } 863 if (sc->mode & AUMODE_RECORD) { 864 /* 865 * for recording, buffer size is not the latency (it's 866 * exactly one block), so let's get the maximum buffer 867 * size of maximum reliability during xruns 868 */ 869 max = sc->rec.datalen / (sc->round * sc->rchan * sc->bps); 870 if (sc->ops->set_nblks) { 871 max = sc->ops->set_nblks(sc->arg, sc->mode, 872 r, sc->round, max); 873 DPRINTF("%s: rec nblks -> %u\n", DEVNAME(sc), max); 874 } 875 sc->rec.nblks = max; 876 } 877 return 0; 878} 879 880int 881audio_setpar(struct audio_softc *sc) 882{ 883 struct audio_params p, r; 884 int error; 885 886 DPRINTF("%s: setpar: req enc=%d bits=%d, bps=%d, msb=%d " 887 "rate=%d, pchan=%d, rchan=%d, round=%u, nblks=%d\n", 888 DEVNAME(sc), sc->sw_enc, sc->bits, sc->bps, sc->msb, 889 sc->rate, sc->pchan, sc->rchan, sc->round, sc->play.nblks); 890 891 /* 892 * check if requested parameters are in the allowed ranges 893 */ 894 if (sc->mode & AUMODE_PLAY) { 895 if (sc->pchan < 1) 896 sc->pchan = 1; 897 else if (sc->pchan > 64) 898 sc->pchan = 64; 899 } 900 if (sc->mode & AUMODE_RECORD) { 901 if (sc->rchan < 1) 902 sc->rchan = 1; 903 else if (sc->rchan > 64) 904 sc->rchan = 64; 905 } 906 switch (sc->sw_enc) { 907 case AUDIO_ENCODING_ULAW: 908 case AUDIO_ENCODING_ALAW: 909 case AUDIO_ENCODING_SLINEAR_LE: 910 case AUDIO_ENCODING_SLINEAR_BE: 911 case AUDIO_ENCODING_ULINEAR_LE: 912 case AUDIO_ENCODING_ULINEAR_BE: 913 break; 914 default: 915 sc->sw_enc = AUDIO_ENCODING_SLINEAR_LE; 916 } 917 if (sc->bits < 8) 918 sc->bits = 8; 919 else if (sc->bits > 32) 920 sc->bits = 32; 921 if (sc->bps < 1) 922 sc->bps = 1; 923 else if (sc->bps > 4) 924 sc->bps = 4; 925 if (sc->rate < 4000) 926 sc->rate = 4000; 927 else if (sc->rate > 192000) 928 sc->rate = 192000; 929 930 /* 931 * copy into struct audio_params, required by drivers 932 */ 933 p.encoding = r.encoding = sc->sw_enc; 934 p.precision = r.precision = sc->bits; 935 p.bps = r.bps = sc->bps; 936 p.msb = r.msb = sc->msb; 937 p.sample_rate = r.sample_rate = sc->rate; 938 p.channels = sc->pchan; 939 r.channels = sc->rchan; 940 941 /* 942 * set parameters 943 */ 944 error = sc->ops->set_params(sc->arg, sc->mode, sc->mode, &p, &r); 945 if (error) 946 return error; 947 if (sc->mode == (AUMODE_PLAY | AUMODE_RECORD)) { 948 if (p.encoding != r.encoding || 949 p.precision != r.precision || 950 p.bps != r.bps || 951 p.msb != r.msb || 952 p.sample_rate != r.sample_rate) { 953 printf("%s: different play and record parameters " 954 "returned by hardware\n", DEVNAME(sc)); 955 return ENODEV; 956 } 957 } 958 if (sc->mode & AUMODE_PLAY) { 959 sc->hw_enc = p.encoding; 960 sc->bits = p.precision; 961 sc->bps = p.bps; 962 sc->msb = p.msb; 963 sc->rate = p.sample_rate; 964 sc->pchan = p.channels; 965 } 966 if (sc->mode & AUMODE_RECORD) { 967 sc->hw_enc = r.encoding; 968 sc->bits = r.precision; 969 sc->bps = r.bps; 970 sc->msb = r.msb; 971 sc->rate = r.sample_rate; 972 sc->rchan = r.channels; 973 } 974 if (sc->rate == 0 || sc->bps == 0 || sc->bits == 0) { 975 printf("%s: invalid parameters returned by hardware\n", 976 DEVNAME(sc)); 977 return ENODEV; 978 } 979 if (sc->ops->commit_settings) { 980 error = sc->ops->commit_settings(sc->arg); 981 if (error) 982 return error; 983 } 984 985 /* 986 * conversion from/to exotic/dead encoding, for drivers not supporting 987 * linear 988 */ 989 switch (sc->hw_enc) { 990 case AUDIO_ENCODING_SLINEAR_LE: 991 case AUDIO_ENCODING_SLINEAR_BE: 992 case AUDIO_ENCODING_ULINEAR_LE: 993 case AUDIO_ENCODING_ULINEAR_BE: 994 sc->sw_enc = sc->hw_enc; 995 sc->conv_dec = sc->conv_enc = NULL; 996 break; 997 case AUDIO_ENCODING_ULAW: 998#if BYTE_ORDER == LITTLE_ENDIAN 999 sc->sw_enc = AUDIO_ENCODING_SLINEAR_LE; 1000#else 1001 sc->sw_enc = AUDIO_ENCODING_SLINEAR_BE; 1002#endif 1003 if (sc->bits == 8) { 1004 sc->conv_enc = slinear8_to_mulaw; 1005 sc->conv_dec = mulaw_to_slinear8; 1006 } else if (sc->bits == 24) { 1007 sc->conv_enc = slinear24_to_mulaw24; 1008 sc->conv_dec = mulaw24_to_slinear24; 1009 } else { 1010 sc->sw_enc = sc->hw_enc; 1011 sc->conv_dec = sc->conv_enc = NULL; 1012 } 1013 break; 1014 default: 1015 printf("%s: setpar: enc = %d, bits = %d: emulation skipped\n", 1016 DEVNAME(sc), sc->hw_enc, sc->bits); 1017 sc->sw_enc = sc->hw_enc; 1018 sc->conv_dec = sc->conv_enc = NULL; 1019 } 1020 audio_calc_sil(sc); 1021 1022 error = audio_setpar_blksz(sc, &p, &r); 1023 if (error) 1024 return error; 1025 1026 error = audio_setpar_nblks(sc, &p, &r); 1027 if (error) 1028 return error; 1029 1030 /* 1031 * set buffer 1032 */ 1033 if (sc->mode & AUMODE_PLAY) { 1034 sc->play.blksz = sc->round * sc->pchan * sc->bps; 1035 sc->play.ulen = sc->play.nblks * sc->play.blksz; 1036 sc->play.klen = sc->play.datalen - sc->play.datalen % sc->play.blksz; 1037 } 1038 if (sc->mode & AUMODE_RECORD) { 1039 sc->rec.blksz = sc->round * sc->rchan * sc->bps; 1040 sc->rec.ulen = sc->rec.nblks * sc->rec.blksz; 1041 sc->rec.klen = sc->rec.datalen - sc->rec.datalen % sc->rec.blksz; 1042 } 1043 1044 DPRINTF("%s: setpar: new enc=%d bits=%d, bps=%d, msb=%d " 1045 "rate=%d, pchan=%d, rchan=%d, round=%u, nblks=%d\n", 1046 DEVNAME(sc), sc->sw_enc, sc->bits, sc->bps, sc->msb, 1047 sc->rate, sc->pchan, sc->rchan, sc->round, sc->play.nblks); 1048 return 0; 1049} 1050 1051int 1052audio_ioc_start(struct audio_softc *sc) 1053{ 1054 if (!sc->pause) { 1055 DPRINTF("%s: can't start: already started\n", DEVNAME(sc)); 1056 return EBUSY; 1057 } 1058 if ((sc->mode & AUMODE_PLAY) && sc->play.used != sc->play.ulen) { 1059 DPRINTF("%s: play buffer not ready\n", DEVNAME(sc)); 1060 return EBUSY; 1061 } 1062 if ((sc->mode & AUMODE_RECORD) && sc->rec.used != 0) { 1063 DPRINTF("%s: record buffer not ready\n", DEVNAME(sc)); 1064 return EBUSY; 1065 } 1066 sc->pause = 0; 1067 return audio_start(sc); 1068} 1069 1070int 1071audio_ioc_stop(struct audio_softc *sc) 1072{ 1073 if (sc->pause) { 1074 DPRINTF("%s: can't stop: not started\n", DEVNAME(sc)); 1075 return EBUSY; 1076 } 1077 sc->pause = 1; 1078 if (sc->active) 1079 return audio_stop(sc); 1080 return 0; 1081} 1082 1083int 1084audio_ioc_getpar(struct audio_softc *sc, struct audio_swpar *p) 1085{ 1086 p->rate = sc->rate; 1087 p->sig = sc->sw_enc == AUDIO_ENCODING_SLINEAR_LE || 1088 sc->sw_enc == AUDIO_ENCODING_SLINEAR_BE; 1089 p->le = sc->sw_enc == AUDIO_ENCODING_SLINEAR_LE || 1090 sc->sw_enc == AUDIO_ENCODING_ULINEAR_LE; 1091 p->bits = sc->bits; 1092 p->bps = sc->bps; 1093 p->msb = sc->msb; 1094 p->pchan = sc->pchan; 1095 p->rchan = sc->rchan; 1096 p->nblks = sc->play.nblks; 1097 p->round = sc->round; 1098 return 0; 1099} 1100 1101int 1102audio_ioc_setpar(struct audio_softc *sc, struct audio_swpar *p) 1103{ 1104 int error, le, sig; 1105 1106 if (sc->active) { 1107 DPRINTF("%s: can't change params during dma\n", 1108 DEVNAME(sc)); 1109 return EBUSY; 1110 } 1111 1112 /* 1113 * copy desired parameters into the softc structure 1114 */ 1115 if (p->sig != ~0U || p->le != ~0U || p->bits != ~0U) { 1116 sig = 1; 1117 le = (BYTE_ORDER == LITTLE_ENDIAN); 1118 sc->bits = 16; 1119 sc->bps = 2; 1120 sc->msb = 1; 1121 if (p->sig != ~0U) 1122 sig = p->sig; 1123 if (p->le != ~0U) 1124 le = p->le; 1125 if (p->bits != ~0U) { 1126 sc->bits = p->bits; 1127 sc->bps = sc->bits <= 8 ? 1128 1 : (sc->bits <= 16 ? 2 : 4); 1129 if (p->bps != ~0U) 1130 sc->bps = p->bps; 1131 if (p->msb != ~0U) 1132 sc->msb = p->msb ? 1 : 0; 1133 } 1134 sc->sw_enc = (sig) ? 1135 (le ? AUDIO_ENCODING_SLINEAR_LE : 1136 AUDIO_ENCODING_SLINEAR_BE) : 1137 (le ? AUDIO_ENCODING_ULINEAR_LE : 1138 AUDIO_ENCODING_ULINEAR_BE); 1139 } 1140 if (p->rate != ~0) 1141 sc->rate = p->rate; 1142 if (p->pchan != ~0) 1143 sc->pchan = p->pchan; 1144 if (p->rchan != ~0) 1145 sc->rchan = p->rchan; 1146 if (p->round != ~0) 1147 sc->round = p->round; 1148 if (p->nblks != ~0) 1149 sc->play.nblks = p->nblks; 1150 1151 /* 1152 * if the device is not opened for playback or recording don't 1153 * touch the hardware yet (ex. if this is /dev/audioctlN) 1154 */ 1155 if (sc->mode == 0) 1156 return 0; 1157 1158 /* 1159 * negotiate parameters with the hardware 1160 */ 1161 error = audio_setpar(sc); 1162 if (error) 1163 return error; 1164 audio_clear(sc); 1165 if ((sc->mode & AUMODE_PLAY) && sc->ops->init_output) { 1166 error = sc->ops->init_output(sc->arg, 1167 sc->play.data, sc->play.klen); 1168 if (error) 1169 return error; 1170 } 1171 if ((sc->mode & AUMODE_RECORD) && sc->ops->init_input) { 1172 error = sc->ops->init_input(sc->arg, 1173 sc->rec.data, sc->rec.klen); 1174 if (error) 1175 return error; 1176 } 1177 return 0; 1178} 1179 1180int 1181audio_ioc_getstatus(struct audio_softc *sc, struct audio_status *p) 1182{ 1183 p->mode = sc->mode; 1184 p->pause = sc->pause; 1185 p->active = sc->active; 1186 return 0; 1187} 1188 1189int 1190audio_match(struct device *parent, void *match, void *aux) 1191{ 1192 struct audio_attach_args *sa = aux; 1193 1194 return (sa->type == AUDIODEV_TYPE_AUDIO) ? 1 : 0; 1195} 1196 1197void 1198audio_attach(struct device *parent, struct device *self, void *aux) 1199{ 1200 struct audio_softc *sc = (void *)self; 1201 struct audio_attach_args *sa = aux; 1202 const struct audio_hw_if *ops = sa->hwif; 1203 struct mixer_devinfo *mi; 1204 struct mixer_ctrl *ent; 1205 void *arg = sa->hdl; 1206 int error; 1207 1208 printf("\n"); 1209 1210#ifdef DIAGNOSTIC 1211 if (ops == 0 || 1212 ops->open == 0 || 1213 ops->close == 0 || 1214 ops->set_params == 0 || 1215 (ops->start_output == 0 && ops->trigger_output == 0) || 1216 (ops->start_input == 0 && ops->trigger_input == 0) || 1217 ops->halt_output == 0 || 1218 ops->halt_input == 0 || 1219 ops->set_port == 0 || 1220 ops->get_port == 0 || 1221 ops->query_devinfo == 0) { 1222 printf("%s: missing method\n", DEVNAME(sc)); 1223 sc->ops = 0; 1224 return; 1225 } 1226#endif 1227 sc->ops = ops; 1228 sc->cookie = sa->cookie; 1229 sc->arg = arg; 1230 1231#if NWSKBD > 0 1232 wskbd_mixer_init(sc); 1233#endif /* NWSKBD > 0 */ 1234 1235 error = audio_buf_init(sc, &sc->play, AUMODE_PLAY); 1236 if (error) { 1237 sc->ops = 0; 1238 printf("%s: could not allocate play buffer\n", DEVNAME(sc)); 1239 return; 1240 } 1241 error = audio_buf_init(sc, &sc->rec, AUMODE_RECORD); 1242 if (error) { 1243 audio_buf_done(sc, &sc->play); 1244 sc->ops = 0; 1245 printf("%s: could not allocate record buffer\n", DEVNAME(sc)); 1246 return; 1247 } 1248 1249 klist_init_mutex(&sc->mix_klist, &audio_lock); 1250 1251 /* set defaults */ 1252#if BYTE_ORDER == LITTLE_ENDIAN 1253 sc->sw_enc = AUDIO_ENCODING_SLINEAR_LE; 1254#else 1255 sc->sw_enc = AUDIO_ENCODING_SLINEAR_BE; 1256#endif 1257 sc->bits = 16; 1258 sc->bps = 2; 1259 sc->msb = 1; 1260 sc->rate = 48000; 1261 sc->pchan = 2; 1262 sc->rchan = 2; 1263 sc->round = 960; 1264 sc->play.nblks = 2; 1265 sc->play.pos = sc->play.xrun = sc->rec.pos = sc->rec.xrun = 0; 1266 sc->record_enable = MIXER_RECORD_ENABLE_SYSCTL; 1267 1268 /* 1269 * allocate an array of mixer_ctrl structures to save the 1270 * mixer state and prefill them. 1271 */ 1272 1273 mi = malloc(sizeof(struct mixer_devinfo), M_TEMP, M_WAITOK); 1274 1275 mi->index = 0; 1276 while (1) { 1277 if (sc->ops->query_devinfo(sc->arg, mi) != 0) 1278 break; 1279 mi->index++; 1280 } 1281 sc->mix_nent = mi->index; 1282 sc->mix_ents = mallocarray(sc->mix_nent, 1283 sizeof(struct mixer_ctrl), M_DEVBUF, M_WAITOK); 1284 sc->mix_evbuf = mallocarray(sc->mix_nent, 1285 sizeof(struct mixer_ev), M_DEVBUF, M_WAITOK | M_ZERO); 1286 1287 ent = sc->mix_ents; 1288 mi->index = 0; 1289 while (1) { 1290 if (sc->ops->query_devinfo(sc->arg, mi) != 0) 1291 break; 1292 switch (mi->type) { 1293 case AUDIO_MIXER_VALUE: 1294 ent->un.value.num_channels = mi->un.v.num_channels; 1295 /* FALLTHROUGH */ 1296 case AUDIO_MIXER_SET: 1297 case AUDIO_MIXER_ENUM: 1298 ent->dev = mi->index; 1299 ent->type = mi->type; 1300 } 1301 mi->index++; 1302 ent++; 1303 } 1304 1305 free(mi, M_TEMP, sizeof(struct mixer_devinfo)); 1306} 1307 1308int 1309audio_activate(struct device *self, int act) 1310{ 1311 struct audio_softc *sc = (struct audio_softc *)self; 1312 int i; 1313 1314 switch (act) { 1315 case DVACT_QUIESCE: 1316 /* 1317 * good drivers run play and rec handlers in a single 1318 * interrupt. Grab the lock to ensure we expose the same 1319 * sc->quiesce value to both play and rec handlers 1320 */ 1321 mtx_enter(&audio_lock); 1322 sc->quiesce = 1; 1323 mtx_leave(&audio_lock); 1324 1325 /* 1326 * once sc->quiesce is set, interrupts may occur, but 1327 * counters are not advanced and consequently processes 1328 * keep sleeping. 1329 * 1330 * XXX: ensure read/write/ioctl don't start/stop 1331 * DMA at the same time, this needs a "ready" condvar 1332 */ 1333 if (sc->mode != 0 && sc->active) 1334 audio_stop_do(sc); 1335 1336 /* 1337 * save mixer state 1338 */ 1339 for (i = 0; i != sc->mix_nent; i++) 1340 sc->ops->get_port(sc->arg, sc->mix_ents + i); 1341 1342 DPRINTF("%s: quiesce: active = %d\n", DEVNAME(sc), sc->active); 1343 break; 1344 case DVACT_WAKEUP: 1345 DPRINTF("%s: wakeup: active = %d\n", DEVNAME(sc), sc->active); 1346 1347 /* 1348 * restore mixer state 1349 */ 1350 for (i = 0; i != sc->mix_nent; i++) 1351 sc->ops->set_port(sc->arg, sc->mix_ents + i); 1352 1353 /* 1354 * keep buffer usage the same, but set start pointer to 1355 * the beginning of the buffer. 1356 * 1357 * No need to grab the audio_lock as DMA is stopped and 1358 * this is the only thread running (caller ensures this) 1359 */ 1360 sc->quiesce = 0; 1361 wakeup(&sc->quiesce); 1362 1363 if (sc->mode != 0) { 1364 if (audio_setpar(sc) != 0) 1365 break; 1366 if (sc->mode & AUMODE_PLAY) { 1367 sc->play.start = 0; 1368 audio_fill_sil(sc, sc->play.data, sc->play.klen); 1369 } 1370 if (sc->mode & AUMODE_RECORD) { 1371 sc->rec.start = sc->rec.ulen - sc->rec.used; 1372 audio_fill_sil(sc, sc->rec.data, sc->rec.klen); 1373 } 1374 if (sc->active) 1375 audio_start_do(sc); 1376 } 1377 break; 1378 } 1379 return 0; 1380} 1381 1382int 1383audio_detach(struct device *self, int flags) 1384{ 1385 struct audio_softc *sc = (struct audio_softc *)self; 1386 int maj, mn; 1387 1388 DPRINTF("%s: audio_detach: flags = %d\n", DEVNAME(sc), flags); 1389 1390 wakeup(&sc->quiesce); 1391 1392 /* locate the major number */ 1393 for (maj = 0; maj < nchrdev; maj++) 1394 if (cdevsw[maj].d_open == audioopen) 1395 break; 1396 /* 1397 * Nuke the vnodes for any open instances, calls close but as 1398 * close uses device_lookup, it returns EXIO and does nothing 1399 */ 1400 mn = self->dv_unit; 1401 vdevgone(maj, mn | AUDIO_DEV_AUDIO, mn | AUDIO_DEV_AUDIO, VCHR); 1402 vdevgone(maj, mn | AUDIO_DEV_AUDIOCTL, mn | AUDIO_DEV_AUDIOCTL, VCHR); 1403 1404 /* 1405 * The close() method did nothing, quickly halt DMA (normally 1406 * parent is already gone, and code below is no-op), and wake-up 1407 * user-land blocked in read/write/ioctl, which return EIO. 1408 */ 1409 if (sc->mode != 0) { 1410 if (sc->active) { 1411 wakeup(&sc->play.blocking); 1412 wakeup(&sc->rec.blocking); 1413 audio_stop(sc); 1414 } 1415 sc->ops->close(sc->arg); 1416 sc->mode = 0; 1417 } 1418 if (sc->mix_isopen) 1419 wakeup(&sc->mix_blocking); 1420 klist_invalidate(&sc->play.klist); 1421 klist_invalidate(&sc->rec.klist); 1422 klist_invalidate(&sc->mix_klist); 1423 1424 /* free resources */ 1425 klist_free(&sc->mix_klist); 1426 free(sc->mix_evbuf, M_DEVBUF, sc->mix_nent * sizeof(struct mixer_ev)); 1427 free(sc->mix_ents, M_DEVBUF, sc->mix_nent * sizeof(struct mixer_ctrl)); 1428 audio_buf_done(sc, &sc->play); 1429 audio_buf_done(sc, &sc->rec); 1430 return 0; 1431} 1432 1433int 1434audio_submatch(struct device *parent, void *match, void *aux) 1435{ 1436 struct cfdata *cf = match; 1437 1438 return (cf->cf_driver == &audio_cd); 1439} 1440 1441struct device * 1442audio_attach_mi(const struct audio_hw_if *ops, void *arg, void *cookie, 1443 struct device *dev) 1444{ 1445 struct audio_attach_args aa; 1446 1447 aa.type = AUDIODEV_TYPE_AUDIO; 1448 aa.hwif = ops; 1449 aa.hdl = arg; 1450 aa.cookie = cookie; 1451 1452 /* 1453 * attach this driver to the caller (hardware driver), this 1454 * checks the kernel config and possibly calls audio_attach() 1455 */ 1456 return config_found_sm(dev, &aa, audioprint, audio_submatch); 1457} 1458 1459int 1460audioprint(void *aux, const char *pnp) 1461{ 1462 struct audio_attach_args *arg = aux; 1463 const char *type; 1464 1465 if (pnp != NULL) { 1466 switch (arg->type) { 1467 case AUDIODEV_TYPE_AUDIO: 1468 type = "audio"; 1469 break; 1470 case AUDIODEV_TYPE_OPL: 1471 type = "opl"; 1472 break; 1473 case AUDIODEV_TYPE_MPU: 1474 type = "mpu"; 1475 break; 1476 default: 1477 panic("audioprint: unknown type %d", arg->type); 1478 } 1479 printf("%s at %s", type, pnp); 1480 } 1481 return UNCONF; 1482} 1483 1484int 1485audio_open(struct audio_softc *sc, int flags) 1486{ 1487 int error; 1488 1489 if (sc->mode) 1490 return EBUSY; 1491 error = sc->ops->open(sc->arg, flags); 1492 if (error) 1493 return error; 1494 sc->active = 0; 1495 sc->pause = 1; 1496 sc->rec.blocking = 0; 1497 sc->play.blocking = 0; 1498 sc->mode = 0; 1499 if (flags & FWRITE) 1500 sc->mode |= AUMODE_PLAY; 1501 if (flags & FREAD) 1502 sc->mode |= AUMODE_RECORD; 1503 1504 error = audio_setpar(sc); 1505 if (error) 1506 goto bad; 1507 audio_clear(sc); 1508 1509 /* 1510 * allow read(2)/write(2) to automatically start DMA, without 1511 * the need for ioctl(), to make /dev/audio usable in scripts 1512 */ 1513 sc->pause = 0; 1514 return 0; 1515bad: 1516 sc->ops->close(sc->arg); 1517 sc->mode = 0; 1518 return error; 1519} 1520 1521int 1522audio_drain(struct audio_softc *sc) 1523{ 1524 int error, xrun; 1525 unsigned char *ptr; 1526 size_t count, bpf; 1527 1528 DPRINTF("%s: drain: mode = %d, pause = %d, active = %d, used = %zu\n", 1529 DEVNAME(sc), sc->mode, sc->pause, sc->active, sc->play.used); 1530 if (!(sc->mode & AUMODE_PLAY) || sc->pause) 1531 return 0; 1532 1533 /* discard partial samples, required by audio_fill_sil() */ 1534 mtx_enter(&audio_lock); 1535 bpf = sc->pchan * sc->bps; 1536 sc->play.used -= sc->play.used % bpf; 1537 if (sc->play.used == 0) { 1538 mtx_leave(&audio_lock); 1539 return 0; 1540 } 1541 1542 if (!sc->active) { 1543 /* 1544 * dma not started yet because buffer was not full 1545 * enough to start automatically. Pad it and start now. 1546 */ 1547 for (;;) { 1548 ptr = audio_buf_wgetblk(&sc->play, &count); 1549 if (count == 0) 1550 break; 1551 audio_fill_sil(sc, ptr, count); 1552 audio_buf_wcommit(&sc->play, count); 1553 } 1554 mtx_leave(&audio_lock); 1555 error = audio_start(sc); 1556 if (error) 1557 return error; 1558 mtx_enter(&audio_lock); 1559 } 1560 1561 xrun = sc->play.xrun; 1562 while (sc->play.xrun == xrun) { 1563 DPRINTF("%s: drain: used = %zu, xrun = %d\n", 1564 DEVNAME(sc), sc->play.used, sc->play.xrun); 1565 1566 /* 1567 * set a 5 second timeout, in case interrupts don't 1568 * work, useful only for debugging drivers 1569 */ 1570 sc->play.blocking = 1; 1571 error = msleep_nsec(&sc->play.blocking, &audio_lock, 1572 PWAIT | PCATCH, "au_dr", SEC_TO_NSEC(5)); 1573 if (!(sc->dev.dv_flags & DVF_ACTIVE)) 1574 error = EIO; 1575 if (error) { 1576 DPRINTF("%s: drain, err = %d\n", DEVNAME(sc), error); 1577 break; 1578 } 1579 } 1580 mtx_leave(&audio_lock); 1581 return error; 1582} 1583 1584int 1585audio_close(struct audio_softc *sc) 1586{ 1587 audio_drain(sc); 1588 if (sc->active) 1589 audio_stop(sc); 1590 sc->ops->close(sc->arg); 1591 sc->mode = 0; 1592 DPRINTF("%s: close: done\n", DEVNAME(sc)); 1593 return 0; 1594} 1595 1596int 1597audio_read(struct audio_softc *sc, struct uio *uio, int ioflag) 1598{ 1599 unsigned char *ptr; 1600 size_t count; 1601 int error; 1602 1603 DPRINTFN(1, "%s: read: resid = %zd\n", DEVNAME(sc), uio->uio_resid); 1604 1605 /* block if quiesced */ 1606 while (sc->quiesce) 1607 tsleep_nsec(&sc->quiesce, 0, "au_qrd", INFSLP); 1608 1609 /* start automatically if audio_ioc_start() was never called */ 1610 if (audio_canstart(sc)) { 1611 error = audio_start(sc); 1612 if (error) 1613 return error; 1614 } 1615 1616 mtx_enter(&audio_lock); 1617 1618 /* if there is no data then sleep */ 1619 while (sc->rec.used == 0) { 1620 if (ioflag & IO_NDELAY) { 1621 mtx_leave(&audio_lock); 1622 return EWOULDBLOCK; 1623 } 1624 DPRINTFN(1, "%s: read sleep\n", DEVNAME(sc)); 1625 sc->rec.blocking = 1; 1626 error = msleep_nsec(&sc->rec.blocking, 1627 &audio_lock, PWAIT | PCATCH, "au_rd", INFSLP); 1628 if (!(sc->dev.dv_flags & DVF_ACTIVE)) 1629 error = EIO; 1630 if (error) { 1631 DPRINTF("%s: read woke up error = %d\n", 1632 DEVNAME(sc), error); 1633 mtx_leave(&audio_lock); 1634 return error; 1635 } 1636 } 1637 1638 /* at this stage, there is data to transfer */ 1639 while (uio->uio_resid > 0 && sc->rec.used > 0) { 1640 ptr = audio_buf_rgetblk(&sc->rec, &count); 1641 if (count > uio->uio_resid) 1642 count = uio->uio_resid; 1643 mtx_leave(&audio_lock); 1644 DPRINTFN(1, "%s: read: start = %zu, count = %zu\n", 1645 DEVNAME(sc), ptr - sc->rec.data, count); 1646 if (sc->conv_dec) 1647 sc->conv_dec(ptr, count); 1648 error = uiomove(ptr, count, uio); 1649 if (error) 1650 return error; 1651 mtx_enter(&audio_lock); 1652 audio_buf_rdiscard(&sc->rec, count); 1653 } 1654 mtx_leave(&audio_lock); 1655 return 0; 1656} 1657 1658int 1659audio_write(struct audio_softc *sc, struct uio *uio, int ioflag) 1660{ 1661 unsigned char *ptr; 1662 size_t count; 1663 int error; 1664 1665 DPRINTFN(1, "%s: write: resid = %zd\n", DEVNAME(sc), uio->uio_resid); 1666 1667 /* block if quiesced */ 1668 while (sc->quiesce) 1669 tsleep_nsec(&sc->quiesce, 0, "au_qwr", INFSLP); 1670 1671 /* 1672 * if IO_NDELAY flag is set then check if there is enough room 1673 * in the buffer to store at least one byte. If not then don't 1674 * start the write process. 1675 */ 1676 mtx_enter(&audio_lock); 1677 if (uio->uio_resid > 0 && (ioflag & IO_NDELAY)) { 1678 if (sc->play.used == sc->play.ulen) { 1679 mtx_leave(&audio_lock); 1680 return EWOULDBLOCK; 1681 } 1682 } 1683 1684 while (uio->uio_resid > 0) { 1685 while (1) { 1686 ptr = audio_buf_wgetblk(&sc->play, &count); 1687 if (count > 0) 1688 break; 1689 if (ioflag & IO_NDELAY) { 1690 /* 1691 * At this stage at least one byte is already 1692 * moved so we do not return EWOULDBLOCK 1693 */ 1694 mtx_leave(&audio_lock); 1695 return 0; 1696 } 1697 DPRINTFN(1, "%s: write sleep\n", DEVNAME(sc)); 1698 sc->play.blocking = 1; 1699 error = msleep_nsec(&sc->play.blocking, 1700 &audio_lock, PWAIT | PCATCH, "au_wr", INFSLP); 1701 if (!(sc->dev.dv_flags & DVF_ACTIVE)) 1702 error = EIO; 1703 if (error) { 1704 DPRINTF("%s: write woke up error = %d\n", 1705 DEVNAME(sc), error); 1706 mtx_leave(&audio_lock); 1707 return error; 1708 } 1709 } 1710 if (count > uio->uio_resid) 1711 count = uio->uio_resid; 1712 mtx_leave(&audio_lock); 1713 error = uiomove(ptr, count, uio); 1714 if (error) 1715 return 0; 1716 if (sc->conv_enc) { 1717 sc->conv_enc(ptr, count); 1718 DPRINTFN(1, "audio_write: converted count = %zu\n", 1719 count); 1720 } 1721 if (sc->ops->copy_output) 1722 sc->ops->copy_output(sc->arg, count); 1723 1724 mtx_enter(&audio_lock); 1725 audio_buf_wcommit(&sc->play, count); 1726 1727 /* start automatically if audio_ioc_start() was never called */ 1728 if (audio_canstart(sc)) { 1729 mtx_leave(&audio_lock); 1730 error = audio_start(sc); 1731 if (error) 1732 return error; 1733 mtx_enter(&audio_lock); 1734 } 1735 } 1736 mtx_leave(&audio_lock); 1737 return 0; 1738} 1739 1740int 1741audio_getdev(struct audio_softc *sc, struct audio_device *p) 1742{ 1743 size_t sz; 1744 1745 memset(p, 0, sizeof(struct audio_device)); 1746 sz = 0; 1747 1748 if (sc->ops->display_name) 1749 sz = sc->ops->display_name(sc->arg, p->name, sizeof(p->name)); 1750 1751 if (sz == 0) { 1752 if (sc->dev.dv_parent == NULL) 1753 return EIO; 1754 strlcpy(p->name, sc->dev.dv_parent->dv_xname, sizeof(p->name)); 1755 } 1756 1757 return 0; 1758} 1759 1760int 1761audio_ioctl(struct audio_softc *sc, unsigned long cmd, void *addr) 1762{ 1763 struct audio_pos *ap; 1764 int error = 0; 1765 1766 /* block if quiesced */ 1767 while (sc->quiesce) 1768 tsleep_nsec(&sc->quiesce, 0, "au_qio", INFSLP); 1769 1770 switch (cmd) { 1771 case AUDIO_GETPOS: 1772 mtx_enter(&audio_lock); 1773 ap = (struct audio_pos *)addr; 1774 ap->play_pos = sc->play.pos; 1775 ap->play_xrun = sc->play.xrun; 1776 ap->rec_pos = sc->rec.pos; 1777 ap->rec_xrun = sc->rec.xrun; 1778 mtx_leave(&audio_lock); 1779 break; 1780 case AUDIO_START: 1781 return audio_ioc_start(sc); 1782 case AUDIO_STOP: 1783 return audio_ioc_stop(sc); 1784 case AUDIO_SETPAR: 1785 error = audio_ioc_setpar(sc, (struct audio_swpar *)addr); 1786 break; 1787 case AUDIO_GETPAR: 1788 error = audio_ioc_getpar(sc, (struct audio_swpar *)addr); 1789 break; 1790 case AUDIO_GETSTATUS: 1791 error = audio_ioc_getstatus(sc, (struct audio_status *)addr); 1792 break; 1793 case AUDIO_GETDEV: 1794 error = audio_getdev(sc, (struct audio_device *)addr); 1795 break; 1796 default: 1797 DPRINTF("%s: unknown ioctl 0x%lx\n", DEVNAME(sc), cmd); 1798 error = ENOTTY; 1799 break; 1800 } 1801 return error; 1802} 1803 1804void 1805audio_event(struct audio_softc *sc, int addr) 1806{ 1807 struct mixer_ev *e; 1808 1809 mtx_enter(&audio_lock); 1810 if (sc->mix_isopen) { 1811 e = sc->mix_evbuf + addr; 1812 if (!e->pending) { 1813 e->pending = 1; 1814 e->next = sc->mix_pending; 1815 sc->mix_pending = e; 1816 } 1817 audio_mixer_wakeup(sc); 1818 } 1819 mtx_leave(&audio_lock); 1820} 1821 1822int 1823audio_mixer_devinfo(struct audio_softc *sc, struct mixer_devinfo *devinfo) 1824{ 1825 if (devinfo->index < sc->mix_nent) 1826 return sc->ops->query_devinfo(sc->arg, devinfo); 1827 1828 devinfo->next = -1; 1829 devinfo->prev = -1; 1830 switch (devinfo->index - sc->mix_nent) { 1831 case MIXER_RECORD: 1832 strlcpy(devinfo->label.name, AudioCrecord, MAX_AUDIO_DEV_LEN); 1833 devinfo->type = AUDIO_MIXER_CLASS; 1834 devinfo->mixer_class = -1; 1835 break; 1836 case MIXER_RECORD_ENABLE: 1837 strlcpy(devinfo->label.name, "enable", MAX_AUDIO_DEV_LEN); 1838 devinfo->type = AUDIO_MIXER_ENUM; 1839 devinfo->mixer_class = MIXER_RECORD + sc->mix_nent; 1840 devinfo->un.e.num_mem = 3; 1841 devinfo->un.e.member[0].ord = MIXER_RECORD_ENABLE_OFF; 1842 strlcpy(devinfo->un.e.member[0].label.name, "off", 1843 MAX_AUDIO_DEV_LEN); 1844 devinfo->un.e.member[1].ord = MIXER_RECORD_ENABLE_ON; 1845 strlcpy(devinfo->un.e.member[1].label.name, "on", 1846 MAX_AUDIO_DEV_LEN); 1847 devinfo->un.e.member[2].ord = MIXER_RECORD_ENABLE_SYSCTL; 1848 strlcpy(devinfo->un.e.member[2].label.name, "sysctl", 1849 MAX_AUDIO_DEV_LEN); 1850 break; 1851 default: 1852 return EINVAL; 1853 } 1854 1855 return 0; 1856} 1857 1858int 1859audio_mixer_get(struct audio_softc *sc, struct mixer_ctrl *c) 1860{ 1861 if (c->dev < sc->mix_nent) 1862 return sc->ops->get_port(sc->arg, c); 1863 1864 switch (c->dev - sc->mix_nent) { 1865 case MIXER_RECORD: 1866 return EBADF; 1867 case MIXER_RECORD_ENABLE: 1868 c->un.ord = sc->record_enable; 1869 break; 1870 default: 1871 return EINVAL; 1872 } 1873 1874 return 0; 1875} 1876 1877int 1878audio_mixer_set(struct audio_softc *sc, struct mixer_ctrl *c, struct proc *p) 1879{ 1880 int error; 1881 1882 if (c->dev < sc->mix_nent) { 1883 error = sc->ops->set_port(sc->arg, c); 1884 if (error) 1885 return error; 1886 if (sc->ops->commit_settings) 1887 return sc->ops->commit_settings(sc->arg); 1888 audio_event(sc, c->dev); 1889 return 0; 1890 } 1891 1892 switch (c->dev - sc->mix_nent) { 1893 case MIXER_RECORD: 1894 return EBADF; 1895 case MIXER_RECORD_ENABLE: 1896 switch (c->un.ord) { 1897 case MIXER_RECORD_ENABLE_OFF: 1898 case MIXER_RECORD_ENABLE_ON: 1899 case MIXER_RECORD_ENABLE_SYSCTL: 1900 break; 1901 default: 1902 return EINVAL; 1903 } 1904 if (suser(p) == 0) 1905 sc->record_enable = c->un.ord; 1906 break; 1907 default: 1908 return EINVAL; 1909 } 1910 1911 return 0; 1912} 1913 1914int 1915audio_ioctl_mixer(struct audio_softc *sc, unsigned long cmd, void *addr, 1916 struct proc *p) 1917{ 1918 /* block if quiesced */ 1919 while (sc->quiesce) 1920 tsleep_nsec(&sc->quiesce, 0, "mix_qio", INFSLP); 1921 1922 switch (cmd) { 1923 case AUDIO_MIXER_DEVINFO: 1924 return audio_mixer_devinfo(sc, addr); 1925 case AUDIO_MIXER_READ: 1926 return audio_mixer_get(sc, addr); 1927 case AUDIO_MIXER_WRITE: 1928 return audio_mixer_set(sc, addr, p); 1929 default: 1930 return ENOTTY; 1931 } 1932 return 0; 1933} 1934 1935int 1936audio_mixer_read(struct audio_softc *sc, struct uio *uio, int ioflag) 1937{ 1938 struct mixer_ev *e; 1939 int data; 1940 int error; 1941 1942 DPRINTF("%s: mixer read: resid = %zd\n", DEVNAME(sc), uio->uio_resid); 1943 1944 /* block if quiesced */ 1945 while (sc->quiesce) 1946 tsleep_nsec(&sc->quiesce, 0, "mix_qrd", INFSLP); 1947 1948 mtx_enter(&audio_lock); 1949 1950 /* if there are no events then sleep */ 1951 while (!sc->mix_pending) { 1952 if (ioflag & IO_NDELAY) { 1953 mtx_leave(&audio_lock); 1954 return EWOULDBLOCK; 1955 } 1956 DPRINTF("%s: mixer read sleep\n", DEVNAME(sc)); 1957 sc->mix_blocking = 1; 1958 error = msleep_nsec(&sc->mix_blocking, 1959 &audio_lock, PWAIT | PCATCH, "mix_rd", INFSLP); 1960 if (!(sc->dev.dv_flags & DVF_ACTIVE)) 1961 error = EIO; 1962 if (error) { 1963 DPRINTF("%s: mixer read woke up error = %d\n", 1964 DEVNAME(sc), error); 1965 mtx_leave(&audio_lock); 1966 return error; 1967 } 1968 } 1969 1970 /* at this stage, there is an event to transfer */ 1971 while (uio->uio_resid >= sizeof(int) && sc->mix_pending) { 1972 e = sc->mix_pending; 1973 sc->mix_pending = e->next; 1974 e->pending = 0; 1975 data = e - sc->mix_evbuf; 1976 mtx_leave(&audio_lock); 1977 DPRINTF("%s: mixer read: %u\n", DEVNAME(sc), data); 1978 error = uiomove(&data, sizeof(int), uio); 1979 if (error) 1980 return error; 1981 mtx_enter(&audio_lock); 1982 } 1983 1984 mtx_leave(&audio_lock); 1985 return 0; 1986} 1987 1988int 1989audio_mixer_open(struct audio_softc *sc, int flags) 1990{ 1991 DPRINTF("%s: flags = 0x%x\n", __func__, flags); 1992 1993 if (flags & FREAD) { 1994 if (sc->mix_isopen) 1995 return EBUSY; 1996 sc->mix_isopen = 1; 1997 } 1998 return 0; 1999} 2000 2001int 2002audio_mixer_close(struct audio_softc *sc, int flags) 2003{ 2004 int i; 2005 2006 DPRINTF("%s: flags = 0x%x\n", __func__, flags); 2007 2008 if (flags & FREAD) { 2009 sc->mix_isopen = 0; 2010 2011 mtx_enter(&audio_lock); 2012 sc->mix_pending = NULL; 2013 for (i = 0; i < sc->mix_nent; i++) 2014 sc->mix_evbuf[i].pending = 0; 2015 mtx_leave(&audio_lock); 2016 } 2017 return 0; 2018} 2019 2020int 2021audioopen(dev_t dev, int flags, int mode, struct proc *p) 2022{ 2023 struct audio_softc *sc; 2024 int error; 2025 2026 sc = (struct audio_softc *)device_lookup(&audio_cd, AUDIO_UNIT(dev)); 2027 if (sc == NULL) 2028 return ENXIO; 2029 if (sc->ops == NULL) 2030 error = ENXIO; 2031 else { 2032 switch (AUDIO_DEV(dev)) { 2033 case AUDIO_DEV_AUDIO: 2034 error = audio_open(sc, flags); 2035 break; 2036 case AUDIO_DEV_AUDIOCTL: 2037 error = audio_mixer_open(sc, flags); 2038 break; 2039 default: 2040 error = ENXIO; 2041 } 2042 } 2043 device_unref(&sc->dev); 2044 return error; 2045} 2046 2047int 2048audioclose(dev_t dev, int flags, int ifmt, struct proc *p) 2049{ 2050 struct audio_softc *sc; 2051 int error; 2052 2053 sc = (struct audio_softc *)device_lookup(&audio_cd, AUDIO_UNIT(dev)); 2054 if (sc == NULL) 2055 return ENXIO; 2056 switch (AUDIO_DEV(dev)) { 2057 case AUDIO_DEV_AUDIO: 2058 error = audio_close(sc); 2059 break; 2060 case AUDIO_DEV_AUDIOCTL: 2061 error = audio_mixer_close(sc, flags); 2062 break; 2063 default: 2064 error = ENXIO; 2065 } 2066 device_unref(&sc->dev); 2067 return error; 2068} 2069 2070int 2071audioread(dev_t dev, struct uio *uio, int ioflag) 2072{ 2073 struct audio_softc *sc; 2074 int error; 2075 2076 sc = (struct audio_softc *)device_lookup(&audio_cd, AUDIO_UNIT(dev)); 2077 if (sc == NULL) 2078 return ENXIO; 2079 switch (AUDIO_DEV(dev)) { 2080 case AUDIO_DEV_AUDIO: 2081 error = audio_read(sc, uio, ioflag); 2082 break; 2083 case AUDIO_DEV_AUDIOCTL: 2084 error = audio_mixer_read(sc, uio, ioflag); 2085 break; 2086 default: 2087 error = ENXIO; 2088 } 2089 device_unref(&sc->dev); 2090 return error; 2091} 2092 2093int 2094audiowrite(dev_t dev, struct uio *uio, int ioflag) 2095{ 2096 struct audio_softc *sc; 2097 int error; 2098 2099 sc = (struct audio_softc *)device_lookup(&audio_cd, AUDIO_UNIT(dev)); 2100 if (sc == NULL) 2101 return ENXIO; 2102 switch (AUDIO_DEV(dev)) { 2103 case AUDIO_DEV_AUDIO: 2104 error = audio_write(sc, uio, ioflag); 2105 break; 2106 case AUDIO_DEV_AUDIOCTL: 2107 error = ENODEV; 2108 break; 2109 default: 2110 error = ENXIO; 2111 } 2112 device_unref(&sc->dev); 2113 return error; 2114} 2115 2116int 2117audioioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) 2118{ 2119 struct audio_softc *sc; 2120 int error; 2121 2122 sc = (struct audio_softc *)device_lookup(&audio_cd, AUDIO_UNIT(dev)); 2123 if (sc == NULL) 2124 return ENXIO; 2125 switch (AUDIO_DEV(dev)) { 2126 case AUDIO_DEV_AUDIO: 2127 error = audio_ioctl(sc, cmd, addr); 2128 break; 2129 case AUDIO_DEV_AUDIOCTL: 2130 if (cmd == AUDIO_SETPAR && sc->mode != 0) { 2131 error = EBUSY; 2132 break; 2133 } 2134 if (cmd == AUDIO_START || cmd == AUDIO_STOP) { 2135 error = ENXIO; 2136 break; 2137 } 2138 if (cmd == AUDIO_MIXER_DEVINFO || 2139 cmd == AUDIO_MIXER_READ || 2140 cmd == AUDIO_MIXER_WRITE) 2141 error = audio_ioctl_mixer(sc, cmd, addr, p); 2142 else 2143 error = audio_ioctl(sc, cmd, addr); 2144 break; 2145 default: 2146 error = ENXIO; 2147 } 2148 device_unref(&sc->dev); 2149 return error; 2150} 2151 2152int 2153audiokqfilter(dev_t dev, struct knote *kn) 2154{ 2155 struct audio_softc *sc; 2156 struct klist *klist; 2157 int error; 2158 2159 sc = (struct audio_softc *)device_lookup(&audio_cd, AUDIO_UNIT(dev)); 2160 if (sc == NULL) 2161 return ENXIO; 2162 error = 0; 2163 switch (AUDIO_DEV(dev)) { 2164 case AUDIO_DEV_AUDIO: 2165 switch (kn->kn_filter) { 2166 case EVFILT_READ: 2167 klist = &sc->rec.klist; 2168 kn->kn_fop = &audioread_filtops; 2169 break; 2170 case EVFILT_WRITE: 2171 klist = &sc->play.klist; 2172 kn->kn_fop = &audiowrite_filtops; 2173 break; 2174 default: 2175 error = EINVAL; 2176 goto done; 2177 } 2178 break; 2179 case AUDIO_DEV_AUDIOCTL: 2180 switch (kn->kn_filter) { 2181 case EVFILT_READ: 2182 klist = &sc->mix_klist; 2183 kn->kn_fop = &audioctlread_filtops; 2184 break; 2185 default: 2186 error = EINVAL; 2187 goto done; 2188 } 2189 break; 2190 } 2191 kn->kn_hook = sc; 2192 2193 klist_insert(klist, kn); 2194done: 2195 device_unref(&sc->dev); 2196 return error; 2197} 2198 2199void 2200filt_audiordetach(struct knote *kn) 2201{ 2202 struct audio_softc *sc = kn->kn_hook; 2203 2204 klist_remove(&sc->rec.klist, kn); 2205} 2206 2207int 2208filt_audioread(struct knote *kn, long hint) 2209{ 2210 struct audio_softc *sc = kn->kn_hook; 2211 2212 MUTEX_ASSERT_LOCKED(&audio_lock); 2213 2214 return (sc->mode & AUMODE_RECORD) && (sc->rec.used > 0); 2215} 2216 2217void 2218filt_audiowdetach(struct knote *kn) 2219{ 2220 struct audio_softc *sc = kn->kn_hook; 2221 2222 klist_remove(&sc->play.klist, kn); 2223} 2224 2225int 2226filt_audiowrite(struct knote *kn, long hint) 2227{ 2228 struct audio_softc *sc = kn->kn_hook; 2229 2230 MUTEX_ASSERT_LOCKED(&audio_lock); 2231 2232 return (sc->mode & AUMODE_PLAY) && (sc->play.used < sc->play.ulen); 2233} 2234 2235void 2236filt_audioctlrdetach(struct knote *kn) 2237{ 2238 struct audio_softc *sc = kn->kn_hook; 2239 2240 klist_remove(&sc->mix_klist, kn); 2241} 2242 2243int 2244filt_audioctlread(struct knote *kn, long hint) 2245{ 2246 struct audio_softc *sc = kn->kn_hook; 2247 2248 MUTEX_ASSERT_LOCKED(&audio_lock); 2249 2250 return (sc->mix_isopen && sc->mix_pending); 2251} 2252 2253int 2254filt_audiomodify(struct kevent *kev, struct knote *kn) 2255{ 2256 int active; 2257 2258 mtx_enter(&audio_lock); 2259 active = knote_modify(kev, kn); 2260 mtx_leave(&audio_lock); 2261 2262 return active; 2263} 2264 2265int 2266filt_audioprocess(struct knote *kn, struct kevent *kev) 2267{ 2268 int active; 2269 2270 mtx_enter(&audio_lock); 2271 active = knote_process(kn, kev); 2272 mtx_leave(&audio_lock); 2273 2274 return active; 2275} 2276 2277#if NWSKBD > 0 2278int 2279wskbd_initmute(struct audio_softc *sc, struct mixer_devinfo *vol) 2280{ 2281 struct mixer_devinfo *mi; 2282 int index = -1; 2283 2284 mi = malloc(sizeof(struct mixer_devinfo), M_TEMP, M_WAITOK); 2285 2286 for (mi->index = vol->next; mi->index != -1; mi->index = mi->next) { 2287 if (sc->ops->query_devinfo(sc->arg, mi) != 0) 2288 break; 2289 if (strcmp(mi->label.name, AudioNmute) == 0) { 2290 index = mi->index; 2291 break; 2292 } 2293 } 2294 2295 free(mi, M_TEMP, sizeof(struct mixer_devinfo)); 2296 return index; 2297} 2298 2299int 2300wskbd_initvol(struct audio_softc *sc, struct wskbd_vol *vol, char *cn, char *dn) 2301{ 2302 struct mixer_devinfo *dev, *cls; 2303 2304 vol->val = vol->mute = -1; 2305 dev = malloc(sizeof(struct mixer_devinfo), M_TEMP, M_WAITOK); 2306 cls = malloc(sizeof(struct mixer_devinfo), M_TEMP, M_WAITOK); 2307 2308 for (dev->index = 0; ; dev->index++) { 2309 if (sc->ops->query_devinfo(sc->arg, dev) != 0) 2310 break; 2311 if (dev->type != AUDIO_MIXER_VALUE) 2312 continue; 2313 cls->index = dev->mixer_class; 2314 if (sc->ops->query_devinfo(sc->arg, cls) != 0) 2315 continue; 2316 if (strcmp(cls->label.name, cn) == 0 && 2317 strcmp(dev->label.name, dn) == 0) { 2318 vol->val = dev->index; 2319 vol->nch = dev->un.v.num_channels; 2320 vol->step = dev->un.v.delta > 8 ? dev->un.v.delta : 8; 2321 vol->mute = wskbd_initmute(sc, dev); 2322 vol->val_pending = vol->mute_pending = 0; 2323 DPRINTF("%s: wskbd using %s.%s%s\n", DEVNAME(sc), 2324 cn, dn, vol->mute >= 0 ? ", mute control" : ""); 2325 break; 2326 } 2327 } 2328 2329 free(cls, M_TEMP, sizeof(struct mixer_devinfo)); 2330 free(dev, M_TEMP, sizeof(struct mixer_devinfo)); 2331 return (vol->val != -1); 2332} 2333 2334void 2335wskbd_mixer_init(struct audio_softc *sc) 2336{ 2337 static struct { 2338 char *cn, *dn; 2339 } spkr_names[] = { 2340 {AudioCoutputs, AudioNmaster}, 2341 {AudioCinputs, AudioNdac}, 2342 {AudioCoutputs, AudioNdac}, 2343 {AudioCoutputs, AudioNoutput} 2344 }, mic_names[] = { 2345 {AudioCrecord, AudioNrecord}, 2346 {AudioCrecord, AudioNvolume}, 2347 {AudioCinputs, AudioNrecord}, 2348 {AudioCinputs, AudioNvolume}, 2349 {AudioCinputs, AudioNinput} 2350 }; 2351 int i; 2352 2353 for (i = 0; i < sizeof(spkr_names) / sizeof(spkr_names[0]); i++) { 2354 if (wskbd_initvol(sc, &sc->spkr, 2355 spkr_names[i].cn, spkr_names[i].dn)) 2356 break; 2357 } 2358 for (i = 0; i < sizeof(mic_names) / sizeof(mic_names[0]); i++) { 2359 if (wskbd_initvol(sc, &sc->mic, 2360 mic_names[i].cn, mic_names[i].dn)) 2361 break; 2362 } 2363 task_set(&sc->wskbd_task, wskbd_mixer_cb, sc); 2364} 2365 2366void 2367wskbd_mixer_update(struct audio_softc *sc, struct wskbd_vol *vol) 2368{ 2369 struct mixer_ctrl ctrl; 2370 int val_pending, mute_pending, i, gain, error, s; 2371 2372 s = spltty(); 2373 val_pending = vol->val_pending; 2374 vol->val_pending = 0; 2375 mute_pending = vol->mute_pending; 2376 vol->mute_pending = 0; 2377 splx(s); 2378 2379 if (sc->ops == NULL) 2380 return; 2381 if (vol->mute >= 0 && mute_pending) { 2382 ctrl.dev = vol->mute; 2383 ctrl.type = AUDIO_MIXER_ENUM; 2384 error = sc->ops->get_port(sc->arg, &ctrl); 2385 if (error) { 2386 DPRINTF("%s: get mute err = %d\n", DEVNAME(sc), error); 2387 return; 2388 } 2389 switch (mute_pending) { 2390 case WSKBD_MUTE_TOGGLE: 2391 ctrl.un.ord = !ctrl.un.ord; 2392 break; 2393 case WSKBD_MUTE_DISABLE: 2394 ctrl.un.ord = 0; 2395 break; 2396 case WSKBD_MUTE_ENABLE: 2397 ctrl.un.ord = 1; 2398 break; 2399 } 2400 DPRINTFN(1, "%s: wskbd mute setting to %d\n", 2401 DEVNAME(sc), ctrl.un.ord); 2402 error = sc->ops->set_port(sc->arg, &ctrl); 2403 if (error) { 2404 DPRINTF("%s: set mute err = %d\n", DEVNAME(sc), error); 2405 return; 2406 } 2407 audio_event(sc, vol->mute); 2408 } 2409 if (vol->val >= 0 && val_pending) { 2410 ctrl.dev = vol->val; 2411 ctrl.type = AUDIO_MIXER_VALUE; 2412 ctrl.un.value.num_channels = vol->nch; 2413 error = sc->ops->get_port(sc->arg, &ctrl); 2414 if (error) { 2415 DPRINTF("%s: get mute err = %d\n", DEVNAME(sc), error); 2416 return; 2417 } 2418 for (i = 0; i < vol->nch; i++) { 2419 gain = ctrl.un.value.level[i] + vol->step * val_pending; 2420 if (gain > AUDIO_MAX_GAIN) 2421 gain = AUDIO_MAX_GAIN; 2422 else if (gain < AUDIO_MIN_GAIN) 2423 gain = AUDIO_MIN_GAIN; 2424 ctrl.un.value.level[i] = gain; 2425 DPRINTFN(1, "%s: wskbd level %d set to %d\n", 2426 DEVNAME(sc), i, gain); 2427 } 2428 error = sc->ops->set_port(sc->arg, &ctrl); 2429 if (error) { 2430 DPRINTF("%s: set vol err = %d\n", DEVNAME(sc), error); 2431 return; 2432 } 2433 audio_event(sc, vol->val); 2434 } 2435} 2436 2437void 2438wskbd_mixer_cb(void *arg) 2439{ 2440 struct audio_softc *sc = arg; 2441 2442 wskbd_mixer_update(sc, &sc->spkr); 2443 wskbd_mixer_update(sc, &sc->mic); 2444 device_unref(&sc->dev); 2445} 2446 2447int 2448wskbd_set_mixermute(long mute, long out) 2449{ 2450 struct audio_softc *sc; 2451 struct wskbd_vol *vol; 2452 2453 sc = (struct audio_softc *)device_lookup(&audio_cd, 0); 2454 if (sc == NULL) 2455 return ENODEV; 2456 vol = out ? &sc->spkr : &sc->mic; 2457 vol->mute_pending = mute ? WSKBD_MUTE_ENABLE : WSKBD_MUTE_DISABLE; 2458 if (!task_add(systq, &sc->wskbd_task)) 2459 device_unref(&sc->dev); 2460 return 0; 2461} 2462 2463/* 2464 * Adjust the volume of the audio device associated with the given cookie. 2465 * Otherwise, fallback to audio0. 2466 */ 2467int 2468wskbd_set_mixervolume_dev(void *cookie, long dir, long out) 2469{ 2470 int unit = 0; 2471 int i; 2472 2473 for (i = 0; i < audio_cd.cd_ndevs; i++) { 2474 struct audio_softc *sc; 2475 2476 sc = (struct audio_softc *)device_lookup(&audio_cd, i); 2477 if (sc == NULL) 2478 continue; 2479 if (sc->cookie != cookie) { 2480 device_unref(&sc->dev); 2481 continue; 2482 } 2483 2484 device_unref(&sc->dev); 2485 unit = i; 2486 break; 2487 } 2488 2489 return wskbd_set_mixervolume_unit(unit, dir, out); 2490} 2491 2492int 2493wskbd_set_mixervolume(long dir, long out) 2494{ 2495 return wskbd_set_mixervolume_unit(0, dir, out); 2496} 2497 2498int 2499wskbd_set_mixervolume_unit(int unit, long dir, long out) 2500{ 2501 struct audio_softc *sc; 2502 struct wskbd_vol *vol; 2503 2504 sc = (struct audio_softc *)device_lookup(&audio_cd, unit); 2505 if (sc == NULL) 2506 return ENODEV; 2507 vol = out ? &sc->spkr : &sc->mic; 2508 if (dir == 0) 2509 vol->mute_pending ^= WSKBD_MUTE_TOGGLE; 2510 else 2511 vol->val_pending += dir; 2512 if (!task_add(systq, &sc->wskbd_task)) 2513 device_unref(&sc->dev); 2514 return 0; 2515} 2516#endif /* NWSKBD > 0 */