Linux Audio (4) DAPM-1 Kcontrol

news/2024/11/15 6:41:56/

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_ioctlcase 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); //找到对应的kctrolresult = 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 templatesnd_ctl_new(&kctl, access); //struct snd_kcontrol kctl;kctl->vd[idx].access = access;return kctl;

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


http://www.ppmy.cn/news/73609.html

相关文章

Evita项目-2-Evita中规定的安全汽车车载电子网络架构

目录 1 摘要 2 文章目的 3 安全需求 4 安全架构 4.1 硬件和软件分区 4.2 EVITA硬件安全模块

【嵌入式Linux】设备树基本语法

设备树基本语法 1_总领-本期设备树视频要怎么讲?讲什么?_哔哩哔哩_bilibili 基本的 特殊的 中断控制 描述GIC控制器 时钟 CPU GPIO 个数,保留范围(起始、长度),个数对应的名字 GPIO映射-这个脚被用了换一…

AC,AP以及三阶段项目

特点:access:连接终端设备 只能通过1个vlan trunk:交换机与交换机相连 可以通过多个vlan 共同特点:交换机的端口收发数据的规则: 收:如果收到的数据,没有携带任何标签,则使用该端口…

Linux---目录结构、绝对路径与相对路径、命令基础格式、ls命令

1. Linux的目录结构 Linux的目录结构是一个树型结构。 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘。 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面。 在Linux系统中,路径之间的层级关系,使用:/ 来表示。 Linux只…

nerfstudio介绍及在windows上的配置、使用

nerfstudio提供了一个简单的API,可以简化创建、训练和可视化NeRF的端到端过程。该库通过模块化每个组件来支持可解释的NeRF实现。nerfstudio源码地址: https://github.com/nerfstudio-project/nerfstudio , 通过模块化集成了多个NeRF扩展的实现,持续更新…

企业数字化转型到底该怎么做?

企业数字化转型涉及实施技术和利用数字工具来增强业务流程、改善客户体验和推动创新。主要包括: 愿景和战略:首先明确定义数字化转型目标。确定数字技术可以对企业的业务产生最重大影响的领域,例如运营效率、客户参与度或产品开发。 评估当前…

知识图谱构建全流程

一、知识图谱简介 知识图谱,是结构化的语义知识库,用于迅速描述物理世界中的概念及其相互关系,通过知识图谱能够将Web上的信息、数据以及链接关系聚集为知识,使信息资源更易于计算、理解以及评价,并能实现知识的快速响…

【消息中间件】RocketMQ如何保证消息的可靠性?

文章目录 前言一 、发送端消息可靠性1. 同步发送2. 异步发送3. 单向发送4. 发送重试策略 二、存储端消息可靠性1. 存储可靠性挑战2. 同步刷盘3. 异步刷盘(默认)4. 过期文件删除 三、消费端消息可靠性1. 消费重试2. 死信队列3. 消息回溯 四、总结参考与感…