Linux ALSA 之一:ALSA 架构简介-程序员宅基地

技术标签: linux  ALSA  Linux内核设计与实现  音频  

一、概述

ALSA是 Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构。

在 Linux 内核设备驱动层,ALSA 提供了 alsa-driver,在应用层,ALSA 为我们提供了 alsa-lib,故在其支持下,Linux 应用程序只需要调用 alsa-lib 提供的 API,即可完成对底层音频硬件的控制。linux内核中alsa的软件结构如下:
在这里插入图片描述
用户空间的 alsa-lib 对应用程序提供统一的 API 接口,隐藏了驱动层的实际细节,简化了应用程序的实现难度,但是由于 alsa-lib 也由于过大,因此在 android 等下也经常使用 tiny-alsa,详细描述此处略。

如上图所示,在 Linux 内核中,有对 alsa-driver 进一步的封装,即 alsa-soc,其针对 alsa 的一些不足之处进行了增强,后面篇幅会详细介绍。

二、ALSA 设备文件结构

Linux 系统下看到的设备文件结构如下:

$ cd /dev/snd
$ ls -l
crw-rw----+ 1 root audio 116, 8 2011-02-23 21:38 controlC0
crw-rw----+ 1 root audio 116, 4 2011-02-23 21:38 midiC0D0
crw-rw----+ 1 root audio 116, 7 2011-02-23 21:39 pcmC0D0c
crw-rw----+ 1 root audio 116, 6 2011-02-23 21:56 pcmC0D0p
crw-rw----+ 1 root audio 116, 5 2011-02-23 21:38 pcmC0D1p
crw-rw----+ 1 root audio 116, 3 2011-02-23 21:38 seq
crw-rw----+ 1 root audio 116, 2 2011-02-23 21:38 timer

从上面能看到有如下设备文件:

controlC0 -->              用于声卡的控制,例如通道选择,混音,麦克控制,音量加减,开关等
midiC0D0  -->              用于播放midi音频
pcmC0D0c -->               用于录音的pcm设备
pcmC0D0p -->               用于播放的pcm设备
seq  -->                   音序器
timer -->                  定时器

其中,C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则,从上面的列表可以看出,我的声卡下挂了6个设备,根据声卡的实际能力,驱动实际上可以挂载更多种类的设备,在include/sound/core.h 中,定义了以下设备类型,通常更关心的是 pcmcontrol 这两种设备,Default 一个声卡对应一个 Control 设备。

#define    SNDRV_DEV_TOPLEVEL    ((__force snd_device_type_t) 0)
#define    SNDRV_DEV_CONTROL    ((__force snd_device_type_t) 1)
#define    SNDRV_DEV_LOWLEVEL_PRE    ((__force snd_device_type_t) 2)
#define    SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)
#define    SNDRV_DEV_PCM        ((__force snd_device_type_t) 0x1001)
#define    SNDRV_DEV_RAWMIDI    ((__force snd_device_type_t) 0x1002)
#define    SNDRV_DEV_TIMER        ((__force snd_device_type_t) 0x1003)
#define    SNDRV_DEV_SEQUENCER    ((__force snd_device_type_t) 0x1004)
#define    SNDRV_DEV_HWDEP        ((__force snd_device_type_t) 0x1005)
#define    SNDRV_DEV_INFO        ((__force snd_device_type_t) 0x1006)
#define    SNDRV_DEV_BUS        ((__force snd_device_type_t) 0x1007)
#define    SNDRV_DEV_CODEC        ((__force snd_device_type_t) 0x1008)
#define    SNDRV_DEV_JACK          ((__force snd_device_type_t) 0x1009)
#define    SNDRV_DEV_COMPRESS    ((__force snd_device_type_t) 0x100A)
#define    SNDRV_DEV_LOWLEVEL    ((__force snd_device_type_t) 0x2000)

三、Linux ALSA 源码目录结构

在 LInux 源码中 ALSA 架构的代码在 /sound 下,Linux 5.0 的目录如下:
在这里插入图片描述
其中各主要子目录的作用如下:

core       该目录包含了ALSA 驱动的中间层,它是整个 ALSA 驱动的核心部分
core/oss   包含模拟旧的 OSS 架构的 PCM 和 Mixer 模块
core/seq   有关音序器相关的代码
drivers    放置一些与CPU、BUS架构无关的公用代码
i2c        ALSA自己的I2C控制代码
pci        pci声卡的顶层目录,子目录包含各种pci声卡的代码
isa        isa声卡的顶层目录,子目录包含各种isa声卡的代码
soc        针对 system-on-chip 体系的中间层代码
soc/codecs 针对soc 体系的各种 codec 的代码,与平台无关

include    ALSA驱动的公共头文件目录,其路径为 /include/sound,该目录的头文件需要导出给用户空间的应用程序使用,通常,驱动模块私有的头文件不应放置在这里

