Temporizador genérico de contagem regressiva de suspensão de áudio para Linux

1

Eu criei um script bash para o Audacious que pausa a reprodução em X minutos (e isso reduz gradualmente o volume nos últimos 10 minutos ). Este script atendeu bem minhas necessidades enquanto usava o Audacious. No entanto, agora estou mudando para DeaDBeeF .

Eu tenho duas opções: modificar meu script existente para trabalhar com o DeaDBeeF ou criar uma abordagem genérica que funcionará com quase todos os reprodutores de áudio do Linux ou do KDE. Estou procurando ajuda com qualquer abordagem.

No entanto, não consegui localizar a documentação do DeaDBeeF que me permite prosseguir da maneira que eu consegui com o Audacious. Se eu pudesse encontrar a documentação (e se o DeaDBeeF oferecesse comandos equivalentes) eu poderia facilmente modificar meu script existente. Como alternativa, e possivelmente com mais ajuda, eu poderia implementar um script genérico.

Eu não sou um desenvolvedor, então minha implementação preferida é um script bash simples (embora eu esteja aberto a outras opções de implementação igualmente simples).

Como mencionado, estou procurando ajuda para modificar meu script bash para trabalhar com o DeaDBeeF ou para trabalhar de maneira genérica. Aqui está meu script:

#!/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

Os recursos essenciais implementados neste script são:

  • Escolha um valor do temporizador de contagem regressiva para dormir a partir de uma GUI
  • Desativar a reprodução aleatória (aleatória) quando o contador regressivo começar
  • Pausar a reprodução de áudio em X minutos
  • Mostrar tempo restante na GUI (ou por meio de notificações na área de trabalho)
  • Mostrar o nível de volume atual na GUI
  • Reduza gradualmente o volume nos últimos 10 minutos
  • Após a pausa ser pausada, redefina o nível do volume para o valor inicial
  • Permitir que o timer de contagem regressiva seja redefinido para um novo valor sem interromper a reprodução
  • Permitir que o temporizador de contagem regressiva seja cancelado sem interromper a reprodução
  • Pare a reprodução manualmente a partir da GUI do cronômetro de contagem regressiva

Algumas perguntas são:

O DeaDBeeF tem comandos equivalentes?

Se sim, onde está a documentação para os comandos DeaDBeeF equivalentes?

Para quem já está familiarizado com o DeaDBeeF, posso esperar simplesmente substituir os comandos DeaDBeeF pelos meus comandos Audacious existentes no meu script? Ou as diferenças são grandes o suficiente para exigir uma reescrita completa do roteiro?

Se um temporizador de contagem regressiva genérico com a funcionalidade acima será relativamente simples de implementar, alguém quer me guiar? Acho que a parte do volume será fácil de implementar:

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

fonte

Quando se trata de pausar a reprodução, até onde eu sei, os seguintes comandos não correspondem aos requisitos do meu script:

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

A abordagem acima não pausa apenas o áudio de reprodução, ele desativa todo o som de todos os aplicativos e parece ter outros efeitos colaterais em potencial.

Do que eu vi aqui , controlando a reprodução e pausando genericamente (em qualquer player de áudio) com aparência de pactl difícil. Certamente deve haver um caminho mais simples. Estou bem, se é específico do KDE.

    
por MountainX 21.04.2018 / 19:55

2 respostas

1

Se você olhar a fonte do deadbeef para main.c , o% A funçãohelp() lista as opções que devem ser suficientes para você:

--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
    
por 23.04.2018 / 18:39
0

Aqui está o script que acabei usando. Como a opção --volume ainda não está disponível na versão estável, usei os comandos pactl .

Este é um temporizador de contagem regressiva para o DeaDBeeF. Ele suporta todos, exceto um dos recursos do meu script Audacious. Eles são:

  • Escolha um valor do temporizador de contagem regressiva de inatividade em uma GUI (kdialog)
  • Pausar a reprodução de áudio em X minutos
  • Mostrar tempo restante na GUI (ou por meio de notificações na área de trabalho)
  • Mostrar o nível de volume atual na GUI
  • Reduza gradualmente o volume nos últimos 10 minutos
  • Após a pausa ser pausada, redefina o nível do volume para o valor inicial
  • Permitir que o timer de contagem regressiva seja redefinido para um novo valor sem interromper a reprodução
  • Permitir que o temporizador de contagem regressiva seja cancelado sem interromper a reprodução
  • Pare a reprodução manualmente a partir da GUI do cronômetro de contagem regressiva
  • Se interrompido, inicie a reprodução novamente a partir da GUI do timer de contagem regressiva

Código:

#!/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
    
por 05.05.2018 / 23:36