struct snd_kcontrol_new { snd_ctl_elem_iface_t iface; /* interface identifier */ unsigned int device; /* device/client number */ unsigned int subdevice; /* subdevice (substream) number */ unsigned char *name; /* ASCII name of item */ unsigned int index; /* index of item */ unsigned int access; /* access rights */ unsigned int count; /* count of same elements */ snd_kcontrol_info_t *info; snd_kcontrol_get_t *get; snd_kcontrol_put_t *put; union { snd_kcontrol_tlv_rw_t *c; const unsigned int *p; } tlv; unsigned long private_value; }; struct soc_mixer_control { int min, max, platform_max; unsigned int reg, rreg, shift, rshift, invert; }
static const struct snd_kcontrol_new rt5625_snd_controls[] = { ... SOC_DOUBLE("Headphone Playback Switch", RT5625_HP_OUT_VOL, RT5625_L_MUTE_SFT, RT5625_R_MUTE_SFT, 1, 1), ... };
#define SOC_DOUBLE(xname, xreg, shift_left, shift_right, xmax, xinvert) \ { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \ .put = snd_soc_put_volsw, \ .private_value = (unsigned long)&(struct soc_mixer_control) \ { .reg = xreg, .shift = shift_left, .rshift = shift_right, \ .max = xmax, .platform_max = xmax, .invert = xinvert \ } \ }
/* * DAPM audio route definition. * * Defines an audio route originating at source via control and finishing * at sink. */ struct snd_soc_dapm_route { const char *sink; const char *control; const char *source; /* Note: currently only supported for links where source is a supply */ int (*connected)(struct snd_soc_dapm_widget *source, struct snd_soc_dapm_widget *sink); };
沒有留言:
張貼留言