调试音频Audio之Tee sink部分

背景:

整个音频流程中,首先是各个app的AudioTrack的数据,传入AudioFlinger,由AudioFlinger进行了混音后,再送入Hal,kernel等。
在这里插入图片描述

但是对于用户来说声音最后是否正常,异常的判断就只能靠听到输出的喇叭声音,上面有好几个流程阶段,没办法准确定位到声音问题是发送在哪个阶段,所以为了调试音频数据方便,google官方就在AudioFlinger加入了Tee Sink相关dump。
具体的使用可以看官方的文档,非常详细:
https://source.android.google.cn/docs/core/audio/debugging
Audio debugging

This article describes some tips and tricks for debugging Android audio.
Tee sink

The “tee sink” is an AudioFlinger debugging feature, available in custom builds only, for retaining a short fragment of recent audio for later analysis. This permits comparison between what was actually played or recorded vs. what was expected.

For privacy the tee sink is disabled by default, at both compile-time and run-time. To use the tee sink, you will need to enable it by re-compiling, and also by setting a property. Be sure to disable this feature after you are done debugging; the tee sink should not be left enabled in production builds.

The instructions in this section are for Android 7.x and higher. For Android 5.x and 6.x, replace /data/misc/audioserver with /data/misc/media. Additionally, you must use a userdebug or eng build. If you use a userdebug build, then disable verity with:

adb root && adb disable-verity && adb reboot
翻译主要部分:上面表达只能在debug机器使用tee sink,正常手机是不可以的

Compile-time setup
如何开启tee sink,步骤如下所示,主要就是#define TEE_SINK.

cd frameworks/av/services/audioflinger
Edit Configuration.h.
Uncomment #define TEE_SINK.
Re-build libaudioflinger.so.
adb root
adb remount
Push or sync the new libaudioflinger.so to the device's /system/lib.

Run-time setup
adb shell getprop | grep ro.debuggable
Confirm that the output is: [ro.debuggable]: [1]
adb shell
ls -ld /data/misc/audioserver

Confirm that the output is:

drwx------ media media … media

If the directory does not exist, create it as follows:

mkdir /data/misc/audioserver
chown media:media /data/misc/audioserver

echo af.tee=# > /data/local.prop
Where the af.tee value is a number described below.
chmod 644 /data/local.prop
reboot

Values for af.tee property

The value of af.tee is a number between 0 and 7, expressing the sum of several bits, one per feature. See the code at AudioFlinger::AudioFlinger() in AudioFlinger.cpp for an explanation of each bit, but briefly:

1 = input
2 = FastMixer output
4 = per-track AudioRecord and AudioTrack

There is no bit for deep buffer or normal mixer yet, but you can get similar results using “4.”

**上面就是介绍了两个部分:
1.确定是否有 /data/misc/audioserver目录,这个目录来获取相关AudioFlinger里面的音频输出目录 2.确定是否有 af.tee property,prop值主要有1,2,4,具体值含义可以frameworks/av/services/audioflinger/NBAIO_Tee.h查看
**
在这里插入图片描述
上面都配置确定好了以后,既可以启动相关的dump目录来获取数据,主要的命令就是
adb shell dumpsys media.audio_flinger,执行完成后既可以去 /data/misc/audioserver/目录获取相关的wav文件

Test and acquire data

