对 DAPM 的新理解
来源:互联网 发布:认识老外的软件 编辑:程序博客网 时间:2024/05/09 01:22
最近试图 解决 headset 插入没声音的问题,重新 读了 dapm.txt , 又有了新的体会 :
1, 输入源类型:
MIXER: 作用是 对多输入 进行选择 ,或者 混合多输入为一个输出。
MUX: 作用是 是对多输入 进行选择, 输出只有一个。
PGA: 单输入 单输出,同时带有 一个gain 控制音量。
在 DAMP 中, 对应的Widget 类型分别为 : snd_soc_dapm_mixer ; snd_soc_dapm_mux ; snd_soc_dapm_pga。
在定义widget 时,一般会为其指定 一个kcontrol, 例如:
- static conststruct snd_kcontrol_new wm8900_loutmix_controls[] = {
- SOC_DAPM_SINGLE("LINPUT3 Bypass Switch", WM8900_REG_LOUTMIXCTL1, 7, 1, 0),
- SOC_DAPM_SINGLE("AUX Bypass Switch", WM8900_REG_AUXOUT_CTL, 7, 1, 0),
- SOC_DAPM_SINGLE("Left Input Mixer Switch", WM8900_REG_BYPASS1, 7, 1, 0),
- SOC_DAPM_SINGLE("Right Input Mixer Switch", WM8900_REG_BYPASS2, 3, 1, 0),
- SOC_DAPM_SINGLE("DACL Switch", WM8900_REG_LOUTMIXCTL1, 8, 1, 0),
- };
dapm kcontrol名称 = 目的对象sink名称 + 操作行为control名称,即'Left Output Mixer Left Input Mixer Switch',control为操作行为
- SND_SOC_DAPM_MIXER("Left Output Mixer", WM8900_REG_POWER3, 3, 0,
- wm8900_loutmix_controls,
- ARRAY_SIZE(wm8900_loutmix_controls)),
- static conststruct snd_soc_dapm_route audio_map[] = {
- {"Left Output Mixer", "Left Input Mixer Switch","Left Input Mixer"},
- };
对headset 没有声音 分析 又有的入口函数是 :
snd_soc_dapm_put_volsw
- snd_soc_dapm_put_volsw
- -->dapm_mixer_update_power
- -->snd_kcontrol_chip
- -->找到dapm kcontrol所在的widget(也就是操作目的对象sink)
- -->snd_soc_test_bits
- -->Tests a register with a new value and checksif the new valueis different from the old value.
- dapm_power_widgets
- -->power up/down对象widget,更底层可追溯到dapm_seq_run_coalesced
- 检查是否有widget->event [这里不分析Event的情况,继续往下走]
- snd_soc_update_bits
- -->根据dapm kcontrol:SOC_DAPM_SINGLE定义的reg、shift和max设置音频通路,方法与普通的kcontrol一样
例中, Mixer " Left Output Mixer " 的输入定义在 wm8900_loutmix_controls 中, 这样 上层就可以通过参考 route map 的 值来 控制kcontrol 的值 ,从而打开一个通路。
引用,将kcontrols、widgets和route串联起来:
- snd_soc_dapm_new_controls(codec, wm8900_dapm_widgets,
- ARRAY_SIZE(wm8900_dapm_widgets));
- snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
- snd_soc_dapm_new_widgets(codec);
- return 0;
- 对 DAPM 的新理解
- 对测试的新理解
- 对ListView新的理解
- 对NSNotificationCenter的新理解
- 对C#2.0新特性的理解
- 对编程语言的新理解
- 对C/S模式的新理解
- 对 protected 的一点儿新理解
- 对线程的一点点新理解
- 对线程新的自我理解
- 对const和引用的新理解
- 对TCP状态的新理解
- 对Android权限一些新的理解
- 对数据处理的一些新理解
- 对LEFT JOIN的新理解
- DAPM之九:complete path对codec suspend的影响
- 对BSD的新路由查找算法的理解
- 对BSD的新路由查找算法的理解
- 杭电OJ——1124 Factorial(水题)
- 分享一个服务器重启问题发现的过程
- dev 调用dll 错误
- STM32+ucos+ucgui+fatfs+bmp解码+JPG解码
- 设计模式之观察者模式,C++实现(下部分)
- 对 DAPM 的新理解
- 设计模式概述
- apk 反编译 重编译
- Hibernate4主键生成策略(xml方式)
- IOS从一无所知到精通大概需要多长时间 以及 开发者过去几年最大的成长是什么
- QT与OpenGL之整体缩放
- PKI常见证书格式和转换[转]
- Java常用日志工具
- 近期小记