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

Языки программирования, IDE, компиляторы, интерпретаторы, гипервизоры и виртуальные среды
Правила форума
Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Версия ОС вместе с разрядностью. Пример: LM 18.1 x64, LM Sarah x32 2. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 3. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 4. Суть. Желательно с выводом консоли, логами. 5. Скрин. Просьба указывать 1, 2 и 3 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

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

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

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

Добра всем )))
Только месяц, как перешёл на линукс и Mint Cianamon в частности ))) Всё нравиться )) Вот только, мы с женой периодически смотрим фильмы на ТВ, подключённом через HDMI. Так вот, хотелось бы сделать скриптик для python, который потом можно легко добавить в контекстное меню на рабочем столе по инструкции из этой темы: 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
Разъяснение по скрипту под спойлером - не стесняйтесь открывать))
По видео:
Для начала выполняем xrandr, затем, в зависимости от своего вывода правим параметры IN="HDMI-1" и EXT="HDMI-2", на то, что у вас есть.
Не по теме
К примеру, у меня, HDMI-1=IN - это мой монитор, а HDMI-2=EXT - это телевизор и он стоит слева от монитора.
Смотрим: скрипт xrandr | grep "$EXT" | cut -d ' ' -f 2- | grep [0-9] определяет, подключён ли телевизор и если да, то xrandr --output $EXT --off - отключает его, а монитор остаётся включённым --output $IN в режиме автоподбора частоты и разрешения--auto(обычно максимально возможные значения) --primary - основным. Если же ТВ сейчас отключён, то xrandr --output $IN --auto --primary - монитор остаётся в том же режиме, а ТВ подключается в режиме --output $EXT --auto -авто и --left-of $IN - слева от моего монитора.
Пояснение по параметрам xrandr для того, что бы этот скрипт проще было адаптировать под себя:
статья об утилите для обзора и изменения режимов дисплея Xrandr
По звуку:
Главное, что бы перед запуском скрипта был включён нужный источник звука, потому что скрипт просто циклически меняет доступные sink.
Нашёл скрипт здесь. Спасибо этому человеку )))
Сам скрипт по переключению звука по источникам:

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

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

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

Аватара пользователя

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

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

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

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

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

ССЫЛКА НА МОЙ ВОПРОС

Аватара пользователя

Bill Williamson
Сообщения: 476
Зарегистрирован: 31 авг 2016, 10:38
Решено: 19
Благодарил (а): 180 раз
Поблагодарили: 102 раза

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

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

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

Аватара пользователя

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

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

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

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

Аватара пользователя

Chocobo
Сообщения: 5967
Зарегистрирован: 27 авг 2016, 19:57
Решено: 136
Откуда: НН
Благодарил (а): 424 раза
Поблагодарили: 1548 раз

Скирпт на 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
Сообщения: 852
Зарегистрирован: 03 сен 2016, 10:36
Решено: 15
Благодарил (а): 2 раза
Поблагодарили: 129 раз

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

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

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

Аватара пользователя

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

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

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

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

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

kotiky@kotiky-B85M-D3H ~ $ xrandr
Screen 0: minimum 320 x 200, current 1280 x 1024, maximum 8192 x 8192
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected primary 1280x1024+0+0 (normal left inverted right x axis y axis) 380mm x 300mm
   1280x1024     60.02*+
   1280x960      60.00  
   1024x768      60.00  
   800x600       60.32  
   640x480       60.00  
   720x400       70.08  
HDMI-2 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +  50.00    59.94    30.00    25.00    24.00    29.97    23.98  
   1920x1080i    60.00    50.00    59.94  
   1680x1050     59.88  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1440x900      59.90  
   1366x768      59.79  
   1280x800      59.91  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1024x768      75.08    70.07    60.00  
   832x624       74.55  
   800x600       72.19    75.00    60.32  
   720x576       50.00  
   720x576i      50.00  
   720x480       60.00    59.94  
   720x480i      60.00    59.94  
   640x480       75.00    72.81    66.67    60.00    59.94  
   720x400       70.08  
