ALSA框架学习笔记1:component注册

devm_snd_soc_register_component 是音频驱动框架中比较关键的一个函数,单独分析下。
一、函数原型
/**
 * devm_snd_soc_register_component - resource managed component registration
 * @dev: Device used to manage component
 * @cmpnt_drv: Component driver
 * @dai_drv: DAI driver
 * @num_dai: Number of DAIs to register
 *
 * Register a component with automatic unregistration when the device is
 * unregistered.
 */
int devm_snd_soc_register_component(struct device *dev,
			 const struct snd_soc_component_driver *cmpnt_drv,
			 struct snd_soc_dai_driver *dai_drv, int num_dai)
{
	struct device **ptr;
	int ret;

	ptr = devres_alloc(devm_component_release, sizeof(*ptr), GFP_KERNEL);
	if (!ptr)
		return -ENOMEM;

	ret = snd_soc_register_component(dev, cmpnt_drv, dai_drv, num_dai);
	if (ret == 0) {
		*ptr = dev;
		devres_add(dev, ptr);
	} else {
		devres_free(ptr);
	}

	return ret;
}

作用:构造一个component,并add到全局的component_list中,并将dai_driver与component建立联系。

二、函数实现(省略部分细节)
snd_soc_register_component(dev, cmpnt_drv, dai_drv, num_dai)
{
	struct snd_soc_component *component;			// 创建一个component
	... ...
	snd_soc_add_component(dev, component, component_driver, dai_drv, num_dai)
	{
		snd_soc_component_initialize(component, component_driver, dev)
		{
			component->name = fmt_single_name(dev, &component->id);
			component->dev = dev;          			// component->dev指向dev,即platform_device->dev
			component->driver = driver;   			// component->driver指向component_driver
		}
		
		snd_soc_register_dais(component, dai_drv, num_dai)
		{
			// 一个component可以有多个dai_driver
			for (i = 0; i < count; i++) 
			{
				soc_add_dai(component, dai_drv + i, count == 1 && !component->driver->non_legacy_dai_naming)
				{
					struct snd_soc_dai *dai;	 						// 创建一个soc_dai
					dai->component = component;  						// dai->component指向component
					dai->dev = dev;              						// dai->dev指向component->dev
					dai->driver = dai_drv;       						// dai->driver指向dai_drv
					list_add_tail(&dai->list, &component->dai_list);	// 把dai->list加到component->dai_list中
				}
			}
		}
		
		snd_soc_component_add(component)
		{
			list_add(&component->list, &component_list);		// 把component->list加入到全局的component_list中
		}
		
		// 暂时先跳过
		snd_soc_try_rebind_card()
		{
			... ...
		}
	}
}
三、结构体关系图

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"alsa lib pcm.c:8512"是一个错误信息,它是ALSA(Advanced Linux Sound Architecture)库中的一个错误代码。 ALSA是用于在Linux操作系统上处理音频和声音的软件框架。pcm.c是该库中与PCM(Pulse-code Modulation)音频数据处理相关的文件。当出现"alsa lib pcm.c:8512"错误时,表示在执行PCM音频数据读取或写入操作时发生了错误,具体是在pcm.c文件的第8512行。 要解决这个错误,可以考虑以下几个步骤: 1. 检查设备配置:确保使用正确的音频设备进行读取或写入操作。可以使用命令"aplay -l"和"arecord -l"来列出系统中可用的音频设备。 2. 检查权限:确保当前用户有足够的权限来访问音频设备。可以使用命令"ls -l /dev/snd/"来查看设备文件的权限。 3. 检查设置参数:检查PCM音频处理的设置参数是否正确。可以参考ALSA文档和相应的程序代码来确认参数设置的正确性。 4. 检查驱动和库版本:确保ALSA库和音频驱动程序的版本是兼容的。更新驱动程序或升级ALSA库可能有助于解决一些已知的问题。 5. 查找其他错误信息:在"alsa lib pcm.c:8512"错误之前或之后的错误信息中,可能会提供更多有关问题原因的线索。对这些错误信息进行分析,可能会帮助定位和解决问题。 6. 检查其他系统资源:确保系统上的其他资源,如内存、磁盘空间等,充足且没有其他问题。 如果以上步骤都无法解决问题,建议查看ALSA论坛或咨询相关的技术支持团队,寻求更详细的帮助和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值