Ubuntu com Kodi - como faço para suspender com base na saída de áudio?

1

Ok, estou executando o Ubuntu 15.04 com o Kodi 15.2 como um HTPC. Eu sempre tive problemas com suspender e hibernar devido ao fato de que parece que o gerenciamento de energia dos dois sistemas causa alguns conflitos. Eu tive o Ubuntu colocar meu sistema para dormir enquanto assistia a filmes no Kodi, então eu desativei o gerenciamento de energia. Eu tive Kodi colocar meu sistema para dormir enquanto assistia Netflix (ou com Advanced Launcher ou Chrome Launcher), então eu desativei (atualmente meu HTPC é executado 24/7). Eu estou tentando chegar a algum tipo de script que não apenas mede a inatividade, mas também a saída de áudio. Eu sou um noob total quando se trata de scripting, mas é isso que eu criei até agora:

    LOG=/var/log/sleepcounter.log
    sound=0 > /var/log/sleepcounter.log

    while true: do
        sleep 1

        # check if sound is sent to speakers, add 1 if not
        if pactl list | grep -v RUNNING > /dev/null; then
            echo sound=$((sound += 1)) > /var/log/sleepcounter.log;
        fi
    done

Essencialmente, isso conta segundos em que o áudio não está sendo reproduzido. O problema então é que ele não redefine o contador para "0" quando o áudio é reproduzido. Eu tentei mudar isso, e surgiu com um script ligeiramente diferente que não funciona:

    LOG=/var/log/sleepcounter.log
    sound=0 > /var/log/sleepcounter.log
    read -d $'\x04' sound < "$LOG"


    while true; do
            sleep 1

            # check if sound is sent to speakers, add 1 if not
            if pactl list | grep  RUNNING > /dev/null; then
                    echo sound=0 > /var/log/sleepcounter.log
            else echo sound=$((sound += 1)) > /var/log/sleepcounter.log;

            fi
    done

Este script exato não escreve nada no arquivo sleepcounter.log, quando eu verifico que está em branco. Eu não consigo descobrir como fazer com que o som padrão seja = 0 e mantenha 0 enquanto o som está tocando, comece a contar quando o som parar, seguido por começar de novo a partir de 0 quando o som começar de novo ...

Eu tenho este par com outro script:

    LOG=/var/log/sleepcounter.log
    read -d $'\x04' sound < $LOG

    while true; do
            sleep 30
            # check if there is any system activity
            if [[ 'xprintidle' > 600000 && "$sound" -ge 600 ]]; then
                    (sudo pm-suspend-hybrid);
            fi
    done

Este aqui funciona. Se definir manualmente sleepcounter.log como som = 600 (ou mais), o sistema entrará em suspensão quando estiver inativo por 10 minutos. Enquanto isso funciona, eu estou pensando que também pode haver uma maneira de combinar os dois scripts em um, só para torná-lo um pouco mais simples.

Eu sei que estou tendo um problema ao referenciar as variáveis, e esta é minha primeira vez tentando escrever um script. Se alguém pudesse me ajudar, eu agradeceria muito.

    
por Bighairyg 11.12.2015 / 18:57

2 respostas

1

Vou postar isso aqui para qualquer pessoa que esteja procurando uma solução simples. Minha maior preocupação é muitas vezes adormecermos assistindo filmes e acordarmos com a TV ainda ligada. Eu sou novo no Linux, e nosso sistema anterior era o Windows XP (sem o Kodi), então ter a tela desativada após 10 minutos não era problema (embora ocasionalmente fosse travado e desligado no meio de um filme da Netflix). Eu tive dois sistemas Dell diferentes com o Windows morrer no passado, indo dormir e nunca mais acordar, então eu nunca usei as funções de suspensão / suspensão incorporadas ao Windows. Eu acho que o Kodi é uma interface incrível, muito melhor do que tentar controlar a área de trabalho do Windows com um mini teclado / trackpad sem fio.

Eu finalmente percebi isso, e é claro que eu estava tornando isso muito mais complicado do que realmente é. O que acabei fazendo foi reescrever os dois scripts diferentes em um único:

    while true; do
            sleep 1     # wait for 1 second to continue loop

            # check for sound output, if yes clear variable, if no then count +1
            if pactl list | grep RUNNING > /dev/null; then
                unset sound; echo $sound; else
                echo sound=$((sound++))
            fi

            # check idle time and no-sound time, if yes then suspend and exit loop
            if [[ 'xprintidle' > 600000000 && "$sound" -ge 600 ]]; then
                (sudo pm-suspend); exit 0
            fi
    done

Depois de salvar o script, tive que executar alguns outros comandos para que ele funcionasse corretamente:

    chmod x+ /path/to/filename.sh #to make it executable
    chmod 555 /path/to/filename.sh #had a problem with permissions and ownership

seguido pela modificação do arquivo /etc/sudoers para poder chamar pm-suspend sem ser root ou pedir uma senha adicionando isso ao final do arquivo:

    username  ALL = NOPASSWD: /usr/sbin/pm-hibernate
    username  ALL = NOPASSWD: /usr/sbin/pm-suspend

substituindo username pelo nome de usuário real que eu usei para fazer login no meu sistema.

Até agora, independentemente do que está produzindo som (testei com o Netflix por meio do Chrome Launcher através do Kodi, YouTube no Chrome diretamente da área de trabalho e reproduzi um filme diretamente do Kodi) ele suspende aproximadamente 10 minutos após o fim do som. desde que eu não esteja fazendo mais nada. Eu digo "aproximadamente" porque eu acredito que xprintidle joga alguns números aleatórios aqui e ali, mas até agora ele sempre dorme. Eu tive que adicionar o comando exit , caso contrário, ele gerou um loop sleep / wake que era difícil de sair. Em seguida, adicionei o script a ser executado na inicialização, adicionando uma tarefa cron com @reboot /path/to/filename.sh . Isso funciona muito bem, mas ainda não tenho certeza se cron é reiniciado no currículo (não acredito, não foi possível testar isso ainda) ou se preciso chamar o script de outro lugar quando o o sistema acorda.

Eu suponho que preciso perguntar em outro tópico, mas minha próxima parte deste projeto é garantir que este script reinicie ao ser retomado, e fazer com que o sistema reconheça meu teclado sem fio Rii Mini i28 (com dongle USB) como um dispositivo de despertar.

    
por Bighairyg 20.12.2015 / 21:34
1

Com um pouco de testes, vi a Kodi fechar seu cliente para a Pulseaudio depois de alguns minutos de inatividade. Isso torna este problema bastante simples. Em seu script de desligamento, tudo o que você precisa testar (além do tempo) é que não há clientes Kodi ou Chrome. Isso é tão simples quanto:

DISPLAY=:0 pactl list clients | grep -E 'kodi|chrome'

Edit: Eu sinceramente não li o título antes de escrever esta resposta. Definir o DISPLAY parece ser o elemento crítico, pelo menos aqui, para obter pactl olhando para a sessão Pulseaudio correta.

Se você estiver criando algo em algo, lembre-se de que grep retorna 0 em uma correspondência. E você pode usar o argumento -q em vez de redirecionar para /dev/null .

No entanto se você tiver sons de navegação desligados também, o usuário pode estar em um menu. Talvez você queira fazer outro tipo de verificação, talvez inserindo em entrada ou verificando a cor média da tela (defina o protetor de tela para tela preta, se a tela estiver preta e não houver som, suspender).

    
por Oli 11.12.2015 / 19:54