ALSA框架学习笔记3:声卡注册流程(代码解析)

这篇具有很好参考价值的文章主要介绍了ALSA框架学习笔记3:声卡注册流程(代码解析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以Amlogic V918D为例,介绍驱动如何将设备树中的声卡节点注册为声卡设备
一、设备树中的声卡节点
/* Audio Related start */
	auge_sound {
		compatible = "amlogic, auge-sound-card";
		aml-audio-card,name = "AML-AUGESOUND";
		...
		
		aml-audio-card,dai-link@0 {
			...
		};

		aml-audio-card,dai-link@1 {
			...
		};

		...

		aml-audio-card,dai-link@7 {
			...
		};
	};
	/* Audio Related end */

声卡名为"AML-AUGESOUND",下面有8个dai-link,每一个dai-link下面都有cpu dai和codec dai设备节点。每个dai-link都会被注册为一个pcm设备,这里先列出简化的流程:

->aml_card_probe
	->devm_snd_soc_register_card
		->snd_soc_register_card
			->snd_soc_bind_card
				->snd_soc_instantiate_card
					->soc_link_init
						->soc_new_pcm
							->snd_pcm_new

从上一遍文章知道cpu dai和codec dai都被注册为了component,可以猜想:
1、生成pcm设备就是根据dai-link,分别找到cpu dai和codec dai对应的component,然后建立联系;
2、对pcm进行操作时,比如open(),一定会同时触发cpu dai的open和codec dai的open回调;

二、代码分析

static int aml_card_probe(struct platform_device *pdev)
{
	/* 1. 统计"dai-link"子节点的个数num,也即最终会生成pcm设备的个数 */
	/* 2. 给dai_link[num]分配内存空间 */
	/* 3. 解析声卡节点的各个属性,以及每个dai-link子节点的各类属性 */
	/* 4. 关联结构体,见下图一 */
	/* 5. 注册声卡 */
	devm_snd_soc_register_card(&pdev->dev, &priv->snd_card)
	{
		snd_soc_register_card(card)
		{
			snd_soc_bind_card(card)
			{
				snd_soc_instantiate_card(card)
				{
					/* 5.1 遍历声卡下的所有dai_link */
					for_each_card_prelinks(card, i, dai_link) {
						/* 根据dai_link下的codec/cpu/platform去查找对应的component */
						ret = soc_init_dai_link(card, dai_link);
						...
					}

					/* 5.2 遍历声卡下的所有dai_link */
					for_each_card_prelinks(card, i, dai_link) {
						/* dai_link下的component和pcm绑定,就是确定了pcm下cpu dai对应的component和codec dai对应的component。 */
						ret = soc_bind_dai_link(card, dai_link);
						...
					}
					
					/* 5.3 new一个card */
					ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, card->owner, 0, &card->snd_card);

					/* 5.4 调card的probe函数 */
					card->probe(card);
					
					/* 5.5 遍历component调用其driver的probe。(component->driver->probe) */
					ret = soc_probe_link_components(card);

					/* 5.6 调用绑定在pcm上的cpu dai和codec dai。(dai->driver->probe)*/
					ret = soc_probe_link_dais(card);

					/* 5.7 创建pcm设备*/
					for_each_card_rtds(card, rtd)
					{
						soc_link_init(card, rtd)
						{
							ret = soc_new_pcm(rtd, num);
						}
					}

					/* 5.8 注册card */
					ret = snd_card_register(card->snd_card);
				}
			}
		}
	}
	
	/* 6. 添加kcontrols,主要是针对CPU DAI的kcontrols,或者说平台根据自身硬件设定好的,一般不需要用户修改。用户主要关注注册在CODEC上的kcontrols。 */ 
	aml_card_add_controls(&priv->snd_card)

	/* 7. 处理音效相关,比如EQ、DRC等 */
	card_add_effects_init(&priv->snd_card)

	/* 8. 添加kcontrols */
	snd_soc_add_card_controls(&priv->snd_card, snd_user_controls,
				  ARRAY_SIZE(snd_user_controls));
}

图一:
aml-augesound,linux,android,android,驱动开发
三、总结
1、声卡的注册流程一般是SOC侧负责,在适配新的codec的时候,一般也不需要去动这块流程。它像是一个框架,开放给用户去定制的部分就是设备树中相关的dai节点;
2、在声卡的驱动中,会看到很多地方在注册DAPM的kcontrol(设备中可以通过timymix查看和设置)。codec也可以在自己的driver中注册增加自己的kcontrol;
3、kcontrol有啥用呢?首先这个东西是给用户层开放的直接设置声卡参数的,比如用tinymix工具通过设置各个kcontrol的属性,去调式音频链路。那Android里会不会用这个呢?目前没有看到类似应用;
4、一开始有个疑问:Android设备调音量的时候,会不会设置到codec的硬件上?查阅后发现实际上并不会,Andorid调节的媒体音量、闹钟音量等都是数字音量,是在streamVolume上实现的。关于Android层播放音频,调节音量的流程,在后续文章中再分析。文章来源地址https://www.toymoban.com/news/detail-596356.html

