ALSA
+ -

ALSA简介

2022-06-08 1341 0

ALSA全称Advanced Linux Sound Architecture。是Linux 内核关于音频的驱动程序架构。

ALSA官网为:https://www.alsa-project.org/

在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。

ALSA

嵌入式ALSA

嵌入式音频子系统架主要是ALSA 片上系统 (ASoC),其中包括 codec driver、 platform driver、 machine driver 等

  • codec driver只关心 codec 本身;
  • platform driver 主要包括平台 cpu dai( 如 i2s) , dma 等部分;
  • machine driver 主要将 platform driver 和 codec driver 连接起来。

    platform 和 dai driver 一般修改较少, 主要修改machine 和 codec driver,这也将是我们后续分析的重点。

ALSA驱动asoc框架

ALSA扣扑结构

ALSA扣扑结构

ALSA历史

开发 ALSA 的项目由 Jaroslav Kysela 领导,基于Gravis Ultrasound声卡的 Linux 设备驱动程序。它始于 1998 年,与 Linux 内核分开开发,直到 2002 年在 2.5 开发系列中引入(2.5.4–2.5.5)。

在 2.6 版本中,它默认替换了之前的系统Open Sound System (OSS)(尽管确实存在向后兼容层)。

ALSA 具有比 OSS 更大、更复杂的 API,因此开发使用 ALSA 作为其声音技术的应用程序可能会更加困难。虽然 ALSA 可以配置为提供 OSS 仿真层,但在许多 Linux 发行版中,此类功能不再可用或默认未安装。

ALSA特点

ALSA 在设计时具有一些功能,在其构思时,OSS 不支持:

  • 基于硬件的MIDI合成。
  • 多通道的硬件混合。
  • 全双工操作。
  • 多处理器友好、线程安全的设备驱动程序。

除了声音设备驱动程序之外,ALSA 还为希望通过比提供用于与内核驱动程序直接交互的接口更高级别的接口来使用驱动程序功能的应用程序开发人员捆绑了一个用户空间 库。与试图直接反映硬件功能的内核 API 不同,ALSA 的用户空间库提供了一种抽象,该抽象在不同的底层硬件元素之间保持尽可能标准化。这个目标部分是通过使用软件插件来实现的;例如,许多现代声卡或内置声音芯片没有“主音量”控件。相反,对于这些设备,用户空间库使用“ softvol ”提供软件音量控制” 插件,普通的应用软件不需要关心这样的控制是通过底层硬件实现的,还是通过底层硬件的软件仿真实现的。

ALSA的应用

除了 Linux 内核内部的软件框架,ALSA 项目还提供了命令行工具和实用程序 alsactl、 amixer、arecord/aplay和alsamixer以及ncurses基于TUI。

还有由第三方开发人员编写的 GUI ,例如 GNOME-ALSAmixer (使用GTK)、Kmix、 XFCE4-mixer、LXpanel、QasHctl、QasMixer、Pavucontrol、AconnectGUI、tapiir polarbear、ALSAmixerGUI(使用FLTK)、ZynAddSubFX、Yoshimi等等。

ALSA概念

一般情况,ALSA 最多支持8张卡,编号为 0 到 7;每张卡都是能够输入和输出的物理或逻辑内核设备。此外,每张卡还可以通过其id来寻址,这是一个解释性字符串,例如“ Headset ”或“ ICH 9 ”。

一张卡有devices,从 0 开始编号;设备可能是播放类型的,这意味着它从计算机输出声音,或其他类型,例如捕获、控制、定时器或音序器;未指定特定设备时,默认使用设备编号 0。

一个设备可能有子设备,从 0 开始编号;子设备代表设备的一些相关声音端点,例如扬声器对。如果未指定子设备或者指定了子设备号-1,则使用任何可用的子设备。

卡接口是用于访问卡的 ALSA 协议的描述;可能的接口包括:hw、plughw、default和plug : dmix 。hw接口提供对内核设备的直接访问,但不支持软件混合或流适配。plughw和default在硬件接口会产生错误 的情况下启用声音输出。

应用程序通常通过将所有上述规范组合在一个设备字符串[ citation required ]中来描述声音输出,该设备字符串具有以下形式之一(区分大小写):

  • interface:card,device,subdevice
  • interface:CARD=1,DEV=3,SUBDEV=2.

