如何解决在上层按键操作alsa code后无法调节驱动音量的原因

http://blog.csdn.net/morixinguan/article/details/56514356

之前写过一篇文章,是对alc5623.c codec部分进行了大致框架的分析,现在要解决一些实际问题,关于上层的代码我就不公布了,只公布在驱动的代码:

在手册中,我们看到一个这样的寄存器设置。

先来看看说明文档,主要是做主音量的输出。

下面就是详细的如何配置0x0C的寄存器

我遇到的问题是,到了上层应用,无法通过按键调节主音量,并会提示:

can't find simple control"Master",0

如何解决?

在kcontrol中添加一个Master,用它来做主音量控制。

static const struct snd_kcontrol_newalc5621_vol_snd_controls[] = {

         SOC_DOUBLE_TLV("MasterPlayback Volume",
                            ALC5623_STEREO_DAC_VOL,8, 0, 31, 1, vol_tlv),
         SOC_DOUBLE("MasterPlayback Switch",
                            ALC5623_STEREO_DAC_VOL,15, 7, 1, 1),

    …………………
};
 

SOC_DOUBLE_TLV在这个宏中已经配置了info和put函数,意思就是设置音量还有获取音量。

//set函数设置音量

nt snd_soc_info_volsw(struct snd_kcontrol*kcontrol,
         structsnd_ctl_elem_info *uinfo)
{
         structsoc_mixer_control *mc =
                   (structsoc_mixer_control *)kcontrol->private_value;
         intplatform_max;

         if(!mc->platform_max)
                   mc->platform_max= mc->max;
         platform_max= mc->platform_max;

         if(platform_max == 1 && !strstr(kcontrol->id.name, "Volume"))
                   uinfo->type= SNDRV_CTL_ELEM_TYPE_BOOLEAN;
         else
                   uinfo->type= SNDRV_CTL_ELEM_TYPE_INTEGER;

         uinfo->count= snd_soc_volsw_is_stereo(mc) ? 2 : 1;
         uinfo->value.integer.min= 0;
         uinfo->value.integer.max= platform_max;
         return0;
}

//put函数获取音量

int snd_soc_put_volsw(struct snd_kcontrol*kcontrol,
         structsnd_ctl_elem_value *ucontrol)
{
         structsoc_mixer_control *mc =
                   (structsoc_mixer_control *)kcontrol->private_value;
         structsnd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
         unsignedint reg = mc->reg;
         unsignedint reg2 = mc->rreg;
         unsignedint shift = mc->shift;
         unsignedint rshift = mc->rshift;
         intmax = mc->max;
         unsignedint mask = (1 << fls(max)) - 1;
         unsignedint invert = mc->invert;
         interr;
         booltype_2r = 0;
         unsignedint val2 = 0;
         unsignedint val, val_mask;

         val= (ucontrol->value.integer.value[0] & mask);
         if(invert)
                   val= max - val;
         val_mask= mask << shift;
         val= val << shift;
         if(snd_soc_volsw_is_stereo(mc)) {
                   val2= (ucontrol->value.integer.value[1] & mask);
                   if(invert)
                            val2= max - val2;
                   if(reg == reg2) {
                            val_mask|= mask << rshift;
                            val|= val2 << rshift;
                   }else {
                            val2= val2 << shift;
                            type_2r= 1;
                   }
         }
         err= snd_soc_update_bits_locked(codec, reg, val_mask, val);
         if(err < 0)
                   returnerr;

         if(type_2r)
                   err= snd_soc_update_bits_locked(codec, reg2, val_mask, val2);

         returnerr;
}

 

那么设置完后编译通过后下到板子里就可以正常驱动了。

还有一个问题,当耳机插入时,调节音量,耳机在放,喇叭也在放,怎么解决?

在耳机插入时:

只要将喇叭关掉,将耳机开启就可以了。

 

 

下面的这两步操作最为关键,当耳机插入时,关闭喇叭,将音源更新到耳机里。

snd_soc_update_bits(codec, 0x04, 0x8080,0x8080);
snd_soc_update_bits(codec, 0x02, 0x8080,0x0);
时间: 2024-08-19 22:26:37

如何解决在上层按键操作alsa code后无法调节驱动音量的原因的相关文章

卢玉华SEM解读黑帽SEO操作被罚后应对措施

