google web font

суббота, 28 августа 2010 г.

NVidia ± телевизор

Благодаря советам, данным мне на linux.org.ru, я написал два скрипта, которые в очередной раз сделают мою жизнь проще. Суть такова.

Есть двухголовая видеокарта NVidia, к одной голове привинчен монитор, ко второй — телевизор. Смысл — при желании показывать кино на телевизоре, а не на мониторе. При этом телевизор видится в системе просто как второй монитор, то есть на него растягивается рабочий стол и кино запускается в обычном плеере. Всё, что нужно — это активировать телевизор в настройках и включить его с пульта. Пультом мы управляем руками, а настройками — с компьютера. Способы достижения цели — тысячи их. У меня установлен проприетарный драйвер, который я считаю приемлемым. Итак.
Способ первый, самый простой и неинтересный. Запускаем каким-то образом от рута nvidia-settings, настраиваем два монитора, как больше нравится, сохраняем в xorg.conf и имеем телевизор постоянно активированным. Плюсы: один раз прокликал мышкой в гуёвой программе — и забыл обо всём вообще. Минусы: рабочий стол выходит за пределы видимой зоны (телевизор хоть и активен в настройках, но всё-таки выключен), в эту невидимую зону постоянно вылетают мышка, запускаемые программы и корзина с закрытыми вкладками у оперы.

Способ второй, поинтереснее. Настраиваем в гуёвине, как в первом способе, но один монитор, сохраняем xorg.conf. Дальше, при необходимости, запускаем nvidia-settings и на лету активируем телевизор, после чего можно смотреть кино на нём. Плюсы: телевизор не мешает обычной работе, активен только тогда, когда надо. Минусы: после активации телевизора рабочий стол на него не расширяется (или я не нашёл, как), лишние движения при каждой необходимости, плюс объяснить Маринке, что (а главное — почему) нужно сделать — слишком сложно.

Способ третий. Самый интересный в реализации, самый простой в использовании. nvidia-settings имеет возможность загрузить и применить настройки из указанного в параметрах командной строки файла конфигурации, не запуская при этом гуй. Можно настроить конфигурацию с двумя мониторами, сохранить её в отдельный конфиг, а потом при необходимости просто загрузить. Но есть проблема: таким образом можно менять параметры мониторов, но нельзя активировать или деактивировать монитор. Для этого нужно использовать утилитку Disper, которая написана на python и может сделать то, что нам надо. xorg.conf при этом настроен на двухмониторную конфигурацию, чтобы не наблюдать на телевизоре чёрный экран (смотри минусы второго способа). Итак, логика третьего способа:
  • иксы стартуют, активируются оба монитора по настройкам из xorg.conf
  • в автозапуске KDE прописан скрипт, который деактивирует телевизор
  • на панели есть кнопка, которая активирует телевизор, можно нажать при необходимости.
