![Linux 범용 오디오 절전 카운트다운 타이머](https://linux55.com/image/131936/Linux%20%EB%B2%94%EC%9A%A9%20%EC%98%A4%EB%94%94%EC%98%A4%20%EC%A0%88%EC%A0%84%20%EC%B9%B4%EC%9A%B4%ED%8A%B8%EB%8B%A4%EC%9A%B4%20%ED%83%80%EC%9D%B4%EB%A8%B8.png)
Bash 스크립트를 만들었습니다.용감한X분 동안 재생을 일시 중지합니다(지난 10분 동안 점차적으로 볼륨을 줄입니다). 이 스크립트는 Audacious를 사용할 때 내 요구 사항에 매우 적합합니다. 하지만 이제는 다음으로 전환하고 싶습니다.죽은 콩.
두 가지 옵션이 있었습니다. 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에서 수동으로 재생 중지
몇 가지 질문은 다음과 같습니다:
DeadDBeeF에 해당하는 명령이 있습니까?
그렇다면 해당 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
데드비프 소스를 보면메인 프로그램이 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
답변2
이것이 내가 사용한 스크립트입니다. --volume
아직 안정 버전에서는 이 옵션을 사용할 수 없기 때문에 pactl
명령을 사용했습니다.
DeaDBeeF의 카운트다운 수면 타이머입니다. 내 Audacious 스크립트에서는 한 가지 기능을 제외한 모든 기능을 지원합니다. 그들은:
- 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