7 мая 2009 г.

Про линупс и телевизор

Есть у меня телевизор с HDMI входом и компьютер с нвидиевской видеокартой с двумая видеовыходами. Использовать его для просмотра фильмов кажется весьма заманчивой идеей.

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

Добиться требуемого удалось ознакомившись с двумя документами: X.Org/Dual Moniors на gentoo-wiki и NVIDIA Accelerated Linux Graphics Driver README and Installation Guide.

Итак, сначала учим систему думать, что телевизор всегда подключен: для этого добавляем строчку

Option "ConnectedMonitor" "DFP,DFP"

в секцию Device файла /etc/X11/xorg.conf. У меня два DVI выхода, поэтому написано DFP,DFP. Если один из выходов — обычный VGA DSUB, то надо писать CRT, вместо одного из DFP, если TV out, то, соответственно, TV.

После этого, иксы думают, что оба монитора всегда подключены и начинаются две проблемы: мышка убегает на на второй монитор, который выключен и иксы неверно определяют видеорежимы телевизора, т.к. не могут запросить EDID у него (т.к. реально он не подключен).

Проблема с мышкой решается добавлением строчек

Screen 0 "Screen0" 0 0
Screen 1 "Screen1" 2000 0

в секцию ServerLayout файла /etc/X11/xorg.conf. Этого достаточно, чтобы мышка перестала убегать на второй монитор, но следствием этого становится то, что на второй монитор теперь совсем невозможно попасть. Это решим позже.

Теперь с видеорежимами. Иксы при запуске запрашивают из монитора EDID — запись с данными о поддерживаемых монитором видеорежимах. Т.к. в нашем случае, монитор в момент запуска иксов отключен, иксам эту информацию брать неоткуда. По идее, решить это можно добавив строчки ModeLine в секцию Monitor соответствующего монитора или Option "metamodes" в секцию Device соответствующего видеовыхода, но мне это, по неизвестным мне причинам, не помогло. Решением было считать EDID из монитора когда он был подключен в момент запуска иксов и заставить иксы использовать EDID из файла вместо запроса его у монитора. Сохранить EDID можно либо утилитой read-edid, которая работает только в 32-битном линуксе, либо nvidia-settings, которая работает везде, но только при наличии видеокарты nvidia. Получив файл с требуемой информацией, необходимо подсунуть ее иксам. Этого можно добиться добавив

Option "CustomEDID" "DFP-1:/etc/X11/myedid.bin"

в секцию Device. Естественно, DFP-1 и путь к файлу с данными надо поправить на свои. Эта опция добавляется драйвером nvidia, и с другими драйверами скорее всего не заработает. На этом конфигурация X-сервера завершена.

Теперь настроим KDE так, чтобы он не пытался использовать второй монитор для рабочего стола. Для этого находим файл ~/.kde/share/config/kcmdisplayrc и добавляем в него строчки

[X11]
disableMultihead=true

Перезапускаем сеанс KDE и теперь на втором мониторе рабочего стола не будет.

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

Запускать приложения на втором мониторе можно установив переменную окружения DISPLAY в значение :0.1 перед запуском приложения. Например, так:

$ DISPLAY=:0.1 smplayer ./somevideo.avi

В моем случае, я завел скрипт для запуска smplayer'а на втором мониторе, который берет специальные настройки плеера из нестандартного места, чтобы "телевизионный" вариан вел себя несколько иначе, чем "стандартный". В частности, телевизор подключен ко второй звуковой карте, соответственно звук надо выводить на нее, а не на основную.

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