Lines Matching +full:cmd +full:- +full:cnt +full:- +full:name
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org>
5 * Portions Copyright (c) Ryan Beasley <ryan.beasley@gmail.com> - GSoC 2006
65 char name[MIXER_NAMELEN]; member
117 return snddev->mixer_dev; in mixer_get_devt()
129 return -1; in mixer_lookup()
134 snd_mtxunlock((x)->lock); \
139 snd_mtxlock((x)->lock); \
152 if (mtx_owned(m->lock)) in mixer_set_softpcmvol()
157 if (!(d->flags & SD_F_MPSAFE) || mtx_owned(d->lock) != 0) in mixer_set_softpcmvol()
174 if (c->direction == PCMDIR_PLAY && in mixer_set_softpcmvol()
175 (c->feederflags & (1 << FEEDER_VOLUME))) in mixer_set_softpcmvol()
205 if (mtx_owned(m->lock)) in mixer_set_eq()
210 if (!(d->flags & SD_F_MPSAFE) || mtx_owned(d->lock) != 0) in mixer_set_eq()
249 (0 == (m->devs & (1 << dev)))) in mixer_set()
250 return (-1); in mixer_set()
254 realdev = m->realdev[dev]; in mixer_set()
256 d = device_get_softc(m->dev); in mixer_set()
258 return (-1); in mixer_set()
261 if (!(d->flags & SD_F_MPSAFE) && mtx_owned(m->lock) != 0) in mixer_set()
268 m->level_muted[dev] = l | (r << 8); in mixer_set()
274 parent = m->parent[dev]; in mixer_set()
278 child = m->child[dev]; in mixer_set()
281 tl = (l * (m->level[parent] & 0x00ff)) / 100; in mixer_set()
282 tr = (r * ((m->level[parent] & 0xff00) >> 8)) / 100; in mixer_set()
283 if (dev == SOUND_MIXER_PCM && (d->flags & SD_F_SOFTPCMVOL)) in mixer_set()
288 return (-1); in mixer_set()
292 if (!(child & (1 << i)) || m->parent[i] != dev) in mixer_set()
294 realdev = m->realdev[i]; in mixer_set()
295 tl = (l * (m->level[i] & 0x00ff)) / 100; in mixer_set()
296 tr = (r * ((m->level[i] & 0xff00) >> 8)) / 100; in mixer_set()
298 (d->flags & SD_F_SOFTPCMVOL)) in mixer_set()
303 realdev = m->realdev[dev]; in mixer_set()
307 return (-1); in mixer_set()
310 if (dev == SOUND_MIXER_PCM && (d->flags & SD_F_SOFTPCMVOL)) in mixer_set()
313 dev == SOUND_MIXER_BASS) && (d->flags & SD_F_EQ)) in mixer_set()
318 return (-1); in mixer_set()
324 m->level[dev] = l | (r << 8); in mixer_set()
325 m->modify_counter++; in mixer_set()
333 if ((dev < SOUND_MIXER_NRDEVICES) && (mixer->devs & (1 << dev))) { in mixer_get()
334 if (mixer->mutedevs & (1 << dev)) in mixer_get()
335 return (mixer->level_muted[dev]); in mixer_get()
337 return (mixer->level[dev]); in mixer_get()
339 return (-1); in mixer_get()
349 mutedevs &= mixer->devs; in mix_setmutedevs()
350 delta = (mixer->mutedevs ^ mutedevs) & mixer->devs; in mix_setmutedevs()
351 mixer->mutedevs = mutedevs; in mix_setmutedevs()
357 mixer->level_muted[i] = mixer->level[i]; in mix_setmutedevs()
360 mixer_set(mixer, i, 0, mixer->level_muted[i]); in mix_setmutedevs()
372 d = device_get_softc(mixer->dev); in mixer_setrecsrc()
374 return -1; in mixer_setrecsrc()
375 if (!(d->flags & SD_F_MPSAFE) && mtx_owned(mixer->lock) != 0) in mixer_setrecsrc()
379 src &= mixer->recdevs; in mixer_setrecsrc()
381 src = mixer->recdevs & SOUND_MASK_MIC; in mixer_setrecsrc()
383 src = mixer->recdevs & SOUND_MASK_MONITOR; in mixer_setrecsrc()
385 src = mixer->recdevs & SOUND_MASK_LINE; in mixer_setrecsrc()
386 if (src == 0 && mixer->recdevs != 0) in mixer_setrecsrc()
387 src = (1 << (ffs(mixer->recdevs) - 1)); in mixer_setrecsrc()
393 mixer->recsrc = recsrc; in mixer_setrecsrc()
401 return mixer->recsrc; in mixer_getrecsrc()
425 int i, cnt; in mixer_get_recroute() local
427 cnt = 0; in mixer_get_recroute()
430 /** @todo can user set a multi-device mask? (== or &?) */ in mixer_get_recroute()
431 if ((1 << i) == m->recsrc) in mixer_get_recroute()
433 if ((1 << i) & m->recdevs) in mixer_get_recroute()
434 ++cnt; in mixer_get_recroute()
440 *route = cnt; in mixer_get_recroute()
460 int i, cnt, ret; in mixer_set_recroute() local
463 cnt = 0; in mixer_set_recroute()
466 if ((1 << i) & m->recdevs) { in mixer_set_recroute()
467 if (route == cnt) in mixer_set_recroute()
469 ++cnt; in mixer_set_recroute()
490 d = device_get_softc(m->dev); in mix_setdevs()
491 if (d != NULL && (d->flags & SD_F_SOFTPCMVOL)) in mix_setdevs()
493 if (d != NULL && (d->flags & SD_F_EQ)) in mix_setdevs()
496 if (m->parent[i] < SOUND_MIXER_NRDEVICES) in mix_setdevs()
497 v |= 1 << m->parent[i]; in mix_setdevs()
498 v |= m->child[i]; in mix_setdevs()
500 m->devs = v; in mix_setdevs()
528 ei = &m->enuminfo; in mix_setrecdevs()
532 nleft = sizeof(ei->strings); in mix_setrecdevs()
533 loc = ei->strings; in mix_setrecdevs()
537 ei->strindex[nvalues] = nwrote; in mix_setrecdevs()
542 nleft -= ncopied; in mix_setrecdevs()
552 device_printf(m->dev, in mix_setrecdevs()
553 "mix_setrecdevs: Not enough room to store device names--please file a bug report.\n"); in mix_setrecdevs()
554 device_printf(m->dev, in mix_setrecdevs()
559 loc = &ei->strings[nwrote]; in mix_setrecdevs()
567 ei->nvalues = nvalues; in mix_setrecdevs()
568 m->recdevs = v; in mix_setrecdevs()
584 if (m->parent[i] < SOUND_MIXER_NRDEVICES) in mix_setparentchild()
585 m->child[m->parent[i]] &= ~(1 << i); in mix_setparentchild()
586 m->parent[i] = parent; in mix_setparentchild()
587 m->child[i] = 0; in mix_setparentchild()
591 m->child[parent] = mask; in mix_setparentchild()
600 m->realdev[dev] = realdev; in mix_setrealdev()
608 return m->parent[dev]; in mix_getparent()
616 return m->child[dev]; in mix_getchild()
622 return m->devs; in mix_getdevs()
628 return m->mutedevs; in mix_getmutedevs()
634 return m->recdevs; in mix_getrecdevs()
640 return m->devinfo; in mix_getdevinfo()
657 snprintf(m->name, sizeof(m->name), "%s:mixer", in mixer_obj_create()
660 strlcat(m->name, ":", sizeof(m->name)); in mixer_obj_create()
661 strlcat(m->name, desc, sizeof(m->name)); in mixer_obj_create()
663 m->lock = snd_mtxcreate(m->name, (type == MIXER_TYPE_PRIMARY) ? in mixer_obj_create()
665 m->type = type; in mixer_obj_create()
666 m->devinfo = devinfo; in mixer_obj_create()
667 m->busy = 0; in mixer_obj_create()
668 m->dev = dev; in mixer_obj_create()
669 for (i = 0; i < nitems(m->parent); i++) { in mixer_obj_create()
670 m->parent[i] = SOUND_MIXER_NONE; in mixer_obj_create()
671 m->child[i] = 0; in mixer_obj_create()
672 m->realdev[i] = i; in mixer_obj_create()
676 snd_mtxlock(m->lock); in mixer_obj_create()
677 snd_mtxfree(m->lock); in mixer_obj_create()
689 KASSERT(m->type == MIXER_TYPE_SECONDARY, in mixer_delete()
690 ("%s(): illegal mixer type=%d", __func__, m->type)); in mixer_delete()
692 /* mixer uninit can sleep --hps */ in mixer_delete()
696 snd_mtxfree(m->lock); in mixer_delete()
715 const char *name; in mixer_init() local
720 return (-1); in mixer_init()
722 name = device_get_name(dev); in mixer_init()
724 if (resource_int_value(name, unit, "eq", &val) == 0 && in mixer_init()
726 snddev->flags |= SD_F_EQ; in mixer_init()
728 snddev->flags |= val; in mixer_init()
730 snddev->flags |= SD_F_EQ_DEFAULT; in mixer_init()
731 snddev->eqpreamp = 0; in mixer_init()
736 return (-1); in mixer_init()
741 if (resource_int_value(name, unit, snd_mixernames[i], in mixer_init()
755 pdev->si_drv1 = m; in mixer_init()
756 snddev->mixer_dev = pdev; in mixer_init()
760 if (!(m->devs & (1 << i))) in mixer_init()
762 if (m->realdev[i] != i) { in mixer_init()
763 device_printf(dev, "Mixer \"%s\" -> \"%s\":", in mixer_init()
765 (m->realdev[i] < SOUND_MIXER_NRDEVICES) ? in mixer_init()
766 snd_mixernames[m->realdev[i]] : "none"); in mixer_init()
771 if (m->parent[i] < SOUND_MIXER_NRDEVICES) in mixer_init()
773 snd_mixernames[m->parent[i]]); in mixer_init()
774 if (m->child[i] != 0) in mixer_init()
775 printf(" child=0x%08x", m->child[i]); in mixer_init()
778 if (snddev->flags & SD_F_SOFTPCMVOL) in mixer_init()
780 if (snddev->flags & SD_F_EQ) in mixer_init()
797 if (d == NULL || pdev == NULL || pdev->si_drv1 == NULL) in mixer_uninit()
800 m = pdev->si_drv1; in mixer_uninit()
802 KASSERT(m->type == MIXER_TYPE_PRIMARY, in mixer_uninit()
803 ("%s(): illegal mixer type=%d", __func__, m->type)); in mixer_uninit()
805 pdev->si_drv1 = NULL; in mixer_uninit()
808 snd_mtxlock(m->lock); in mixer_uninit()
815 snd_mtxunlock(m->lock); in mixer_uninit()
817 /* mixer uninit can sleep --hps */ in mixer_uninit()
821 snd_mtxfree(m->lock); in mixer_uninit()
824 d->mixer_dev = NULL; in mixer_uninit()
837 m = pdev->si_drv1; in mixer_reinit()
838 snd_mtxlock(m->lock); in mixer_reinit()
842 snd_mtxunlock(m->lock); in mixer_reinit()
847 if (m->mutedevs & (1 << i)) in mixer_reinit()
850 mixer_set(m, i, 0, m->level[i]); in mixer_reinit()
853 mixer_setrecsrc(m, m->recsrc); in mixer_reinit()
854 snd_mtxunlock(m->lock); in mixer_reinit()
866 m = oidp->oid_arg1; in sysctl_hw_snd_hwvol_mixer()
867 snd_mtxlock(m->lock); in sysctl_hw_snd_hwvol_mixer()
868 strlcpy(devname, snd_mixernames[m->hwvol_mixer], sizeof(devname)); in sysctl_hw_snd_hwvol_mixer()
869 snd_mtxunlock(m->lock); in sysctl_hw_snd_hwvol_mixer()
871 snd_mtxlock(m->lock); in sysctl_hw_snd_hwvol_mixer()
872 if (error == 0 && req->newptr != NULL) { in sysctl_hw_snd_hwvol_mixer()
874 if (dev == -1) { in sysctl_hw_snd_hwvol_mixer()
875 snd_mtxunlock(m->lock); in sysctl_hw_snd_hwvol_mixer()
878 m->hwvol_mixer = dev; in sysctl_hw_snd_hwvol_mixer()
881 snd_mtxunlock(m->lock); in sysctl_hw_snd_hwvol_mixer()
892 m = pdev->si_drv1; in mixer_hwvol_init()
894 m->hwvol_mixer = SOUND_MIXER_VOLUME; in mixer_hwvol_init()
895 m->hwvol_step = 5; in mixer_hwvol_init()
898 OID_AUTO, "hwvol_step", CTLFLAG_RWTUN, &m->hwvol_step, 0, ""); in mixer_hwvol_init()
909 mix_setmutedevs(m, m->mutedevs ^ (1 << m->hwvol_mixer)); in mixer_hwvol_mute_locked()
919 m = pdev->si_drv1; in mixer_hwvol_mute()
920 snd_mtxlock(m->lock); in mixer_hwvol_mute()
922 snd_mtxunlock(m->lock); in mixer_hwvol_mute()
930 level = mixer_get(m, m->hwvol_mixer); in mixer_hwvol_step_locked()
932 if (level != -1) { in mixer_hwvol_step_locked()
935 left += left_step * m->hwvol_step; in mixer_hwvol_step_locked()
940 right += right_step * m->hwvol_step; in mixer_hwvol_step_locked()
946 mixer_set(m, m->hwvol_mixer, m->mutedevs, left | right << 8); in mixer_hwvol_step_locked()
957 m = pdev->si_drv1; in mixer_hwvol_step()
958 snd_mtxlock(m->lock); in mixer_hwvol_step()
960 snd_mtxunlock(m->lock); in mixer_hwvol_step()
968 return (m->busy); in mixer_busy()
978 snd_mtxlock(m->lock); in mix_set()
979 ret = mixer_set(m, dev, m->mutedevs, left | (right << 8)); in mix_set()
980 snd_mtxunlock(m->lock); in mix_set()
992 snd_mtxlock(m->lock); in mix_get()
994 snd_mtxunlock(m->lock); in mix_get()
1006 snd_mtxlock(m->lock); in mix_setrecsrc()
1008 snd_mtxunlock(m->lock); in mix_setrecsrc()
1020 snd_mtxlock(m->lock); in mix_getrecsrc()
1022 snd_mtxunlock(m->lock); in mix_getrecsrc()
1032 return (m->type); in mix_get_type()
1040 return (m->dev); in mix_get_dev()
1043 /* ----------------------------------------------------------------------- */
1051 if (i_dev == NULL || i_dev->si_drv1 == NULL) in mixer_open()
1054 m = i_dev->si_drv1; in mixer_open()
1055 d = device_get_softc(m->dev); in mixer_open()
1061 snd_mtxlock(m->lock); in mixer_open()
1062 m->busy = 1; in mixer_open()
1063 snd_mtxunlock(m->lock); in mixer_open()
1075 if (i_dev == NULL || i_dev->si_drv1 == NULL) in mixer_close()
1078 m = i_dev->si_drv1; in mixer_close()
1079 d = device_get_softc(m->dev); in mixer_close()
1085 snd_mtxlock(m->lock); in mixer_close()
1086 ret = (m->busy == 0) ? EBADF : 0; in mixer_close()
1087 m->busy = 0; in mixer_close()
1088 snd_mtxunlock(m->lock); in mixer_close()
1094 mixer_ioctl_channel(struct cdev *dev, u_long cmd, caddr_t arg, int mode, in mixer_ioctl_channel() argument
1103 if (td == NULL || td->td_proc == NULL) in mixer_ioctl_channel()
1104 return (-1); in mixer_ioctl_channel()
1106 m = dev->si_drv1; in mixer_ioctl_channel()
1107 d = device_get_softc(m->dev); in mixer_ioctl_channel()
1108 j = cmd & 0xff; in mixer_ioctl_channel()
1118 return (-1); in mixer_ioctl_channel()
1122 pid = td->td_proc->p_pid; in mixer_ioctl_channel()
1126 ret = -1; in mixer_ioctl_channel()
1141 if (c->pid != pid || in mixer_ioctl_channel()
1142 !(c->feederflags & (1 << FEEDER_VOLUME))) { in mixer_ioctl_channel()
1146 if (rdch == NULL && c->direction == PCMDIR_REC) { in mixer_ioctl_channel()
1150 } else if (wrch == NULL && c->direction == PCMDIR_PLAY) { in mixer_ioctl_channel()
1161 return (-1); in mixer_ioctl_channel()
1165 (cmd & ~0xff) == MIXER_READ(0)) { in mixer_ioctl_channel()
1166 snd_mtxlock(m->lock); in mixer_ioctl_channel()
1168 snd_mtxunlock(m->lock); in mixer_ioctl_channel()
1183 if ((cmd & ~0xff) == MIXER_WRITE(0)) { in mixer_ioctl_channel()
1190 } else if ((cmd & ~0xff) == MIXER_READ(0)) { in mixer_ioctl_channel()
1202 mixer_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, in mixer_ioctl() argument
1208 if (i_dev == NULL || i_dev->si_drv1 == NULL) in mixer_ioctl()
1211 d = device_get_softc(((struct snd_mixer *)i_dev->si_drv1)->dev); in mixer_ioctl()
1218 ret = -1; in mixer_ioctl()
1220 if (mixer_bypass != 0 && (d->flags & SD_F_VPC)) in mixer_ioctl()
1221 ret = mixer_ioctl_channel(i_dev, cmd, arg, mode, td, in mixer_ioctl()
1224 if (ret == -1) in mixer_ioctl()
1225 ret = mixer_ioctl_cmd(i_dev, cmd, arg, mode, td, in mixer_ioctl()
1238 strlcpy(mi->id, m->name, sizeof(mi->id)); in mixer_mixerinfo()
1239 strlcpy(mi->name, device_get_desc(m->dev), sizeof(mi->name)); in mixer_mixerinfo()
1240 mi->modify_counter = m->modify_counter; in mixer_mixerinfo()
1248 mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, in mixer_ioctl_cmd() argument
1253 int v = -1, j = cmd & 0xff; in mixer_ioctl_cmd()
1259 if (IOCGROUP(cmd) == 'X') { in mixer_ioctl_cmd()
1260 switch (cmd) { in mixer_ioctl_cmd()
1280 m = i_dev->si_drv1; in mixer_ioctl_cmd()
1285 snd_mtxlock(m->lock); in mixer_ioctl_cmd()
1286 if (from == MIXER_CMD_CDEV && !m->busy) { in mixer_ioctl_cmd()
1287 snd_mtxunlock(m->lock); in mixer_ioctl_cmd()
1290 switch (cmd) { in mixer_ioctl_cmd()
1292 bcopy((void *)&m->enuminfo, arg, sizeof(oss_mixer_enuminfo)); in mixer_ioctl_cmd()
1310 if ((cmd & ~0xff) == MIXER_WRITE(0)) { in mixer_ioctl_cmd()
1320 ret = mixer_set(m, j, m->mutedevs, *arg_i); in mixer_ioctl_cmd()
1323 snd_mtxunlock(m->lock); in mixer_ioctl_cmd()
1326 if ((cmd & ~0xff) == MIXER_READ(0)) { in mixer_ioctl_cmd()
1347 snd_mtxunlock(m->lock); in mixer_ioctl_cmd()
1348 return ((v != -1) ? 0 : ENXIO); in mixer_ioctl_cmd()
1351 snd_mtxunlock(m->lock); in mixer_ioctl_cmd()
1358 char *name, int namelen, struct cdev **dev) in mixer_clone() argument
1364 if (strcmp(name, "mixer") == 0) { in mixer_clone()
1368 if (PCM_REGISTERED(d) && d->mixer_dev != NULL) { in mixer_clone()
1369 *dev = d->mixer_dev; in mixer_clone()
1400 mi->dev = unit; in mixer_oss_mixerinfo_unavail()
1401 snprintf(mi->id, sizeof(mi->id), "mixer%d (n/a)", unit); in mixer_oss_mixerinfo_unavail()
1402 snprintf(mi->name, sizeof(mi->name), "pcm%d:mixer (unavailable)", unit); in mixer_oss_mixerinfo_unavail()
1403 mi->card_number = unit; in mixer_oss_mixerinfo_unavail()
1404 mi->legacy_device = unit; in mixer_oss_mixerinfo_unavail()
1411 * in oss_miserinfo::dev. If set to -1, then information about the
1437 if (mi->dev == -1 && i_dev->si_devsw != &mixer_cdevsw) in mixer_oss_mixerinfo()
1452 if ((mi->dev == -1 && i == snd_unit) || mi->dev == i) { in mixer_oss_mixerinfo()
1466 if (!((d->mixer_dev == i_dev && mi->dev == -1) || in mixer_oss_mixerinfo()
1467 mi->dev == i)) { in mixer_oss_mixerinfo()
1472 if (d->mixer_dev->si_drv1 == NULL) { in mixer_oss_mixerinfo()
1479 m = d->mixer_dev->si_drv1; in mixer_oss_mixerinfo()
1480 mtx_lock(m->lock); in mixer_oss_mixerinfo()
1485 * - a specific PCM device is locked. in mixer_oss_mixerinfo()
1486 * - a specific mixer device has been locked, so be in mixer_oss_mixerinfo()
1490 mi->dev = i; in mixer_oss_mixerinfo()
1491 snprintf(mi->id, sizeof(mi->id), "mixer%d", i); in mixer_oss_mixerinfo()
1492 strlcpy(mi->name, m->name, sizeof(mi->name)); in mixer_oss_mixerinfo()
1493 mi->modify_counter = m->modify_counter; in mixer_oss_mixerinfo()
1494 mi->card_number = i; in mixer_oss_mixerinfo()
1499 mi->port_number = 0; in mixer_oss_mixerinfo()
1523 mi->enabled = device_is_attached(m->dev) ? 1 : 0; in mixer_oss_mixerinfo()
1549 snprintf(mi->devnode, sizeof(mi->devnode), "/dev/mixer%d", i); in mixer_oss_mixerinfo()
1550 mi->legacy_device = i; in mixer_oss_mixerinfo()
1552 mtx_unlock(m->lock); in mixer_oss_mixerinfo()
1571 if (m->lock == NULL) { in mixer_get_lock()
1574 return (m->lock); in mixer_get_lock()
1584 *pright = *pleft = -1; in mix_get_locked()
1585 return (-1); in mix_get_locked()
1601 return (mixer_set(m, dev, m->mutedevs, level)); in mix_set_locked()