Deepin 25 音频服务切换脚本
Deepin 25上一键切换PipeWire和PulseAudio的脚本
#!/bin/bash # Deepin 25 音频服务切换脚本 # 在 PipeWire 和 PulseAudio 之间切换 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查当前音频服务 get_current_audio_server() { if systemctl --user is-active --quiet pipewire.service || systemctl --user is-active --quiet pipewire-pulse.service; then echo "pipewire" elif systemctl --user is-active --quiet pulseaudio.service; then echo "pulseaudio" else echo "unknown" fi } # 显示当前状态 show_status() { local current=$(get_current_audio_server) log_info "当前音频服务: $current" echo -e "\n服务状态:" echo "PipeWire: $(systemctl --user is-active pipewire.service 2>/dev/null || echo 'inactive')" echo "PipeWire-Pulse: $(systemctl --user is-active pipewire-pulse.service 2>/dev/null || echo 'inactive')" echo "PulseAudio: $(systemctl --user is-active pulseaudio.service 2>/dev/null || echo 'inactive')" } # 切换到 PulseAudio switch_to_pulseaudio() { log_info "正在切换到 PulseAudio..." # 停止 PipeWire 相关服务 systemctl --user stop pipewire-pulse.service 2>/dev/null || true systemctl --user stop pipewire.service 2>/dev/null || true systemctl --user stop pipewire-media-session.service 2>/dev/null || true systemctl --user stop pipewire.socket 2>/dev/null || true # 禁用 PipeWire 服务 [1,6](@ref) systemctl --user disable pipewire-pulse.service 2>/dev/null || true systemctl --user disable pipewire.service 2>/dev/null || true systemctl --user disable pipewire-media-session.service 2>/dev/null || true systemctl --user disable pipewire.socket 2>/dev/null || true # 屏蔽 PipeWire 服务防止自动启动 [1](@ref) systemctl --user mask pipewire-pulse.service 2>/dev/null || true systemctl --user mask pipewire.service 2>/dev/null || true # 启用并启动 PulseAudio 服务 [3](@ref) systemctl --user unmask pulseaudio.service pulseaudio.socket 2>/dev/null || true systemctl --user enable --now pulseaudio.service pulseaudio.socket log_success "已切换到 PulseAudio" } # 切换到 PipeWire switch_to_pipewire() { log_info "正在切换到 PipeWire..." # 停止 PulseAudio 服务 systemctl --user stop pulseaudio.service pulseaudio.socket 2>/dev/null || true # 禁用 PulseAudio 服务 [1,6](@ref) systemctl --user disable pulseaudio.service pulseaudio.socket 2>/dev/null || true systemctl --user mask pulseaudio.service pulseaudio.socket 2>/dev/null || true # 取消屏蔽 PipeWire 服务 [1](@ref) systemctl --user unmask pipewire.service pipewire-pulse.service 2>/dev/null || true # 启用并启动 PipeWire 服务 systemctl --user enable --now pipewire.service pipewire.socket pipewire-pulse.service # 启动媒体会话服务(如果存在) if systemctl --user list-unit-files | grep -q pipewire-media-session.service; then systemctl --user enable --now pipewire-media-session.service fi log_success "已切换到 PipeWire" } # 验证切换是否成功 verify_switch() { log_info "验证切换结果..." sleep 2 local current=$(get_current_audio_server) local expected="$1" if [ "$current" = "$expected" ]; then log_success "切换验证成功!当前音频服务: $current" # 测试音频功能 if command -v pactl &>/dev/null; then log_info "音频服务器信息:" pactl info | grep -E "Server Name|Server Version" fi else log_error "切换验证失败!期望: $expected, 实际: $current" return 1 fi } # 重启音频服务(不影响切换) restart_audio() { local current=$(get_current_audio_server) log_info "重新启动当前音频服务: $current" if [ "$current" = "pipewire" ]; then systemctl --user restart pipewire.service pipewire-pulse.service else systemctl --user restart pulseaudio.service fi log_success "音频服务已重启" } # 显示帮助信息 show_help() { cat << EOF Deepin 25 音频服务切换脚本 用法: $0 [选项] 选项: status 显示当前音频服务状态 to-pw 切换到 PipeWire to-pa 切换到 PulseAudio restart 重启当前音频服务 help 显示此帮助信息 示例: $0 status # 显示当前状态 $0 to-pa # 切换到 PulseAudio $0 to-pw # 切换到 PipeWire $0 restart # 重启音频服务 注意: 切换后可能需要重新启动音频应用程序或重新登录。 EOF } # 主函数 main() { local action="${1:-status}" # 检查是否以普通用户运行 if [ "$EUID" -eq 0 ]; then log_error "请勿使用 root 权限运行此脚本(音频服务是用户级服务)" exit 1 fi # 检查 systemd user session if ! systemctl --user is-active dbus.service >/dev/null 2>&1; then log_error "systemd user session 未启动,请先确保图形会话正常" exit 1 fi case "$action" in status) show_status ;; to-pw|to-pipewire) show_status switch_to_pipewire verify_switch "pipewire" ;; to-pa|to-pulseaudio) show_status switch_to_pulseaudio verify_switch "pulseaudio" ;; restart) show_status restart_audio ;; help|--help|-h) show_help ;; *) log_error "未知操作: $action" show_help exit 1 ;; esac } # 脚本入口 if [ $# -eq 0 ]; then show_status else main "$@" fi
使用方法
保存脚本:将上面的脚本保存为 audio-switch.sh
赋予执行权限:
chmod +x audio-switch.sh
使用脚本:
# 查看当前状态 ./audio-switch.sh status # 切换到 PulseAudio ./audio-switch.sh to-pa # 切换到 PipeWire ./audio-switch.sh to-pw # 重启当前音频服务 ./audio-switch.sh restart
重要注意事项
切换后需要重新启动应用程序:音频应用程序需要重启才能使用新的音频服务
蓝牙设备:如果使用蓝牙音频设备,建议在切换后重新连接
验证功能:切换完成后,使用系统声音设置或 pactl info命令验证功能是否正常
Deepin 25 特性:Deepin 25 默认已安装两者,脚本基于标准的 systemd 用户服务管理
故障排除
如果提示切换失败,可以尝试重新启动系统,重新运行一次脚本。

浙公网安备 33010602011771号