does anyone have a good example or walkthrough how to change capture sources? I'm having a heck of a time.
my calls go like this:
/* setup */ snd_mixer_selem_id_alloca snd_mixer_open snd_mixer_attach snd_mixer_selem_register snd_mixer_load
/* set up PCM element, unused in this example */ snd_mixer_selem_id_set_index snd_mixer_selem_id_set_name snd_mixer_find_selem
/* set up Line element (linecapture) */ snd_mixer_selem_id_set_index snd_mixer_selem_id_set_name snd_mixer_find_selem
/* set up Mic element (miccapture) */ snd_mixer_selem_id_set_index snd_mixer_selem_id_set_name snd_mixer_find_selem
/* here's that part that throws me... I'm trying to sit in a loop and * trade capture back and forth between Line and Mic. code reproduced * here verbatim... */
do { snd_mixer_selem_channel_id_t chn; for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) { int junk;
if (snd_mixer_selem_has_capture_channel(linecapture, chn)) { status = snd_mixer_selem_get_capture_switch(linecapture, chn, &junk); assert(0 == status); printf("line, chn %d, junk %d, ", chn, junk); status = snd_mixer_selem_set_capture_switch(linecapture, chn, lineflag); printf("set %d\n", lineflag); assert(0 == status); }
if (snd_mixer_selem_has_capture_channel(miccapture, chn)) { status = snd_mixer_selem_get_capture_switch(miccapture, chn, &junk); printf("mic, chn %d, junk %d, ", chn, junk); assert(0 == status); status = snd_mixer_selem_set_capture_switch(miccapture, chn, micflag); printf("set %d\n", micflag); assert(0 == status); } }
for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) { if (snd_mixer_selem_has_capture_channel(linecapture, chn)) { status = snd_mixer_selem_get_capture_switch(linecapture, chn, &lineflag); printf("read line, chn %d: %d\n", chn, lineflag); assert(0 == status); }
if (snd_mixer_selem_has_capture_channel(miccapture, chn)) { status = snd_mixer_selem_get_capture_switch(miccapture, chn, &micflag); printf("read mic, chn %d: %d\n", chn, micflag); assert(0 == status); } }
if (lineflag) { lineflag = 0; micflag = 1; } else { lineflag = 1; micflag = 0; }
getchar();
} while (1);
I get output like this:
line, chn 0, junk 0, set 1 mic, chn 0, junk 1, set 0 line, chn 1, junk 1, set 1 mic, chn 1, junk 0, set 0 read line, chn 0: 1 read mic, chn 0: 0 read line, chn 1: 1 read mic, chn 1: 0
[all is well, alsamixer shows LR capture on Line input, smash return and go for another loop]
line, chn 0, junk 1, set 0 mic, chn 0, junk 0, set 1 line, chn 1, junk 1, set 0 mic, chn 1, junk 0, set 1 read line, chn 0: 1 read mic, chn 0: 1 read line, chn 1: 1 read mic, chn 1: 1
[here's where it goes funny. the "junk" is what I set last time, as expected, but the readbacks after the set_capture_switch indicate both line and mic are being captured? that's not right. alsamixer shows LR capture on Mic input. smack return again to see what happens.]
line, chn 0, junk 1, set 0 mic, chn 0, junk 1, set 1 line, chn 1, junk 1, set 0 mic, chn 1, junk 1, set 1 read line, chn 0: 0 read mic, chn 0: 1 read line, chn 1: 1 read mic, chn 1: 1
[this gets really weird. we make the same write calls we did last time, and now we get back something different? alsamixer shows R Line and L Capture. screwey.]
I feel I must be missing something obvious, like a flush operation, or something very simple. who knew changing a mux could be such an involved procedure? (=