✓ Решено Скирпт на Bash для включения/выключения второго экрана и переброса звука

Языки программирования, IDE, компиляторы, интерпретаторы
Правила форума
Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа.
Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение SATORY_RA » 22 апр 2017, 18:26

Добра всем )))
Только месяц, как перешёл на линукс и Mint Cianamon в частности ))) Всё нравиться )) Вот только, мы с женой периодически смотрим фильмы на ТВ, подключённом через HDMI. Так вот, хотелось бы сделать скриптик для python, который потом можно легко добавить в контекстное меню на рабочем столе по инструкции из этой темы: https://linuxmint.com.ru/viewtopic.php?t=741.
Пытался что-то наваять сам, но так как не имею опыта в программировании, да и с линуксом пока знаком шапошно, то, конечно же, ничего не вышло ))) Понял только, что экраном можно управлять через xrandr, по звуку ещё толком не разобрался ))
Имеем: основной монитор и ТВ, подключённое по HDMI. ТВ находиться слева от монитора - это важно, так как по дефолту, при включении, он почему-то всегда становиться справа от основного, хотя в прошлый раз я его перетягивал на левую сторону от основного. Ещё, звук тоже нужно переключать с колонок от компа, на динамики ТВ. А в Cianamon для этого нужно много движений лишних - не удобно.
Так вот, требования к скрипту:
- включение/выключение ТВ и, если ТВ включается, то звук перекидывается на канал HDMI, а если отключается, то, соответственно, звук возвращается обратно на динамики компа.
Я так понимаю, скрипт должен проводить проверку состояния HDMI и если он отключён, то должен его включить и вместе с ним так же переключить звук на HDMI; если ТВ включён, то при выполнении, скрипт должен выключить его и переключить звук обратно на динамики компьютера.
Если кто-нибудь возьмётся помочь, то прошу ещё написать комментарии в коде, хочу попробовать разобраться потом что к чему и иметь возможность поправить в нём что-то сам ))))
Заранее спасибо откликнувшимся ))))
P.S. Мне то в принципе не тяжело всё это делать, но вот жена не довольна, я и так её три месяца уламывал с винды соскочить ))) А так, добавлю скрипт этот в менюшку, раз нажал и оп-ля, всё включено, нажал опять, всё выключено, красота )))

Решение SATORY_RA » 02 май 2017, 19:06
Всем спасибо, нашёл решение ))))

Код: Выделить всё

#!/bin/bash

IN="HDMI-1"
EXT="HDMI-2"

if (xrandr | grep "$EXT" | cut -d ' ' -f 2- | grep [0-9])
    then
    xrandr --output $EXT --off --output $IN --auto --primary
    SINK=$(pacmd list-sinks|grep '[^*] index'|sed 's/.*: //')
    pacmd set-default-sink ${SINK}
    pacmd list-sink-inputs |grep 'index: '|sed 's/\s*index: //'|while read x
    do
    pacmd move-sink-input "$x" "${SINK}";
    done
    else
            xrandr --output $IN --auto --primary  --output $EXT --auto --left-of $IN
            SINK1=$(pacmd list-sinks|grep '[^*] index'|sed 's/.*: //')
            pacmd set-default-sink ${SINK1}
            pacmd list-sink-inputs |grep 'index: '|sed 's/\s*index: //'|while read x
            do
            pacmd move-sink-input "$x" "${SINK1}";
            done
fi

Разъяснение по скрипту под спойлером - не стесняйтесь открывать))
► Показать

UPD.10.05.17. Убрал лишние if..then..fi
UPD.11.05.17. Исправил переключение звука - переключался только в одну сторону.
Добавление этого скрипта в контекстное меню ФМ nemo (Пост SATORY_RA #15476) для переключения режимов на рабочем столе.

Перейти к ответу ➙

Аватара пользователя
Nik-Neim
Сообщения: 231
Зарегистрирован: 04 дек 2016, 08:52
Решено: 1
Откуда: Где-то в Подмосковье
Благодарил (а): 240 раз
Поблагодарили: 89 раз

Скирпт на Python для включения/выключения второго экрана

Сообщение Nik-Neim » 22 апр 2017, 18:32

SATORY_RA, У меня точно такая же головоломка. Тоже обращался с подобной просьбой. Вопрос завис... Поэтому, присоединяюсь. Изображение

Вот, отыскал...

ССЫЛКА НА МОЙ ВОПРОС
Изображение

Аватара пользователя
Bill Williamson
Сообщения: 433
Зарегистрирован: 31 авг 2016, 10:38
Решено: 16
Благодарил (а): 161 раз
Поблагодарили: 85 раз

Скирпт на Python для включения/выключения второго экрана

Сообщение Bill Williamson » 22 апр 2017, 23:38

Ковыряя скрипты для панели, случайно наткнулся на это. Он для i3wm с панелью i3blocks. Мб принцип его работы вам чем-то поможет.
Изображение

Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Python для включения/выключения второго экрана

Сообщение SATORY_RA » 23 апр 2017, 07:40

Да, что-то похожее, но как это переписать под мои пожелания ))) Нужно найти кого-нибудь, кто в python разбирается ))))
По этой ссылке что-то есть, но всё так же не очень понятно https://github.com/meehow/python-xrandr/blob/master/xrandr/core.py. От сюда нужно взять какие-то куски кода, но вот какие ? )))

