3.12. sample_audio 使用说明
3.12.1. 功能概述
sample_audio 是
sample_alsa:基于 ALSA(Advanced Linux Sound Architecture)的
音频 录制 与 播放 程序。支持 通过 命令行 参数 配置 采样率、位深、声道、录制 时 长 以及 录音/播放 设备,可 将 录制 的 音频 保存 为 WAV 格式文件,并 提供 交互式 命令 用于 录制、播放、查询 硬件 支持 能力。 sample_hat_loopback:面向 Waveshare Audio Driver HAT REV2(ES7210+ES8156)外接
声卡 的 双工 loopback 自检 程序,通过「先 录音、再 边播 边录」的 两 阶段 流程,验证 HAT 声卡 是否 正常 注册、能否 完成 8 声道 双工 收发。
注意: EVB 没有
3.12.1.1. 软件架构说明
sample_audio 项目
解析
命令行 参数,包括 --capture/--playback指定录音/播放 PCM 设备,以及 -r/-b/-c/-d/-f等音频 参数 设置 mixer 控件(录音
侧 ADC PGA Gain、播放侧 DAC),若声卡 上 不 存在 对应 控件 则 打印 告警 并 跳 过 录制
音频 功能,负责 从 输入 设备 获取 音频 数据,按位 深 做 数字 增益 后 写入 WAV 文件 播放
音频 功能,从 WAV 文件 中 读取 文件 头 参数 并 据此 配置 PCM 设备,再 通过 输出设备 播放 处理
用户 交互 命令,负责 获取 用户 输入 的 信息,提供 详细 参考 查询
硬件 支持 的 格式、采样率 和 声道 数
软件架构

3.12.1.2. 代码位置及目录结构
代码
位置: app/samples/platform_samples/sample_audio目录
结构:
.
├── sample_alsa
│ ├── Makefile
│ └── sample_alsa.c
└── sample_hat_loopback
├── Makefile
└── sample_hat_loopback.c
sample_alsa/Makefile、sample_hat_loopback/Makefile:分别
用于 编译 两个 示例 程序 的 Makefile 文件。 sample_alsa.c:sample_alsa 程序
的 主要 源代码 文件。 sample_hat_loopback.c:sample_hat_loopback 程序
的 主要 源代码 文件。
3.12.1.3. 工具位置及目录结构
/app/platform_samples/sample_audio
该
3.12.1.4. 背景知识
ALSA 库(libasound): Linux 系统
中 用于 音频 处理 的 标准 库,提供 了 丰富 的 音频 处理 接口,包括 PCM 设备 的 打开/配置/读写、mixer 控件 的 设置、硬件 能力 探测 等。 WAV 文件格式:一种
无损 音频文件 格式,被 广泛支持 和 使用,本 示例 使用 标准 的 44 字节 PCM WAV 头。 ALSA 设备
命名: hw:card,device表示直接 访问 声卡 card 上 的 第 device 个 PCM 设备; plughw:在其 之上 增加 了 一层 插件,sample_alsa 仅 接受 hw:形式。
3.12.1.5. API 流程说明
sample_alsa 主要
snd_pcm_open:打开 PCM 设备(录音
用 SND_PCM_STREAM_CAPTURE,播放 用 SND_PCM_STREAM_PLAYBACK)。 snd_mixer_open / snd_mixer_attach / snd_mixer_selem_register / snd_mixer_load / snd_mixer_find_selem / snd_mixer_selem_set_capture_volume_all / snd_mixer_selem_set_playback_volume_all / snd_mixer_close:用于
在 录音 前 设置 ADC PGA Gain、在播放 前 设置 DAC等 mixer 控件,找不到 对应 控件 时 程序 会 打印 告警 并 跳 过,不会 终止 运行。 snd_pcm_hw_params_any:初始化
硬件 参数 对象。 snd_pcm_hw_params_set_access:设置
数据 访问 方式(程序 固定 使用 SND_PCM_ACCESS_RW_INTERLEAVED,即 左右 声道 交错)。 snd_pcm_hw_params_set_format:设置
音频格式,设置 前用 snd_pcm_hw_params_test_format 探测 硬件 是否 支持 指定 位深 对应 的 格式,不 支持 则 回退 到 SND_PCM_FORMAT_S16_LE。 snd_pcm_hw_params_set_rate_near:设置
采样率,设置 前用 snd_pcm_hw_params_test_rate 探测 硬件 是否 支持 指定 采样率,不 支持 则 回退 到 44100 Hz。 snd_pcm_hw_params_set_channels:设置
声道 数。 snd_pcm_hw_params:应用
硬件 参数 到 设备。 snd_pcm_hw_params_get_period_size:获取
周期 大小,用于 分配 读写 缓冲区。 snd_pcm_readi 和 snd_pcm_writei:用于
音频 数据 的 读取 和 写入;当 返回 -EPIPE(缓冲区 溢出/欠载)时,调用 snd_pcm_prepare 恢复 后 继续。 snd_pcm_drain:播放
结束 时 排空 剩余 数据。 snd_pcm_close:关闭 PCM 设备,释放
资源。
查询c 命令)还会
snd_pcm_hw_params_test_format:逐项
测试 硬件 支持 的 PCM 格式。 snd_pcm_hw_params_test_rate:逐项
测试 硬件 支持 的 采样率。 snd_pcm_hw_params_get_channels_min / snd_pcm_hw_params_get_channels_max:获取
硬件 支持 的 最小/最大 声道 数。