Тут ещё вопрос возник HDMI-2 connected, но сейчас он отключён, правда не физически, а через параметры -> дисплей. Как тогда состояние его узнавать? )))

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

kotiky@kotiky-B85M-D3H ~ $ pacmd list-cards
2 card(s) available.
    index: 0
	name: <alsa_card.pci-0000_00_03.0>
	driver: <module-alsa-card.c>
	owner module: 6
	properties:
		alsa.card = "0"
		alsa.card_name = "HDA Intel HDMI"
		alsa.long_card_name = "HDA Intel HDMI at 0xf7d14000 irq 32"
		alsa.driver_name = "snd_hda_intel"
		device.bus_path = "pci-0000:00:03.0"
		sysfs.path = "/devices/pci0000:00/0000:00:03.0/sound/card0"
		device.bus = "pci"
		device.vendor.id = "8086"
		device.vendor.name = "Intel Corporation"
		device.product.id = "0c0c"
		device.product.name = "Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller"
		device.form_factor = "internal"
		device.string = "0"
		device.description = "Встроенное аудио"
		module-udev-detect.discovered = "1"
		device.icon_name = "audio-card-pci"
	profiles:
		output:hdmi-stereo: Digital Stereo (HDMI) выход (priority 5400, available: unknown)
		output:hdmi-surround: Digital Surround 5.1 (HDMI) выход (priority 300, available: unknown)
		output:hdmi-surround71: Digital Surround 7.1 (HDMI) выход (priority 300, available: unknown)
		output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) выход (priority 5200, available: unknown)
		output:hdmi-stereo-extra2: Digital Stereo (HDMI 3) выход (priority 5200, available: unknown)
		output:hdmi-surround-extra2: Digital Surround 5.1 (HDMI 3) выход (priority 100, available: unknown)
		output:hdmi-surround71-extra2: Digital Surround 7.1 (HDMI 3) выход (priority 100, available: unknown)
		off: Выключено (priority 0, available: unknown)
	active profile: <output:hdmi-stereo>
	sinks:
		alsa_output.pci-0000_00_03.0.hdmi-stereo/#0: Встроенное аудио Digital Stereo (HDMI)
	sources:
		alsa_output.pci-0000_00_03.0.hdmi-stereo.monitor/#0: Monitor of Встроенное аудио Digital Stereo (HDMI)
	ports:
		hdmi-output-0: HDMI / DisplayPort (priority 5900, latency offset 0 usec, available: no)
			properties:
				device.icon_name = "video-display"
		hdmi-output-1: HDMI / DisplayPort 2 (priority 5800, latency offset 0 usec, available: no)
			properties:
				device.icon_name = "video-display"
		hdmi-output-2: HDMI / DisplayPort 3 (priority 5700, latency offset 0 usec, available: no)
			properties:
				device.icon_name = "video-display"
    index: 1
	name: <alsa_card.pci-0000_00_1b.0>
	driver: <module-alsa-card.c>
	owner module: 7
	properties:
		alsa.card = "1"
		alsa.card_name = "HDA Intel PCH"
		alsa.long_card_name = "HDA Intel PCH at 0xf7d10000 irq 31"
		alsa.driver_name = "snd_hda_intel"
		device.bus_path = "pci-0000:00:1b.0"
		sysfs.path = "/devices/pci0000:00/0000:00:1b.0/sound/card1"
		device.bus = "pci"
		device.vendor.id = "8086"
		device.vendor.name = "Intel Corporation"
		device.product.id = "8c20"
		device.product.name = "8 Series/C220 Series Chipset High Definition Audio Controller"
		device.form_factor = "internal"
		device.string = "1"
		device.description = "Встроенное аудио"
		module-udev-detect.discovered = "1"
		device.icon_name = "audio-card-pci"
	profiles:
		input:analog-stereo: Аналоговый стерео вход (priority 60, available: unknown)
		output:analog-stereo: Аналоговый стерео выход (priority 6000, available: unknown)
		output:analog-stereo+input:analog-stereo: Аналоговый стерео дуплекс (priority 6060, available: unknown)
		output:analog-surround-21: Аналоговый объёмный 2.1 выход (priority 800, available: unknown)
		output:analog-surround-21+input:analog-stereo: Аналоговый объёмный 2.1 выход + Аналоговый стерео вход (priority 860, available: unknown)
		output:analog-surround-40: Аналоговый объёмный 4.0 выход (priority 700, available: unknown)
		output:analog-surround-40+input:analog-stereo: Аналоговый объёмный 4.0 выход + Аналоговый стерео вход (priority 760, available: unknown)
		output:analog-surround-41: Аналоговый объёмный 4.1 выход (priority 800, available: unknown)
		output:analog-surround-41+input:analog-stereo: Аналоговый объёмный 4.1 выход + Аналоговый стерео вход (priority 860, available: unknown)
		output:analog-surround-50: Аналоговый объёмный 5.0 выход (priority 700, available: unknown)
		output:analog-surround-50+input:analog-stereo: Аналоговый объёмный 5.0 выход + Аналоговый стерео вход (priority 760, available: unknown)
		output:analog-surround-51: Аналоговый объёмный 5.1 выход (priority 800, available: unknown)
		output:analog-surround-51+input:analog-stereo: Аналоговый объёмный 5.1 выход + Аналоговый стерео вход (priority 860, available: unknown)
		output:analog-surround-71: Analog Surround 7.1 выход (priority 700, available: unknown)
		output:analog-surround-71+input:analog-stereo: Analog Surround 7.1 выход + Аналоговый стерео вход (priority 760, available: unknown)
		output:iec958-stereo: Цифровой стерео (IEC958) выход (priority 5500, available: unknown)
		output:iec958-stereo+input:analog-stereo: Цифровой стерео (IEC958) выход + Аналоговый стерео вход (priority 5560, available: unknown)
		off: Выключено (priority 0, available: unknown)
	active profile: <output:analog-stereo+input:analog-stereo>
	sinks:
		alsa_output.pci-0000_00_1b.0.analog-stereo/#1: Встроенное аудио Аналоговый стерео
	sources:
		alsa_output.pci-0000_00_1b.0.analog-stereo.monitor/#1: Monitor of Встроенное аудио Аналоговый стерео
		alsa_input.pci-0000_00_1b.0.analog-stereo/#2: Встроенное аудио Аналоговый стерео
	ports:
		analog-input-front-mic: Фронтальный микрофон (priority 8500, latency offset 0 usec, available: no)
			properties:
				device.icon_name = "audio-input-microphone"
		analog-input-rear-mic: Тыловой микрофон (priority 8200, latency offset 0 usec, available: no)
			properties:
				device.icon_name = "audio-input-microphone"
		analog-input-linein: Линейный вход (priority 8100, latency offset 0 usec, available: no)
			properties:
				
		analog-output-lineout: Линейный выход (priority 9900, latency offset 0 usec, available: yes)
			properties:
				
		analog-output-headphones: Аналоговые наушники (priority 9000, latency offset 0 usec, available: no)
			properties:
				device.icon_name = "audio-headphones"
		iec958-stereo-output: Цифровой выход (S/PDIF) (priority 0, latency offset 0 usec, available: unknown)
			properties:	