Аватара пользователя
Chocobo
Сообщения: 4560
Зарегистрирован: 27 авг 2016, 19:57
Решено: 107
Откуда: НН
Благодарил (а): 372 раза
Поблагодарили: 1223 раза

Скирпт на Python для включения/выключения второго экрана

Сообщение Chocobo » 23 апр 2017, 10:57

SATORY_RA, Ну тут я не вижу особого смысла в питоне, эта условная конструкция будет проще выглядеть на баше.

позиция экрана - что-то типа xrandr --output LVDS1 --auto --output HDMI1 --auto --left-of LVDS1 (в зависимости от того что есть в xrandr)
канал вывода звука, сформировать вызов pacmd на основе этой темы - помогите настроить выход на наушники (Пост svm #5731)

И аналогично в обратную, на случай отключения дисплея.
Чтоб не плодить пункты или хоткеи - завернуть обработку можно в единую условную конструкцию на вхождение HDMI1 connected, где вызываться значения будут в зависимости от состояния HDMI1
Изображение

Unborn
Сообщения: 640
Зарегистрирован: 03 сен 2016, 10:36
Решено: 14
Благодарил (а): 2 раза
Поблагодарили: 93 раза

Скирпт на Python для включения/выключения второго экрана

Сообщение Unborn » 23 апр 2017, 11:19

SATORY_RA писал(а):Источник цитаты включение/выключение ТВ и, если ТВ включается, то звук перекидывается на канал HDMI, а если отключается, то, соответственно, звук возвращается обратно на динамики компа.

Если видео встроенное, то вообще ничего не нужно. Должно просто работать, как например, подключить наушники. А с дискреткой, да нужно переключать вывод звука через неё. У вас как?
Если ТВ СМАРТ или с поддержкой сети, то лучше по сети подключить. Жена сериал смотрит, а ты музон в наушниках слушаешь и здесь, на форуме сидишь. И нагрузка на комп копеечная и друг друга не отвлекаете.

Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Python для включения/выключения второго экрана

Сообщение SATORY_RA » 23 апр 2017, 14:38

Ниже то, что у меня есть. Как это правильно оформить в баш-скрипт? И этот скрипт сможет проверять состояние HDMI и в зависимости делать так, как я писал выше? )) Вот эта ссылка https://habrahabr.ru/post/47163/ - это то? В смысле, по этому принципу скрипты такие строятся или с того времени многое поменялось? ))
► Показать

Тут ещё вопрос возник HDMI-2 connected, но сейчас он отключён, правда не физически, а через параметры -> дисплей. Как тогда состояние его узнавать? )))
► Показать

У меня видео встроеное Intel, но при включении ТВ автоматом туда звук не улетает. Сеть в телике есть (самсунг старый, когда-то сам включал с помощью светодиода и мелодии), но смарт тв нету)))

Unborn
Сообщения: 640
Зарегистрирован: 03 сен 2016, 10:36
Решено: 14
Благодарил (а): 2 раза
Поблагодарили: 93 раза

Скирпт на Python для включения/выключения второго экрана

Сообщение Unborn » 23 апр 2017, 16:19

SATORY_RA, установи pavucontrol, если ещё не установлен. Там и будет видно какой основной сток, а какие резервные. Устанавливай основным HDMI, тогда при подключении звук автоматом должен пойти через него. При отключении - через резервный выход. А у тебя основным, наверно, установлен аналоговый выход. В Альсе то всё правильно. 0 - HDMI. Как бы препятствий на её уровне быть не должно.

Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение SATORY_RA » 30 апр 2017, 19:51

Код: Выделить всё

#!/bin/bash

IN="HDMI-1"
EXT="HDMI-2"

if (xrandr | grep "$EXT" | grep "connected 1920")
    then
    xrandr --output $EXT --off --output $IN --auto --primary
    pacmd set-default-sink 1
    else
        if (xrandr | grep "$EXT" | grep " connected")
            then
            xrandr --output $IN --auto --primary  --output $EXT --auto --left-of $IN
            pacmd set-default-sink 2   
        fi
fi

Подробнее под спойлером))
► Показать

