Skip site navigation (1)Skip section navigation (2)
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>