ALSA-DAPM
所谓widget,其实可以理解为是kcontrol的进一步升级和封装,她同样是指音频系统中的某个部件,比如mixer,mux,输入输出引脚,电源供应器等等,甚至,我们可以定义虚拟的widget,例如playback stream widget。widget把kcontrol和动态电源管理进行了有机的结合,同时还具备音频路径的连结功能,一个widget可以与它相邻的widget有某种动态的连结关系。在DAPM框架中,widget用结构体snd_soc_dapm_widget来描述:
amixer工作流程
参考tinymix的使用流程
常用操作
1 | #define SNDRV_CTL_IOCTL_CARD_INFO _IOR('U', 0x01, struct snd_ctl_card_info) |
驱动的注册
1 | snd_ctl_create //创建控件管理结构 |
控件(元素)的添加
1 | snd_soc_add_codec_controls |
kcontrol
1 | struct snd_kcontrol_new { |
kcontrol的命名
kcontrol的作用由名称来区分,对于名称相同的kcontrol,则使用index区分。name定义的标准是“SOURCE DIRECTION FUNCTION”即“源 方向 功能”,SOURCE定义了kcontrol的源,如“Master”、“PCM”等;DIRECTION 则为“Playback”、“Capture”等,如果DIRECTION忽略,意味着Playback和capture双向;FUNCTION则可以是“Switch”、“Volume”和“Route”等。
内核说明文档:
1 | This document describes standard names of mixer controls. |
Documentation/sound/alsa/ControlNames.txt
widget
- codec域
比如VREF和VMID等提供参考电压的widget,这些widget通常在codec的probe/remove回调中进行控制,当然,在工作中如果没有音频流时,也可以适当地进行控制它们的开启与关闭。
- platform域
位于该域上的widget通常是针对平台或板子的一些需要物理连接的输入/输出接口,例如耳机、扬声器、麦克风,因为这些接口在每块板子上都可能不一样,所以通常它们是在machine驱动中进行定义和控制,并且也可以由用户空间的应用程序通过某种方式来控制它们的打开和关闭。
- 音频路径域
一般是指codec内部的mixer、mux等控制音频路径的widget,这些widget可以根据用户空间的设定连接关系,自动设定他们的电源状态。
- 音频数据流域
是指那些需要处理音频数据流的widget,例如ADC、DAC等等。
数据结构
snd_soc_dapm_type
1 | /* dapm widget types */ |
snd_soc_dapm_widget
1 | /* dapm widget */ |
dapm
先注册widget,而后逐一进行初始化处理
注册
1 | int snd_soc_register_component(struct device *dev, |
数据结构:
1 | struct snd_soc_component_driver { |
注册流程:
1 | snd_soc_register_component |
初始化流程:
1 | snd_soc_register_card |
连接:
1 | snd_soc_register_card |
更新寄存器:
1 | dapm_power_widgets |
Add Controls
1 | snd_soc_add_codec_controls |
sound/soc/soc-core.c
作用:
Add Widgets
Add Route
相关术语
MIXER
Mixer - Mixes several analog signals into a single analog signal.
Mixer可以混合多个输入到输出
MUX
Mux - An analog switch that outputs only one of many inputs.
Mux只能从多个输入里选择一个作为输出
dapm widget链表更新
- 初始化的时候,snd_soc_instantiate_card里调用snd_soc_dapm_new_widgets,最终会调用dapm_power_widgets
- 在用户空间通过tinymix设置路径,在SOC_DAPM_ENUM中的put或者get函数最终会调用dapm_power_widgets
- 在用户空间通过tinyplay播放或者录音是的soc_pcm_prepare和soc_pcm_close,最终会调用dapm_power_widgets
参考
- ALSA声卡驱动中的DAPM详解之二:widget-具备路径和电源管理信息的kcontrol
- linux alsa 音频路径切换
- ALSA声卡驱动中的DAPM详解之三:如何定义各种widget
- codec–wm8960
- snd_kcontrol_new名称中的SOURCE字段
- Asoc dapm(三) - dapm widgets & dapm kcontrol & dapm route
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
- DAPM