web-dev-qa-db-ja.com

Linux用の汎用オーディオスリープカウントダウンタイマー

Audacious のbashスクリプトを作成しました。これは、X分で再生を一時停止します(最後の10分間で音量を徐々に下げます)。このスクリプトは、Audaciousを使用しているときに私のニーズを十分に満たしました。ただし、現在は DeaDBeeF に切り替えています。

2つのオプションがあります。DeaDBeeFで動作するように既存のスクリプトを変更するか、ほとんどすべてのLinuxまたはKDEオーディオプレーヤーで動作する一般的なアプローチを作成します。私はどちらのアプローチでも助けを求めています。

ただし、Audaciousで実行できた方法で続行できるDeaDBeeFのドキュメントを見つけることができませんでした。ドキュメントを見つけることができれば(そしてDeaDBeeFが同等のコマンドを提供していれば)、既存のスクリプトを簡単に変更できます。あるいは、おそらくもっと助けを借りて、私は一般的なスクリプトを実装することができます。

私は開発者ではないので、私が好む実装は単純なbashスクリプトです(ただし、他の同様に単純な実装オプションも利用できます)。

前述のように、DeaDBeeFで動作するように、または一般的な方法で動作するように、bashスクリプトを変更するための支援を求めています。これが私のスクリプトです:

#!/bin/bash

function_pid=0

function musicsleep(){
    countdown=$(($1*60-1))
    datestop=$((`date +%s` + $countdown));
    echo "pausing music in $1 minutes..."

    #begin reducing sound volume 10 minutes (600 sec) from end
    voldown=$(($datestop - 600))

    while [ "$datestop" -ge `date +%s` ]; do
        datestr=$(printf "%s" $(date -u --date @$(($datestop + 1 - `date +%s`)) +%H:%M:%S))
        echo -ne "$datestr\r";
        kdialog --passivepopup "music will pause in: $datestr" 14
        if [ `date +%s` -ge "$voldown" ]; then
            currvol=$(audtool get-volume)
            #reduce volume in 40 steps of 2 = 80% reduction (starting at 100) over 10 min
            newvol=$(($currvol - 2))
            audtool set-volume $newvol
            echo -ne "\t\tvolume = $newvol\r"
            kdialog --passivepopup "volume = $newvol" 14
        fi
        sleep 15
    done
    audtool playback-pause
    echo "music paused at $(date)"
    audtool set-volume 100
}

while true; do

    choice=$(kdialog --combobox "Music Sleep Time:" "cancel" "stop" "5" "10" "15" "20" "25" "30" "35" "45" "45" "50" "60" "90" "120" "180" "360" "480" --default "25");
    retval="$?"
    if [ "$retval" -eq 0 ]; then
            if [ $function_pid -ne 0 ]; then
                kill $function_pid
                function_pid=0
                echo "countdown process terminated..."
            fi

            if [ "$choice" == cancel ]; then
                echo "countdown canceled by user at $(date)"
                kdialog --passivepopup "countdown canceled" 10
            Elif [ "$choice" == stop ]; then
                audtool playback-stop
                echo "music playback stopped at $(date)"
                kdialog --passivepopup "music playback stopped" 10
            else
                echo "countdown (re)set by user at $(date)"
                kdialog --passivepopup "countdown started" 5
                audresult=$(audtool playlist-shuffle-status)
                if [ "$audresult" == "on" ]; then audtool playlist-shuffle-toggle; fi
                audtool playback-playing
                isplaying=$?
                audtool playback-paused
                ispaused=$?
                audtool playback-stopped
                isstopped=$?
                echo "isplaying=$isplaying, ispaused=$ispaused, isstopped=$isstopped"
                if [[ "$isstopped" -eq 0 || "$ispaused" -eq 0 ]]; then audtool playback-play; echo "playback started"; fi
                musicsleep "$choice" &
                function_pid=$!
                echo "function_pid=$function_pid"
            fi
            audtool set-volume 100

    Elif [ "$retval" -eq 1 ]; then
            echo "exiting musicsleep"
            #audtool set-volume 100
            break
    else
            kdialog --error "ERROR";
    fi;