3.12.2. 编译部署
3.12.2.1. 编译
两个make 即可:
cd sample_alsa && make # 编译 sample_alsa
cd sample_hat_loopback && make # 编译 sample_hat_loopback
比如
root@ubuntu:/app/platform_samples/sample_audio/sample_alsa# make
将
3.12.2.2. 硬件环境搭建
可以
外接cat /proc/asound/cards 查看--capture/--playback 参数hw:1,1、播放hw:1,0。
3.12.2.3. 程序部署
编译
sample_audio/
├── sample_alsa
│ ├── Makefile
│ ├── sample_alsa
│ ├── sample_alsa.c
│ └── sample_alsa.o
└── sample_hat_loopback
├── Makefile
├── sample_hat_loopback
├── sample_hat_loopback.c
└── sample_hat_loopback.o
板端
本 sample 的 sample_alsa 可执行文件
位于 板端 /app/platform_samples/sample_audio/sample_alsa/sample_alsa本 sample 的 sample_hat_loopback 可执行文件
位于 板端 /app/platform_samples/sample_audio/sample_hat_loopback/sample_hat_loopback
3.12.3. sample_alsa 运行
3.12.3.1. 程序运行方法
直接hw:0,0、采样率 48000 Hz、位深 16 bit、双声道、5 秒):
./sample_alsa
或者
./sample_alsa -r 16000 -b 16 -c 2 -d 5 -f record_test.wav
EVB 没有cat /proc/asound/cards 查看--capture/--playback 指定hw:1,1、播放hw:1,0:
./sample_alsa --capture hw:1,1 --playback hw:1,0
3.12.3.2. 程序参数选项说明
--capture <hw:card,device> Specify capture PCM device (default hw:0,0) ( 指定录音设备,仅支持 hw:card,device )
--playback <hw:card,device> Specify playback PCM device (default hw:0,0) ( 指定播放设备,仅支持 hw:card,device )
-r <Sampling rate> Specify sample rate for record or playback ( 指定采样率 )
-b <Bit depth> Specify bit depth for record or playback ( 指定位深 )
-c <Number of channels> Specify channels for record or playback ( 指定声道数 )
-d <Duration> Specify duration for record or playback ( 指定录制时长 )
-f <File name> Specify file for record or playback ( 指定文件名 )
-h Show this help message ( 显示帮助信息 )
说明:--capture/--playback 仅hw:card,device 形式(直接 hw 访问,不plughw:/plug:),可hw: 前缀card,device。播放-r/-c/-b 仅
3.12.3.3. 运行效果
程序
直接hw:0,0):
root@buildroot:/app/platform_samples/sample_audio/sample_alsa# ./sample_alsa
Audio Recording and Playback Program
Settings:
Capture Device : hw:0,0
Playback Device : hw:0,0
Sampling Rate : 48000 Hz
Bit Depth : 16 bit
Channels : 2
Duration : 5 seconds
File Name : record_test.wav
*************** Command Lists ***************
q -- Quit
r -- Start recording
p -- Playback
c -- Check hardware support
h -- Print help message
Command:
使用
root@buildroot:/app/platform_samples/sample_audio/sample_alsa# ./sample_alsa --capture hw:1,1 --playback hw:1,0
Audio Recording and Playback Program
Settings:
Capture Device : hw:1,1
Playback Device : hw:1,0
Sampling Rate : 48000 Hz
Bit Depth : 16 bit
Channels : 2
Duration : 5 seconds
File Name : record_test.wav
*************** Command Lists ***************
q -- Quit
r -- Start recording
p -- Playback
c -- Check hardware support
h -- Print help message
Command:
使用
root@buildroot:/app/platform_samples/sample_audio/sample_alsa# ./sample_alsa --capture hw:1,1 --playback hw:1,0 -r 16000 -b 16 -c 2 -d 5
Audio Recording and Playback Program
Settings:
Capture Device : hw:1,1
Playback Device : hw:1,0
Sampling Rate : 16000 Hz
Bit Depth : 16 bit
Channels : 2
Duration : 5 seconds
File Name : record_test.wav
*************** Command Lists ***************
q -- Quit
r -- Start recording
p -- Playback
c -- Check hardware support
h -- Print help message
Command:
录制ADC PGA Gain 控件
Command: r
Warning: mixer control 'ADC PGA Gain' not set on hw:1,1 (skipped)
Use amixer -c <card> contents to check control names.
Start recording: record_test.wav (5 sec, 48000 Hz, 2 ch, 16 bit, device hw:1,1)
Recording finished: record_test.wav (960000 bytes, 5.00 sec, 48000 Hz, 2 ch, 16 bit)
Command:
说明:Warning: mixer control 'ADC PGA Gain' not set 表示hw:1,1 对应ADC PGA Gain 的 mixer 控件,程序amixer -c <card> contents 查看Recording finished 行中960000 bytes 为采样率 × 声道数 × (位深/8) × 时长 = 48000 × 2 × 2 × 5。
播放
Command: p
Playing file: record_test.wav (48000 Hz, 2 ch, 16 bit, 5.00 sec, device hw:1,0)
[ 2208.795534] es8156_startup start
Playback finished: record_test.wav
Command:
说明:以 [ xxxxxxx ] 开头[ 2208.795534] es8156_startup start)是Playing file 行中Note: WAV format differs from current CLI settings ... 提示。
检查
Command: c
capture_device:
Supported formats:
Format Support Description
----------------------------------------------------------------------------------------------
S8 Signed 8 bit Not Supported
U8 Unsigned 8 bit Not Supported
S16_LE Signed 16 bit Little Endian Supported
S16_BE Signed 16 bit Big Endian Not Supported
U16_LE Unsigned 16 bit Little Endian Not Supported
U16_BE Unsigned 16 bit Big Endian Not Supported
S24_LE Signed 24 bit Little Endian Supported
S24_BE Signed 24 bit Big Endian Not Supported
U24_LE Unsigned 24 bit Little Endian Not Supported
U24_BE Unsigned 24 bit Big Endian Not Supported
S32_LE Signed 32 bit Little Endian Not Supported
S32_BE Signed 32 bit Big Endian Not Supported
U32_LE Unsigned 32 bit Little Endian Not Supported
U32_BE Unsigned 32 bit Big Endian Not Supported
IEC958_SUBFRAME_LE IEC-958 Little Endian Not Supported
IEC958_SUBFRAME_BE IEC-958 Big Endian Not Supported
MU_LAW Mu-Law Not Supported
A_LAW A-Law Not Supported
IMA_ADPCM Ima-ADPCM Not Supported
MPEG MPEG Not Supported
GSM GSM Not Supported
Channels SupportNum
--------------------------------------------------------
Max 2
Min 2
Sampling Rate (Hz) Support
--------------------------------------------------------
8000 Supported
16000 Supported
22050 Supported
44100 Supported
48000 Supported
96000 Not Supported
192000 Not Supported
playback_device:
Supported formats:
Format Support Description
----------------------------------------------------------------------------------------------
S8 Signed 8 bit Not Supported
U8 Unsigned 8 bit Not Supported
S16_LE Signed 16 bit Little Endian Supported
S16_BE Signed 16 bit Big Endian Not Supported
U16_LE Unsigned 16 bit Little Endian Not Supported
U16_BE Unsigned 16 bit Big Endian Not Supported
S24_LE Signed 24 bit Little Endian Supported
S24_BE Signed 24 bit Big Endian Not Supported
U24_LE Unsigned 24 bit Little Endian Not Supported
U24_BE Unsigned 24 bit Big Endian Not Supported
S32_LE Signed 32 bit Little Endian Not Supported
S32_BE Signed 32 bit Big Endian Not Supported
U32_LE Unsigned 32 bit Little Endian Not Supported
U32_BE Unsigned 32 bit Big Endian Not Supported
IEC958_SUBFRAME_LE IEC-958 Little Endian Not Supported
IEC958_SUBFRAME_BE IEC-958 Big Endian Not Supported
MU_LAW Mu-Law Not Supported
A_LAW A-Law Not Supported
IMA_ADPCM Ima-ADPCM Not Supported
MPEG MPEG Not Supported
GSM GSM Not Supported
Channels SupportNum
--------------------------------------------------------
Max 2
Min 2
Sampling Rate (Hz) Support
--------------------------------------------------------
8000 Supported
16000 Supported
22050 Supported
44100 Supported
48000 Supported
96000 Not Supported
192000 Not Supported
*************** Command Lists ***************
q -- Quit
r -- Start recording
p -- Playback
c -- Check hardware support
h -- Print help message
Command:
退出
Command: q
Quit
Command: root@buildroot:/app/platform_samples/sample_audio/sample_alsa#
3.12.4. sample_hat_loopback
3.12.4.1. 功能概述
sample_hat_loopback 是plughw:1,1、播放plughw:1,0。
3.12.4.2. 软件架构说明
sample_hat_loopback 同样
声卡
检测 模块,解析 /proc/asound/cards查找名为 duplexaudio的声卡,并 校验 其 是否 注册 为 card 1(与 plughw:1,1/plughw:1,0对应)阶段1 录音
模块,打开 plughw:1,1录制 5 秒 8 声道语音,保存 为 record_first.wav并打印各 声道 峰值 阶段2 双工
模块,通过 两个 pthread 并行执行——播放 线程 连续 播放 阶段1 录音 2 次(中间 间隔 2 秒 静音),录音 线程 同时 录制 完整 8 声道 流,保存 为 sample_hat_loopback.wav峰值
判定 模块,统计 回采 数据 中 ch7/ch8(PCB loopback)与 ch1-ch4(有线 loopback)的 峰值,峰值 ≥ 500(即该 通道 PCM 采样 绝对值 的 最大值 达到 500;16-bit 量程 为 0–32768,达到 500 表示 回采 通路 确实 采 到 有效 信号 而 非底 噪/静音)判定 PASS,否则 判定 FAIL
软件架构main 入口

