Matrix

CarlyleLiu‘s Blog

测试方法

  • 两块板子之间通过 I2S 通信,其中一块板子配置为 Slave 另一块板子为 Master

  • Master 板端执行 arecord | aplay 或者 gstream 命令

    1
    2
    arecord -Dhw:2,0 -r 44100 -c 8 -f S32_LE | aplay -Dhw:2,0 -c 8 -r 44100 -f S32_LE
    gst-launch-1.0 alsasrc device=device_input_split ! alsasink device=device_output sync=false

  • Slave 通过 aplay 播放一段 wav 文件

  • 通过示波器抓取 Master 板的 I2S 输入和输出端的波形间隔来测量虚拟声卡的 Latency

阅读全文 »

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 的参数配置。当然,前文在讨论编解码器类驱动程序时已经描述过这两种数据结构体,因此,本节将仅介绍与平台代码相关的附加概念。

阅读全文 »

编解码器类驱动程序是最基本的,他实现的代码应该利用编解码器设备并公开其硬件属性,以便 amixer 等用户空间工具可以使用它。

由于驱动程序针对特定的编解码器,因此它应该包含音频控制、音频接口功能、编解码器 DAPM 定义和 I/O 功能,每个编解码器必须满足:

  • 通过定义 DAI 和 PCM 配置来提供与其他模块的接口
  • 提供编解码器控制 I/O hook(使用 I2C、SPI 的 API)
  • 根据用户空间的需要,公开其他内核控件(Kernel control,Kcontrol)以动态控制模块行为
  • 定义 DAPM widget,为动态电源切换建立 DAPM 路由,并提供 DAC 数字静音控制(option)
阅读全文 »

ASOC

ALSA 是为桌面计算机而设计的,没有考虑嵌入式设备的限制,在处理嵌入式设备时会产生很多问题,包括但不限于如下:

  • 编解码器和 CPU 之间的耦合太强,导致代码移植困难。
  • 没有处理用户音频相关行为通知的标准方法,在移动场景中,用户的相关音频操作很频繁。
  • 在最初的 ALSA 设置中没有考虑 PM 机制。

ASOC 就是为了解决以上问题而产生的。ALSA(ALSA system on chip, ASOC)层的目的是为嵌入式处理器和各种编解码器提供更好的 ALSA 支持。ASOC 具有以下优势:

  • 独立的编解码器驱动程序。
  • 更方便的配置 CPU 和编解码器动态音频电源管理(dynamic audio power management, DAPM)之间的音频数据接口。
  • 减少弹出和点击操作,并增加与平台相关的控件。
阅读全文 »
0%