Linux Audio (4) DAPM-1 Kcontrol

news2024/11/29 4:35:32

DAPM-1 Kcontrol

  • 控制部件之kcontrol
    • snd_kcontrol_new 结构体
    • 如何定义snd_kcontrol_new?
    • 如何使用snd_kcontrol?
    • 添加kcontrol代码分析

课程:韦东山音频专题
内核:Kernel 3.5
但是我用的实例和课程不同,以防止编程记流水账

控制部件之kcontrol

Kcontrol的核心点:
(1) 一个声卡有多个kcontrol
(2) 一个kcontrol对应一个功能,如调音量,开关录音等
(3) kcontrol中有函数来设置功能

代码分析:
课程实例:
wm8960.c sound\soc\codecs 28499 2019/7/20 459
博客实例:
uda134x.c sound\soc\codecs 16565 2019/7/20 344

snd_kcontrol_new 结构体

#define SOC_SINGLE(xname, reg, shift, max, invert) \
{	.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 =  SOC_SINGLE_VALUE(reg, shift, max, invert) }

static const struct snd_kcontrol_new uda1341_snd_controls[] = {
SOC_SINGLE("Master Playback Volume", UDA134X_DATA000, 0, 0x3F, 1),
SOC_SINGLE("Capture Volume", UDA134X_EA010, 2, 0x07, 0),
struct snd_kcontrol_new {
    ...
	snd_kcontrol_info_t *info;
	snd_kcontrol_get_t *get;
	snd_kcontrol_put_t *put;
    ...
    unsigned long private_value;
};

从snd_kcontrol_new 结构体中成员变量:

  • .info : 获取kcontrol的信息
  • .get : 获取kcontrol的值
  • .set : 设置kcontrol的值
  • .private_value : 供info, get, set三个函数使用,也许会有寄存器地址以及位偏移信息。

如何定义snd_kcontrol_new?

include\sound\soc.h中有定义了宏来方便定义:

#define SOC_SINGLE(xname, reg, shift, max, invert) \
{	.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 =  SOC_SINGLE_VALUE(reg, shift, max, invert) }

比如SOC_SINGLE("Master Playback Volume", UDA134X_DATA000, 0, 0x3F, 1),
#define UDA134X_DATA000 10
在这里插入图片描述

如何使用snd_kcontrol?

上层通过ioctl调用kcontrol的file operation函数。

APP: open("/dev/snd/controlC0")
         ioctrl  -- > snd_ctl_ioctl
         	case SNDRV_CTL_IOCTL_ELEM_READ:
         	snd_ctl_elem_read_user(card, argp);
         		snd_ctl_elem_read(card, control);
         			kctl = snd_ctl_find_id(card, &control->id); //找到对应的kctrol
         				result = kctl->get(kctl, control); // .get函数在定义kcontrol时定义

在这里插入图片描述

添加kcontrol代码分析


搜索uda1341_snd_controls看到有在probe()函数中调用。

uda134x_soc_probe(struct snd_soc_codec *codec)
	snd_soc_add_codec_controls(codec, uda1341_snd_controls,...)
		snd_soc_add_controls()
			//snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
			snd_ctl_add(card, snd_soc_cnew(control, data, control->name, prefix));
				list_add_tail(&kcontrol->list, &card->controls);

snd_soc_cnew(control, data, control->name, prefix) 将 snd_kcontrol_new 构造成 snd_kcontrol,下面来看下这个函数:

snd_soc_cnew(control, data, control->name, prefix)
	kcontrol = snd_ctl_new1(&template, data); //create a control instance from the template
		snd_ctl_new(&kctl, access); //struct snd_kcontrol kctl;
			kctl->vd[idx].access = access;
			return kctl;

看来是分配了一个struct snd_kcontrol kctl,然后把snd_kcontrol_new 信息填充进去。
在这里插入图片描述

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

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

相关文章

【周末闲谈】你知道物联网技术吗?

连接万物,创造未来。从智能家居到智慧医疗,从智能车联到智慧城市,物联网技术的影响已经悄然渗透到了我们的方方面面。欢迎大家积极讨论联网技术如何影响了我们的生活。 个人主页:【😊个人主页】 系列专栏:【…

微软和OpenAI联手推出了GitHub Copilot这一AI编程工具,可根据开发者的输入和上下文,生成高质量的代码片段和建议

只需要写写注释,就能生成能够运行的代码?对于程序员群体来说,这绝对是一个提高生产力的超级工具,令人难以置信。实际上,早在2021年6月,微软和OpenAI联手推出了GitHub Copilot这一AI编程工具。它能够根据开发…

【计算机网络复习】第四章 网络层 3

路由器的功能和层次 o 计算机网络的核心设备 o 具有多个输入接口和多个输出接口 o 任务是转发IP包:将从某个输入接口收到的I包,按照要去的目的地(即目的网络),从路由器的某个合适的输出接口转发给下一跳路由器 …

基于ssm+vue的驾校在线培训平台

基于ssmvue的驾校在线培训平台 系统功能 普通用户 新闻咨讯:可以查看系统新闻并进行评论、收藏和点赞 教资信息查看:普通用户登录系统可以查看驾校教资情况 系统通知信息:用户可以查看网站相关通知公告信息 在线报名:普通用户可…

C++ 初始模板

模板 void Swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; }void Swap(double* x, double* y) {double tmp *x;*x *y;*y tmp; }void Swap(char* x, char* y) {char tmp *x;*x *y;*y tmp; } 如上述所示,我们在实现函数的时候,有很多函数会像…

