ALSA编程指南

FrontPage

  • 硬件概览
  • Audio Interface
  • ALSA是什么?
  • ALSA程序的结构
  • 与ALSA相关的资源
  • ALSA的体系结构
    • PCM
    • Control接口
  • ALSA用户空间C库概览
  • PCM操作相关
  • Audio Clips

硬件概览 †

计算机中声卡的设计几乎从来没有过统一标准,所以,声卡的自身的设计本身是变化多端的。但是,通常常见的声卡都可以抽象出几个部分:

  • 输入设备:比如麦克风(模拟/电子),从其他音响设备结果来的LINE IN;
  • ADC:模拟信号到数字信号转换器;声卡可以处理的信号是数字信号,当有输入进入声卡时,输入通常是模拟信号,比如传统的麦克风给出的信号就是模拟信号,这是就需要ADC将模拟信号转换成声音信号;
  • 信号处理和控制核心:这部分是声卡的核心,一般由一个或者多个codec实现;
  • DAC:数字信号到模拟信号的转换器;它的功能就是将处理好的数字信号转化成模拟信号;
  • MIXER:俗称混音器;这个设备主要的功能是将不同输入来源的声音信号混合起来并且转发到不同的输出设备上去;比如,想象一下一边听音乐一边音频聊天的情景,混音器需要将从麦克风过来的语音内容和播放器传说过来的音乐混合起来转发到耳机上;而当耳机拔出脱离声卡时,混音器需要将声音信号转发的计算机的喇叭上去;等等;
  • 输出设备:喇叭,LINE OUT和麦克风都是输出设备;放大器也可以被看作输出设备,通常放大器不需要软件控制,也就是不需要有驱动程序就可以动作;放大器的主要功能就是将声音信号放大,增加响度等等。

Audio Interface †

Audio Interface主要是指可以将声音数据从计算机中传入传出的接口。常见的Audio Interface有I2S和AC97两种。其中,I2S多用与嵌入式设备上的声音数据传输,而AC97接口则多见于传统PC。这两种接口有什么不同呢?这里暂且搁置不谈。对声音程序的开发者来说,跟重要的是理解Audio Inferface的概念而非细节。细节就留给硬件工程师和驱动开发者吧。

在计算机内部,声音被表示成为字节流(stream bit),与其他类型的数据并没有差异。而在计算机的外部世界,通常,声音可以被表示成为数字形式(一个或这多个字节流)或者模拟形式(按照时间表示的电压变化)。Audio Interface的主要任务就是将计算机内部外部世界的不同数据类型进行转化。Audio Inferface的构成当然和它的功能有着必然的联系。当声音通过Audio Inferface传入计算机内部时,经过转化的数据(字节)将被暂时存储在一个硬件上的缓冲区中,当缓冲区已满,Audio Interface就会触发一个中断,要求CPU协调将数据从缓冲区移动到适当的地方去,通常,这种数据移动都是以DMA的方式进行,而且,通常数据移动的目的地就是主存。

                 +---------------------------------+
                 |Audio         +----------------+ |
Audio Signal ----|Interface-----+ HW BUFFER      | |
                 |              +----------------+ |
                 +---------------------------------+

将数据从计算机传出的过程于此类似,只是方向正好相反,中断触发的时机也不同。Audio Interface会在硬件缓冲区被搬走后清空的情况下触发终端,要求CPU协调传送新的数据进入缓冲区。

从上面的描述就可以看出,Audio Interface有几个要素需要开发者注意。

  • 数据转换的格式;
  • 数据转换的速率;
  • 需要多少数据/空闲空间来触发中断;
  • 硬件缓冲区的大小;

以上要素中,前两个决定了声音信号/数据的质量,而后两者决定了“延迟”。一般延迟有“输入延迟”和“输出延迟”两种。输入延迟指的是数据开始传输进入硬件缓冲区的时刻和CPU得到完成数据移动的那个时刻之间的时间差;输出延迟与次类似,方向相反。

ALSA是什么? †

ALSA是Advanced Linux Sound Architecture的缩写。回答完毕。

这样答未免太无聊了,但毕竟有了一个给傻瓜写的教科书一样开头。ALSA是为Linux并且不限于Linux操作系统而设计的一套软件栈,它为声音相关的硬件提供了硬件抽象;应用程序可以通过一个统一的接口操作声卡的硬件而不需要关系具体的细节;

ALSA程序的结构 †

ALSA程序的结构非常简单。

open_the_device(); /* 打开声音输入/输出设备 */
set_the_parameters_of_the_device(); /* 设置该设备的参数,最终要的就是前文提到的四个参数 */
while(!done) {
  /* one or both of these */
  receive_audio_data_from_the_dev(); /* 从设备接收数据 */
  deliver_audio_data_to_the_dev(); /* 向设备发送数据 */
}
close_the_device(); /* 关闭声音输入输出设备 */

与ALSA相关的资源 †

  • ALSA项目的主页

http://www.alsa-project.org/main/index.php/Main_Page

这里是ALSA相关的所有内容的源头,包括代码和文档,如果想要弄懂声音如何在Linux中工作,狠狠扎进这一堆财富里面吧!

  • Documentation/sound/alsa/*

内核源码中的文档也是相当的言简意赅,这里要着重推荐。其中,推于嵌入式设备或者Android开发者来说,soc目录中的文档堪称字字珠玑。ASoC主要是由Wolfson公司的开发人员推动和撰写的,这几个文档详细讲述了如何开发ASoC驱动的几乎所有内容。

  • http://www.alsa-project.org/alsa-doc/alsa-lib/index.html

这是用doxygen从代码注释中产生的ALSA用户空间库文档,相当的翔实,建议加入收藏夹中。

ALSA的体系结构 †

ALSA编程指南_第1张图片

上图之中,Control和PCM部分是理解ALSA如何工作的关键。

PCM †

PCM是最常见的数字音频信号形式之一,ALSA驱动提供了一些对PCM进行操作和配置的接口函数;虽然PCM可以广泛用于音频信号传输以外的很多应用上,在编写ALSA驱动和应用时,可以简单的认为它就是依时间轴上不断变化的声音的样本;

比如,下面这个典型的声音信号,

ALSA编程指南_第2张图片

转化成PCM之后变成了这样:

ALSA编程指南_第3张图片

很显然,PCM上声音的质量取决于两个方面,

  • 第一就是采样的密度,也就是时间轴上的间隔;时间间隔越小,声音的质量越好;
  • 第二就是它可以表示的电压的粒度;电压级别划分越细致,声音的质量越好;

Control接口 †

Control是ALSA为用户空间应用程序提供的控制声卡的频频路径(输入输出重定向),音量大小,输入输出设备选择和配置的接口。ALSA控制接口可以控制的两类主要元素是声音的路径和音量的大小;其中,在嵌入式设备上,声音的路径控制是通过驱动程序提供的DAPM接口实现的;而音量控制,是通过接口控制MIXER做到的。

ALSA用户空间C库概览 †

http://www.alsa-project.org/alsa-doc/alsa-lib/index.html

PCM操作相关 †

http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html

Audio Clips †

Audio sample rate conversion (SRC) or audio resampling is the process of changing the audio sample rate without affecting the quality. Broadcast audio infrastructure equipment typically requires 48-kHz synchronous sampling rate audio signals. However, the audio inputs to the audio equipment can be from sources with different sampling rates. For example, CD audio signals have a sampling rate of 44.1 kHz, while other audio sources have sampling rates from 32 kHz to 192 kHz.

你可能感兴趣的:(ALSA编程指南)