在 Waydroid 容器内提升 Android 音量

# 进入 Waydroid shell
sudo waydroid shell

# 在容器内用 Android 命令提升媒体音量
cmd media_session volume --set 15  # 最大通常是 15 或 16

# 或者
service call audio 3 i32 3 i32 15  # 3=STREAM_MUSIC, 15=音量值

快速诊断脚本

运行下面这个脚本,可以一次性确认问题根源:

echo "=== 默认音频 Sink ==="
pactl info | grep "默认音频入口"

echo ""
echo "=== 蓝牙设备 Profile ==="
pactl list cards | grep -A 5 "Name: bluez_card"

echo ""
echo "=== 当前 Sink Inputs(是否有 Waydroid)==="
pactl list sink-inputs | grep -E "(Name:|application.name)"

echo ""
echo "=== ALSA 设备 ==="
aplay -l | head -10

第一步:查看当前的 PulseAudio 路径配置

# 1. 安装 pavucontrol(PulseAudio 音量控制 GUI)
sudo apt install pavucontrol
# 2. 运行 Waydroid 并播放声音,然后打开 pavucontrol
pavucontrol
-----------------------------------
cat /var/lib/waydroid/waydroid.prop | grep pulse_runtime_path
waydroid.pulse_runtime_path=/run/xdg/pulse
------------------------------------
pactl info
服务器字串:/run/user/1000/pulse/native
程序库协议版本:35
服务器协议版本:35
是否本地服务器:是
客户端索引:36
区块大小: 65472
用户名:bob
主机名:bob-FMVU26011
服务器名:pulseaudio
服务器版本:15.99.1
默认采样规格:s16le 2ch 44100Hz
默认声道映射:front-left,front-right
默认音频入口:alsa_output.pci-0000_00_1f.3.analog-stereo
默认信源: alsa_input.pci-0000_00_1f.3.analog-stereo
Cookie:097f:bb45
# 查看 PulseAudio 使用的底层 ALSA 声卡
pactl list sinks | grep -A 5 "Name:\|alsa\|Driver"
# 在输出中找 Driver: 行:
# module-alsa-card.c → 直接驱动 ALSA 声卡
# module-bluez5-device.c → 蓝牙设备
# module-pipe-sink.c → PipeWire 或管道输出
pactl list sinks
#查看已加载的 PulseAudio 模块
pactl list modules short

如果输出是 /run/xdg/pulse,而你的 PulseAudio 实际运行在 /run/user/1000/pulse,这就是路径不匹配——Waydroid 容器内的音频 HAL 找不到 PulseAudio socket,于是回退到直接 ALSA 硬件输出,导致 pavucontrol 看不到 Waydroid 的音频流。

第二步:修正 PulseAudio 路径

# 1. 停止 Waydroid
waydroid session stop
sudo systemctl stop waydroid-container

# 2. 直接编辑配置文件,修正 pulse_runtime_path
sudo sed -i 's|waydroid.pulse_runtime_path=/run/xdg/pulse|waydroid.pulse_runtime_path=/run/user/1000/pulse|' /var/lib/waydroid/waydroid.prop

# 3. 确认修改成功
grep pulse_runtime_path /var/lib/waydroid/waydroid.prop

如果 waydroid.prop 里没有 pulse_runtime_path 这一行,直接追加:

bash复制

echo "waydroid.pulse_runtime_path=/run/user/1000/pulse" | sudo tee -a /var/lib/waydroid/waydroid.prop

第三步:确保容器内有 ALSA PulseAudio 插件

即使路径正确,如果 Waydroid 容器内的 ALSA 配置没有定义 pulse PCM 设备,snd_pcm_open("pulse", ...) 仍然会失败。

bash复制

# 检查容器内是否有 ALSA 的 pulse PCM 配置
sudo ls /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/ 2>/dev/null || echo "目录不存在"

如果目录为空或不存在,需要创建配置:

sudo mkdir -p /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/

