
音频ALSA驱动
文章平均质量分 93
嵌入式音视频开发之旅
问题交流:tu18879499804
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
从零写一个ALSA声卡驱动学习(8)之ALSA如何和procfs进行绑定?
需要注意的是:当调用 snd_pcm_suspend_all() 时,即使没有设置 SNDRV_PCM_INFO_RESUME 标志,也始终会触发带有 SUSPEND 的 trigger 回调。除了 SND_PCM,select 命令还支持以下组件:SND_RAWMIDI、SND_TIMER、SND_HWDEP、SND_MPU401_UART、SND_OPL3_LIB、SND_OPL4_LIB、SND_VX_LIB、SND_AC97_CODEC。在前面的示例中,所有资源的分配和释放都是手动完成的。原创 2025-06-29 14:35:20 · 661 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(7)之ALSA内存管理
由于历史原因,Playback Mask 和 Playback Default 控制项的两种形式都可以在 SNDRV_CTL_ELEM_IFACE_PCM 或 SNDRV_CTL_ELEM_IFACE_MIXER 接口上实现。要创建 SG 缓冲区处理器,可以在 PCM 构造函数中调用 snd_pcm_set_managed_buffer() 或 snd_pcm_set_managed_buffer_all(),并使用 SNDRV_DMA_TYPE_DEV_SG 类型,就像其他 PCI 预分配方式一样。原创 2025-06-28 17:43:09 · 336 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(6)之AC97驱动实现解析
但如果你需要在驱动中修改寄存器值,或者需要对 AC97 编解码器执行挂起/恢复(suspend/resume)操作,那么就需要保留这个指针,以便传递给相应的函数。以下寄存器可用于设置采样率:AC97_PCM_MIC_ADC_RATE、AC97_PCM_FRONT_DAC_RATE、AC97_PCM_LR_ADC_RATE 和 AC97_SPDIF。当一张声卡上有多个编解码器(Codec)时,你需要多次调用 snd_ac97_mixer(),并将 ac97.num 设置为 1 或更大的值。原创 2025-06-25 21:11:43 · 482 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(5)
一些常用的 info 回调函数已经为你提供,方便使用:snd_ctl_boolean_mono_info() 和 snd_ctl_boolean_stereo_info()。第一部分 SOURCE(来源) 表示该控制项控制的来源,是一个字符串,例如 “Master”(主控)、“PCM”、“CD” 和 “Line”(线路输入)等。snd_ctl_new1() 会分配一个新的 struct snd_kcontrol 实例,而 snd_ctl_add() 则将指定的控件组件添加到声卡(card)中。原创 2025-06-22 17:50:04 · 1035 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(4)
已分配缓冲区的物理地址存储在 runtime->dma_area 中,缓冲区大小和 period 大小则分别存储在 runtime->buffer_size 和 runtime->period_size 中。对于大多数只需要调用 synchronize_irq() 的驱动,还有一个更简单的做法:在不实现 sync_stop 回调(即设置为 NULL)的前提下,驱动在申请中断后将返回的中断号赋值给 card->sync_irq 字段即可。需要注意的是,不要将它与 pcm->private_data 混淆。原创 2025-06-21 20:34:11 · 1096 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(3)
如果两者都支持,也可以同时设置。其他可选的标志还包括 SNDRV_PCM_INFO_PAUSE 和 SNDRV_PCM_INFO_RESUME。当 PCM 子流之间可以同步(通常是播放和录音流的同步启动/停止)时,也可以添加 SNDRV_PCM_INFO_SYNC_START 标志。如果你的芯片支持一些非常规的采样率,还需要添加 SNDRV_PCM_RATE_KNOT 标志,并手动设置相应的硬件约束(后文会详细介绍)。需要注意的是,运行时实例中保存的是描述符的一个副本,而不是对原始描述符的指针。原创 2025-06-20 21:16:13 · 977 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(2)
如果你是通过 request_region() 或 request_mem_region() 手动申请的资源,则可以通过 release_resource() 来释放。但在实际分配之前,需要将该中断号初始化为 -1,因为中断号 0 是合法的。在 PCI 总线上,中断是可以共享的,因此在调用 request_irq() 时需要使用 IRQF_SHARED 作为中断标志。PCI 资源的分配是在 probe 函数中完成的,通常会专门编写一个额外的 xxx_create() 函数来实现这一目的。原创 2025-06-14 21:42:28 · 588 阅读 · 0 评论 -
从零写一个ALSA声卡驱动学习(1)
不过,至少 ALSA 的内核 API 是一致的,因此本文档在编写这些驱动时仍然具有一定的参考价值。“card” 记录是声卡的核心管理结构,它负责管理该声卡上的所有设备(组件),例如 PCM、混音器(Mixer)、MIDI、合成器等。虽然 Linux 系统本身有标准的 i2c 层,但某些声卡只需要简单的操作,而标准的 i2c API 过于复杂,因此 ALSA 对某些声卡实现了自己的 i2c 代码。在 snd_mychip_probe() 函数中的注释行里标注的数字,对应的是下一节中将详细解释的内容。原创 2025-06-08 00:01:07 · 937 阅读 · 0 评论