DAPM-2 Widget/Path/Route
- WM8960结构图
- Widget
- Route
- Path
- 总结
课程:韦东山音频专题
内核:Kernel 3.5
实例:WM8960
WM8960结构图
录音时的音频通路 抽象图为:
Widget
wm8960.c sound\soc\codecs
static const struct snd_soc_dapm_widget wm8960_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("LINPUT1"),
SND_SOC_DAPM_INPUT("LINPUT2"),
SND_SOC_DAPM_INPUT("LINPUT3"),
SND_SOC_DAPM_MIXER("Left Boost Mixer", WM8960_POWER1, 5, 0,
wm8960_lin_boost, ARRAY_SIZE(wm8960_lin_boost)),
SND_SOC_DAPM_MIXER("Left Output Mixer", WM8960_POWER3, 3, 0,
&wm8960_loutput_mixer[0],
ARRAY_SIZE(wm8960_loutput_mixer)),
SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER2, 3, 0),
}
// "Left Boost Mixer"中包含三个snd_kcontrol_new
static const struct snd_kcontrol_new wm8960_lin_boost[] = {
SOC_DAPM_SINGLE("LINPUT2 Switch", WM8960_LINPATH, 6, 1, 0),
SOC_DAPM_SINGLE("LINPUT3 Switch", WM8960_LINPATH, 7, 1, 0),
SOC_DAPM_SINGLE("LINPUT1 Switch", WM8960_LINPATH, 8, 1, 0),
};
DAPM的kcontrol 和 普通的kcontrol是不一样的,他们的.put
函数不一样。
定义时 SOC_DAPM_SINGLE()
和 SOC_SINGLE()
区分。
Route
static const struct snd_soc_dapm_route audio_paths[] = {
{ "Left Boost Mixer", "LINPUT1 Switch", "LINPUT1" },
{ sink widget’s name , kcontrol’s name , source widget’s name }
需要将Route转化为Path,对
wm8960_add_widgets(struct snd_soc_codec *codec)
snd_soc_dapm_add_routes(dapm, audio_paths, ARRAY_SIZE(audio_paths));
for (i = 0; i < num; i++)
snd_soc_dapm_add_route(dapm, route);
//根据名字找到sink/source widget 和 kcontrol
path->source = wsource;
path->sink = wsink;
path->connected = route->connected;
Path
Route转为Path后,如果我们想让下面的path导通,需要什么条件?
DAPM的目的是省电,由此可以再引入complete path的概念。
- complete path
以下为一条complete path
static const struct snd_soc_dapm_route audio_paths[] = {
{ "Left Boost Mixer", "LINPUT1 Switch", "LINPUT1" }, // Path1
{ "Left Input Mixer", "Boost Switch", "Left Boost Mixer", }, // Path2
{ "Left ADC", NULL, "Left Input Mixer" }, // Path3
- 上电过程
条件1:complete Path上的所有path都是connect状态
条件2:有APP在使用声卡使用
满足上述两个条件才会启动所涉及的Reg/Widget(上电)
总结
- tinymix 设置普通的kcontrol:直接设置寄存器
- tinymix 设置DAPM的kcontrol:设置所在Path的connect位
调用dapm_power_widgets(widget->dapm, SND_SOC_DAPM_STREAM_NOP);
- tinyplay, tinycap在传输数据之前:
调用damp_power_widgets(dapm, event);
dapm_power_widgets
在有app使用声卡时会找出complete path,设置上面所有的widget(上电)