Hi CK, I added more details below:
On Thu, 10 Dec 2015 01:12:35 +0100 Danny Milosavljevic <[email protected]> wrote: > > > How does ALSA (or alsamixer) know which controls are "Capture"? > > I'm also curious to know how to seperate capture from playback. > > I digged into alsa-lib 1.0.28 some more and found out how control creation > and grouping works (I hope indentation will not get messed up in the > following): > > -> snd_mixer_load loads hctls > -> snd_hctl_load, these have a callback for event handling > -> simple_event_add > -> determines key directly (actually base_len checks > "suffixes", see below) > -> simple_add1(key <-- this is the "ctls" key; see > below) > -> selem_none_t allocation (by calloc; good > luck finding it) > -> snd_mixer_elem_new > -> key is corrected for enumerations > -> "ctls" dictionary (see below) is updated > -> simple_update (updates caps) > > The selem_none_t has a "ctls" dictionary which has an entry per gui control > type > (one for a switch, if any; one for a capture volume, if any; etcetc). > > static const struct suf { > const char *suffix; > selem_ctl_type_t type; > } suffixes[] = { > {" Playback Enum", CTL_PLAYBACK_ENUM}, > {" Playback Switch", CTL_PLAYBACK_SWITCH}, > {" Playback Route", CTL_PLAYBACK_ROUTE}, > {" Playback Volume", CTL_PLAYBACK_VOLUME}, > {" Capture Enum", CTL_CAPTURE_ENUM}, > {" Capture Switch", CTL_CAPTURE_SWITCH}, > {" Capture Route", CTL_CAPTURE_ROUTE}, > {" Capture Volume", CTL_CAPTURE_VOLUME}, > {" Enum", CTL_GLOBAL_ENUM}, > {" Switch", CTL_GLOBAL_SWITCH}, > {" Route", CTL_GLOBAL_ROUTE}, > {" Volume", CTL_GLOBAL_VOLUME}, > {NULL, 0} > }; > > A control ends up being SND_CTL_ELEM_TYPE_ENUMERATED by > snd_ctl_elem_add_enumerated. > That is called by alsa-utils alsactl: > > -> load_state (from usually "/var/lib/alsa/asound.state") > -> set_controls > -> set_control > -> checks whether comment access has "user" > -> if so, add_user_control > > So basically if it was in the file as ENUMERATED it is restored as ENUMERATED. > Also, in alisp it can end up as ENUMERATED if it was that way in the LISP > source. > Not sure how they are initially created... Also, the hctl come to be in the first place by: -> snd_hctl_load -> snd_ctl_elem_list -> snd_ctl_hw_elem_list -> ioctl SNDRV_CTL_IOCTL_ELEM_LIST and we are finally in kernel space, more specifically in file "sound/core/control.c". -> snd_ctl_ioctl -> snd_ctl_elem_list -> snd_kcontrol (actually list_entry of struct snd_kcontrol) -> snd_ctl_build_ioff ("returns" new ID with indices shifted by offset) The snd_kcontrol_new we have are converted by a call to snd_ctl_new1() (in file "sound/soc/soc-core.c"). -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