【C++ 入坑指南】(09)数组

文章目录 简介一维数组1. 定义2. 特点3. 用途4. 示例 二维数组1. 定义2. 用途3. 示例 简介 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 一维数组 1. 定义…

外企还是香啊~

小伙伴们大家好,我是阿秀。 三月份的时候我看了下外企,查了一些资料,最后查下来远远比我想的要多,可能很多人跟我一样,对外企的印象都停留在微软、谷歌、intel这些比较市值大的公司上。 其实远远不止,广义上…

密码学安全性证明(一)Cramer-Shoup密码系统

Cramer-Shoup密码系统来自于A Practical Public Key CryptosystemProvably Secure against Adaptive ChosenCiphertext Attack这篇论文 CDH问题回顾: 已知(g,g^x, gk)能否计算gxk DDH问题回顾: 已知(g,g^x, g^k ,D)能否判断D是否等于g^xk 注意…

港科夜闻|香港科技大学赛马会研究院两位成员入选美国国家科学院

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学赛马会研究院两位成员入选美国国家科学院。香港科技大学赛马会研究院Gunther Uhlmann教授和香港科技大学客座教授戴碧瓘教授因在原创性研究方面的杰出和可持续的成就,入选美国国家科学院(NAS)。G…

API接口的工作原理以及可以帮我们实现什么功能?

一、API接口的工作原理 API接口是应用程序编程接口(Application Programming Interface)的缩写,是不同软件系统之间进行通信的一种方式。 API接口的工作原理是,通过预定义的接口规范,软件系统可以调用或提供API接口的服务,来实现…

【开源项目】权限框架Nepxion Permission原理解析

项目介绍 Nepxion Permission是一款基于Spring Cloud的微服务API权限框架,并通过Redis分布式缓存进行权限缓存。它采用Nepxion Matrix AOP框架进行切面实现,支持注解调用方式,也支持Rest调用方式 项目地址 https://toscode.gitee.com/nepxion…

实现图形算法API[软光栅渲染器,C++]

最近有点烦,发烧感冒了三天[事实上是俩天,第三天是因为摆得太舒服了索性多玩一天],啥都没学,打守望先锋也把把被虐...,想着今天来提起键盘把之前的东西都总结一下。 那么话归真题,首先我是仿造opengl来写的…

tensorflow/keras如何自定义layer

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Linux高级 I/O(3)】如何使用阻塞 I/O 与非阻塞 I/O?——poll()函数

poll()函数介绍 系统调用 poll()与 select()函数很相似,但函数接口有所不同。在 select()函数中,我们提供三个 fd_set 集合,在每个集合中添加我们关心的文件描述符;而在 poll()函数中,则需要构造一个 struct pollfd 类…

opencv图像增强实现方法

opencv是一款开源的图像增强工具,主要用于在 python环境下实现图像增强功能。 使用 opencv实现图像增强,需要使用 opencv的 GUI模块,如图1所示。 在 opencv中,有一个 datasets模块,这个模块主要用于处理数据和可视化操…

剑指 Offer 30. 包含min函数的栈【辅助栈】

剑指 Offer 30. 包含min函数的栈【辅助栈】 文章目录 剑指 Offer 30. 包含min函数的栈【辅助栈】题目描述题解 题目描述 题解 class MinStack {/*** initialize your data structure here.*/Stack<Integer> A, B;public MinStack(){A new Stack<Integer>();B ne…

使用OpenCV进行肺炎诊断检测

肺炎是一种由感染引起的严重呼吸道疾病&#xff0c;特别是在高危人群中&#xff0c;可能会出现危及生命的并发症。必须尽快诊断和治疗肺炎&#xff0c;以最大限度地提高患者康复的机会。 诊断过程并不容易&#xff0c;需要一些医学实验室工具和先进的医疗技能&#xff0c;但我们…

计算机专业毕业,有人Offer 50w,有人挂科重修!

昨天有两个VIP的小伙伴问我问题&#xff1a; 同学小明&#xff1a;孟哥&#xff0c;我小硕一枚&#xff0c;有两个offer&#xff0c;一个拿到了阿里的offer&#xff0c;乱七八糟加起来有四五十&#xff1b;还有一个是老家的电网。但是父母想让我回去&#xff0c;毕竟稳定&#…

Kali-linux绕过Utilman登录

Utilman是Windows辅助工具管理器。该程序是存放在Windows系统文件中最重要的文件&#xff0c;通常情况下是在安装系统过程中自动创建的&#xff0c;对于系统正常运行来说至关重要。在Windows下&#xff0c;使用WindowsU组合键可以调用Utilman进程。本节将介绍绕过Utilman程序登…

瑞芯微RGMII的配置

主要配置项 除去复位等信号&#xff0c;我们主要关注两大块的配置&#xff1a; 时钟配置 MAC 采用125M时钟&#xff0c;PHY采用25M时钟。 主要配置时钟源&#xff0c;这个和具体硬件连线强相关。例如125M时钟可以来源于soc内部的PLL&#xff0c;也可以由对端PHY 提供。 由对端P…