Итак, что нам осталось сделать — написать скрипты и сохранить конфигурации в файлы. Работаем последовательно.
  1. xorg.conf настроен по первому способу. Желательно использовать tweenview, потому что с xinerama не дружит то ли nvidia, то ли kde-4, то ли оба.
  2. Устанавливаем disper. Для этого в папке с исходниками запускаем make PREFIX=/home/user/usr/ и make install. Проверяем, что в папке /home/user/usr/bin появился исполняемый файл disper. 
  3. Запускаем nvidia-settings и настраиваем двухмониторный режим по вкусу. Рекомендую установить в "X-server XVideo Settings" галочку "Sync to VBlank", и там же выбрать свой телевизор в "Sync to this display device" — это чтобы не было теаринга (tearing, для этого ещё надо выбрать в mplayer'е вывод -vo xv). Выходим из программы настройки и копируем файл ~/.nvidia-settings-rc в надёжное место.
  4. Запускаем nvidia-settings -q EnabledDisplays и запоминаем, какое значение параметра соответствует активированному монитору.
  5. Запускаем /home/user/usr/bin/disper -e. Он напишет в ответ несколько строк, которые и будут являться двухмониторной конфигурацией. Он может принимать эти строки на стандартный ввод, поэтому сохраняем их в надёжное место.
  6. Теперь запускаем nvidia-settings ещё раз, деактивируем телевизор и настраиваем одномониторную конфигурацию. Сохраняем конфиг рядом с предыдущим.
  7. Запускаем nvidia-settings -q EnabledDisplays и запоминаем, какое значение параметра соответствует деактивированному монитору. 
  8. Повторяем процедуру с disper -e, понимая, что на этот раз мы сохраняем одномониторную конфигурацию.
  9. Пишем скрипт. В моём случае, это три скрипта: один, чтобы включить двухмониторную конфигурацию (врубить телек), второй — чтобы включить одномониторную конфигурацию (вырубить телек), третий, добровольный — чтобы управлять ими всеми сам определяет врубить или вырубить телевизор.
  10. Дальше добавляем в автозапуск программу — тот скрипт, который вырубает телек. Большую часть времени мы даже не вспоминаем о том, что у нас подключен телевизор. Автозапуск удобно настраивается в systemsettings.
  11. Добавляем в K-меню новую программу — скрипт, который активирует телевизор. Вытаскиваем её на панель. Теперь объяснить Маринке, что и почему нужно сделать, чтобы посмотреть кино на телеке, просто: нужно просто нажать на кнопку на панели.
  12. В .bashrc можно прописать alias, что-то вроде alias movie_on_tv='/home/combine/bin/useTV && mplayer -vo xv -xineramascreen 1 -fs' и запускать movie_on_tv /porn/hdtv.mkv. Да, если xinerama не используется, нужный параметр mplayer'а называется всё равно xineramascreen.
Наконец, сам скрипт, хотя после такого подробного описания уже пора бы понять, что именно там должно быть. Этот скрипт врубает телек — его надо вытащить на панель
#!/bin/bash

echo "backend: nvidia
associated displays: DFP-0, DFP-1
metamode: DFP-0: 1680x1050 @1680x1050 +0+0, DFP-1: nvidia-auto-select @1280x768 +1680+0
scaling: stretched, stretched" | /home/combine/usr/bin/disper -i

nvidia-settings -l --config /home/combine/.two_monitors.nvrc
rm /home/combine/.nvidia-settings-rc
ln -s /home/combine/.two_monitors.nvrc /home/combine/.nvidia-settings-rc
Что в нём происходит: echo | disper — активирует телевизор. Текст мы уже получили из disper -e. Потом nvidia-settings подгружает из бережно сохранённого файла настройки для этой конфигурации. И на всякий случай делаем стандартный файл конфигурации симлинком на тот, в котором лежит текущая конфигурация. На случай, если захочется запустить гуй, например.
Следующий скрипт вырубает телек — его надо добавить в автозагрузку и, по желанию, тоже на панель. Можно заметить, как мало отличий от первого скрипта.
#!/bin/bash

echo "backend: nvidia
associated displays: DFP-0
metamode: DFP-0: 1680x1050 @1680x1050 +0+0
scaling: stretched" | /home/combine/usr/bin/disper -i

nvidia-settings -l --config /home/combine/.one_monitor.nvrc
rm /home/combine/.nvidia-settings-rc
ln -s /home/combine/.one_monitor.nvrc /home/combine/.nvidia-settings-rc
И вот универсальный вариант: можно и в автозагрузку, и на панель, а первые два выкинуть нафиг. Работает, между прочим, точно так же.
#!/bin/bash

if nvidia-settings -q EnabledDisplays | grep '0x00030000' ### If TV is active then disable it
then
        echo "backend: nvidia
associated displays: DFP-0
metamode: DFP-0: 1680x1050 @1680x1050 +0+0
scaling: stretched" | /home/combine/usr/bin/disper -i

        nvidia-settings -l --config /home/combine/.one_monitor.nvrc
        rm /home/combine/.nvidia-settings-rc
        ln -s /home/combine/.one_monitor.nvrc /home/combine/.nvidia-settings-rc

else ### TV is incative. Enable it.
        echo "backend: nvidia
associated displays: DFP-0, DFP-1
metamode: DFP-0: 1680x1050 @1680x1050 +0+0, DFP-1: nvidia-auto-select @1280x768 +1680+0
scaling: stretched, stretched" | /home/combine/usr/bin/disper -i

        nvidia-settings -l --config /home/combine/.two_monitors.nvrc
        rm /home/combine/.nvidia-settings-rc
        ln -s /home/combine/.two_monitors.nvrc /home/combine/.nvidia-settings-rc

fi
Хочу ещё раз обратить внимание на то, что нужно заменить соответствующие части скрипта на свои. Это важно. Если попёрли ошибки, например, если запустить disper с неправильными параметрами — перезапуск исков не поможет, можно смело ребутаться. Кернел паников и зависаний у меня при проделывании всего описанного не возникло, но если ты забудешь подставить свои параметры вместо моих — даже не надейся, что всё будет в порядке.

Комментариев нет:

Отправить комментарий