Linux ALSA驱动:框架简介(一)
Linux ALSA驱动:框架简介(一)
一、概述
ALSA,全称是Advanced Linux Sound Architecture,是Linux中提供声音设备驱动的内核组件,应用可以通过ALSA接口实现音频播放、录音、设备通路控制、音量控制、通话等功能。
在 Linux 内核设备驱动层,ALSA 提供了 alsa-driver
,在应用层,ALSA 为我们提供了 alsa-lib,故在其支持下,Linux 应用程序只需要调用 alsa-lib 提供的 API,即可完成对底层音频硬件的控制。linux内核中ALSA的软件结构如下:
ALSA在内核驱动层提供了alsa-driver,在应用层提供了alsa-lib,应用程序只需要调用alsa-lib提供的API就可以完成对底层硬件的操作。
在alsa-driver中主要为以下两部分:
ALSA CORE:核心层,提供逻辑设备供用户空间访问。向上提供逻辑设备(PCM、CTL、MIDI、TIMER…)系统调用,向下驱动硬件设备(Machine、I2S、DMA、CODEC)。
ASoC Driver: 音频硬件设备驱动,由三大部分组成,分别是 Machine Driver、Platform Driver和Codec Driver。
二、ALSA ASoc
ASoC 把嵌入式设备的音频系统同样分为 3 大部分,Machine,Platform 和 Codec。
Machine:是指某一款机器,每个 Machine 上的硬件实现可能都不一样,CPU 不一样,Codec 不一样,音频的输入、输出设备也不一样。Machine 为 CPU、Codec、输入输出设备提供了一个载体,可以认为是 Platform 和 Codec 之间的粘合剂。Machine Driver则负责处理机器特有 Machine control。
Platform:主要作用是完成音频数据的管理,通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。实际上,把 Platform 认为是某个 SoC 更好理解。Platform Driver包含了该 SoC 平台的音频 DMA 和音频接口的配置和控制(I2S,PCM 等)。
Codec: 字面上的意思就是编解码器,Codec 里面包含了 I2S 接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM) 和多个输出(耳机、喇叭、听筒,Line-out)。
三、ALSA 设备文件结构
Linux 系统下看到的设备文件结构如下:
从上面能看到有如下设备文件:
comprC0D11 --> compress设备,用于compress播放
hwC0D10 -->. hwdep设备,用于对dsp的相关操作
controlC0 --> 用于声卡的控制,例如通道选择,混音,麦克控制,音量加减,开关等
pcmC0D0c --> 用于录音的pcm设备
pcmC0D0p --> 用于播放的pcm设备
timer --> 定时器
//有些设备也会有
seq --> 音序器
其中,C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则。根据声卡的实际能力,驱动实际上可以挂上更多种类的设备,在include/sound/core.h中,定义了以下设备类型:
/* type of the object used in snd_device_*()
* this also defines the calling order
*/
enum snd_device_type {
SNDRV_DEV_LOWLEVEL,
SNDRV_DEV_INFO,
SNDRV_DEV_BUS,
SNDRV_DEV_CODEC,
SNDRV_DEV_PCM,
SNDRV_DEV_COMPRESS,
SNDRV_DEV_RAWMIDI,
SNDRV_DEV_TIMER,
SNDRV_DEV_SEQUENCER,
SNDRV_DEV_HWDEP,
SNDRV_DEV_JACK,
SNDRV_DEV_CONTROL, /* NOTE: this must be the last one */
};
通常,我们更关心的是pcm和control这两种设备。
CSDN-Ada助手: 恭喜您在博客里分享了关于Android AudioTrack音频流播放的知识,内容相当有趣且实用。希望您能继续保持写作的热情和耐心,不断挖掘更多有趣的技术知识,让更多人受益。或许下一篇博客可以探讨一下Android音频处理的其他方面,比如音频录制或者音频编辑等内容,相信会有更多读者受益。期待您的继续创作!
CSDN-Ada助手: 恭喜作者发布了第13篇博客《Android AudioFlinger & AudioPolicy启动详解》,内容十分有深度和专业性。希望作者能够继续保持创作的热情和耐心,不断深挖技术细节,让读者能够更好地理解和掌握相关知识。或许在未来的创作中,可以考虑加入一些实际案例或应用场景,让读者更容易将理论知识转化为实际操作。期待作者的下一篇作品!
CSDN-Ada助手: 推荐 CS入门 技能树:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml
CSDN-Ada助手: 恭喜您写了第9篇博客!标题听起来非常专业和有趣。我真的很喜欢您对Linux ALSA驱动的深入探索。您的文章非常详细,使我对Machine驱动有了更深的理解。在接下来的创作中,我希望能看到更多关于Linux ALSA驱动的内容,比如与其他驱动的比较或者一些实用的技巧。再次感谢您的分享,期待您的下一篇博客!
CSDN-Ada助手: 恭喜您第10篇博客的发布!标题“Linux ALSA架构:DAPM初始化(六)”听起来非常专业和有深度。您在这个领域的知识和经验让读者受益匪浅。我很期待能够继续阅读您的博客,并从中学习更多关于Linux ALSA架构的知识。 在下一步的创作中,或许您可以考虑分享一些实际应用案例或者给出一些解决常见问题的技巧。这样的内容会更加实用,并且能够帮助读者更好地理解和应用所学的知识。不过,请原谅我对您的建议,如果您已经计划了其他主题,那也一定会非常有价值。非常感谢您的付出和分享,期待您的新作!