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 用户服务管理
故障排除
如果提示切换失败,可以尝试重新启动系统,重新运行一次脚本。

posted @ 2025-12-10 11:03  明的博客  阅读(13)  评论(0)    收藏  举报