目前我们开发音频使用最多的系统应该就是Android和Linux了。针对这两个系统都有各自的调试工具,Android使用的是简化后的tinyalsa工具,Linux用的就是原始的ALSA工具。下面我们就分别介绍下这两个工具。
LINUX平台
1. alsamixer
图形化界面工具,用于调整音量、选择输入输出设备等等,直接在控制带窗口输入alsamixer即可打开:
如图所示执行指令后会出现一个可视化窗口,通过上下左右键就可以控制,十分方便快捷。
2. amixer
amixer就不是可视化窗口那样了,他显示出来的就是接口控件列表。
指令:
amixer
输出示例:
Simple mixer control 'Master',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 255
Front Left: Playback 200 [78%] [on]
Front Right: Playback 200 [78%] [on]
指定声卡
如果系统中有多个声卡,可以使用-c参数指定声卡
amixer -c
列出所有简单控件
amixer scontrols
输出示例
Simple mixer control 'Master',0
Simple mixer control 'Capture',0
显示指定控件
amixer sget
amixer cget numid=
示例
amixer sget Master
输出
Simple mixer control 'Master',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 255
Front Left: Playback 200 [78%] [on]
Front Right: Playback 200 [78%] [on]
修改指定控件
amixer sset
amixer cset numid=
3. aplay
aplay 是 ALSA 提供的一个命令行工具,用于在 Linux 平台上播放音频文件。它支持多种音频格式(如 .wav),并允许用户指定音频设备进行播放,是音频调试的重要工具之一。
基本用法
aplay test.wav//播放test.wav文件
常用选项
选项 | 说明 |
-l | 列出系统中的所有声卡和音频设备。 |
-D | 指定播放的音频设备。 |
-q | 静默模式,不显示播放信息。 |
--duration | 指定播放时长(秒)。 |
-t | 指定文件类型(如raw 或wav)。 |
-c | 指定音频通道数(如1 表示单声道,2 表示立体声)。 |
-f | 指定音频格式(如S16_LE 表示 16 位小端格式)。 |
-r | 指定采样率(如 44100 Hz)。 |
-v | 显示详细信息。 |
列出系统音频设备
aplay -l
输出:
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC887-VD Analog [ALC887-VD Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
解释:
- card 0, device 0:代表声卡编号和设备编号。
- 可用的音频设备有:
- 0,0:默认模拟音频设备。
- 1,3:HDMI 音频设备。
指定音频设备播放
aplay -D plughw:,
示例:
在 card 0, device 0 上播放 test.wav。
aplay -D plughw:0,0 test.wav
arecord
arecord与aplay相对应,arecord就是用来录音的指令。
示例
arecord test.wav//在默认设备上录制音频,并保存为 test.wav。
常用选项
选项 | 说明 |
-l | 列出系统中所有的录音设备。 |
-D | 指定录音设备。 |
-d | 指定录音时长(秒)。 |
-f | 指定音频格式(如S16_LE 表示 16 位小端格式)。 |
-c | 指定录音通道数(如1 表示单声道,2 表示立体声)。 |
-r | 指定采样率(如 44100 Hz)。 |
-t | 指定输出文件类型(如raw 或wav)。 |
-q | 静默模式,不显示录音信息。 |
-V mono 或-V stereo | 显示录音时的音量电平。 |
-v | 显示详细信息。 |
详细的使用大家可以在自己的设备上多多尝试下。
Android平台
tinymix
输出:
Number of controls: 15
ctl 0: 'Playback Volume', value: 63
ctl 1: 'Capture Volume', value: 50
ctl 2: 'Mic Select', value: 'Main Mic'
ctl 3: 'Headphone Jack Switch', value: 1
每一行表示一个控制项:
- ctl: 控制项的编号。
- 名称: 控制项的名称。
- 值: 当前设置值,可以是数值或字符串。
修改控件的值
tinymix
//示例:tinymix 1 75
//将 Capture Volume 设置为 75。
查询支持的音频设备
tinymix -D
//查看所有支持的音频设备或卡。
tinymix 与 Android 音频系统的关系
在 Android 音频架构中,tinymix 作用于 音频硬件抽象层(HAL) 和 驱动层,直接与音频设备通信。它可以跳过 Android 的 AudioFlinger 和 AudioPolicyManager,直接对底层音频参数进行调整。
tinymix的作用范围
[音频 HAL] <--> [ALSA 驱动]
上面介绍的两种都是基于系统底层调试的方案,我们可以通过这两种方式去调试验证驱动代码是否有异常,但如果是上层呢?那每个系统就都会有自己定制的方案,比如HAL层,每个厂家调试方案都是不一样的,就MTK来说就是设置个属性值来控制调试开关。这个时候就需要我们去查看厂家的调试指导手册了。
Audioflinger
不过Android的audioflinger层还有一个共有的调试方式,我们一起来看下
adb shell dumpsys media.audio_flinger
这个命令会输出 AudioFlinger 的当前状态,包括音频硬件的使用情况、流的状态等。
Tee Sink
Tee Sink 是 AudioFlinger 提供的一种调试功能,它允许在音频流被送往最终的输出设备之前将音频流复制一份,并将这份音频数据发送到另一个输出端。这对于调试和分析音频流非常有用。
编译时设置
cd frameworks/av/services/audioflinger
修改 Configuration.h。
对 #define TEE_SINK 取消注释。
重新构建 libaudioflinger.so。
adb root
adb remount
将新的 libaudioflinger.so 推送或同步到设备的 /system/lib。
运行时设置
adb shell getprop | grep ro.debuggable确认输出是:[ro.debuggable]: [1]
adb shell
ls -ld /data/misc/audioserver
确认输出是:drwx------ media media ... media
echo af.tee=# > /data/local.prop其中,
af.tee 值是一个数字,在下文中有所说明。
chmod 644 /data/local.prop
reboot
如果audioserver目录不存在,请按如下方式创建:
mkdir /data/misc/audioserver
chown media:media /data/misc/audioserver
测试:
运行您的音频测试。
adb shell dumpsys media.audio_flinger
在 dumpsys 输出中查找如下行:
tee copied to /data/misc/audioserver/20131010101147_2.wav
这是一个PCM.wav 文件。
然后,使用 adb pull 命令提取任何相关的 /data/misc/audioserver/*.wav 文件;
图文来源:快乐程序猿 作者:麋鹿
声明:我们尊重“真实原创”,转载仅供学习交流,旨在传播有益信息,如有侵权,请联系我们,谢谢!