触发DAPM机制的时机

概述

DAPM机制的入口函数是 dapm_power_widgets。

所谓dapm机制简单来说就是遍历声卡上所有标记为dirty的widget,根据widgets之间path实例的connect状态决定widget和源/目的 widget是否连通。
找到连通的源/目的widget,把其标记为dirty后重复上述操作。直到找到完整音频路径同时路径上的widget上电。不在完整音频路径上的widget下电。

完整音频路径就是起始端和结束端都是端点widget的路径。

触发DAPM机制的四种情况

1: 声卡初始化阶段,snd_soc_dapm_new_widgets函数遍历声卡上的所有widgets,创建和注册widget相关的kcontrols后,会触发扫描。
snd_soc_instantiate_card-->
   snd_soc_dapm_new_widgets-->
     dapm_power_widgets

2: 用户空间通过amix等应用程序配置widget相关的dapm kcontrols,会在kcontrol的put()回调函数里触发dapm扫描。

snd_soc_dapm_mixer_update_power
snd_soc_dapm_mixer_update_power-->
   soc_dapm_mixer_update_power-->
     dapm_power_widgets

snd_soc_dapm_put_volsw
snd_soc_dapm_put_volsw-->
   soc_dapm_mixer_update_power-->
     dapm_power_widgets

snd_soc_dapm_mux_update_power
snd_soc_dapm_mux_update_power-->
   soc_dapm_mux_update_power-->
     dapm_power_widgets

snd_soc_dapm_put_enum_double
snd_soc_dapm_put_enum_double-->
   soc_dapm_mux_update_power-->
     dapm_power_widgets

snd_soc_dapm_mixer_update_power,snd_soc_dapm_mux_update_power。这两个函数是asoc core API,用在kcontrol自定义的put()回调函数里。
snd_soc_dapm_put_volsw,snd_soc_dapm_put_enum_double。这两个函数是asoc core提供的默认put()回调函数。

注意目前只能配置mux、mixer、switch widget类型的kcontrols。换句话就是用户空间只能通过mux、mixer、switch kcontrols配置音频路径。

3: pcm设备文件打开或关闭,pcm core 发送stream event 给dapm core,调用snd_soc_dapm_stream_event()触发扫描。
snd_soc_dapm_stream_event-->
   soc_dapm_stream_event-->
   dapm_power_widgets

stream启动触发dapm扫描时如果没有得到完整音频路径的话,扫描就会失败,pcm设备文件打卡失败。

4: 音频驱动程序在改变了某个widget并把它加入到dapm_dirty链表后,主动调用 snd_soc_dapm_sync或者snd_soc_dapm_sync_unlocked函数触发扫描操作。

posted @ 2020-11-12 23:09  bobfly1984  阅读(418)  评论(0编辑  收藏  举报