Run your audio test.
adb shell dumpsys media.audio_flinger
Look for a line in dumpsys output such as this:
tee copied to /data/misc/audioserver/20131010101147_2.wav
This is a PCM .wav file.
Then adb pull any /data/misc/audioserver/*.wav files of interest; note that track-specific dump filenames do not appear in the dumpsys output, but are still saved to /data/misc/audioserver upon track closure.
Review the dump files for privacy concerns before sharing with others.

各个wav文件的含义可以去这个文件frameworks/av/services/audioflinger/NBAIO_Tee.cpp查看

在这里插入图片描述

Suggestions

Try these ideas for more useful results:

Disable touch sounds and key clicks to reduce interruptions in test output.
Maximize all volumes.
Disable apps that make sound or record from microphone, if they are not of interest to your test.
Track-specific dumps are only saved when the track is closed; you may need to force close an app in order to dump its track-specific data
Do the dumpsys immediately after test; there is a limited amount of recording space available.
To make sure you don't lose your dump files, upload them to your host periodically. Only a limited number of dump files are preserved; older dumps are removed after that limit is reached.

Restore

As noted above, the tee sink feature should not be left enabled. Restore your build and device as follows:

Revert the source code changes to Configuration.h.
Re-build libaudioflinger.so.
Push or sync the restored libaudioflinger.so to the device's /system/lib.
adb shell
rm /data/local.prop
rm /data/misc/audioserver/*.wav
reboot

更多framework实战干货,请关注下面“千里马学框架”

<think>我们正在解决Linux系统下PulseAudio无法通过rockchipdp0播放音频的问题。用户已经说明PulseAudio能够识别到rockchipdp0设备,但无法播放音频。这通常表明音频设备已被识别,但在播放过程中出现了问题(如配置错误、格式不支持、权限问题等)。 参考之前的回答,我们曾针对RK3588的DP音频问题提供了硬件检查、软件设置(Android)、设备树修改和驱动更新等方案。但本次问题发生在Linux系统下,且使用PulseAudio,因此我们将重点放在Linux音频栈(ALSA/PulseAudio)的调试上。 解决方案步骤: 1. **确认硬件连接和基本配置**(同之前,但简要说明): - 确保DP线缆和显示器支持音频传输。 - 检查系统音量未被静音(使用`alsamixer`或`pactl`命令)。 2. **检查ALSA设备状态**: 首先,确认ALSA层是否能识别到rockchipdp0设备,并测试通过ALSA直接播放音频(绕过PulseAudio),以确定问题是否在PulseAudio层面。 - 列出所有ALSA设备: ```bash aplay -l ``` 查找类似`rockchipdp0`的设备。通常,DP设备会显示为`cardX: rockchipdp0 [rockchip-dp0], device Y`。 - 使用`aplay`测试播放(注意:需要.wav格式的测试文件): ```bash aplay -D hw:<card编号>,<device编号> /usr/share/sounds/alsa/Front_Center.wav ``` 如果这样播放有声音,则问题在PulseAudio配置;如果没有,则问题可能在驱动或硬件。 3. **检查PulseAudio配置**: PulseAudio可能识别了设备,但未将其设置为默认设备或配置有误。 - 查看PulseAudio识别的设备列表: ```bash pactl list sinks ``` 注意查找名称为`rockchipdp0`的sink,并记录其状态(是否被挂起?是否已选择?)。 - 如果设备被挂起(suspended),可以尝试唤醒: ```bash pactl set-sink-port <sink名称> analog-output # 或者尝试取消静音和设置音量 pactl set-sink-mute <sink名称或编号> 0 pactl set-sink-volume <sink名称或编号> 100% ``` - 将rockchipdp0设置为默认设备: ```bash pactl set-default-sink <sink名称> ``` - 如果设备未被正确识别,可能需要检查PulseAudio模块加载。确保加载了正确的设备发现模块(如module-alsa-sink)。但通常PulseAudio会自动处理。 4. **检查音频格式支持**: DP音频设备可能不支持某些音频格式(如特定的采样率或位深)。我们需要检查设备支持的格式,并尝试在PulseAudio中设置兼容的格式。 - 通过ALSA查看设备支持的格式(使用`aplay -v`): ```bash aplay -v -D hw:<card编号>,<device编号> /usr/share/sounds/alsa/Front_Center.wav ``` 观察输出中的格式列表(如S16_LE, S24_LE等)。 - 在PulseAudio中,可以尝试强制使用特定的采样率和格式。编辑PulseAudio配置文件(通常位于`/etc/pulse/daemon.conf`或用户目录`~/.config/pulse/daemon.conf`),修改或添加: ```ini default-sample-format = s16le default-sample-rate = 48000 ``` 然后重启PulseAudio:`pulseaudio -k`(等待自动重启)或`pulseaudio --start`。 5. **检查内核驱动和dmesg日志**: - 查看内核日志,确认DP音频设备初始化时没有错误: ```bash dmesg | grep -i dp dmesg | grep -i audio dmesg | grep -i snd ``` 注意是否有错误或警告(如“failed to set DP audio stream”、“format not supported”等)。 - 如果驱动有问题,可能需要更新内核。RK3588的DP音频驱动在较新的内核中可能已经修复了问题。 6. **使用其他工具测试**: 使用`speaker-test`测试音频输出: ```bash speaker-test -D hw:<card编号>,<device编号> -c 2 -t wav ``` 如果使用PulseAudio,则: ```bash speaker-test -c 2 -t wav ``` 7. **修改PulseAudio配置文件(高级)**: 如果设备被错误地识别为其他类型(如HDMI),可以尝试在PulseAudio中手动定义设备。创建配置文件`/etc/pulse/default.pa`(或用户目录的对应文件)的修改,添加: ```pulse # 卸载自动检测的模块(如果需要) unload-module module-alsa-sink # 重新加载模块并指定设备名称和描述 load-module module-alsa-sink device=hw:<card编号>,<device编号> sink_name=rockchipdp0 sink_properties="device.description='Rockchip DP0'" set-default-sink rockchipdp0 ``` 然后重启PulseAudio。 8. **检查权限**: 确保当前用户在audio组中(使用`groups`命令检查)。如果没有,将用户加入audio组: ```bash sudo usermod -aG audio <用户名> ``` 然后重新登录。 9. **参考设备树配置(如果之前未配置)**: 虽然用户的问题在Linux系统下,但设备树配置同样重要(尤其是如果之前未配置过DP音频)。请参考之前的设备树修改部分,确保在设备树中启用了音频支持(`audio-enabled`属性)。 总结步骤: - 通过ALSA直接播放测试硬件和驱动。 - 检查PulseAudio中设备的状态和配置。 - 调整音频格式和采样率。 - 检查内核日志和更新驱动。 - 必要时手动配置PulseAudio。 如果问题仍然存在,请提供以下信息以便进一步诊断: - `aplay -l` 的输出 - `pactl list sinks` 的输出 - `dmesg | grep -i dp` 的输出 - `dmesg | grep -i snd` 的输出 相关问题: 1. 如何在Linux中调试ALSA音频设备? 2. 如何配置PulseAudio使用特定的音频设备? 3. RK3588设备树中DP音频的配置方法有哪些? 4. 如何查看和修改PulseAudio的默认采样率?</think>### Linux系统下PulseAudio识别rockchipdp0但无法播放音频的解决方案 在RK3588平台上,PulseAudio能识别`rockchipdp0`设备但无法播放音频,通常是由于**音频格式不匹配**、**设备树配置错误**或**PulseAudio路由问题**导致。以下是系统化的解决方案: --- #### 1. **验证ALSA层音频输出** 首先确认底层ALSA驱动能否正常输出音频: ```bash # 查找rockchipdp0设备号 aplay -l | grep rockchipdp0 # 示例输出: card 2: rockchipdp0 [rockchip-dp0], device 0: fec00000.dp0-dp0-0 [] # 通过ALSA直接播放测试音频(绕过PulseAudio) aplay -D hw:2,0 /usr/share/sounds/alsa/Front_Center.wav ``` - ✅ 成功:问题在PulseAudio配置层(跳转步骤3) - ❌ 失败:问题在驱动/硬件层(跳转步骤2) --- #### 2. **检查驱动与设备树配置** 若ALSA层无输出,需检查DP音频的硬件支持: **a. 确认设备树启用音频** 编辑设备树文件(如`rk3588-linux.dts`),确保包含: ```dts &dp0 { status = "okay"; audio-enabled; // 显式启用音频[^4] sound-dai = <&dp_audio>; }; ``` 重新编译并更新设备树: ```bash make dtbs && sudo cp arch/arm64/boot/dts/rockchip/rk3588-linux.dtb /boot/dtbs/ ``` **b. 检查内核驱动状态** 查看驱动日志: ```bash dmesg | grep -iE "dp|audio|snd" ``` - 关键错误如`dp_audio: format not supported`表明**采样率/格式不兼容** - 修复:强制支持48kHz格式(DP音频常用): ```bash echo "options snd_hda_codec_hdmi model=generic" | sudo tee /etc/modprobe.d/rockchipdp.conf sudo modprobe -r snd_hda_codec_hdmi && sudo modprobe snd_hda_codec_hdmi ``` --- #### 3. **配置PulseAudio强制使用DP设备** 若ALSA正常但PulseAudio无输出: **a. 设置默认输出设备** 编辑PulseAudio配置: ```bash sudo nano /etc/pulse/default.pa ``` 添加以下内容(替换实际设备名): ```pulseaudio # 强制使用rockchipdp0 set-default-sink "alsa_output.platform-dp0-sound.stereo-fallback" ``` **b. 检查并重载配置** ```bash # 查看可用设备 pactl list sinks | grep -E "Name:|Description:" # 设置默认设备(示例名称) pactl set-default-sink alsa_output.platform-dp0-sound.stereo-fallback # 重启PulseAudio pulseaudio -k && pulseaudio --start ``` --- #### 4. **解决采样率与格式冲突** DP音频通常需要**48kHz采样率**,而PulseAudio可能使用其他格式: **a. 修改PulseAudio默认格式** 编辑`/etc/pulse/daemon.conf`: ```ini default-sample-format = s16le default-sample-rate = 48000 avoid-resampling = yes # 禁止重采样 ``` **b. 验证当前流格式** 播放音频时检查: ```bash pactl list sink-inputs ``` 输出中检查: ``` Format: pcm, Format.sample_format = "s16le" Rate: 48000 Hz ``` --- #### 5. **调试工具与日志** - 实时监控PulseAudio日志: ```bash pulseaudio -v 2>&1 | grep -i "dp0" ``` - 检查音频流状态: ```bash pacmd list-sinks | grep -iE "state|dp0" ``` - `state: RUNNING`表示播放中 - `state: SUSPENDED`表示设备挂起(尝试唤醒:`pactl set-sink-suspend alsa_output.platform-dp0-sound false`) --- ### 关键问题排查流程图 ```mermaid graph TD A[PulseAudio识别rockchipdp0但无声] --> B{ALSA直接播放测试} B -- 成功 --> C[PulseAudio配置问题] B -- 失败 --> D[驱动/设备树问题] C --> C1[设置默认sink] C --> C2[修改采样率为48kHz] D --> D1[检查设备树audio-enabled] D --> D2[检查dmesg驱动错误] D2 --> D21[强制snd_hda_codec_hdmi参数] ``` ### 总结 1. 优先通过`aplay`验证ALSA层输出 2. 设备树需包含`audio-enabled`属性[^4] 3. PulseAudio强制使用48kHz采样率 4. 避免重采样冲突(`avoid-resampling = yes`) 若问题依旧,请提供: - `dmesg | grep -i dp` 输出 - `pactl list sinks` 完整输出 - `/etc/pulse/daemon.conf` 内容 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值