对 DAPM 的新理解

最近试图 解决 headset  插入没声音的问题,重新 读了 dapm.txt  , 又有了新的体会 :

1, 输入源类型:

MIXER:  作用是 对多输入 进行选择 ,或者 混合多输入为一个输出。

MUX: 作用是 是对多输入 进行选择, 输出只有一个。

PGA:  单输入 单输出,同时带有 一个gain 控制音量。

在 DAMP 中, 对应的Widget 类型分别为 : snd_soc_dapm_mixer ; snd_soc_dapm_mux ; snd_soc_dapm_pga。

在定义widget 时,一般会为其指定 一个kcontrol, 例如:

 

  1. static const struct snd_kcontrol_new wm8900_loutmix_controls[] = {
  2. SOC_DAPM_SINGLE("LINPUT3 Bypass Switch", WM8900_REG_LOUTMIXCTL1, 7, 1, 0),
  3. SOC_DAPM_SINGLE("AUX Bypass Switch", WM8900_REG_AUXOUT_CTL, 7, 1, 0),
  4. SOC_DAPM_SINGLE("Left Input Mixer Switch", WM8900_REG_BYPASS1, 7, 1, 0),
  5. SOC_DAPM_SINGLE("Right Input Mixer Switch", WM8900_REG_BYPASS2, 3, 1, 0),
  6. SOC_DAPM_SINGLE("DACL Switch", WM8900_REG_LOUTMIXCTL1, 8, 1, 0),
  7. };

dapm kcontrol名称 = 目的对象sink名称 + 操作行为control名称,即'Left Output Mixer Left Input Mixer Switch',control为操作行为

  1. SND_SOC_DAPM_MIXER("Left Output Mixer", WM8900_REG_POWER3, 3, 0,
  2. wm8900_loutmix_controls,
  3. ARRAY_SIZE(wm8900_loutmix_controls)),
  1. static const struct snd_soc_dapm_route audio_map[] = {
  2. {"Left Output Mixer", "Left Input Mixer Switch", "Left Input Mixer"},
  3. };

对headset 没有声音 分析 又有的入口函数是 :

snd_soc_dapm_put_volsw

[c-sharp] view plain copy print ?
  1. snd_soc_dapm_put_volsw
  2. -->dapm_mixer_update_power
  3. -->snd_kcontrol_chip
  4. -->找到dapm kcontrol所在的widget(也就是操作目的对象sink)
  5. -->snd_soc_test_bits
  6. -->Tests a register with a new value and checks if the new value is different from the old value.
  7. dapm_power_widgets
  8. -->power up/down对象widget,更底层可追溯到dapm_seq_run_coalesced
  9. 检查是否有widget->event [这里不分析Event的情况,继续往下走]
  10. snd_soc_update_bits
  11. -->根据dapm kcontrol:SOC_DAPM_SINGLE定义的reg、shift和max设置音频通路,方法与普通的kcontrol一样

 

例中, Mixer " Left Output Mixer " 的输入定义在 wm8900_loutmix_controls 中, 这样 上层就可以通过参考 route map 的 值来 控制kcontrol 的值 ,从而打开一个通路。

 

引用,将kcontrols、widgets和route串联起来: 

  1. snd_soc_dapm_new_controls(codec, wm8900_dapm_widgets,
  2. ARRAY_SIZE(wm8900_dapm_widgets));
  3. snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
  4. snd_soc_dapm_new_widgets(codec);
  5. return 0;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值