ALSA声卡12_从零编写之添加音量控制_学习笔记

1、设置音量时应用程序的调用过程

(1)strace分析: amixer cset numid=1 30 (设置音量)
/dev/snd/controlC0
open
SNDRV_CTL_IOCTL_CARD_INFO
SNDRV_CTL_IOCTL_PVERSION
SNDRV_CTL_IOCTL_ELEM_INFO
SNDRV_CTL_IOCTL_ELEM_READ
SNDRV_CTL_IOCTL_ELEM_WRITE : snd_ctl_elem_write_user

(2)应用程序调用SNDRV_CTL_IOCTL_ELEM_WRITE时,驱动程序调用snd_ctl_elem_write_user函数,这个函数从用户空间把一些参数拷贝进来,然后调用函数snd_ctl_elem_write

(3)函数snd_ctl_elem_write

找到一个snd_kcontrol结构体,然后调用snd_control结构体的put函数。


(4)这个snd_kcontrol结构体是谁提供的

ASOC驱动程序分为3大块(machine,codec,platform),应该在codec这一块来提供的,因为它跟声卡密切相关。去调节音量的时候肯定要调整它



2、写程序(uda1341.c(codec))

(1)结构体snd_kcontrol_new

static const struct snd_kcontrol_new uda1341_vol_control = 
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, //表示snd_kcontrol结构体用于哪一类设备(表示进行参数设置)
    .name = "Master Playback Volume",  //音量控制,每个声卡驱动程序的snd_kcontrol各不相同,为什么应用程序都可以调整它的音量,对于某些常用的属性,它们都有固定的名字。应用程序根据名字找到它的snd_kcontrol项,调用里面的put函数。
.info = uda1341_info_vol,  //获得一些信息,如音量范围是多少
.get  = uda1341_get_vol,//获得当前的音量值
.put  = uda1341_put_vol, //设置音量
};


(2) 获得音量信息,比如最小值最大值

/*
 * 获得音量信息,比如最小值最大值
 */

int uda1341_info_vol(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;//音量值的类型是整数
uinfo->count = 2;//声道数是双声道的
uinfo->value.integer.min = 0;//最小整数,
uinfo->value.integer.max = 63;//最大整数,
return 0;
}

因为uda1341的音量控制是6位的(0表示最大音量,63表示最小音量),而应用程序中0表示最小音量,值越大表示音量越大


(3)获得当前音量值

/*
 * 获得当前音量值
 */

int uda1341_get_vol(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);


    ucontrol->value.integer.value[1] = \  //这里 \  表示ucontrol->value.integer.value[0] 等于ucontrol->value.integer.value[1] ,因为是双声道
ucontrol->value.integer.value[0] = 63 - snd_soc_read(codec, UDA1341_DATA00);//读寄存器DAT00的值,因为驱动程序的值和应用程序的值大小是相反的,uda1341不支持寄存器的读操作,要想得到一个寄存器的值,是去读某个cache(这个cache保存的是设置寄存器的值)
return 0;
}

(4) 设置当前音量值

/*
 * 设置当前音量值
 */

int uda1341_put_vol(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
unsigned int val;


val = 63 - ucontrol->value.integer.value[0];//应用程序传进来的值写到寄存器里面要反转


    snd_soc_write(codec, UDA1341_DATA00, val);//把值val写到寄存器DATA00中去
    
return 0;
}

3、结构体snd_kcontrol_new和内核部分的连接

(1)probe函数

static int uda1341_soc_probe(struct snd_soc_codec *codec)
{
    int ret;
    uda1341_init_regs(codec);
    
ret = snd_soc_add_codec_controls(codec, &uda1341_vol_control, 1);
    return ret;
}


4、测试


amixer  controls查看控制项

amixer cget numid=1表示查看当前音量

amixer cset numid=1 30设置音量



5、Input Mux

因为不同的板子的麦克风通道不同(在uda1341),用同一驱动,想录音时应用程序应该设置input mux选项。