到了这里,关于ALSA框架学习笔记3:声卡注册流程(代码解析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音频开发之ALSA框架

    ALSA(Advanced Linux Sound Architecture)是Linux操作系统上用于提供音频和MIDI功能的软件架构。它为Linux系统提供了强大的音频支持,包括音频录制、播放和处理,它设计用于提供高性能、低延迟、高质量的音频处理,并为开发者提供了一组API和工具。 ALSA的涉及本身比较复杂,如果

    2024年01月23日
    浏览(59)
  • alsa框架与音频芯片移植基础

    Alsa是Advanced Linux Sound Architecture的缩写,即高级Linux声音架构,在Linux操作系统上提供了对音频和MIDI的支持。在Linux 2.6的内核版本后,Alsa目前已经成为了linux的主流音频体系结构。 除了 alsa-driver,ALSA 包含在用户空间的 alsa-lib 函数库,具有更加友好的编程接口,并且完全兼容于

    2024年02月09日
    浏览(30)
  • PSCAD学习笔记(2)——python调用PSCAD自动化库代码解析:组件控制

    该学习笔记结合官方文件和个人学习见解撰写,主要分享一些常见实用功能,欢迎讨论、补充、指正。PSCAD相关免费学习资源实属稀缺,如果本文对您有所帮助,麻烦点赞评论支持一下。您的支持是我更新的动力。 PSCAD版本:4.6.3 python版本:3.7 mhrc-automation版本:1.2.4 python编辑

    2024年02月22日
    浏览(54)
  • 【框架源码】Spring源码解析之BeanDefinition加载流程解析

    观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息,主要包括:Bean的属性、是否单例、延迟加载、Bean的名称、构造方法等。 简言之就是Spring通过解

    2024年02月09日
    浏览(33)
  • 基于LIDC-IDRI肺结节肺癌数据集的人工智能深度学习分类良性和恶性肺癌(Python 全代码)全流程解析(二)

    第一部分内容的传送门 环境配置建议使用anaconda进行配置。核心的配置是keras和tensorflow的版本要匹配。 环境配置如下: tensorboard 1.13.1 tensorflow 1.13.1 Keras 2.2.4 numpy 1.21.5 opencv-python 4.6.0.66 python 3.7 数据集的预处理分为两个关键步骤。首先是图片处理,我们使用cv2库将图片转换为

    2024年04月29日
    浏览(30)
  • 基于LIDC-IDRI肺结节肺癌数据集的放射组学机器学习分类良性和恶性肺癌(Python 全代码)全流程解析 (一)

    第二部分传送门 LIDC-IDRI数据集是用于医学影像分析的公开数据集,包含1010例低剂量CT扫描和人工标注的肺部结节信息。这些数据对于肺癌早期检测和算法开发至关重要。由美国国立卫生研究院(NIH)资助,该数据集为研究人员提供了宝贵资源,促进了医学影像处理和人工智能

    2024年04月27日
    浏览(24)
  • 【框架源码】Spring源码解析之Bean创建源码流程

    问题:Spring中是如何初始化单例bean的? 我们都知道Spring解析xml文件描述成BeanDefinition,解析BeanDefinition最后创建Bean将Bean放入单例池中,那么Spring在创建Bean的这个过程都做了什么。 Spring核心方法refresh()中最最重要的一个方法 finishBeanFactoryInitialization() 方法,该方法负责初始化

    2024年02月09日
    浏览(29)
  • 【框架源码】Spring源码解析之Bean生命周期流程

    观看本文前,我们先思考一个问题,什么是Spring的bean的生命周期?这也是我们在面试的时候,面试官常问的一个问题。 在没有Spring之前,我们创建对象的时候,采用new的方式,当对象不在被使用的时候,由Java的垃圾回收机制回收。 而 Spring 中的对象是 bean,bean 和普通的 J

    2024年02月09日
    浏览(31)
  • 【通义千问】大模型Qwen GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的使用

    如希望使用Qwen-chat进行推理,所需要写的只是如下所示的数行代码。 请确保你使用的是最新代码,并指定正确的模型名称和路径,如 Qwen/Qwen-7B-Chat 和 Qwen/Qwen-14B-Chat 这里给出了一段代码

    2024年02月08日
    浏览(35)
  • 深入探索RK3588平台开发:解析Linux音频调试与alsa-utils工具

    近期我深入研究了RK3588平台的开发,特别是在音频领域的探索。在这个系列的讲解中,我们将重点关注Linux音频调试,并深入探讨与之相关的alsa-utils工具。通过本文,我将为大家详细介绍如何在RK3588平台上进行高效的音频开发,让我们一同踏入这个令人兴奋的领域。 RK3588是瑞

    2024年01月25日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包