[Bug Report] Deepin25重启或插拔耳机后,无法恢复原来的音量 Resolved
Tofloor
poster avatar
骑木马的哥哥
deepin
2025-12-15 16:51
Author

【前置条件】:发生问题的系统版本为25.0.10

【复现步骤】:假设音量为50%,然后重启主机,或插拔下有线耳机。音量设置虽然显示为50%,但实际音量比50%小,重新调整新的音量才能恢复。

【预期结果】:重启主机,或插拔下有线耳机后,恢复到操作之前的音量,且实际音量与操作前的音量保持一致。

【实际结果】:重启主机,或插拔下有线耳机后,无法恢复到操作之前的音量,虽然图形界面显示的是之前的音量,但实际音量比图形界面显示的音量小,必须重新调整新的音量才能恢复。

Reply Favorite View the author
All Replies
ksgt0025
deepin
2025-12-15 17:15
#1
It has been deleted!
piaoliang77
deepin
2025-12-15 17:19
#2

我的v25每次重启后网页播放几乎没有声音,必须手动控制音量大小后才能恢复

Reply View the author
deepin-流云
Super Moderator
Community OP
2025-12-15 17:32
#3

这个问题内部已经有问题单在跟踪,我们催下研发进度

Reply View the author
ksgt0025
deepin
2025-12-15 18:54
#4

把默认的PipeWire 切换到 PulseAudio,待后续问题解决再切换回来。

在主目录新建一个audio-switch.sh文件,文件内容:

#!/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 "$@"
f

使用方法
保存脚本:将上面的脚本保存为 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

第一次切换到PulseAudio,会提示失败,然后重启在切换一次PulseAudio,就可以成功。

Reply View the author