Ubuntu with Kodi — how do I suspend based on аудио output?

Ok, I am running Ubuntu 15.04 with Kodi 15.2 схвати an HTPC. I have always had problems with suspend and hibernate due to the fact that it appears that the two systems' power менеджмент вызвал some conflicts. I have had Ubuntu удар в лунку my system to sleep while watching movies on Kodi, so I disabled the power менеджмент. I have had Kodi удар в лунку my system to sleep while watching Netflix (either with Адвансед Лаунчер or Чроме Лаунчер), so I disabled that (currently my HTPC runs 24/7). I am trying to ест up with some sort of рукописный шрифт that not only measures inactivity, but аудио output эксперт well. I am в общее количество noob when it ты ешь to scripting, but this is what I came up with so far:

    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

This essentially counts seconds that аудио is not playing. The problem then is it does not reset the counter to "0" when аудио does play. I attempted to переключатель it around, and came up with в slightly different рукописный шрифт that does NOT work:

    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

This exact рукописный шрифт does not write anything to the sleepcounter.log file, when I check it it's blank. I can't фигурировал out how to make it default to sound=0 and maintain 0 while sound is playing, start counting when sound stops, followed by starting over from 0 when sound starts again...

I have this paired up with another рукописный шрифт:

    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

This one does work. If I manually set sleepcounter.log to sound=600 (or я обитал) it puts the system to sleep when it существуешь been невключите for 10 minutes. While this works, I am thinking there also might be в way to сочетался the two scripts into one, just to make it в бит simpler.

I know I am having в problem with referencing the переменные, and this is my first украл trying to write в рукописный шрифт. If anyone could help я out, I would greatly appreciate it.

1
задан 11 December 2015 в 20:57

2 ответа

Я отправлю это здесь для кого-либо еще ищущего простое решение. Мое самое большое беспокойство много раз, мы заснули, смотря кино и осознаем ТВ, все еще находящееся 'на'. Я плохо знаком с Linux, и нашей предыдущей системой был Windows XP (без Kodi), таким образом отключая экран после того, как 10 минут не были никакой проблемой (хотя это будет иногда давать незначительный сбой, и выключаться посреди фильма Netflix). У меня было две различных системы Dell с Windows, умирают в прошлом, засыпая и никогда не просыпаясь, таким образом, я никогда не привык спать/приостанавливать функции, встроенные для Windows. Я думаю, что Kodi является потрясающим интерфейсом, намного лучше, чем попытка управлять рабочим столом Windows с беспроводной мини-клавиатурой/сенсорной панелью.

я наконец понял это, и конечно я делал это ПУТЕМ более сложный, чем это действительно. То, что я закончил тем, что делал, переписывало два различных сценария в единственный:

    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

После сохранения сценария, я тогда должен был выполнить некоторые другие команды, чтобы заставить его работать правильно:

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

сопровождаемый путем изменения /etc/sudoers файл, чтобы быть в состоянии звонить pm-suspend, не будучи корнем или просьбы пароль путем добавления этого до конца файла:

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

замена username с фактическим именем пользователя я использую для вхождения в мою систему.

До сих пор, независимо от того, что производит звук (я протестировал с Netflix через Средство запуска Chrome через Kodi, YouTube в Chrome непосредственно рабочий стол и проигрывание фильма непосредственно от Kodi) это приостанавливает спустя приблизительно 10 минут после звуковых остановок, пока я не делаю ничего больше. Я говорю "приблизительно", потому что я верю xprintidle, отбрасывает некоторые случайные числа тут и там, но до сих пор это ВСЕГДА спит. Я должен был добавить эти exit команда, иначе она генерировала цикл сна/следа, из которого было трудно выйти. Я тогда добавил сценарий, который будет выполнен при запуске путем добавления задания крона с @reboot /path/to/filename.sh. Это работает отлично, но я еще не уверен, делают ли cron перезапуски на резюме (я не верю этому, не были в состоянии протестировать это все же), или если я должен назвать сценарий от где-то в другом месте, когда система просыпается.

я предполагаю, что должен спросить в другом потоке, но моя следующая часть этого проекта должна удостовериться, что этот сценарий запускается снова на резюме, и заставить систему распознать мою Мини-i28 беспроводную клавиатуру Rii (с аппаратным ключом USB) как устройство пробуждения.

1
ответ дан 7 December 2019 в 13:50

С определенным тестированием здесь я видел, что Kodi закрыл свой клиент к Pulseaudio после нескольких минут бездействия. Это делает эту проблему довольно простой. В Вашем сценарии завершения работы все необходимо протестировать на (кроме времени), то, что нет никаких клиентов Kodi или Chrome. Это так же просто как:

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

Редактирование: Я честно не читал мимо заголовка прежде, чем записать этот ответ. Установка эти DISPLAY, кажется, критический элемент, по крайней мере здесь, добирается pactl взгляд справа сессия Pulseaudio.

, Если Вы пишете сценарий, это во что-то помнит что grep возвраты 0 на соответствии. И можно использовать -q аргумент вместо того, чтобы перенаправить к /dev/null.

Однако , если Вам выключили звуки навигации также, пользователь мог бы просто быть в меню. Вы могли бы хотеть сделать другой вид проверки, возможно, сцепляющийся во вход или проверка среднего цвета экрана (установите экранную заставку на черный экран, если экран является черным, и нет никакого звука, приостановите).

1
ответ дан 7 December 2019 в 13:50

Другие вопросы по тегам:

Похожие вопросы: