tinymix -D 0
tinymix 75 1 #
tinymix 77 1 # Right Mixer Right Playback Switch
tinymix 79 1 # OUT1 Switch
tinymix 58 # 查看当前值和可能的范围(如果有)
tinymix 58 27 27
【可选】
tinymix "Left Mixer Left Playback Switch" 1
tinymix "Right Mixer Right Playback Switch" 1
tinymix "OUT1 Switch" 1
tinymix "Output 1 Playback Volume" 30 30
tinyplay kiss8.wav -D 0 -d 0
20260311解决瑞芯微原厂RK3576的Android14刷入乐晓电子的K7开发板后解决使用tinyplay播放wav音频
2026/3/11 18:27
缘起:播放 百度视频的视频,和本地 音频 没有声音的时候,很容易/艰难搞定通过tinyplay播放WAV音频的问题了!

现在:【问DeepSeek】
播放 百度视频的视频,和本地 音频都有声音。确认从耳机输出的声音。RK3576的Anroid14
现在在查找tinyplay播放WAV音频无声的原因
es8388声卡 配置异常的时候,百度网页 视频 没有声音。本地播放也没有声音。
使用tinyplay播放kiss8.wav是正常的。
排除 这些问题
播放百度视频的视频/播放本地音频结束之后,控件值又被还原了!
rk3576_u:/ $
rk3576_u:/ $ su
rk3576_u:/ #
rk3576_u:/ #
rk3576_u:/ # lsof | grep pcm
tinyplay 2434 root 4u CHR 116,2 0t0 469 /dev/snd/pcmC0D0p
rk3576_u:/ #
rk3576_u:/ # cat /proc/asound/pcm
00-00: dailink-multicodecs ES8323 HiFi-0 : dailink-multicodecs ES8323 HiFi-0 : playback 1 : capture 1
01-00: rockchip-dp0 spdif-hifi-0 : rockchip-dp0 spdif-hifi-0 : playback 1
02-00: rockchip-hdmi i2s-hifi-0 : rockchip-hdmi i2s-hifi-0 : playback 1 : capture 1
rk3576_u:/ #
rk3576_u:/ # cat /proc/asound/card0/pcm0p/sub0/status
state: RUNNING
owner_pid : 2434
trigger_time: 1773209282.092204021
tstamp : 1773209317.838874908
delay : 3536
avail : 560
avail_max : 1032
hw_ptr : 1576496
appl_ptr : 1580032
rk3576_u:/ #
rk3576_u:/ # dmesg | tail -20
1687.333060\] healthd: battery l=50 v=3300 t=2.6 h=2 st=3 c=-1600 fc=100 chg=au
rk3576_u:/ #
我们被问到关于RK3576 Android14的问题。之前用户报告耳机没有声音,然后一步步调试。最后用户给出新的信息:他们运行了tinyplay,并用lsof和cat /proc/asound/...等命令。这些输出表明:
用户执行了tinyplay(PID 2434),并且它打开了/dev/snd/pcmC0D0p。
/proc/asound/pcm显示00-00是"dailink-multicodecs ES8323 HiFi-0",这是声卡0设备0,支持播放和捕获。
01-00是"rockchip-dp0 spdif-hifi-0"(可能是DP音频),02-00是"rockchip-hdmi i2s-hifi-0"(HDMI音频)。
/proc/asound/card0/pcm0p/sub0/status显示状态为RUNNING,owner_pid 2434,说明tinyplay正在播放,且没有错误(delay, avail等正常)。
dmesg \| tail -20只显示了healthd消息,没有音频错误。
结合之前的上下文:用户说"es8388声卡配置异常的时候,百度网页视频没有声音。本地播放也没有声音。使用tinyplay播放kiss8.wav是正常的。" 但现在他们可能是在另一个场景下测试:上层应用有声音(百度视频等),但tinyplay无声?不,从最新输出看,他们运行了tinyplay并且成功了(因为status显示RUNNING)。但用户最后的问题是"现在在查找tinyplay播放WAV音频无声的原因",这可能意味着他们仍遇到tinyplay无声,但这次给出的数据却显示tinyplay正在运行并播放?我们需要重新解读。
用户之前说:"播放 百度视频的视频,和本地 音频都有声音。确认从耳机输出的声音。" 这表示上层应用有声音,且是从耳机输出的。但"tinyplay没有声音"是指此时tinyplay无声。然后我们建议了检查权限、设备节点等。他们执行了命令,我们看到lsof显示tinyplay打开了pcmC0D0p,status是RUNNING。这很奇怪:如果tinyplay正在播放且status RUNNING,理论上应该有声音。但用户说tinyplay无声,所以可能有其他原因:比如虽然驱动认为正在播放,但实际音频数据没有送到耳机?但status的delay和avail值看起来正常。
可能用户没有真正播放tinyplay,或者他们运行tinyplay时没有听到声音,但驱动却认为它在播放。或者tinyplay播放的是一个静音文件?或者硬件通路配置不对,但驱动层面没有报错,只是数据没有路由到物理输出。
我们需要帮助用户诊断为什么tinyplay虽然打开设备并写入数据,但耳机听不到声音。从之前的tinymix输出看,用户设置了"Output 1 Playback Volume" 192 192,但那个设置失败了(因为之前命令语法错误)。我们后来建议了正确命令,但用户没有反馈是否成功设置。我们需要确认当前混音器状态是否正确。
目前用户只给了最新的lsof等,没有给最新的tinymix。所以我们需要用户提供最新的tinymix输出,以确保所有必要的音频路径开关已经开启。
此外,上层应用(百度视频)有声音,说明HAL层正确配置了声卡。但tinyplay无声,可能是因为tinyplay和上层应用使用的是不同的PCM设备?从/proc/asound/pcm看,有多个播放设备:00-00(ES8323),01-00(DP),02-00(HDMI)。上层应用可能使用了01-00或02-00,而不是00-00。虽然tinyplay打开了00-00,并且状态RUNNING,但00-00可能没有物理连接到耳机输出?耳机输出可能连接到哪个设备?从之前的tinymix控件来看,mixer name是"rockchip-es8388",这是ES8388 codec,应该对应声卡0。耳机输出应该通过声卡0。所以tinyplay用声卡0是正确的。但为什么上层应用有声而tinyplay无声?可能是因为上层应用在播放时,通过HAL配置了codec的路径,而tinyplay没有配置(或者tinyplay之前配置过但被覆盖了?)。
一个可能性:当上层应用播放时,它通过HAL自动设置了tinymix的某些控件(比如hp switch、输出音量等)。当上层应用停止播放后,这些控件可能恢复默认值(或保持不变)。然后用户运行tinyplay,但tinyplay不会自动设置这些控件,所以如果控件处于静音状态,tinyplay也会无声。而用户之前尝试用tinymix设置,但可能没有设置正确。
用户之前尝试设置"Output 1 Playback Volume" 192 192时遇到了"Error: invalid value for index 0"。这可能是因为该控件需要两个值(左右声道),但用户只给了一个?但命令tinymix "Output 1 Playback Volume" 192 192应该给两个值,为什么会报错?可能是控件名称不完全匹配?我们需要检查tinymix输出中控件的确切名称。在之前的输出中,控件58是"Output 1 Playback Volume",类型INT,num 2,所以应该接受两个整数。用户命令应该正确。但报错说invalid value for index 0,可能原因是值超出了范围?需要查看该控件的取值范围。可以用tinymix -D 0 get 58来查看当前值和范围(如果支持)。或者检查控件的最大值。
另外,用户成功设置了"hp switch" 1和"Speaker Switch" 0,但后续检查tinymix输出显示"hp switch"仍为Off?在最新的tinymix输出中(之前提供的,不是最新的),我们看到"hp switch"是Off,"Output 1 Playback Volume"是0 0。这可能是因为他们设置后没有重新检查,或者设置未生效。但设置"hp switch" 1的命令没有报错,应该生效了。我们需要用户重新执行tinymix来确认当前值。
所以当前的主要任务是让用户提供最新的完整的tinymix输出,以确认所有必要的控件(输出音量、hp switch、OUT1 Switch、Left Mixer Left Playback Switch等)是否已正确设置。
此外,还需要确认tinyplay播放的文件是否是真正的音频文件(不是静音文件)。可以用hexdump检查文件头。
但用户说"使用tinyplay播放kiss8.wav是正常的",可能是指在声卡配置异常的时候tinyplay正常。而现在声卡配置正常(上层应用有声),但tinyplay无声?这更奇怪了:因为声卡配置正常时,tinyplay应该也能正常发声,只要路径正确。可能是上层应用改变了某些设置,使得tinyplay无法使用同一通路?但上层应用播放时,通路是开启的,停止后可能关闭了。tinyplay需要自己开启。
我们应指导用户:
在播放上层应用(有声音)后,立即运行tinyplay(不改变任何设置),看是否有声。如果无声,则说明tinyplay需要的控件在上层应用停止后被关闭了。然后需要手动开启那些控件。
提供最新的tinymix输出(在tinyplay播放时抓取),以便检查哪些控件没有打开。
确认tinyplay播放时音量控件是否设置正确。可以用tinymix 58查看当前Output 1 Playback Volume值。
由于用户之前设置时遇到错误,可能音量设置没成功。需要帮助用户正确设置音量。
我们需要输出一个步骤清晰的回答,引导用户逐步操作并收集信息。
另外,从/proc/asound/pcm看到,声卡0的播放计数为1,说明有一个播放流正在运行,正是tinyplay(pid 2434)。但用户可能是在测试tinyplay时抓取的这些信息,然后tinyplay正在运行,但用户听不到声音。所以重点在于硬件通路配置。
建议用户:
播放一个已知有声音的音频文件(如kiss8.wav)通过tinyplay,同时执行tinymix,保存输出。
播放上层应用(百度视频)有声音时,也执行tinymix,保存输出。
对比两份tinymix,找出差异。特别是那些与耳机输出相关的控件:Output 1 Playback Volume, hp switch, OUT1 Switch, Left Mixer Left Playback Switch, Right Mixer Right Playback Switch等。
另外,检查tinyplay播放时,耳机是否插好,是否被静音。可能是硬件开关问题。
我们需要写一个综合的回答,包含以下要点:
确认tinyplay正在运行且没有错误(status RUNNING),但无声,说明数据流到了驱动,但可能因为混音器控件设置不当,没有路由到物理输出。
指导用户对比上层应用播放和tinyplay播放时的tinymix状态。
指导用户正确设置必要的控件(提供命令示例),特别是之前报错的Output 1 Playback Volume,可能是数值范围不对,可以尝试设置小一点的数值如30 30,并解释如何查看控件的取值范围。
如果对比发现差异,解释需要开启哪些控件。
如果一切控件相同但tinyplay仍无声,考虑tinyplay使用的声道数或格式与硬件当前设置不匹配,尽管tinypcminfo显示支持,但可能驱动期望特定格式。可以尝试用tinyplay指定参数与上层应用播放时格式一致(通过cat /proc/asound/card0/pcm0p/sub0/hw_params查看当前硬件参数)。
最后,建议如果问题解决,考虑永久修改配置文件。
我们还要注意用户是root权限,所以可以执行任何命令。
现在整理回答。
根据你最新的输出,tinyplay(PID 2434)已经成功打开 pcmC0D0p 设备,并且内核报告该设备处于 RUNNING 状态,说明音频数据正在被写入驱动。然而,你听不到声音,这意味着数据虽然送到了内核,但未能正确路由到耳机物理输出。问题很可能出在声卡混音器(tinymix)的控件配置上,导致音频信号在 codec 内部被阻断或静音。
关键线索
上层应用(百度视频等)有声音,说明硬件通路本身是好的,且 Android 的音频 HAL 能正确配置 codec。
tinyplay 无声,是因为它不会自动设置混音器控件,必须依赖你手动通过 tinymix 开启相关通路。
你之前尝试设置 Output 1 Playback Volume 时遇到错误,可能该控件未正确设置,导致音量仍为 0。
?? 立即排查步骤
1. 确认当前混音器状态
在 tinyplay 正在播放时(即你刚执行 tinyplay 且无声),另开一个终端窗口执行:
bash
tinymix -D 0 \> /data/tinymix_tinyplay.txt
同时,播放上层应用(百度视频,确保耳机有声)时,再抓取一份:
bash
tinymix -D 0 \> /data/tinymix_app.txt
对比两份文件,重点关注以下控件(它们必须为 On 或非零值):
text
Output 1 Playback Volume → 应为非零,例如 192 192
hp switch → 应为 On
OUT1 Switch → 应为 On
Left Mixer Left Playback Switch → 应为 On
Right Mixer Right Playback Switch → 应为 On
PCM Volume → 应为非零(当前 192 192 已正常)
如果 tinyplay 时这些值为 Off 或 0,则需手动设置。
2. 正确设置关键控件
请按以下顺序执行命令,确保无报错:
2.1 设置输出音量
之前你遇到 Error: invalid value for index 0,可能是因为数值超出范围。先查看该控件的取值范围:
bash
# 查看控件详细信息(如果支持)
tinymix -D 0 get 58
若无法查看,尝试设置一个较小的值(如 30)来测试是否生效:
bash
tinymix 58 30 30
成功后逐步调高。常见有效范围是 0\~192 或 0\~255,192 是 0dB 的典型值。
2.2 开启耳机功放开关
bash
tinymix 64 1 # hp switch
2.3 开启输出级开关
bash
tinymix 79 1 # OUT1 Switch
tinymix 80 1 # OUT2 Switch(如果耳机接OUT2)
2.4 开启混音器通路
bash
tinymix 75 1 # Left Mixer Left Playback Switch
tinymix 77 1 # Right Mixer Right Playback Switch
2.5 验证设置
执行 tinymix \| grep -E "Output 1\|hp switch\|OUT\|Playback Switch",应看到所有值已正确。
3. 重新测试 tinyplay
再次运行:
bash
tinyplay /sdcard/kiss8.wav -D 0 -d 0
如果仍无声,检查 tinyplay 的输出参数是否与当前硬件配置一致。在 tinyplay 播放时,查看硬件实际参数:
bash
cat /proc/asound/card0/pcm0p/sub0/hw_params
输出类似:
text
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1024
buffer_size: 16384
然后确保你的 WAV 文件参数与此匹配。若不匹配,用 tinyplay 的 -r、-c、-b 选项强制指定匹配的值。
4. 检查上层应用播放时的硬件参数
在百度视频播放时,同样查看 hw_params(注意此时播放设备可能是 pcmC0D0p 或其他,用 lsof \| grep pcm 确认),记录下参数。之后用 tinyplay 模拟相同参数播放。
5. 临时关闭音频服务(可选)
如果以上均无效,可以尝试停止 Android 音频服务,让 tinyplay 完全独占声卡,避免 HAL 干扰:
bash
stop audioserver
# 然后运行 tinyplay
tinyplay /sdcard/kiss8.wav -D 0 -d 0
# 测试完后重启服务
start audioserver
注意:这会暂时使系统无声音,但可排除 HAL 动态修改控件的可能。
?? 预期结果
通过上述步骤,你应该能让 tinyplay 正常发声。如果仍然无声,请提供:
两份对比的 tinymix 输出文件。
tinyplay 播放时的 hw_params 内容。
你的 WAV 文件信息(file /sdcard/kiss8.wav)。
这样我们可以进一步定位是控件配置还是参数不匹配的问题。
tinyplay播放:
Mixer name: 'rockchip-es8388'
Number of controls: 81
ctl type num name value
0 ENUM 1 SAI1 Transmit Start Mode Sel Standalone
1 ENUM 1 SAI1 Receive Start Mode Sel Standalone
2 ENUM 1 SAI1 Transmit SDOx Select Auto
3 ENUM 1 SAI1 Receive SDIx Select Auto
4 INT 1 SAI1 Receive Mono Slot Select 0
5 ENUM 1 SAI1 Receive Mono Switch Disable
6 ENUM 1 SAI1 Transmit Mono Switch Disable
7 ENUM 1 SAI1 SDI3 Loopback I2S LR Channel Sel L:MIC R:LP
8 ENUM 1 SAI1 SDI2 Loopback I2S LR Channel Sel L:MIC R:LP
9 ENUM 1 SAI1 SDI1 Loopback I2S LR Channel Sel L:MIC R:LP
10 ENUM 1 SAI1 SDI0 Loopback I2S LR Channel Sel L:MIC R:LP
11 ENUM 1 SAI1 SDI3 Loopback I2S LR Switch Disable
12 ENUM 1 SAI1 SDI2 Loopback I2S LR Switch Disable
13 ENUM 1 SAI1 SDI1 Loopback I2S LR Switch Disable
14 ENUM 1 SAI1 SDI0 Loopback I2S LR Switch Disable
15 ENUM 1 SAI1 SDI3 Loopback Src Select From SDO0
16 ENUM 1 SAI1 SDI2 Loopback Src Select From SDO0
17 ENUM 1 SAI1 SDI1 Loopback Src Select From SDO0
18 ENUM 1 SAI1 SDI0 Loopback Src Select From SDO0
19 ENUM 1 SAI1 SDI3 Loopback Switch Disable
20 ENUM 1 SAI1 SDI2 Loopback Switch Disable
21 ENUM 1 SAI1 SDI1 Loopback Switch Disable
22 ENUM 1 SAI1 SDI0 Loopback Switch Disable
23 ENUM 1 SAI1 Sync Out Switch From CRU
24 ENUM 1 SAI1 Sync In Switch From IO
25 ENUM 1 SAI1 Receive PATH3 Source Select From SDI3
26 ENUM 1 SAI1 Receive PATH2 Source Select From SDI2
27 ENUM 1 SAI1 Receive PATH1 Source Select From SDI1
28 ENUM 1 SAI1 Receive PATH0 Source Select From SDI0
29 ENUM 1 SAI1 Transmit SDO3 Source Select From PATH3
30 ENUM 1 SAI1 Transmit SDO2 Source Select From PATH2
31 ENUM 1 SAI1 Transmit SDO1 Source Select From PATH1
32 ENUM 1 SAI1 Transmit SDO0 Source Select From PATH0
33 BOOL 1 SAI1 Clk Auto Switch Off
34 INT 1 SAI1 PCM Read Wait Time MS 0
35 INT 1 SAI1 PCM Write Wait Time MS 0
36 ENUM 1 3D Mode Level 1
37 INT 1 ALC Capture Target Volume 12
38 INT 1 ALC Capture Max PGA 0
39 INT 1 ALC Capture Min PGA 0
40 ENUM 1 ALC Capture Function Off
41 BOOL 1 ALC Capture ZC Switch Off
42 INT 1 ALC Capture Hold Time 0
43 INT 1 ALC Capture Decay Time 0
44 INT 1 ALC Capture Attack Time 5
45 INT 1 ALC Capture NG Threshold 10
46 ENUM 1 ALC Capture NG Type Mute ADC Output
47 BOOL 1 ALC Capture NG Switch Off
48 BOOL 1 ZC Timeout Switch Off
49 INT 2 Capture Digital Volume 192 192
50 BOOL 1 Capture Mute Off
51 INT 1 Left Channel Capture Volume 0
52 INT 1 Right Channel Capture Volume 0
53 ENUM 1 Playback De-emphasis None
54 ENUM 1 Capture Polarity Normal
55 INT 2 PCM Volume 192 192
56 INT 1 Left Mixer Left Bypass Volume 0
57 INT 1 Right Mixer Right Bypass Volume 0
58 INT 2 Output 1 Playback Volume 0 0
59 INT 2 Output 2 Playback Volume 0 0
60 ENUM 1 ADC Data Select Left Right
61 BOOL 1 Headphone Jack On
62 BOOL 1 Headset Mic Jack Off
63 BOOL 1 spk switch Off
64 BOOL 1 hp switch Off
65 BOOL 1 Headphone Switch On
66 BOOL 1 Speaker Switch On
67 BOOL 1 Main Mic Switch On
68 BOOL 1 Headset Mic Switch Off
69 ENUM 1 Left PGA Mux DifferentialL
70 ENUM 1 Right PGA Mux DifferentialR
71 ENUM 1 Differential Mux Line 2
72 ENUM 1 Mono Mux Stereo
73 ENUM 1 Left Line Mux Line 1L
74 ENUM 1 Right Line Mux Line 1R
75 BOOL 1 Left Mixer Left Playback Switch Off
76 BOOL 1 Left Mixer Left Bypass Switch Off
77 BOOL 1 Right Mixer Right Playback Switch Off
78 BOOL 1 Right Mixer Right Bypass Switch Off
79 BOOL 1 OUT1 Switch Off
80 BOOL 1 OUT2 Switch Off
本地播放:
Mixer name: 'rockchip-es8388'
Number of controls: 81
ctl type num name value
0 ENUM 1 SAI1 Transmit Start Mode Sel Standalone
1 ENUM 1 SAI1 Receive Start Mode Sel Standalone
2 ENUM 1 SAI1 Transmit SDOx Select Auto
3 ENUM 1 SAI1 Receive SDIx Select Auto
4 INT 1 SAI1 Receive Mono Slot Select 0
5 ENUM 1 SAI1 Receive Mono Switch Disable
6 ENUM 1 SAI1 Transmit Mono Switch Disable
7 ENUM 1 SAI1 SDI3 Loopback I2S LR Channel Sel L:MIC R:LP
8 ENUM 1 SAI1 SDI2 Loopback I2S LR Channel Sel L:MIC R:LP
9 ENUM 1 SAI1 SDI1 Loopback I2S LR Channel Sel L:MIC R:LP
10 ENUM 1 SAI1 SDI0 Loopback I2S LR Channel Sel L:MIC R:LP
11 ENUM 1 SAI1 SDI3 Loopback I2S LR Switch Disable
12 ENUM 1 SAI1 SDI2 Loopback I2S LR Switch Disable
13 ENUM 1 SAI1 SDI1 Loopback I2S LR Switch Disable
14 ENUM 1 SAI1 SDI0 Loopback I2S LR Switch Disable
15 ENUM 1 SAI1 SDI3 Loopback Src Select From SDO0
16 ENUM 1 SAI1 SDI2 Loopback Src Select From SDO0
17 ENUM 1 SAI1 SDI1 Loopback Src Select From SDO0
18 ENUM 1 SAI1 SDI0 Loopback Src Select From SDO0
19 ENUM 1 SAI1 SDI3 Loopback Switch Disable
20 ENUM 1 SAI1 SDI2 Loopback Switch Disable
21 ENUM 1 SAI1 SDI1 Loopback Switch Disable
22 ENUM 1 SAI1 SDI0 Loopback Switch Disable
23 ENUM 1 SAI1 Sync Out Switch From CRU
24 ENUM 1 SAI1 Sync In Switch From IO
25 ENUM 1 SAI1 Receive PATH3 Source Select From SDI3
26 ENUM 1 SAI1 Receive PATH2 Source Select From SDI2
27 ENUM 1 SAI1 Receive PATH1 Source Select From SDI1
28 ENUM 1 SAI1 Receive PATH0 Source Select From SDI0
29 ENUM 1 SAI1 Transmit SDO3 Source Select From PATH3
30 ENUM 1 SAI1 Transmit SDO2 Source Select From PATH2
31 ENUM 1 SAI1 Transmit SDO1 Source Select From PATH1
32 ENUM 1 SAI1 Transmit SDO0 Source Select From PATH0
33 BOOL 1 SAI1 Clk Auto Switch Off
34 INT 1 SAI1 PCM Read Wait Time MS 0
35 INT 1 SAI1 PCM Write Wait Time MS 0
36 ENUM 1 3D Mode Level 1
37 INT 1 ALC Capture Target Volume 12
38 INT 1 ALC Capture Max PGA 0
39 INT 1 ALC Capture Min PGA 0
40 ENUM 1 ALC Capture Function Off
41 BOOL 1 ALC Capture ZC Switch Off
42 INT 1 ALC Capture Hold Time 0
43 INT 1 ALC Capture Decay Time 0
44 INT 1 ALC Capture Attack Time 5
45 INT 1 ALC Capture NG Threshold 10
46 ENUM 1 ALC Capture NG Type Mute ADC Output
47 BOOL 1 ALC Capture NG Switch Off
48 BOOL 1 ZC Timeout Switch Off
49 INT 2 Capture Digital Volume 192 192
50 BOOL 1 Capture Mute Off
51 INT 1 Left Channel Capture Volume 0
52 INT 1 Right Channel Capture Volume 0
53 ENUM 1 Playback De-emphasis None
54 ENUM 1 Capture Polarity Normal
55 INT 2 PCM Volume 192 192
56 INT 1 Left Mixer Left Bypass Volume 0
57 INT 1 Right Mixer Right Bypass Volume 0
58 INT 2 Output 1 Playback Volume 27 27
59 INT 2 Output 2 Playback Volume 0 0
60 ENUM 1 ADC Data Select Left Right
61 BOOL 1 Headphone Jack On
62 BOOL 1 Headset Mic Jack Off
63 BOOL 1 spk switch Off
64 BOOL 1 hp switch Off
65 BOOL 1 Headphone Switch On
66 BOOL 1 Speaker Switch On
67 BOOL 1 Main Mic Switch On
68 BOOL 1 Headset Mic Switch Off
69 ENUM 1 Left PGA Mux DifferentialL
70 ENUM 1 Right PGA Mux DifferentialR
71 ENUM 1 Differential Mux Line 2
72 ENUM 1 Mono Mux Stereo
73 ENUM 1 Left Line Mux Line 1L
74 ENUM 1 Right Line Mux Line 1R
75 BOOL 1 Left Mixer Left Playback Switch On
76 BOOL 1 Left Mixer Left Bypass Switch Off
77 BOOL 1 Right Mixer Right Playback Switch On
78 BOOL 1 Right Mixer Right Bypass Switch Off
79 BOOL 1 OUT1 Switch On
80 BOOL 1 OUT2 Switch Off
我们获得了两个tinymix状态对比:tinyplay播放时(无声)和本地播放时(有声)。差异很明显。
我们提取关键控件对比:
tinyplay播放时 (无声):
ctl58 Output 1 Playback Volume: 0 0
ctl64 hp switch: Off
ctl75 Left Mixer Left Playback Switch: Off
ctl77 Right Mixer Right Playback Switch: Off
ctl79 OUT1 Switch: Off
ctl80 OUT2 Switch: Off
本地播放时 (有声):
ctl58 Output 1 Playback Volume: 27 27 (非零)
ctl64 hp switch: Off (仍然Off? 这里需要注意,但可能耳机输出并不依赖hp switch?但之前分析应该需要。这里显示Off但本地有声,说明要么耳机输出不依赖此控件,或者有其他路径。再看)
ctl75 Left Mixer Left Playback Switch: On
ctl77 Right Mixer Right Playback Switch: On
ctl79 OUT1 Switch: On
ctl80 OUT2 Switch: Off
另外,扬声器开关 Speaker Switch 在两种情况下都是On,但spk switch是Off,这合理。
从差异看,tinyplay无声的根本原因是:
Output 1 Playback Volume 为零
左右声道混音器开关关闭
OUT1 输出级关闭
因此,要让tinyplay有声,必须设置这些控件。用户之前尝试设置音量时遇到了错误。我们需指导用户正确设置这些控件,并解释可能的值范围。
之前用户执行 tinymix "Output 1 Playback Volume" 192 192 时报错 Error: invalid value for index 0。这可能是因为该控件值范围较小(本地播放时是27 27),或许最大值不是192。需要先查询控件范围。
建议操作:
查询 ctl58 的取值范围:可能通过 tinymix -D 0 get 58 或查看控件信息。如果没有直接范围,可以尝试设置较小的值,如30 30。因为本地播放时是27 27,说明有效。
开启必要的开关:
tinymix 75 1 # Left Mixer Left Playback Switch
tinymix 77 1 # Right Mixer Right Playback Switch
tinymix 79 1 # OUT1 Switch
tinymix 58 30 30 # Output 1 Playback Volume
可选:tinymix 64 1 # hp switch,但本地播放时是Off却有声,可能此控件不是必需的,不过设置也无妨。
然后重新测试tinyplay。
用户还需确认WAV格式匹配,但之前tinyplay曾成功过,所以格式应该没问题。
另外,检查hw_params确保tinyplay使用的参数与上层应用一致。但既然之前能成功,说明参数本身没问题。
现在我们需要生成最终回答,总结对比结果,给出具体命令,并解释为什么上层应用有声而tinyplay无声(因为上层音频服务会自动配置这些混音器控件,而tinyplay需要手动配置)。
通过对你提供的两份 tinymix 输出进行对比,问题根源已经非常明确:
控件 (ctl) tinyplay 播放时 (无声) 本地播放时 (有声) 作用说明
58 Output 1 Playback Volume 0 0 27 27 耳机输出音量,必须为非零
64 hp switch Off Off 可能不影响当前耳机通路(本地有声时仍为Off)
75 Left Mixer Left Playback Switch Off On 将左声道数字音频混入输出
77 Right Mixer Right Playback Switch Off On 将右声道数字音频混入输出
79 OUT1 Switch Off On 启用OUT1输出级(耳机通常接OUT1)
80 OUT2 Switch Off Off OUT2未使用
结论:tinyplay 无声是因为耳机输出通路的关键控件未被开启,且音量设置为0。 上层应用(如百度视频)播放时,Android 音频 HAL 会自动配置这些控件,因此有声;而 tinyplay 作为底层工具,必须手动设置它们。
? 立即修复:让 tinyplay 正常发声
请按顺序执行以下命令(每条命令都应成功,无报错):
1. 开启混音器通路和输出级
bash
tinymix 75 1 # Left Mixer Left Playback Switch
tinymix 77 1 # Right Mixer Right Playback Switch
tinymix 79 1 # OUT1 Switch
2. 设置耳机输出音量
先查询 Output 1 Playback Volume 的有效范围(避免设置超出范围的值):
bash
tinymix 58 # 查看当前值和可能的范围(如果有)
如果无法获取范围,尝试设置一个较小的值(如本地播放时的 27):
bash
tinymix 58 27 27
若成功,再根据需要调高,例如 192(常见0dB):
bash
tinymix 58 192 192
如果 192 报错,说明最大值较小,可以逐步尝试 50、100 等,直到找到合适的值。
3. (可选)开启耳机功放开关
虽然本地播放时 hp switch 为 Off 也有声,但某些硬件可能依赖它。建议也开启:
bash
tinymix 64 1 # hp switch
4. 验证配置
执行 tinymix \| grep -E "58\|64\|75\|77\|79",应看到类似:
text
58 INT 2 Output 1 Playback Volume 192 192
64 BOOL 1 hp switch On
75 BOOL 1 Left Mixer Left Playback Switch On
77 BOOL 1 Right Mixer Right Playback Switch On
79 BOOL 1 OUT1 Switch On
5. 重新运行 tinyplay
bash
tinyplay /sdcard/kiss8.wav -D 0 -d 0
此时耳机应该有声了。
?? 如果仍无声:检查硬件参数一致性
确保 tinyplay 使用的参数与声卡当前配置一致。在播放时查看硬件参数:
bash
cat /proc/asound/card0/pcm0p/sub0/hw_params
输出示例:
text
access: MMAP_INTERLEAVED
format: S16_LE
channels: 2
rate: 44100 (44100/1)
然后用相同参数播放:
bash
tinyplay /sdcard/kiss8.wav -D 0 -d 0 -r 44100 -c 2 -b 16
?? 永久解决方案
若希望系统启动后 tinyplay 也能直接使用耳机,需修改音频配置文件(如 mixer_paths.xml),确保耳机通路相关控件在初始化时被设为正确值。通常路径为:
/vendor/etc/mixer_paths.xml
/system/etc/mixer_paths.xml
找到 \