参考博文:
Linux ALSA声卡驱动之一:ALSA架构简介
linux-alsa详解1 基本知识

加油打气:Linux ALSA 架构是一个难啃的大骨头,继续加油!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45437140/article/details/124975690

智能推荐

迷信一把:三才数理吉凶_113易经数字代表什么-程序员宅基地

文章浏览阅读1.2w次。所谓三才即天才、人才、地才,它们分别是天格、人格、地格数字的个位 数。4U,byhN0五行之间的关系是:木、火、土、金、水相临相生,相隔相克。这样,根据数理与五行之间的内在联系,推算出来的配置关系即为三才配置。从中观察三才配置的凶吉,可以判断把握您的综合运势,预测您的事业成功 率以及身体状况. 111 成功顺利伸展,希望圆满达成,基础安定,_113易经数字代表什么

群晖 半洗白_黑群晖利用DDSM半洗白教程-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏9次。半洗白原理半洗白原理:DSM6 以上的系统。群晖Docker中会增加一个叫做DSM的功能。简单来说,就是利用Docker在你的群晖系统中,虚拟一个群晖系统。然而,令我们庆幸的是。这个虚拟出来的小群晖。在Docker中是自带生成序列号(SN)的。只不过这个序列号我们只能用来半洗白而不能全洗白。所以,我们只需要将这个小群晖的序列号和MAC 提取出来。替换到你物理机安装的群晖引导当中,就可以实现半洗白咯..._2020年黑群晖还能洗白吗

Bestcoder7(1004)hdu4988(经典问题:树状数组套treap求解动态逆序对)_hdu 4988-程序员宅基地

文章浏览阅读1.7k次。Little Pony and Boast BustersTime Limit: 20000/10000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 83 Accepted Submission(s): 32Problem Description_hdu 4988

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".-程序员宅基地

文章浏览阅读48次。调试Mina程序出现如下错误:SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBin...

vs2012配置python_安装适用于Visual Studio 2012(PTVS)的Python工具-程序员宅基地

文章浏览阅读220次。I installed the version for VS 2010 a few weeks ago, and it went flawlessly. I am not having such good luck for the version for VS 2012. What did I do wrong? I ran, in order, two installers from Micro..._vs2012 installing a python interpreter will let you run your project, and wi

无线网络安全与解决方案(Wireless Security)_wifi security-程序员宅基地

文章浏览阅读9k次,点赞9次,收藏44次。讲解几种无线网络安全问题(Wireless Security)以及相应的解决方案。_wifi security

随便推点

ant项目构建(打jar包小案例)_ant构建,包小-程序员宅基地

文章浏览阅读8.3k次。ant介绍不说了,在此直接使用ant为项目打一个jar包,在开始之前,先说下ant环境的搭建ant环境准备:首先安装好JDK,配置好JAVA_HOME与PATH;其次下载ant包,直接解压,配置ANT_HOME与PATH环境变量;最后测试ant环境是否搭建成功:cmd下输入ant -version,出现ant版本信息说明ant环境搭建成功利用ant打jar包先编写b_ant构建,包小

java获取tomcat端口_获取当前Tomcat实例的端口-程序员宅基地

文章浏览阅读1.3k次。有时需要在当前代码中获取当前Server实例的端口号, 通过HttpServletRequest请求可以, 但有时也需要在没有请求的情况下获取到端口号.用以下方法是可以获取到的:public int getHttpPort() {try {MBeanServer server;if (MBeanServerFactory.findMBeanServer(null).size() > 0) {..._java获取tomcat端口号

qml红色下划线去除_qt 的qml文件中总是红色错误线-程序员宅基地

文章浏览阅读750次。红色下划线_qt 的qml文件中总是红色错误线

Kafka Consumer 执行 poll 操作时获取空数据的原因分析(2)_consumer.poll获取不到数据-程序员宅基地

文章浏览阅读6.1k次。上一个问题的回答:https://blog.csdn.net/weixin_37392582/article/details/1046851911. 场景当用户需要获取数据时,后端从指定 topic 下消费1条数据;每次操作的间隔为 0~;每个 topic 只有一个 消费者。2. 现象多个topic同时消费数据,经常出现“获取数据失败”的问题;所有的消费者均在一个 group 内。..._consumer.poll获取不到数据

SCRATCH 小游戏-程序员宅基地

文章浏览阅读6k次。scratch 小游戏《五连子》

修改caffe中resize的方式_caffe resize-程序员宅基地

文章浏览阅读824次。opencv的resize默认的是使用双线性插值INTER_LINEAR,也可以是尝试其他的方式进行插值操作if (param.random_interpolation_method()) { // 0: INTER_NEAREST // 1: INTER_LINEAR // 2: INTER_CUBIC // 3: INTER_AREA // 4: IN..._caffe resize

推荐文章

热门文章

相关标签