导读:随着百度搜索引擎与其它各大搜索引擎的算法不断变新,站点采用黑帽SEO操作,一旦被各大搜索引擎发现,将会引来杀身之祸,我们应该如何解救黑帽SEO操作所带来的风险,下面由卢玉华SEM解读黑帽SEO操作被罚后应对措施,根据自己的观点与大家分享一下,网站一旦采用黑帽SEO操作,被搜索引擎发现,我们应该采取什么样的应对措施. 一.控制关键词密度策略 百度搜索引擎明文规定,页面的关键词不宜过多,不要插入不相关的关键词,否则视为作弊手法,很可能列入黑名单.对于关键词的密度,网络上有千资百态的说法.卢玉华

qtp11 5-qtp11.5安装后出现灾难性故障是什么原因,怎么解决

问题描述 qtp11.5安装后出现灾难性故障是什么原因,怎么解决 enter code here 错误描述:HP Unitied Functional Testing An unexcepted error occurred.

sqlite-Sqlite操作数据库释放资源后,文件依然处于占用状态

问题描述 Sqlite操作数据库释放资源后,文件依然处于占用状态 如题,我在用sqlite操作数据库的时候明显有了 if (sqliteHelper != null) { sqliteHelper.Dispose(); sqliteHelper = null; } 释放资源的过程,可是最后db3文件依然处于占用状态,请问怎么回事?过一会文件的占用状态就会恢复 解决方案 是打发打发大幅度释放

接口-SSl加密webservice后访问延时特长,求原因,求解决方法

问题描述 SSl加密webservice后访问延时特长,求原因,求解决方法 刚学了使用SSL加密,试着给之前的项目WebService接口增加了SSL机制, 但测试后本机上时间代价很短只有几百ms, 一旦两台电脑上客户端访问服务端,时间代价大概会有10,000ms. 求解答,求原因.

web开发 查询列表进入更新信息操作,更新后返回查询列表,如何保持查询条件呢

问题描述 web开发 查询列表进入更新信息操作,更新后返回查询列表,如何保持查询条件呢 web开发 当进入查询列表带条,然后进入更新信息操作,更新后返回查询列表, 如何保持查询条件呢 解决方案 刷新一下就好了~~~~~~~~~~~~~~~ 解决方案二: 具体的呢我也不好讲 大概提一下 当年我们就是利用隐藏按钮 将一些查询条件保存在value里面 解决方案三: 用session记录查询参数,然后返回链接增加上session记录的参数 如search.aspx string pms="";

电脑Realtek HD Audio无法调节麦克风音量大小解决方法

安装方法: 把rtkhdaud.dat文件复制到C:/WINDOWS/system32/drivers下,然后重新启动计算机即可解决 其实也可以通过批处理来搞定的,将下面的代码保存为 *.bat 的文件后缀,如Realtek_mic_fix.bat  代码如下 复制代码 @echo off echo Realtek HD Audio无法调节麦克风音量大小的补 echo by:pop http://www.111cn.net/ echo. copy rtkhdaud.dat %SystemRoot

17魔毯:帮助互联网用户解决紧急消费欠费,先用后付

摘要: 17魔毯是一个帮助互联网用户解决紧急消费欠费,先用后付的联运平台.与第三方支付商.信用卡.虚拟信用卡不同的是,它不收取手续费. 这个产品2013年4月份推出,它的使用场景是 "17魔毯"是一个帮助互联网用户解决紧急消费欠费,先用后付的联运平台.与第三方支付商.信用卡.虚拟信用卡不同的是,它不收取手续费. 这个产品2013年4月份推出,它的使用场景是:只要用户有一个手机号,当在网上买东西,比如下载一个应用或者游戏道具,或者网购其他的东西时,钱不够或者支付不方便的情况下,有临时的借

断开win2003远程桌面解决不自动注销操作

  解决办法如下: 开始-->运行-->gpedit.msc 计算机配置->管理模板->Windows组件->终端服务->会话 把"为断开的会话设置时间限制"改为"未被配置". 如果通过上面的操作,还会出现远程桌面连接断开过段时间之后,运行的软件自动关闭的话,就再进行以下操作: 开始-->运行-->tscc.msc 连接-->RDP-Tcp右键属性-->会话 把这里面的替代用户设置的设置都改为从不,并且把从

解决Win7电脑的操作中心打不开了问题

1.按下键盘上的win+R,然后输入service.msc并单击回车,这样就可以打开win7系统的服务窗口了. 2.在打开的服务窗口中,找到Security Center服务并双击打开,之后便会出现Security Center服务的编辑设置窗口了,在该窗口中,将该服务的启动类型设置为自动,然后点击服务状态下的启动按钮,设置完成之后,点击窗口下方的应用-确定进行保存就可以了. 好了以上就是关于win操作中心打不开了问题的解决办法了,当然其它的一些东西出现问题肯定也是可以尝试按此方法来解决了.