Date: Tue, 15 Jul 2008 14:48:08 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 145283 for review Message-ID: <200807151448.m6FEm81K055987@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=145283 Change 145283 by hselasky@hselasky_laptop001 on 2008/07/15 14:47:48 Improve selection of recording sources. Make all selectors appear like recording selectors. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2.c#7 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/sound/uaudio2.c#7 (text+ko) ==== @@ -1682,7 +1682,6 @@ { const struct usb2_audio_selector_unit *d = iot[id].u.su; struct uaudio_mixer_node mix; - struct uaudio_mixer_node dummy; uint16_t i; DPRINTF(2, "bUnitId=%d bNrInPins=%d\n", @@ -1699,7 +1698,7 @@ mix.nchan = 1; mix.type = MIX_SELECTOR; - mix.ctl = SOUND_MIXER_NRDEVICES;/* XXXXX */ + mix.ctl = SOUND_MIXER_NRDEVICES; mix.minval = 1; mix.maxval = d->bNrInPins; @@ -1713,9 +1712,11 @@ for (i = 0; i < mix.maxval; i++) { mix.slctrtype[i] = uaudio_mixer_feature_name - (&iot[d->baSourceId[i]], &dummy); + (&iot[d->baSourceId[i]], &mix); } + mix.class = 0; /* not used */ + uaudio_mixer_add_ctl(sc, &mix); return; } @@ -3071,8 +3072,7 @@ sc->sc_mix_info |= (1 << mc->ctl); } if ((mc->ctl == SOUND_MIXER_NRDEVICES) && - (mc->type == MIX_SELECTOR) && - (mc->class == UAC_RECORD)) { + (mc->type == MIX_SELECTOR)) { for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) { if (mc->slctrtype[i - 1] == SOUND_MIXER_NRDEVICES) { @@ -3141,20 +3141,40 @@ uaudio_mixer_setrecsrc(struct uaudio_softc *sc, uint32_t src) { struct uaudio_mixer_node *mc; + uint32_t mask; + uint32_t temp; int32_t i; for (mc = sc->sc_mixer_root; mc; mc = mc->next) { if ((mc->ctl == SOUND_MIXER_NRDEVICES) && - (mc->type == MIX_SELECTOR) && - (mc->class == UAC_RECORD)) { + (mc->type == MIX_SELECTOR)) { + + /* compute selector mask */ + + mask = 0; + for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) { + mask |= (1 << mc->slctrtype[i - 1]); + } + + temp = mask & src; + if (temp == 0) { + continue; + } + /* find the first set bit */ + temp = (-temp) & temp; + + /* update "src" */ + src &= ~mask; + src |= temp; + for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) { - if (src != (1 << mc->slctrtype[i - 1])) { + if (temp != (1 << mc->slctrtype[i - 1])) { continue; } uaudio_mixer_ctl_set(sc, mc, 0, i); - src = (1 << mc->slctrtype[i - 1]); + break; } } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807151448.m6FEm81K055987>