xscreensaver가 잠겨 있을 때 소리를 음소거하는 방법

xscreensaver가 잠겨 있을 때 소리를 음소거하는 방법

목표는 화면이 잠겨 있을 때 소리를 음소거하는 것입니다.

이상적으로는 잠금을 해제한 후에도 소리가 복원됩니다.

사운드 시스템은 Pulseaudio입니다.

답변1

이 스크립트를 시작하십시오(또는 로그인 시 자동으로 시작되도록 이 스크립트를 설정하십시오):

#!/bin/bash -euET
{
set -o pipefail

export DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-unix:path=/run/user/$(id -u)/bus}"
export DISPLAY="${DISPLAY:-:0}"

xscreensaver-command -watch | while read -r line ; do
    echo "handling event: $line"

    if [[ $line = LOCK* ]]; then
      volume=$(pamixer --get-volume)
      echo "current volume is $volume"
      pamixer --set-volume 0
    fi

    if [[ $line = UNBLANK* ]]; then
      echo "setting volume to $volume"
      pamixer --set-volume "$volume"
    fi
done

exit
}

설명하다: 이 스크립트의 "데몬" 부분은 xscreensaver-command -watch멈추고 xscreensaver의 이벤트를 기다립니다. "LOCK" 또는 "UNBLANK" 이벤트가 발생할 때마다 볼륨은 각각 0으로 재설정되고 복원됩니다.

답변2

제안대로 amixer 대신 pactl을 사용했습니다.닉 노스

pactl set-sink-mute @DEFAULT_SINK@ toggle

존재하다기기가 잠겨 있으면 모든 소리를 무음으로 설정합니다.

관심 있는 분들을 위한 전체 코드는 다음과 같습니다. 그것은 관련이 있다클리프 스탠포드코드는 본질적으로

터미널 창을 열고 경로의 "user"를 사용자 이름으로 바꿉니다(해당하는 경우).

nano /home/'user'/.local/share/applications/MuteLock.sh

그런 다음 다음을 창에 붙여넣고 Ctrl+o(저장) 및 Ctrl+x(종료)를 누릅니다.

#!/bin/bash
# Credit for code:
   #https://unix.stackexchange.com/users/14353/cliff-stanford
   #https://unix.stackexchange.com/users/231160/nik-gnomic
# Post on stackexchange: https://unix.stackexchange.com/questions/467456/how-to-mute-sound-when-xscreensaver-locks-screen/589614#589614

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint --line-buffered |
    while read line
    do
        case "$line" in
            *"<true>"*)
                #amixer -q -D pulse sset Master off
                pactl set-sink-mute @DEFAULT_SINK@ toggle
            ;;
            *"<false>"*)
                #amixer -q -D pulse sset Master on
                pactl set-sink-mute @DEFAULT_SINK@ toggle
            ;;
        esac
    done
exit

파일을 실행 가능하게 만들고 경로의 "user"를 사용자 이름으로 바꿉니다(해당되는 경우).

chmod +x /home/'user'/.local/share/applications/MuteLock.sh

그런 다음 Super+L(잠금 화면)을 실행하고 실행하여 제대로 작동하는지 확인하세요.

/home/'user'/.local/share/applications/MuteLock.sh &

Manjaro 20.01 Gnome 3.36 버전에서 테스트되었으며 wayland에서 작동합니다. - 작동하기 위해 xscreensaver를 설치할 필요가 없습니다.

gnome 로그인 백그라운드에서 이 애플리케이션을 실행하기 위해 *.desktop 파일이 생성됩니다. 나는 팔로우한다막스 슐렙치거게시물 위치Gnome Shell:세션이 시작된 후 쉘 스크립트를 실행하시겠습니까?*.desktop 파일 코드

터미널을 다시 열고 경로의 "user"를 사용자 이름으로 바꿉니다(해당되는 경우).

nano /home/'user'/.local/share/applications/MuteLock.desktop

Ctrl+o(저장) 및 Ctrl+x(종료)를 붙여넣습니다.

[Desktop Entry]
Encoding=UTF-8
Type=Application
Icon=application-x-executable
Name=MuteLock
Exec=/home/'user'/.local/share/applications/MuteLock.sh
Path=/home/'user'/.local/share
Terminal=false
Hidden=false
StartupNotify=false
X-GNOME-Autostart-enabled=true
Comment=Mute on screen-lock and un-mute on screen un-lock
Categories=Settings; System; Utility

시작 응용 프로그램 아래 Gnome Tweaks에서 방금 생성한 MuteLock.desktop 파일을 추가합니다.

이 팁이 Dell Inspiron 7390 2-in-1 노트북에 기본적으로 설치된 세 가지 Linux 배포판 모두에 적용된다는 것을 확인할 수 있습니다.

  • Manjaro 20.0.1 커널 v5.6,

  • 우분투 20.04 LTS 커널 v5.4 LTS,

  • OpenSUSE Tumbleweed 커널 v5.6 및

  • Gnome 3.36, GDM, Xorg 및 Wayland와 함께 작동

libplayerctl이 설치되어 있으면 코드에 일시 중지 및 재생을 추가할 수도 있습니다. 배포 패키지 관리자에서 libplayerctl(libplayerctl2), playerctl을 설치하고 다음과 같이 수정합니다.

case "$line" in
                *"<true>"*)
                    playerctl -a pause #pauses all MPRIS players
                    #amixer -q -D pulse sset Master off
                    pactl set-sink-mute @DEFAULT_SINK@ toggle
                ;;
                *"<false>"*)
                    #amixer -q -D pulse sset Master on
                    pactl set-sink-mute @DEFAULT_SINK@ toggle
                    playerctl play #start playing the default player
                ;;
            esac

답변3

존재하다쉬 벤투그리고XFCEorg.freedesktop.login1이벤트가 발생하지 않는 것 같으 므로 이러한 솔루션은 나에게 적합하지 않습니다 . (@VasyaNovikov같은 문제가있는 것 같습니다. )

나에게 맞는 것은 이벤트를 찾는 것입니다 org.xfce.ScreenSaver.

#!/bin/bash
gdbus  monitor  --session  --dest org.xfce.ScreenSaver  |  grep "ActiveChanged"  --line-buffered  |
    while  read  line
    do
        case  "$line"  in
            *"(true,"*)
                pactl  set-sink-mute  @DEFAULT_SINK@  on
            ;;
            *"(false,"*)
                pactl  set-sink-mute  @DEFAULT_SINK@  off
            ;;
        esac
    done
exit

답변4

내가 찾은 가장 쉬운 방법은 시작 시 쉘 스크립트를 실행하는 것입니다. 이는 사용하는 화면 보호기(있는 경우)에 관계없이 작동합니다.

#!/bin/bash

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint --line-buffered |
    while read line
    do
        case "$line" in
            *"<true>"*)
                amixer -q -D pulse sset Master off
            ;;
            *"<false>"*)
                amixer -q -D pulse sset Master on
            ;;
        esac
    done

관련 정보