程序运行
启动
时 通过 /proc/asound/cards查找名为 duplexaudio的声卡,并 校验 其 是否 注册 为 card 1(与 plughw:1,1/plughw:1,0对应)。若未 检测 到 HAT 或 卡号 不符,则 打印 排查 提示 并 退出。 阶段1:打开
plughw:1,1录音设备,对 麦克风 讲 5 秒 话,将 8 声道 语音 保存 为 record_first.wav,并打印各 声道 峰值。 阶段2:再次
打开 录音 与 播放 设备,通过 两个 线程(pthread)并行执行——播放 线程 将 阶段1 录 到 的 语音 连续 播放 2 次(中间 间隔 2 秒 静音),录音 线程 同时 录制 完整 的 8 声道 流,保存 为 sample_hat_loopback.wav。统计
回采 数据 中 ch7/ch8(PCB loopback 通道)与 ch1-ch4(有线 loopback 通道)的 峰值,峰值 ≥ 500 即 判定 PASS,否则 判定 FAIL。
3.12.4.3. API 流程说明

sample_hat_loopback 同样
hat_find_card_index:解析
/proc/asound/cards,定位 HAT 声卡编号。 snd_pcm_open:分别
打开 录音(SND_PCM_STREAM_CAPTURE)与 播放(SND_PCM_STREAM_PLAYBACK)PCM 设备,使用 plughw:1,1/plughw:1,0。snd_pcm_hw_params_any / snd_pcm_hw_params_set_access / snd_pcm_hw_params_set_format / snd_pcm_hw_params_set_channels / snd_pcm_hw_params_set_rate_near / snd_pcm_hw_params_set_period_size_near / snd_pcm_hw_params_set_buffer_size_near / snd_pcm_hw_params:配置
并 应用 硬件 参数。 snd_pcm_prepare:准备
设备。 pthread_create / pthread_join:创建
并 等待 录音、播放 两个 线程。 snd_pcm_readi / snd_pcm_writei:录音
线程 读取、播放 线程 写入 音频 数据;返回 -EPIPE 时 调用 snd_pcm_prepare 恢复。 snd_pcm_close:关闭 PCM 设备。
自定义 write_wav:将 8 声道 PCM 数据
写入 标准 WAV 文件。
3.12.4.4. 程序运行方法
在plughw:1,1/plughw:1,0):
cd /app/platform_samples/sample_audio/sample_hat_loopback
./sample_hat_loopback
运行
音频
子卡 已 安装 在 40PIN 上
3.12.4.5. 运行效果
音频
OK: ALSA card 1 'duplexaudio' matches Audio Driver HAT REV2 driver config.
Driver/overlay check only confirm the mounted board is
Waveshare Audio Driver HAT REV2 (ES7210+ES8156), 3x DIP OFF, then continue.
playback plughw:1,0 capture plughw:1,1
format: 8ch 16000Hz 16bit period=512
=== phase 1: speak into mic (5s) ===
saved record_first.wav (80000 frames, 5.0s)
phase1 peak: ch1=xxxx ch2=xxxx ch3=xxxx ch4=xxxx ch5=xxxx ch6=xxxx ch7=xxxx ch8=xxxx
=== phase 2: play voice x2 (gap 2s) + capture ===
capture length: 12.0s
saved sample_hat_loopback.wav (192000 frames, 12.0s)
phase2 peak: ch1=xxxx ch2=xxxx ch3=xxxx ch4=xxxx ch5=xxxx ch6=xxxx ch7=xxxx ch8=xxxx
PASS: PCB loopback ch7/ch8 (peak xxxx)
判定
若 ch7/ch8(HAT 板载 PCB loopback 通道)峰值 ≥ 500,打印
PASS: PCB loopback ch7/ch8 (peak xxxx),表示 HAT 板载回采 通路 正常。 若 ch7/ch8 不
达标 但 ch1-ch4(外 接线 loopback 通道)峰值 ≥ 500,打印 PASS: wired loopback ch1-ch4 (peak xxxx),并附带 ch7/ch8 峰值 提示。 若
两组 通道 峰值 均 低于 500,打印 FAIL: no loopback ...,表示未 检测 到 有效 回采,需 检查 HAT 安装、DIP 开关 与 系统 使能 配置。
HAT 未
FAIL: Audio Driver HAT REV2 not detected (missing 'duplexaudio').
Please check:
1. HAT on 40-pin header, all 3 DIP switches OFF
2. srpi-config -> Interface Options -> Audio -> Audio Driver HAT V2
3. Reboot after setup: sync && reboot
4. Run: cat /proc/asound/cards
说明:上述xxxx 为
3.12.5. 常见问题
程序
确保 ALSA 库
已 正确 安装,并且 音频设备 驱动 正常 工作。 确认
指定 的 设备 字符串 格式 正确,sample_alsa 仅 接受 hw:card,device(不支持 plughw:/plug:),可用cat /proc/asound/cards查看实际 可用 的 card 编号。
录音Warning: mixer control 'ADC PGA Gain' not set ... (skipped) 告警:
表示
当前 声卡 上 没有 名为 ADC PGA Gain的 mixer 控件,程序会 跳 过 该 增益 设置 并 继续 录制,属于 正常 现象。可用 amixer -c <card> contents查看该 声卡 实际 支持 的 控件 名,必要 时 修改 源码 中 的 control_name以匹配 实际 控件。
录制
确保
音频文件 格式 正确,使用 wav 文件。 sample_alsa 录制
时会 按位 深 对 采样 做 数字 增益(默认 gain=10),若 播放 时 出现 削波 失真,可 在 源码 record_audio()中调小 或 关闭 gain后重新 编译。
播放
sample_alsa 播放
时以 WAV 文件 头 中 的 采样率、声道、位深 为准 配置 PCM 设备,命令行 -r/-c/-b仅作用 于 录音。若 文件 头 与 命令行 设置 不 一致,程序 会 打印 Note: WAV format differs from current CLI settings ...提示,属正常 行为。
程序运行Buffer overflow error occurred!):
这
可能 是 由于 硬件 参数设置 不当 或 设备 驱动 问题,尝试 调整 参数 或 检查 驱动。程序 遇到 该 错误(-EPIPE)会 自动 调用 snd_pcm_prepare恢复并 继续,少量 出现 可 忽略,频繁 出现 则 需 排查 系统 负载 与 采样 参数。
sample_hat_loopback 提示 FAIL: Audio Driver HAT REV2 not detected:
确认 HAT 已
正确 安装 在 40PIN 上,3 个 DIP 开关 全部 为 OFF; 通过
srpi-config -> Interface Options -> Audio -> Audio Driver HAT V2使能后 执行 sync && reboot重启;重启
后 执行 cat /proc/asound/cards,确认存在 duplexaudio且编号 为 1(程序 固定 使用 plughw:1,1/plughw:1,0)。
sample_hat_loopback 提示 FAIL: no loopback:
表示 ch7/ch8 与 ch1-ch4 回采
峰值 均 低于 阈值 500。请 检查 HAT 板载 PCB loopback 通道 是否 正常,或 在 ch1-ch4 上 外接 有线 loopback;同时 确认 阶段1 对 麦克风 讲话 有 正常 输入(参考 phase1 peak输出)。