PERFORCE change 145283 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Jul 15 14:48:09 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=145283
Change 145283 by hselasky at 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;
}
}
}
More information about the p4-projects
mailing list