У меня видео встроеное Intel, но при включении ТВ автоматом туда звук не улетает. Сеть в телике есть (самсунг старый, когда-то сам включал с помощью светодиода и мелодии), но смарт тв нету)))

Аватара пользователя

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

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

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

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

Аватара пользователя

Автор темы
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 23 раза
Поблагодарили: 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
Подробнее под спойлером))
Переключение мониторов
Для начала выполняем xrandr, затем, в зависимости от своего вывода правим параметры IN="HDMI-1" и EXT="HDMI-2", на то, что у вас есть.
Почему if (xrandr | grep "$EXT" | grep "connected 1920")? Потому что нам по какому-то признаку нужно узнать включён ли второй монитор. А так, как xrandr выдаёт и на HDMI-1, и на HDMI-2 connected, то пришлось добавить ещё кусочек строки, которая появляется при включении этого экрана, так мы и узнаём, включён ли он )))
Параметр --left-of $IN отправляет монитор налево от монитора IN==HDMI-1==моего основного монитора. Кому нужно, можно отправлять на право --right-of. так же можно дописать любые дополнительные параметры, по своему желанию)))

Переключение звука
Для того, что бы узнать что и к какому sink привязано выполняем: pacmd list-sinks, там видим:

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

 
2 sink(s) available.
  * index: 1
	name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

