From 8b42d2133384a4966c69d424b9673fa5412d04d4 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 1 Mar 2000 18:13:14 +0000 Subject: [PATCH] Changed the switch interface. Every switches are accessible via one ioctl. --- alsactl/merge.c | 10 +++--- alsactl/setup.c | 94 ++++++++++--------------------------------------- 2 files changed, 24 insertions(+), 80 deletions(-) diff --git a/alsactl/merge.c b/alsactl/merge.c index ea022a5..4ddf736 100644 --- a/alsactl/merge.c +++ b/alsactl/merge.c @@ -427,7 +427,7 @@ int soundcard_setup_process_switches(int cardno) for (ctlsw = mixer->switches; ctlsw; ctlsw = ctlsw->next) if (ctlsw->change) if (!soundcard_open_ctl(&ctlhandle, soundcard)) { - if ((err = snd_ctl_mixer_switch_write(ctlhandle, mixer->no, &ctlsw->s)) < 0) + if ((err = snd_ctl_switch_write(ctlhandle, &ctlsw->s)) < 0) error("Mixer switch '%s' write error: %s", ctlsw->s.name, snd_strerror(err)); } } @@ -435,14 +435,14 @@ int soundcard_setup_process_switches(int cardno) for (ctlsw = pcm->pswitches; ctlsw; ctlsw = ctlsw->next) { if (ctlsw->change) if (!soundcard_open_ctl(&ctlhandle, soundcard)) { - if ((err = snd_ctl_pcm_playback_switch_write(ctlhandle, pcm->no, &ctlsw->s)) < 0) + if ((err = snd_ctl_switch_write(ctlhandle, &ctlsw->s)) < 0) error("PCM playback switch '%s' write error: %s", ctlsw->s.name, snd_strerror(err)); } } for (ctlsw = pcm->rswitches; ctlsw; ctlsw = ctlsw->next) { if (ctlsw->change) if (!soundcard_open_ctl(&ctlhandle, soundcard)) { - if ((err = snd_ctl_pcm_capture_switch_write(ctlhandle, pcm->no, &ctlsw->s)) < 0) + if ((err = snd_ctl_switch_write(ctlhandle, &ctlsw->s)) < 0) error("PCM capture switch '%s' write error: %s", ctlsw->s.name, snd_strerror(err)); } } @@ -451,14 +451,14 @@ int soundcard_setup_process_switches(int cardno) for (ctlsw = rawmidi->oswitches; ctlsw; ctlsw = ctlsw->next) { if (ctlsw->change) if (!soundcard_open_ctl(&ctlhandle, soundcard)) { - if ((err = snd_ctl_rawmidi_output_switch_write(ctlhandle, rawmidi->no, &ctlsw->s)) < 0) + if ((err = snd_ctl_switch_write(ctlhandle, &ctlsw->s)) < 0) error("RAWMIDI output switch '%s' write error: %s", ctlsw->s.name, snd_strerror(err)); } } for (ctlsw = rawmidi->iswitches; ctlsw; ctlsw = ctlsw->next) { if (ctlsw->change) if (!soundcard_open_ctl(&ctlhandle, soundcard)) { - if ((err = snd_ctl_rawmidi_output_switch_write(ctlhandle, rawmidi->no, &ctlsw->s)) < 0) + if ((err = snd_ctl_switch_write(ctlhandle, &ctlsw->s)) < 0) error("RAWMIDI input switch '%s' write error: %s", ctlsw->s.name, snd_strerror(err)); } } diff --git a/alsactl/setup.c b/alsactl/setup.c index 7b157aa..45e3cde 100644 --- a/alsactl/setup.c +++ b/alsactl/setup.c @@ -205,69 +205,7 @@ void soundcard_setup_done(void) soundcards = NULL; } -static int switch_list(void *handle, snd_switch_list_t *list, int interface, int device) -{ - switch (interface) { - case 0: - return snd_ctl_switch_list(handle, list); - case 1: - return snd_ctl_mixer_switch_list(handle, device, list); - case 2: - return snd_ctl_pcm_playback_switch_list(handle, device, list); - case 3: - return snd_ctl_pcm_capture_switch_list(handle, device, list); - case 4: - return snd_ctl_rawmidi_output_switch_list(handle, device, list); - case 5: - return snd_ctl_rawmidi_input_switch_list(handle, device, list); - default: - return -EINVAL; - } -} - -static int switch_read(void *handle, snd_switch_t *sw, int interface, int device) -{ - switch (interface) { - case 0: - return snd_ctl_switch_read(handle, sw); - case 1: - return snd_ctl_mixer_switch_read(handle, device, sw); - case 2: - return snd_ctl_pcm_playback_switch_read(handle, device, sw); - case 3: - return snd_ctl_pcm_capture_switch_read(handle, device, sw); - case 4: - return snd_ctl_rawmidi_output_switch_read(handle, device, sw); - case 5: - return snd_ctl_rawmidi_input_switch_read(handle, device, sw); - default: - return -EINVAL; - } -} - -#if 0 -static int switch_write(void *handle, snd_switch_t *sw, int interface, int device) -{ - switch (interface) { - case 0: - return snd_ctl_switch_write(handle, sw); - case 1: - return snd_ctl_mixer_switch_write(handle, device, sw); - case 2: - return snd_ctl_pcm_playback_switch_write(handle, device, sw); - case 3: - return snd_ctl_pcm_capture_switch_write(handle, device, sw); - case 4: - return snd_ctl_rawmidi_output_switch_write(handle, device, sw); - case 5: - return snd_ctl_rawmidi_input_switch_write(handle, device, sw); - default: - return -EINVAL; - } -} -#endif - -static int determine_switches(void *handle, struct ctl_switch **csw, int interface, int device) +static int determine_switches(void *handle, struct ctl_switch **csw, int iface, int device, int channel) { int err, idx; snd_switch_list_t list; @@ -278,8 +216,11 @@ static int determine_switches(void *handle, struct ctl_switch **csw, int interfa *csw = NULL; bzero(&list, sizeof(list)); - if ((err = switch_list(handle, &list, interface, device)) < 0) { - error("Cannot determine switches for interface %i and device %i: %s", interface, device, snd_strerror(err)); + list.iface = iface; + list.device = device; + list.channel = channel; + if ((err = snd_ctl_switch_list(handle, &list)) < 0) { + error("Cannot determine switches for interface %i and device %i and channel %i: %s", iface, device, channel, snd_strerror(err)); return 1; } if (list.switches_over <= 0) @@ -291,16 +232,19 @@ static int determine_switches(void *handle, struct ctl_switch **csw, int interfa error("No enough memory..."); return 1; } - if ((err = switch_list(handle, &list, interface, device)) < 0) { - error("Cannot determine switches (2) for interface %i and device %i: %s", interface, device, snd_strerror(err)); + if ((err = snd_ctl_switch_list(handle, &list)) < 0) { + error("Cannot determine switches (2) for interface %i and device %i and channel %i: %s", iface, device, channel, snd_strerror(err)); return 1; } for (idx = 0, prev_csw = NULL; idx < list.switches; idx++) { item = &list.pswitches[idx]; bzero(&sw, sizeof(sw)); + sw.iface = iface; + sw.device = device; + sw.channel = channel; strncpy(sw.name, item->name, sizeof(sw.name)); - if ((err = switch_read(handle, &sw, interface, device)) < 0) { - error("Cannot read switch '%s' for interface %i and device %i: %s", sw.name, interface, device, snd_strerror(err)); + if ((err = snd_ctl_switch_read(handle, &sw)) < 0) { + error("Cannot read switch '%s' for interface %i and device %i and channel %i: %s", sw.name, iface, device, channel, snd_strerror(err)); free(list.pswitches); return 1; } @@ -372,7 +316,7 @@ static int soundcard_setup_collect_switches1(int cardno) return 1; } /* --- */ - if (determine_switches(handle, &card->control.switches, 0, 0)) { + if (determine_switches(handle, &card->control.switches, SND_CTL_IFACE_CONTROL, 0, 0)) { snd_ctl_close(handle); return 1; } @@ -386,7 +330,7 @@ static int soundcard_setup_collect_switches1(int cardno) } bzero(mixer, sizeof(struct mixer)); mixer->no = device; - if (determine_switches(handle, &mixer->switches, 1, device)) { + if (determine_switches(handle, &mixer->switches, SND_CTL_IFACE_MIXER, device, 0)) { snd_ctl_close(handle); return 1; } @@ -424,11 +368,11 @@ static int soundcard_setup_collect_switches1(int cardno) error("PCM info error: %s", snd_strerror(err)); return 1; } - if (determine_switches(handle, &pcm->pswitches, 2, device)) { + if (determine_switches(handle, &pcm->pswitches, SND_CTL_IFACE_PCM, device, SND_PCM_CHANNEL_PLAYBACK)) { snd_ctl_close(handle); return 1; } - if (determine_switches(handle, &pcm->rswitches, 3, device)) { + if (determine_switches(handle, &pcm->rswitches, SND_CTL_IFACE_PCM, device, SND_PCM_CHANNEL_CAPTURE)) { snd_ctl_close(handle); return 1; } @@ -454,11 +398,11 @@ static int soundcard_setup_collect_switches1(int cardno) error("RAWMIDI info error: %s", snd_strerror(err)); return 1; } - if (determine_switches(handle, &rawmidi->oswitches, 4, device)) { + if (determine_switches(handle, &rawmidi->oswitches, SND_CTL_IFACE_RAWMIDI, device, SND_RAWMIDI_CHANNEL_OUTPUT)) { snd_ctl_close(handle); return 1; } - if (determine_switches(handle, &rawmidi->iswitches, 5, device)) { + if (determine_switches(handle, &rawmidi->iswitches, SND_CTL_IFACE_RAWMIDI, device, SND_RAWMIDI_CHANNEL_INPUT)) { snd_ctl_close(handle); return 1; }