ALSA流是表示声音的数据流;最常见的流格式是PCM,它必须以匹配硬件特性或参数的方式生成,包括:

  • 采样率:家庭立体声音响通常为 44.1 kHz,家庭影院为 48 kHz,而高保真音频制作或再现则高达 88.2 kHz、96 kHz 甚至 192 kHz。
  • 样本宽度:以每个样本的某些位数衡量(例如 8、16、24 或 32 位/样本)
  • 样本编码:如字节序
  • 通道数:1 个单声道,2 个立体声,或 6 个AC-3 / IEC958
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB-UAC麦克风 音频控制接口
音频控制接口描述符描述了设备的结构(拓扑结构),并通过特定类请求对音频的控制。UAC麦克风 音频控制接口描述符偏移地址字段长度值描述0bLength10x09接口描术符的长度1bDescriptorType10x04描述符的类型接口描述符2bInterfaceNumber10x00接口ID号3bA......
UAC 类特定音频控制接口头描述符
UAC类特定音频控制头接口描述符这个名字有点绕,其实这个描述符是前接标准的音频控制接口描述符,后续关于音频控制的所有相关描述符,起着承上起下的作用。当然也可以认为是音频控制相关描述符的前导。这是因为UAC类特定音频控制接口描述符含有一个关键的字段wTotalLength,用于包含音频控制所有接口描述......
华为UAC耳机 音频控制接口
音频控制接口占用接口ID=0,音频控制接口的描述符结构布局如下:USB标准接口描述符UAC音频控制接口头描述符IDSId描述    音频控制输入终端描述符1USB Streaming   ......
UAC 音频数据格式FORMAT_TYPE_3
下面来介绍USB Audio Data Formats 的第一类音频数格式 FORMAT_TYPE_III = 0x03Audio Data Format Type III Codes 其下又分为5种,分别为:NamewFormatTagTYPE_III_UNDEFINED0x2000IEC1937......
UAC 音频控制
一个USB设备可能包含多个配置。像手机一样,当手机通过USB线缆接入PC机后,会弹出一个选择对话框:让用户选择。当然一个USB设备只能工作在一种配置描述符下。对于每一个USB配置描述符,可能含有多个USB接口描述描述符,同时这些接口描述符可能每个接口描述符又包含多个转换接口描述符。这些接口描述符可能......
UAC 标准音频流接口描述符
UAC音频流接口描述符包含与音频数据流相关的描述符信息。标准音频流接口描述符,Standard AS Interface Descriptor是音频流接口描述符的第一个描述符。该描述符是标准的接口描述符,故数据结构定义如下:typedef struct _USB_INTERFACE_DESCRIPT......
UAC 音频数据格式FORMAT_TYPE_I
下面来介绍USB Audio Data Formats 的第一类音频数格式 FORMAT_TYPE_I = 0x01Audio Data Format Type I Codes 其下又分为5种,分别为:NamewFormatTagTYPE_I_UNDEFINED0x0000PCM0x0001PCM8......
UAC 音频数据格式FORMAT_TYPE_2
下面来介绍USB Audio Data Formats 的第一类音频数格式 FORMAT_TYPE_II = 0x02Audio Data Format Type II Codes 其下又分为5种,分别为:NamewFormatTagTYPE_II_UNDEFINED0x1000MPEG0x1001......
USB-UAC麦克风 音频流接口
音频流接口有2个转换接口。UAC麦克风 零带宽转换接口转换接口0是零带宽设置,用于在麦克风未使用。这是通电后的默认设置。实现了零带宽通过指定接口的此备用设置没有与之关联的端点(bNumEndpoints=0)。偏移地址字段长度值描述0bLength10x091bDescriptorType10x04......
USB音箱 UAC音频控制模块
从UAC规范可知,类示于UVC规范,UAB的两个主要模块分别为音频控制模块和音频流模块。这两个模块分别对应一系列的相关描述符。其中UAC的音频控制模块顾名思义,就是实现的是音频的控制功能,同时显示音频的拓扑结构。而音频流模块主要实现的是数据传输。从音频控制接口头描述符(Audio Control ......
UAC 音频通道集描述符
UAC音频通道集描述符全称Audio Channel Cluster Descriptor。音频通道集描述符是为了引入一组具有相同特性(如采样)的音频通道的描述符。音频通道描述符主要包括两方面的内容:bNrChannels:音频通道的数量。bmChannelConfig:位图字段,用于指定通道占用的......
UAC 音频流端点控制请求
音频流端点控制支持如下选择子:ControlSelector ValueEP_CONTROL_UNDEFINED0x00SAMPLING_FREQ_CONTROL0x01PITCH_CONTROL0x02SAMPLING_FREQ_CONTROL采样......
UAC 类特定音频流接口描述符
类特定音频流接口描述符:Class-Specific AS Interface Descriptor.UAC类特定音频流接口描述符 - UVC1.0结构体定义如下:typedef struct _USB_ASI_DESCRIPTOR{ UINT8 bLength; UINT8......
USB音箱 UAC音频流模块
音频流模块主要用于数据的传输,这里只有一个音频流接口,并且这个接口有一个转换接口。当转换接口为0时,在UAC规范中定义为无数据流传输,即设备关闭,故无任何USB端点信息。从Audio Streaming Format Type Descriptor可知,设备支持的是PCM1格式,2通道,每2通道1......
UAC 标准等时音频数据端点描述符
标准等时音频数据端点描述符:Standard AS Isochronous Audio Data Endpoint Descriptor,用于描述音频数据流的传递方式及方法。标准等时音频数据端点描述符数据结构定义如下:typedef struct _USB_AUDIO_ENDPOINT_DESCRI......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!