表明它能选择哪个麦克风通道,当前是哪一个麦克风通道,设置哪一个麦克风通道


值uda134x_mixer_enum[2]是数组的第2项


6、

让板子使用内核自带的驱动程序


查看设备节点和控制项(input mux在倒数第二项)


查看控制项第11项的值(当前值是0)


若选择第1个通道(模拟通道)最后1个参数表明第几个通道



转载于:https://www.cnblogs.com/alan666/p/8311864.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

twrp3.3.0刷n9002_插画师必备笔刷,送你5套iPad5.0新出300款大神笔刷

由于插画行业的蒸蒸日上,人们对于插画的喜爱程度也大大提高。本身由于插画的趣味性,因此插画成为了不论在男女老幼之间都十分受欢迎的存在。尤其是目前来说最受欢迎之一的iPad插画绘制设计,相信很多在做的同学都有过想要学习插画设计的冲动&a…

恒压板框过滤实验数据处理_高考化学实验中:那些不常见的【特殊仪器】与装置,难得的资料...

高考化学实验试题中有时会涉及到一些不常见的仪器装置,增大了试题分析解答的难度。学长现将一些特殊仪器与装置都一一整理出来,供小伙伴们参考学习,以后试题中再见到它们就再也不怕啦!1.三颈烧瓶(三颈烧瓶&…

pr如何处理音效,如何让你的声音变得干净又清晰?PR音频降噪教程

大家好,我是兴业,欢迎来到我的PR教程。受周围环境的影响,相信很多小伙伴在录制自己的vlog视频时都会产生或多或少的噪音,就拿笔者来说,本来就是合租的房子,室友又经常打游戏,所以很难找到一个安…

苹果笔记本电脑好用吗_苹果新品发布会消息汇总(8月25日)

随着苹果秋季发布会的临近,各种关于新 iPhone 的爆料也逐渐由外观向一些更具体的产品细节上聚焦。就在近日,一向在苹果新品上有着较准确爆料信息的彭博社又发文对未来数周和数月内苹果将发布或升级的一系列新产品进行了信息汇总。我们一起来了解下。  …

webdav 软件_6 款功能强大的工具软件,有一款人人必备

DaVinci Resolve(达芬奇)DaVinci Resolve 是一款视频后期处理调色软件。它可能是最强大的色彩音频视觉调色软件。它最高支持8K 视频编辑。不管是业余爱好者还是好莱坞专业的视频,使用它都可以满足需求。它还支持处理视觉特效和3D 空间。它有250 种可以合成矢量图片&…

python打开文件要wordcloud吗,使用python创建wordcloud

我正在尝试在清理文本文件后在python中创建wordcloud,我得到了所需的结果,即大多数在文本文件中使用但无法绘制的单词.我的代码:import collectionsfrom wordcloud import WordCloudimport matplotlib.pyplot as pltfile open(example.txt, encoding utf8 )stopwo…

java商城_java开源商城系统的优势是什么?

电商平台开发大家都知道,java开放性源码提供了开发商便利,经过开发商对源码的二次修改,在系统的易用性和实用性方面都得到了空前的突破,真正达到了只要会打字就能够建设专业水准的商城系统。采用java开源商城系统的商城都有安全、…

裸奔浏览器_躲进浏览器隐私模式就安全了吗?相当于闭着眼睛裸奔

「隐私模式」是浏览器的一个功能,记得小淙第一次看到这个充满安全感的名字时,心中一阵狂喜,如获珍宝,从此走上了不归路。多少个寂寞难耐的夜,我默默打开隐私模式,页面中间黑色的小人是我最默契的战友&#…

什么是ie浏览器_?IE 浏览器为什么不招人待见?

在一篇博客中,微软将 Internet Explorer 称为「兼容性解决方案」,而不是浏览器。在全球最大的桌面操作系统上推广浏览器,成功看起来是理所当然的,但 IE 却没能做到。在上周发布的一篇博客中,微软将 Internet Explorer …

富士通台式电脑_电脑bios怎么进入-电脑bios进入方法介绍

很多用户在使用电脑时候想要进入BIOS系统,但是不知道该按那个按键操作,其实不同品牌的电脑和不同主板的电脑进入BIOS按键都是不一样的,小编整理了一写不同电脑进入BIOS的方法,一起来看看吧~ 电脑bios进入方法介绍: 一、…

四阶混合累积量matlab_12m氢燃料电池城市客车电电混合动力系统设计方案

文章来源:《12m氢燃料电池城市客车电电混合动力系统设计方案》随着氢燃料电池技术的进步,氢燃料电池客车的优势越发明显,和传统客车比,零污染、零排放;和纯电动客车比,加注燃料速度快、续航里程更…

bzoj1094[ZJOI2007]粒子运动 计算几何

1094: [ZJOI2007]粒子运动 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 658 Solved: 164[Submit][Status][Discuss]Description 阿Q博士正在观察一个圆形器皿中的粒子运动。不妨建立一个平面直角坐标系,圆形器皿的圆心坐标为(x0, y0),半径为R。器…

linux自动挂载磁盘命令,使用mount命令配置Linux自动挂载

使用mount命令来挂载硬件,在Linux重启后这些挂载信息会丢失,因此对应磁盘这类硬件,需要配置自动挂载来保证系统重启时进行自动挂载。自动挂载信息保存在文件/etc/fstab文件中查看该文件的数据:rootlocalhost dev]# cat /etc/fstab…