P.S. Если это возможно, то прошу администрацию переименовать тему: "Скирпт на Bash для включения/выключения второго экрана и переброса звука"
Последний раз редактировалось SATORY_RA 30 апр 2017, 20:41, всего редактировалось 2 раза.

Аватара пользователя
Chocobo
Сообщения: 4560
Зарегистрирован: 27 авг 2016, 19:57
Решено: 107
Откуда: НН
Благодарил (а): 372 раза
Поблагодарили: 1223 раза

Скирпт на Python для включения/выключения второго экрана

Сообщение Chocobo » 30 апр 2017, 19:59

SATORY_RA, браво, мысль воспринята абсолютно верно :thumbs:

SATORY_RA писал(а):Источник цитаты переименовать тему

возможно конечн :yes:
Только тем, кому эти наработки будут интересны стоит учесть, что второй экран не всегда HDMI, и тут грепается разрешение, которое не обязательно fullhd
Изображение

Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение SATORY_RA » 30 апр 2017, 20:00

Chocobo, да, я про это в пояснении писал, но может не очень понятно?? Подскажи, как понятнее написать, я тогда сейчас поправлю )))
Последний раз редактировалось SATORY_RA 30 апр 2017, 20:02, всего редактировалось 1 раз.

Аватара пользователя
Chocobo
Сообщения: 4560
Зарегистрирован: 27 авг 2016, 19:57
Решено: 107
Откуда: НН
Благодарил (а): 372 раза
Поблагодарили: 1223 раза

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение Chocobo » 30 апр 2017, 20:02

Да наверное достаточно, просто акцентирую, на случаи слепого копипаста
Изображение

Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение SATORY_RA » 01 май 2017, 19:09

Chocobo, может вы подскажете?
В общем, скрипт этот отрабатывает и вроде всё переключается, по экранам вопросов нет. Но вот звук. Когда захожу в настройки звука, там отображается всё правильно, т.е. звук выбран на HDMI, но когда включаю фильм, звук идёт через динамики компа. Что это может быть?
Можно потом в настройках переключиться обратно на динамики компа, хотя и так через них звук, а потом снова включить на HDMI и вот уже в этом случае звук идёт из ТВ.
Кстати, в минте стандартом звук через пульсеаудио или альса? Может альса стандартом? Тогда нужно для неё в скрипте команда сделать.

Аватара пользователя
Chocobo
Сообщения: 4560
Зарегистрирован: 27 авг 2016, 19:57
Решено: 107
Откуда: НН
Благодарил (а): 372 раза
Поблагодарили: 1223 раза

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение Chocobo » 01 май 2017, 21:22

alsa тоже работает, но обычно смены параметров пульсы должно хватить, т.к. звук напрямую к альсе никто из приложений гнать не должен.

default-sink 1 и 2 по скрипту выставляются верно?
Изображение

Аватара пользователя
Bill Williamson
Сообщения: 433
Зарегистрирован: 31 авг 2016, 10:38
Решено: 16
Благодарил (а): 161 раз
Поблагодарили: 85 раз

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение Bill Williamson » 01 май 2017, 22:06

SATORY_RA, а как если в скрипте задавать профиль через pactl set-card-profile?
Изображение

Аватара пользователя
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 21 раз
Поблагодарили: 16 раз

Скирпт на Bash для включения/выключения второго экрана и переброса звука

Сообщение SATORY_RA » 02 май 2017, 19:06

Всем спасибо, нашёл решение ))))

Код: Выделить всё

#!/bin/bash

IN="HDMI-1"
EXT="HDMI-2"

if (xrandr | grep "$EXT" | cut -d ' ' -f 2- | grep [0-9])
    then
    xrandr --output $EXT --off --output $IN --auto --primary
    SINK=$(pacmd list-sinks|grep '[^*] index'|sed 's/.*: //')
    pacmd set-default-sink ${SINK}
    pacmd list-sink-inputs |grep 'index: '|sed 's/\s*index: //'|while read x
    do
    pacmd move-sink-input "$x" "${SINK}";
    done
    else
            xrandr --output $IN --auto --primary  --output $EXT --auto --left-of $IN
            SINK1=$(pacmd list-sinks|grep '[^*] index'|sed 's/.*: //')
            pacmd set-default-sink ${SINK1}
            pacmd list-sink-inputs |grep 'index: '|sed 's/\s*index: //'|while read x
            do
            pacmd move-sink-input "$x" "${SINK1}";
            done
fi

Разъяснение по скрипту под спойлером - не стесняйтесь открывать))
► Показать

UPD.10.05.17. Убрал лишние if..then..fi
UPD.11.05.17. Исправил переключение звука - переключался только в одну сторону.
Добавление этого скрипта в контекстное меню ФМ nemo (Пост SATORY_RA #15476) для переключения режимов на рабочем столе.


Вернуться в «Скриптинг и программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей