Linux 범용 오디오 절전 카운트다운 타이머

Linux 범용 오디오 절전 카운트다운 타이머

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

관련 정보