done

このスクリプトに実装されている重要な機能は次のとおりです。

  • GUIからスリープカウントダウンタイマー値を選択します
  • カウントダウンタイマーの開始時にランダム(シャッフル)再生を無効にする
  • X分でオーディオ再生を一時停止します
  • GUIで(またはデスクトップ通知を介して)残り時間を表示する
  • GUIで現在の音量レベルを表示する
  • 過去10分間で徐々に音量を下げます
  • 再生を一時停止した後、音量レベルを初期値にリセットします
  • 再生を中断することなく、カウントダウンタイマーを新しい値にリセットできるようにします
  • 再生を中断せずにカウントダウンタイマーをキャンセルできるようにする
  • カウントダウンタイマーGUIから手動で再生を停止します

いくつかの質問は次のとおりです。

DeaDBeeFには同等のコマンドがありますか?

はいの場合、同等のDeaDBeeFコマンドのドキュメントはどこにありますか?

すでにDeaDBeeFに精通している人は、スクリプト内の既存のAudaciousコマンドをDeaDBeeFコマンドに置き換えるだけでよいでしょうか。それとも、スクリプトを完全に書き直す必要があるほどの違いはありますか?

上記の機能を備えた一般的なカウントダウンタイマーを実装するのが比較的簡単な場合、誰かが私を案内したいですか?ボリューム部分は、次の方法で簡単に実装できると思います。

pactl set-sink-volume "$MY_SINK" "$VOLUME_CHANGE"  

ソース

再生を一時停止することになると、私が知る限り、次のコマンドは私のスクリプトの要件によく一致しません。

pactl suspend-sink "$MY_SINK"
pactl suspend-sink "$MY_SINK" FALSE

上記のアプローチは、オーディオの再生を一時停止するだけでなく、すべてのアプリからのすべてのサウンドを無効にし、他の潜在的な副作用があるようです。

私が見たものから ここ 、pactlで一般的に(オーディオプレーヤー全体で)再生と一時停止を制御するのは難しいようです。確かにもっと簡単な方法があるはずです。 KDE固有であれば大丈夫です。

1
MountainX

main.c のデッドビーフソースを見ると、help()関数はあなたにとって十分なはずのオプションをリストしています。

--pause              Pause playback
--nowplaying FMT     Print formatted track name to stdout
--nowplaying-tf FMT  Print formatted track name to stdout
--volume [NUM]       Print or set deadbeef volume level
1
meuh

これが私が使用することになったスクリプトです。なぜなら --volumeオプションは安定版ではまだ利用できません。代わりに、pactlコマンドを使用しました。

これは、DeaDBeeFのカウントダウンスリープタイマーです。それは私の大胆なスクリプトからの機能の1つを除いてすべてをサポートします。彼らです:

  • GUI(kdialog)からスリープカウントダウンタイマー値を選択します
  • X分でオーディオ再生を一時停止します
  • GUIで(またはデスクトップ通知を介して)残り時間を表示する
  • GUIで現在の音量レベルを表示する
  • 過去10分間で徐々に音量を下げます
  • 再生を一時停止した後、音量レベルを初期値にリセットします
  • 再生を中断することなく、カウントダウンタイマーを新しい値にリセットできるようにします
  • 再生を中断せずにカウントダウンタイマーをキャンセルできるようにする
  • カウントダウンタイマーGUIから手動で再生を停止します
  • 停止した場合は、カウントダウンタイマーGUIから再生を再開してください

コード:

#!/bin/bash

echo "DeaDBeeF control version 0.9"
function_pid=0

echo "true" > /dev/shm/allow_resetting_pactl_volume

function get_default_sink_name() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

function get_default_sink_volume() {
    pacmd list-sinks | awk '/^\s+name: /{indefault = $2 == "<'$(get_default_sink_name)'>"} /^\s+volume: / && indefault {print $5; exit}'
}

function set_default_sink_volume() {
    pactl set-sink-volume $(get_default_sink_name) "$1"
}
#source: https://unix.stackexchange.com/a/251920/15010

