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
このスクリプトに実装されている重要な機能は次のとおりです。
いくつかの質問は次のとおりです。
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固有であれば大丈夫です。
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
これが私が使用することになったスクリプトです。なぜなら --volume
オプションは安定版ではまだ利用できません。代わりに、pactl
コマンドを使用しました。
これは、DeaDBeeFのカウントダウンスリープタイマーです。それは私の大胆なスクリプトからの機能の1つを除いてすべてをサポートします。彼らです:
コード:
#!/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