vm参数说明
Currently, these files are in /proc/sys/vm:
PCM plugins extends functionality and features of PCM devices. The plugins take care about various sample conversions, sample copying among channels and so on.
XRUN是缓冲区不足或溢出,X代表不足或溢出。在这两种情况下,都表明系统速度不够快,未能及时处理来自ALSA音频缓冲区的数据,因此丢失了一些数据。当我们以非常小的缓冲区大小运行时,声卡应该非常快地处理传入缓冲区的数据,否则就溢出overrun了。有些芯片无法适应较小的缓冲区大小,因此我们必须增加缓冲区长度以减轻声音芯片的工作量。通常,xruns可以听到爆裂声或爆裂声。
ASoC架构的设计方式是平台和编解码器类驱动程序必须绑定在一起才能构建音频设备。这种绑定可以在所谓的机器驱动程序或设备树中完成,每一个机器驱动程序和设备树都是与特定机器相关的。也就是说,机器驱动程序针对特定系统,并且不同的板卡需要不同的机器驱动程序。
平台驱动程序可以注册PCM驱动程序、CPU DAI驱动程序及其操作函数,为PCM组件预分配缓冲区,并根据需要设置回放和采集操作。换言之,平台驱动程序包含该平台的音频引擎和音频接口驱动程序(如I2S、AC97和PCM)。
平台驱动程序以构成平台的SoC为目标。它涉及平台的DMA(即音频数据在SoC中的每个块之间如何传输)和CPU DAI(即CPU向编解码器发送音频数据的路径或CPU从编解码器获得音频数据的路径)。
平台驱动程序有两个重要的数据结构体:structsnd_soc_component_driver和structsnd_soc_dai_driver。前者负责DMA数据管理,后者负责DAI的参数配置。当然,前文在讨论编解码器类驱动程序时已经描述过这两种数据结构体,因此,本节将仅介绍与平台代码相关的附加概念。
这里以Wolfson公司的编解码芯片WM8960为例来说明上篇介绍的相关内容。
编解码器类驱动程序是最基本的,他实现的代码应该利用编解码器设备并公开其硬件属性,以便amixer等用户空间工具可以使用它。
由于驱动程序针对特定的编解码器,因此它应该包含音频控制、音频接口功能、编解码器DAPM定义和I/O功能,每个编解码器必须满足:
ALSA是为桌面计算机而设计的,没有考虑嵌入式设备的限制,在处理嵌入式设备时会产生很多问题,包括但不限于如下:
ASOC就是为了解决以上问题而产生的。ALSA(ALSA system on chip, ASOC)层的目的是为嵌入式处理器和各种编解码器提供更好的ALSA支持。ASOC具有以下优势:
电脑播放器播放音乐时:是按一个固定的速率,比如44.1KHZ,电脑内有一个晶振,可分频出一个44.1KHZ,进行音乐播放,发给USB的数据流速率固定。USB声卡自己得有一个晶振才能工作,它也可分频出一个44.1KHZ,供给I2S信号或DAC。
问题来了,晶振是有误差的,这两个44.1KHZ不可能完全一模一样,电脑可能是44.100KHZ,USB声卡可能是44.098KHZ,误差约50ppm,很正常的情况。虽然声卡晶振分频出来是44.098KHZ,但声卡认为它就是工作在44.100KHZ下。好吧,如果二者时钟独立运行,那么1个小时会误差0.2秒,会出现不同步! 即电脑播了1个小时的数据,USB声卡实际是无法播完的,要多0.2秒才能播完。 如果声卡也要1小时播完,那这1小时就需要丢掉0.2秒的数据。
所以二者的时钟必须要同步一致才行,这就是UAC同步问题的原因,因此USB音频规定了一是采用“等时传输模式”,二是设备需要指定为3种同步方式之一:同步(synchronous),适应(adaptive),异步(asynchronous)。