DAPM-path、route、context

widget之间的连接器 - path

path相当于电路中的一根跳线,它把一个widget的输出端和另一个widget的输入端连接在一起,path用snd_soc_dapm_path结构来描述:

struct snd_soc_dapm_path {
        const char *name;
 
        /* source (input) and sink (output) widgets */
        struct snd_soc_dapm_widget *source;
        struct snd_soc_dapm_widget *sink;
        struct snd_kcontrol *kcontrol;
 
        /* status */
        u32 connect:1;  /* source and sink widgets are connected */
        u32 walked:1;   /* path has been walked */
        u32 walking:1;  /* path is in the process of being walked */
        u32 weak:1;     /* path ignored for power management */
 
        int (*connected)(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink);
 
        struct list_head list_source;
        struct list_head list_sink;
        struct list_head list;
};

当widget之间发生连接关系时,snd_soc_dapm_path作为连接者,它的source字段会指向该连接的起始端widget,而它的sink字段会指向该连接的到达端widget,还记得前面snd_soc_dapm_widget结构中的两个链表头字段:sources和sinks么?widget的输入端和输出端可能连接着多个path,所有输入端的snd_soc_dapm_path结构通过list_sink字段挂在widget的souces链表中,同样,所有输出端的snd_soc_dapm_path结构通过list_source字段挂在widget的sinks链表中。

connect,walked,walking,weak是几个辅助字段,用于帮助所有path的遍历。

widget的连接关系 - route

一个路径的连接至少包含以下几个元素:起始端widget,跳线path,到达端widget,在DAPM中,用snd_soc_dapm_route结构来描述这样一个连接关系:

struct snd_soc_dapm_route {
        const char *sink;
        const char *control;
        const char *source;
        int (*connected)(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink);
};

sink指向到达端widget的名字字符串,source指向起始端widget的名字字符串,control指向负责控制该连接所对应的kcontrol名字字符串,connected回调则定义了上一节所提到的自定义连接检查回调函数。该结构的意义很明显就是:source通过一个kcontrol,和sink连接在一起,现在是否处于连接状态,请调用connected回调函数检查。

这里直接使用名字字符串来描述连接关系,所有定义好的route,最后都要注册到dapm系统中,dapm会根据这些名字找出相应的widget,并动态地生成所需要的snd_soc_dapm_path结构,正确地处理各个链表和指针的关系,实现两个widget之间的连接。

DAPM context

直译过来的意思是dapm上下文。可以这么理解:dapm把整个音频系统,按照功能和偏置电压级别,划分为若干个电源域,每个域包含各自的widget,每个域中所有的widget通常都处于同一个偏置电压级别上,而一个电源域就是一个dapm context,通常会有以下几种dapm context:

  • 属于codec中的widget位于一个dapm context中

  • 属于platform中的widget位于一个dapm context中

  • 属于整个声卡的widget位于一个dapm context中

对于音频系统的硬件来说,通常要提供合适的偏置电压才能正常地工作,有了dapm context这种组织方式,我们可以方便地对同一组widget进行统一的偏置电压管理,ASoC用snd_soc_dapm_context结构来表示一个dapm context:

struct snd_soc_dapm_context {
		enum snd_soc_bias_level bias_level;
		unsigned int idle_bias_off:1; /* Use BIAS_OFF instead of STANDBY */
		/* Go to BIAS_OFF in suspend if the DAPM context is idle */
		unsigned int suspend_bias_off:1;
		
		struct device *dev; /* from parent - for debug */
		struct snd_soc_component *component; /* parent component */
		struct snd_soc_card *card; /* parent card */
		
		/* used during DAPM updates */
		enum snd_soc_bias_level target_bias_level;
		struct list_head list;
		
		struct snd_soc_dapm_wcache path_sink_cache;
		struct snd_soc_dapm_wcache path_source_cache;
		
#ifdef CONFIG_DEBUG_FS
		struct dentry *debugfs_dapm;
#endif
};

snd_soc_bias_level的取值范围是以下几种:

  • SND_SOC_BIAS_OFF

  • SND_SOC_BIAS_STANDBY

  • SND_SOC_BIAS_PREPARE

  • SND_SOC_BIAS_ON

代表widget结构snd_soc_dapm_widget中,有一个snd_soc_dapm_context结构指针,指向所属的codec、platform、card、或dai的dapm结构。同时,所有的dapm结构,通过它的list字段,链接到代表声卡的snd_soc_card结构的dapm_list链表头字段 。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
snd_soc_dapm_post_pmu 是 ALSA 音频子系统中的一个函数,负责处理音频设备的电源管理单元 (PMU) 相关的后处理逻辑。 在 ALSA 音频子系统中,音频设备需要进行电源管理以实现功耗优化和资源利用的最佳化。PMU 是负责控制音频设备电源管理的硬件单元,snd_soc_dapm_post_pmu 函数则负责处理 PMU 相关的后续操作。 snd_soc_dapm_post_pmu 函数的主要作用是在 PMU 配置完成后,对音频设备进行后续处理。具体包括以下几个方面: 1. 激活音频设备:设置音频设备的状态为活跃状态,使其可以接受输入和输出音频数据。 2. 配置音量控制:根据配置文件或者驱动程序中的设置,对音频设备的音量进行调整。可以根据使用场景或者用户设置来调整音频设备的音量大小。 3. 处理输入和输出路径:根据配置文件或者驱动程序中的设置,对音频设备的输入和输出路径进行调整。可以根据使用需求来选择不同的输入和输出路径,以实现音频信号的传输和处理。 4. 执行电源管理操作:根据 PMU 的配置,对音频设备的电源进行控制。可以开启、关闭或者调整音频设备的电源状态,以达到功耗管理和资源优化的目的。 总之,snd_soc_dapm_post_pmu 函数在 ALSA 音频子系统中承担着重要的角色,通过对音频设备的电源管理单元的配置和控制,实现音频设备的初始化和后续处理操作,以确保音频设备正常工作并满足用户需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨天不打滑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值