function music_sleep(){
    countdown=$(($1*60-1))
    datestop=$((`date +%s` + $countdown));
    echo "pausing DeaDBeeF in $1 minutes..."

    #begin reducing sound volume 10 minutes (600 sec) from end
    voldown=$(($datestop - 600))

    while [ "$datestop" -ge `date +%s` ]; do
        datestr=$(printf "%s" $(date -u --date @$(($datestop + 1 - `date +%s`)) +%H:%M:%S))
        echo -ne "$datestr\r";
        #echo "$datestr";
        kdialog --passivepopup "DeaDBeeF will pause in: $datestr" 3
        if [ $(</dev/shm/allow_resetting_pactl_volume) == "true" ]; then
            countdown_saved_pactl_volume=$(get_default_sink_volume)
            echo $countdown_saved_pactl_volume > /dev/shm/countdown_saved_pactl_volume
        fi
        if [ `date +%s` -ge "$voldown" ]; then
            echo "false" > /dev/shm/allow_resetting_pactl_volume
            #reduce volume in 40 steps of 2 = 80% reduction (starting at 100) over 10 min
            set_default_sink_volume "-2%"
            currvol=$(get_default_sink_volume)
            echo -ne "\t\tvolume = $currvol\r"
            #echo "volume = $currvol"
            kdialog --passivepopup "volume = $currvol" 3
        fi
        sleep 15
    done

    deadbeef --pause
    echo "DeaDBeeF paused at $(date)"

    countdown_saved_pactl_volume=$(</dev/shm/countdown_saved_pactl_volume)
    set_default_sink_volume "$countdown_saved_pactl_volume"
    echo "true" > /dev/shm/allow_resetting_pactl_volume
}

countdown_saved_pactl_volume=$(get_default_sink_volume)
echo $countdown_saved_pactl_volume > /dev/shm/countdown_saved_pactl_volume
echo "initial volume is: $countdown_saved_pactl_volume"

while true; do

    choice=$(kdialog --combobox "          DeaDBeeF Sleep Timer:          " "cancel" "stop" "5" "10" "15" "20" "25" "30" "35" "45" "45" "50" "60" "90" "120" "180" "360" "480" --default "30");
    retval="$?"

    if [ "$retval" -eq 0 ]; then
            if [ $function_pid -ne 0 ]; then
                    kill $function_pid
                    function_pid=0
                    echo "countdown process terminated..."
            fi

            if [ "$choice" == cancel ]; then
                    echo "countdown canceled by user at $(date)"
                    kdialog --passivepopup "countdown canceled" 5
            Elif [ "$choice" == stop ]; then
                    deadbeef --stop
                    echo "DeaDBeeF playback stopped at $(date)"
                    kdialog --passivepopup "DeaDBeeF playback stopped" 5
            else
                    echo "countdown (re)set by user at $(date)"
                    kdialog --passivepopup "countdown started" 5
                    #audresult=$(audtool playlist-shuffle-status)
                    #if [ "$audresult" == "on" ]; then audtool playlist-shuffle-toggle; fi
                    isplaying=$(deadbeef --nowplaying-tf "%isplaying%")
                    ispaused=$(deadbeef --nowplaying-tf "%ispaused%")
                    echo "isplaying=$isplaying, ispaused=$ispaused"
                    if [[ "$isplaying" -ne 1 || "$ispaused" -eq 1 ]]; then deadbeef --play-pause; echo "playback started"; fi
                    music_sleep "$choice" &
                    function_pid=$!
                    echo "function_pid=$function_pid"
            fi
            countdown_saved_pactl_volume=$(</dev/shm/countdown_saved_pactl_volume)
            set_default_sink_volume "$countdown_saved_pactl_volume"
            echo "reset volume to: $countdown_saved_pactl_volume"
            allow_reset_saved_volume="true"
            echo "true" > /dev/shm/allow_resetting_pactl_volume

    Elif [ "$retval" -eq 1 ]; then
            echo "exiting DeaDBeeFctl"
            break
    else
            kdialog --error "ERROR";
    fi;

done

rm /dev/shm/allow_resetting_pactl_volume
rm /dev/shm/countdown_saved_pactl_volume
0
MountainX