cat << 'EOF' | sudo tee /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/99-pulse.conf
pcm.pulse {
    type pulse
    hint {
        show on
        description "PulseAudio PCM"
    }
}

ctl.pulse {
    type pulse
    hint {
        show on
        description "PulseAudio Control"
    }
}

pcm.!default {
    type pulse
    hint {
        show on
        description "Default PulseAudio Output"
    }
}

ctl.!default {
    type pulse
    hint {
        show on
        description "Default PulseAudio Control"
    }
}
EOF

第四步:确保 PulseAudio socket 对容器可见

Waydroid 容器需要访问宿主机的 PulseAudio socket:

# 确认 socket 存在
ls -la /run/user/1000/pulse/native

# 确认权限(应该对当前用户可读)
ls -la /run/user/1000/pulse/

如果 socket 不存在,重启 PulseAudio:

pulseaudio -k
pulseaudio --start

第五步:启动容器服务和 Waydroid

# 启动容器服务
sudo systemctl start waydroid-container

# 启动 Waydroid 会话
waydroid session start

然后在 Waydroid 中播放音频,同时在宿主机运行:

pactl list sink-inputs | grep -E "(Input|application.name)"

如果看到类似 application.name = "AudioFlinger"application.name = "Waydroid" 的条目,说明音频已经正确路由到 PulseAudio 了。


第六步:提升音量

一旦 Waydroid 的音频流出现在 PulseAudio 中,就可以:

# 用 pavucontrol 把 Waydroid 的音量拉到 150%
pavucontrol

或者在命令行:

# 找到 Waydroid 的 sink input ID,然后提升音量
pactl list sink-inputs
pactl set-sink-input-volume <WAYDROID_INPUT_ID> 150%

快速修复脚本

如果你不想一步步操作,可以直接运行这个脚本:

#!/bin/bash
set -e

echo "=== 停止 Waydroid ==="
waydroid session stop 2>/dev/null || true
sudo systemctl stop waydroid-container 2>/dev/null || true

echo "=== 修正 PulseAudio 路径 ==="
sudo sed -i 's|waydroid.pulse_runtime_path=/run/xdg/pulse|waydroid.pulse_runtime_path=/run/user/1000/pulse|' /var/lib/waydroid/waydroid.prop
grep -q "waydroid.pulse_runtime_path" /var/lib/waydroid/waydroid.prop || \
    echo "waydroid.pulse_runtime_path=/run/user/1000/pulse" | sudo tee -a /var/lib/waydroid/waydroid.prop

echo "=== 创建 ALSA PulseAudio 配置 ==="
sudo mkdir -p /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/

cat << 'EOF' | sudo tee /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/99-pulse.conf
pcm.pulse {
    type pulse
    hint {
        show on
        description "PulseAudio PCM"
    }
}

ctl.pulse {
    type pulse
    hint {
        show on
        description "PulseAudio Control"
    }
}

pcm.!default {
    type pulse
    hint {
        show on
        description "Default PulseAudio Output"
    }
}

ctl.!default {
    type pulse
    hint {
        show on
        description "Default PulseAudio Control"
    }
}
EOF

echo "=== 启动 Waydroid ==="
sudo systemctl start waydroid-container
waydroid session start &

echo "=== 等待 Waydroid 启动 ==="
sleep 5

echo "=== 检查 Sink Inputs ==="
pactl list sink-inputs | grep -E "(Input|application.name)" || echo "暂无 Waydroid 音频流"

echo ""
echo "修复完成。请在 Waydroid 中播放音频,然后运行: pactl list sink-inputs"

核心问题总结

问题 原因
waydroid prop 提示 stopped 容器服务 waydroid-container 未运行,prop 需要容器服务才能通信
pavucontrol 看不到 Waydroid Waydroid 的 pulse_runtime_path 指向了错误路径(/run/xdg/pulse 而非 /run/user/1000/pulse),或容器内缺少 ALSA pulse PCM 配置
声音小 音频直接走了 ALSA → 蓝牙 HFP,绕过 PulseAudio,无法通过 pavucontrol 超放大