webview 防止js注入_天台县js聚合物水泥防水涂料的作用

天台县js聚合物水泥防水涂料的作用 2、JS防水涂料建筑胶粉与801建筑胶水的区别在哪?彩色聚氨酯防水涂料施工要点: 彩色聚氨酯防水涂料注意事项:1、材料必须按配比混合搅拌均匀,混合后的物料应在20分钟内用完。2、施工温度宜在5℃以上&#x…

10年老电脑如何提速_电脑越用越卡?如何简单升级,让你的旧笔记本瞬间提速...

很多人的笔记本电脑使用几年之后往往越来越卡,体验也随之下降。其实,很多时候你无需购置新品,对现有的电脑进行简单的配置升级就能让它提速,变得更为流畅,如果只是用于日常码字、办公,完全还能胜任&#xf…

linux服务器每次重启卡住,运维如何解决Linux服务器重启后命令无法正常使用的问题...

原标题:运维如何解决 Linux 服务器重启后命令无法正常使用的问题前提:在Linux系统中安装ASM,安装完ASM和Oracle数据库时都是正常使用的,但在重启服务器后Oracle相关命令不识别。1、截图如下:2、查看环境变量是否正常命…

web 三联发票针式打印_打印机共享操作,其实没想象的那么难

工作中桌面型的打印机一般是用USB直连一台主机,然后共享给其它电脑进行打印的,如:针式发票打印机、喷墨打印机等,这时就会涉及到一个打印机共享的操作,今天就跟大家分享下共享操作。共享操作:在主机安装好打…

linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文…

win10远程桌面连接_如何正确选择WIN10系统版本,Windows10系统各版本之间的区别...

截至2020年,Windows 10的市场份额达到了54.62%,成为了Windows家庭中占比最高的成员。微软也于2020年初对Windows 7做了不再进行技术支持的声明!毋庸置疑的是,Windows 10的系统会逐渐占有更多的比例,并且逐步取代现有的…

win10进程太多怎么优化_用过最好用的Win10优化软件,全方面优化和管理!

文 | Allen 主播 | 蓝儿喵本文首发:www.zylxb.comHi,大家好,欢迎来到:无优质,不分享!搜罗君的藏宝阁:优搜罗(id:usouluo),由于公众号改版,建议大家星标置顶…