⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wm8782-mixer.h

📁 根据芯片WM8782在LINUX环境下实现的音频驱动
💻 H
字号:
/*
 * wm8782-mixer.h
 *
 * 
 */
#ifndef __WM8782_MIXER__
#define __WM8782_MIXER__

 
/* enumerated kcontrol */
struct snd_wm8782_enum {
	unsigned short reg;
	unsigned short reg2;
	unsigned char shift_l;
	unsigned char shift_r;
	unsigned int mask;
	const char **texts;
	void *dapm;
};
 
/*
 * Convenience kcontrol builders
 */
#define SOC_SINGLE_VALUE(reg,shift,mask,invert) ((reg) | ((shift) << 8) |\
	((shift) << 12) | ((mask) << 16) | ((invert) << 24))
	
#define SOC_SINGLE_VALUE_EXT(reg,mask,invert) ((reg) | ((mask) << 16) |\
	((invert) << 31))
	
#define SOC_SINGLE(xname, reg, shift, mask, invert) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
	.info = snd_wm8782_info_volsw, .get = snd_wm8782_get_volsw,\
	.put = snd_wm8782_put_volsw, \
	.private_value =  SOC_SINGLE_VALUE(reg, shift, mask, invert) }
	
#define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
	.info = snd_wm8782_info_volsw, .get = snd_wm8782_get_volsw, \
	.put = snd_wm8782_put_volsw, \
	.private_value = (reg) | ((shift_left) << 8) | \
		((shift_right) << 12) | ((mask) << 16) | ((invert) << 24) }
		
#define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
	.info = snd_wm8782_info_volsw_2r, \
	.get = snd_wm8782_get_volsw_2r, .put = snd_wm8782_put_volsw_2r, \
	.private_value = (reg_left) | ((shift) << 8)  | \
		((mask) << 12) | ((invert) << 20) | ((reg_right) << 24) }
		
#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts) \
{	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
	.mask = xmask, .texts = xtexts }
	
#define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts) \
	SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xtexts)
	
#define SOC_ENUM_SINGLE_EXT(xmask, xtexts) \
{	.mask = xmask, .texts = xtexts }

#define SOC_ENUM(xname, xenum) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
	.info = snd_wm8782_info_enum_double, \
	.get = snd_wm8782_get_enum_double, .put = snd_wm8782_put_enum_double, \
	.private_value = (unsigned long)&xenum }

#if 0	
#define SOC_SINGLE_EXT(xname, xreg, xmask, xinvert,\
	 xhandler_get, xhandler_put) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
	.info = snd_soc_info_volsw_ext, \
	.get = xhandler_get, .put = xhandler_put, \
	.private_value =  SOC_SINGLE_VALUE_EXT(xreg, xmask, xinvert) }
	
#define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
	.info = snd_soc_info_bool_ext, \
	.get = xhandler_get, .put = xhandler_put, \
	.private_value = xdata }
	
#define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
	.info = snd_soc_info_enum_ext, \
	.get = xhandler_get, .put = xhandler_put, \
	.private_value = (unsigned long)&xenum }
#endif


//int snd_wm8782_update_bits(unsigned short reg,unsigned short mask, unsigned short value);
int snd_wm8782_info_volsw(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_info *uinfo);
int snd_wm8782_get_volsw(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol);
int snd_wm8782_put_volsw(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol);
int snd_wm8782_info_volsw_2r(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_info *uinfo);
int snd_wm8782_get_volsw_2r(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol);
int snd_wm8782_put_volsw_2r(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol);
int snd_wm8782_info_enum_double(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_info *uinfo);
int snd_wm8782_get_enum_double(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol);
int snd_wm8782_put_enum_double(struct snd_kcontrol *kcontrol,struct snd_ctl_elem_value *ucontrol);


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -