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バージョンでテストされ、ウェイランドで動作します。 - 動作するために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ノートブックにデフォルトでインストールされている3つのLinuxディストリビューションすべてに適用されることがわかります。

  • Manjaro 20.0.1 カーネル v5.6,

  • Ubuntu 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イベントが発生していないようなので、これらのソリューションは私には適していません。 (ツイート同じ問題があるようです。 )

私に合うのはイベントを見つけることです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

関連情報