Linux Audio (6) DAPM-3 damp的kcontrol注册过程

news2024/11/26 2:45:25

DAPM-3 damp的kcontrol注册过程

  • 普通kcontrol
  • DAMP kcontrol
    • 第一步 codec驱动add widget
    • 第二步 Mechine驱动add kcontrol

  • damp的注册过程

在这里插入图片描述

普通kcontrol

定义:

static const struct snd_kcontrol_new wm8960_snd_controls[] = {
SOC_DOUBLE_R_TLV("Capture Volume", WM8960_LINVOL, WM8960_RINVOL,
		 0, 63, 0, adc_tlv),

Trace 普通的kcontrol是如何添加到内核中去的,其实在Linux Audio (4) DAPM-1 Kcontrol 中有分析过(uda1341为例),下面以wm8960为例:

wm8960_probe(struct snd_soc_codec *codec)
	snd_soc_add_codec_controls(codec, wm8960_snd_controls, ARRAY_SIZE(wm8960_snd_controls));
		snd_soc_add_controls(card, codec->dev, controls, num_controls, codec->name_prefix, codec);
			snd_ctl_add(card, snd_soc_cnew(control, data, control->name, prefix));
				list_add_tail(&kcontrol->list, &card->controls);
// snd_soc_cnew() 将snd_kcontrol_new转化为kcontrol

将数组中的每个snd_kcontrol_new转化为kcontrol并且挂到card->controls链表中。

DAMP kcontrol

Left Boost Mixer为例,该widget包含一个Mixer和三个kcontrol;而Muxer则只包含有一个kcontrol;
在这里插入图片描述

  • 第一步
    调用 snd_soc_dapm_new_controls 把widget放入dapm->card->widgets链表中

  • 第二步
    在注册machine驱动时,导致如下调用:
    soc_probe_dai_link --> soc_post_component_init --> snd_soc_dapm_new_widgets

    在 snd_soc_dapm_new_widgets 中:

    • 对于每一个widget,设置power_check函数(判断是否应该上电)
    • 对于mixer widget,取出其中的kcontrol_new构造出snd_kcontrol, 放入card->controls链表
    • 对于mixer widget,只有一个kcontrol_new,构造出snd_kcontrol, 放入card->controls链表

第一步 codec驱动add widget

将Mixer widget放入声卡链表中:

wm8960_probe(struct snd_soc_codec *codec)
	wm8960_add_widgets(codec);
		snd_soc_dapm_new_controls(dapm, wm8960_dapm_widgets,ARRAY_SIZE(wm8960_dapm_widgets));
			snd_soc_dapm_new_control(dapm, widget);
				list_add(&w->list, &dapm->card->widgets); //添加到声卡中的widgets链表中
				
		snd_soc_dapm_add_routes(dapm, audio_paths, ARRAY_SIZE(audio_paths));
			snd_soc_dapm_add_route(dapm, route); // for (i = 0; i < num; i++) {
				list_add(&path->list, &dapm->card->paths);
				list_add(&path->list_sink, &wsink->sources);
				list_add(&path->list_source, &wsource->sinks);

第二步 Mechine驱动add kcontrol

三个kcontrol的注册过程

snd_smdk_probe(struct platform_device *pdev) // Mechine驱动的probe()函数
	snd_soc_register_card(struct snd_soc_card *card)
		snd_soc_instantiate_card(struct snd_soc_card *card)
			soc_probe_dai_link()
				soc_post_component_init(card, codec, num, 0);
					snd_soc_dapm_new_widgets(&codec->dapm); //Make sure all DAPM widgets are instantiated

对于Mixer 和 Muxer有不同的处理
在这里插入图片描述

  • Mixer
snd_soc_dapm_new_widgets(&codec->dapm); //Make sure all DAPM widgets are instantiated
	dapm_new_mixer(w); //create new dapm mixer control
		for (i = 0; i < w->num_kcontrols; i++) {
			path->kcontrol = snd_soc_cnew(&w->kcontrol_news[i],wlist, path->long_name,prefix);
			snd_ctl_add(card, path->kcontrol);
				list_add_tail(&kcontrol->list, &card->controls);

path->kcontrol = snd_soc_cnew(&w->kcontrol_news[i],wlist, path->long_name,prefix);

创建kcontrol的命名规则是:
add dapm control with long name for dapm_mixer this is the concatenation of the mixer and kcontrol name for dapm_mixer_named_ctl this is simply the kcontrol name.

  • Muxer
snd_soc_dapm_new_widgets(&codec->dapm); //Make sure all DAPM widgets are instantiated
	dapm_new_mux(struct snd_soc_dapm_widget *w)
		kcontrol = snd_soc_cnew(&w->kcontrol_news[0], wlist,name + prefix_len, prefix);
			snd_ctl_add(card, kcontrol);
				list_add_tail(&kcontrol->list, &card->controls);
		list_for_each_entry(path, &w->sources, list_sink)
			path->kcontrol = kcontrol;	

创建kcontrol的命名规则是:
The control will get a prefix from the control creation process but we’re also using the same prefix for widgets so cut the prefix off the front of the widget name.

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

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

相关文章

创建 ROS 的消息和服务(四)

执行命令 cd ~/catkin_ws/src/catkin_create_pkg beginner_tutorials std_msgs roscpp rospy进入刚刚那个功能包begineer什么的 cd beginner_tutorials/ mkdir msgecho "int64 num" > msg/num.msg 然后添加如下代码,按i 然后输入 <build_depend>message_…

C++:EffectiveC++:Article21:必须返回对象时,别妄想返回其Reference

Article21&#xff1a;必须返回对象时&#xff0c;别妄想返回其Reference 1. operator* 以by value 方式返回一个结果2. operator* 以 by Reference 方式返回一个结果3 定义static Rational 对象总结 本章主要介绍&#xff1a;函数返回值两种类型&#xff1a;值类型返回和引用返…

卷积神经网络的原理、结构和应用

深度学习是一种人工神经网络的应用&#xff0c;其应用范围包括自然语言处理、计算机视觉、语音识别等等。其中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种应用广泛的图像识别模型&#xff0c;其用于解决计算机视觉领域…

【Linux】多种环境变量介绍与设置

文章目录 一. linux环境变量介绍1. linux中的环境变量配置文件2. 环境变量加载顺序 二. 操作环境变量1. 读取环境变量envexportecho $PATH 2. 设置环境变量2.1. export PATH&#xff1a;临时的环境变量2.2. 用户的环境变量vim ~/.bashrcvim ~/.bash_profile 2.3. 所有用户的环境…

软件详细设计总复习(二)【太原理工大学】

文章目录 二、结构型模式1. 适配器模式2. 桥接模式3. 组合模式4. 装饰模式5. 外观模式6. 代理模式 二、结构型模式 1. 适配器模式 适配器是用来将两个原本并不兼容的接口能够在一起工作。就像我们的充电线可以让手机接口和插座接口相互适应&#xff0c;完成工作。 课本上的案…

Linux防火墙iptables

文章目录 一.iptables概述二.netfilter/iptables 关系三.四表五链3.1作用3.2四表3.3五链3.4规则表的优先顺序3.5规则链的匹配顺序3.6iptables 命令行配置方法3.8常用管理选项3.9iptables安装 四、操作4.1 增加规则4.2删除规则4.3修改规则4.4查询规则 五、规则匹配5.1通用匹配5.…

IDEA快捷键总结

IDEA快捷键总结 KeyMap使用的是Eclipse 常用快捷键 Ctrl H 全局搜索Shift Shift 搜索源码Ctrl O 查看当前类或接口包含的方法&#xff0c;即自身结构。Ctrl Alt B 选中接口名&#xff0c;查看当前接口的实现类Ctrl Alt V 快速补全Ctrl Alt ↓ 复制当前行到下一行C…

广告让你不自觉地掏钱?消费者行为背后的心理学

一般来说&#xff0c;应该从广告的各个方面提升&#xff0c;比如与目标用户的需求匹配&#xff0c;产品定位&#xff0c;核心卖点&#xff0c;突出重点和价值&#xff0c;不断重复&#xff0c;等等的这些都说的很好&#xff0c;给用户提供了做这件事的足够的动机和理由。 但我…

【组合优化】基于CHHO的QoS感知的web服务组合优化【Matlab代码22#】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第7节&#xff1a;资源获取】1. Web服务2. QoS感知的Web服务组合3. 改进后的CHHO算法3.1 原始HHO算法3.2 CHHO算法 4. 优化目标5. 部分代码展示6. 仿真结果展示7. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章…

rpc与grpc学习记录

文章目录 1、RPC2、gRPC多线程pythongrpc代码1、安装python需要的库&#xff1a;2、grpc编程步骤3、Demo13.1、编写 .proto文件&#xff0c;定义接口和数据类型3.2、编译 .proto文件生成存根文件3.3、编写服务器端代码&#xff1a;3.4、编写客户端代码&#xff1a;3.5、测试 1、…

docker操作2

docker操作2 文章目录 docker操作2启动新容器配置新的容器后要做的操作进入Docker容器可以显示图片的容器镜像pull 网络镜像 日志停止与删除停止删除删除image报错 在容器和宿主机之间拷贝数据创建命令别名查看docker运行容器的ipdocker image保存与导入保存image导入image 打标…

CMake的应用与实践

CMake 简介 CMake是什么&#xff1f; 全称 Cross Platform Make&#xff0c;起初为了跨平台需求&#xff0c;而后不断完善并广泛使用一款优秀的工程构建工具 特点和优势 开放源代码&#xff0c;具有BSD许可跨平台&#xff0c;支持Linux&#xff0c;Mac和Windows等不同操作系…

【C生万物】 字符串内存函数篇 (上)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 过了指针这个坎后&#xff0c;下一步就是C语言中关于字符的处理&#xff0c;这一期来讲…

chatgpt赋能Python-python5个一行

Python: 5行代码改变世界 Python是一种高级编程语言&#xff0c;以其简单易学的特性而闻名。Python的发明者Guido van Rossum在1980年代末和1990年代初创造了Python&#xff0c;旨在创建一种语言&#xff0c;既易于理解又易于使用。如今&#xff0c;Python已经成为了最受欢迎的…

【离散数学】陪集和拉格朗日定理编程题

1&#xff1a;编写一个程序能够计算有限群G的子群H的左陪集 输入一个n阶有限群G的二元运算表及相关的子群&#xff0c;输出其左陪集。 &#xff08;注意&#xff1a;按照表头元素顺序计算每个陪集&#xff0c;下图为G的二元运算表示例&#xff09; 样例1&#xff1a; 输入&…

干货 | 利用SPSS进行高级统计分析第三期

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 在本期中&#xff0c;我们继续为大家介绍如何利用SPSS进行&#xff1a;单因素方差分析、多因素方差分析、重复测量方差分析等。 1. 单因素方差分析【组间实验单一因变量&#xff1b;进行差…

iptables防火墙中的SNAT和DNAT

SNAT的原理和应用 SNAT 应用环境∶局域网主机共享单个公网IP地址接入Internet &#xff08;私有IP不能在Internet中正常路由&#xff09; SNAT原理∶修改数据包的源地址。 SNAT转换前提条件∶ 局域网各主机已正确设置IP地址、子网掩码、默认网关地址Linux网关开启IP路由转发…

游资92科比到底牛在哪里?

昨天一天时间把92科比之前的一个帖子全部看完&#xff0c;从科比对情绪周期的把握来看那简直总结的已经是标准答案了&#xff0c;那么为何92科比公布了答案&#xff0c;还是有很多人“痛苦”的做不到&#xff1f; 这个问题我觉得跟退学炒股是一样的&#xff0c;退学先解决了小…

springcloud-alibaba (03)sentinel下载安装

Sentinel 一&#xff0c;下载安装&#x1f4a0;二&#xff0c;编写脚本&#x1f9ff;三&#xff0c;启动sentinel&#x1f48e;四&#xff0c;Win-访问控制台✨ 在Linux中下载安装Spring Cloud Alibaba Sentinel&#xff0c;可以按照以下步骤进行操作&#xff1a; 一&#xff0…

Python常见面试题. Python中的解包操作及其应用场景

这是个简单的知识点&#xff0c;但有的同学并不理解 unpacking解包 解&#xff0c;对应的是*或者**&#xff0c;也有自动解包之说 包对应的可迭代对象 Python助学大礼包点击跳转获取 目录 一、自动解包二、数据过多的解包*三、星号在函数中的使用四、两个星号的解包五、场…