***
 index: 2
	name: <alsa_output.pci-0000_00_03.0.hdmi-stereo-extra1>
Соответственно этому присваиваем pacmd set-default-sink номер того, что вам нужно.
P.S. Если это возможно, то прошу администрацию переименовать тему: "Скирпт на Bash для включения/выключения второго экрана и переброса звука"
Последний раз редактировалось пользователем 2 SATORY_RA; всего редактировалось раз: 30

Аватара пользователя

Chocobo
Сообщения: 5967
Зарегистрирован: 27 авг 2016, 19:57
Решено: 136
Откуда: НН
Благодарил (а): 424 раза
Поблагодарили: 1548 раз

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

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

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

Аватара пользователя

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

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

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

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

Аватара пользователя

Chocobo
Сообщения: 5967
Зарегистрирован: 27 авг 2016, 19:57
Решено: 136
Откуда: НН
Благодарил (а): 424 раза
Поблагодарили: 1548 раз

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

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

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

Аватара пользователя

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

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

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

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

Аватара пользователя

Chocobo
Сообщения: 5967
Зарегистрирован: 27 авг 2016, 19:57
Решено: 136
Откуда: НН
Благодарил (а): 424 раза
Поблагодарили: 1548 раз

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

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

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

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

Аватара пользователя

Bill Williamson
Сообщения: 476
Зарегистрирован: 31 авг 2016, 10:38
Решено: 19
Благодарил (а): 180 раз
Поблагодарили: 102 раза

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

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

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

Аватара пользователя

Автор темы
SATORY_RA
Сообщения: 42
Зарегистрирован: 08 апр 2017, 08:58
Решено: 1
Благодарил (а): 23 раза
Поблагодарили: 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
Разъяснение по скрипту под спойлером - не стесняйтесь открывать))
По видео:
Для начала выполняем xrandr, затем, в зависимости от своего вывода правим параметры IN="HDMI-1" и EXT="HDMI-2", на то, что у вас есть.
Не по теме
К примеру, у меня, HDMI-1=IN - это мой монитор, а HDMI-2=EXT - это телевизор и он стоит слева от монитора.
Смотрим: скрипт xrandr | grep "$EXT" | cut -d ' ' -f 2- | grep [0-9] определяет, подключён ли телевизор и если да, то xrandr --output $EXT --off - отключает его, а монитор остаётся включённым --output $IN в режиме автоподбора частоты и разрешения--auto(обычно максимально возможные значения) --primary - основным. Если же ТВ сейчас отключён, то xrandr --output $IN --auto --primary - монитор остаётся в том же режиме, а ТВ подключается в режиме --output $EXT --auto -авто и --left-of $IN - слева от моего монитора.
Пояснение по параметрам xrandr для того, что бы этот скрипт проще было адаптировать под себя:
статья об утилите для обзора и изменения режимов дисплея Xrandr
По звуку:
Главное, что бы перед запуском скрипта был включён нужный источник звука, потому что скрипт просто циклически меняет доступные sink.
Нашёл скрипт здесь. Спасибо этому человеку )))
Сам скрипт по переключению звука по источникам:

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

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

Вернуться в «Программирование, скриптинг, виртуализация»