Картинка для привлечения внимания. На фото тюнер Aver 307 грубо и безжалостно переделанный мной много лет назад в Behold 407.
Итак приступим.
Первоначальная настройка
Тв тюнер установлен, в него вставлена антенна, шнурок инфракрасного датчика и аудио кабель, второй конец которого в линейном входе звуковой карты. Для просмотра будем использовать программу tvtime.
sudo apt-get install tvtime
При установке у вас спросят стандарт вещания и вариант частотной сетки каналов. Стандарт для России SECAM, а частотная сетка Мозамбик Россия.
При установке в каталоге пользователя создается каталог .tvtime, который недоступен для пользователя. Поэтому:
sudo chmod 7 ~/.tvtime/
Можно запускать.
tvtime
В ~/.tvtime будут созданы файлы tvtime.xml и stationlist.xml.
Если вы увидели изображение с телевизора и услышали звук, вам сказочно повезло. Можете переходить к следующему пункту.
Если вы видите изображение не с тюнера, а, например, с Web камеры, добавьте в файл tvtime.xml
<option name="V4LDevice" value="/dev/video1/>
и поробуйте подобрать номер устройства.
Если вы не слышите звук (99% так оно и есть). Запускаете
alsamixer
и увеличиваете громкость по линии Line. Если под ползунком стоят буквы MM, значит линия отключена. Включаем — жмем клавишу «М».
Звук должен появиться. Если нет, то дальше уже зависит от конкретной модели звуковой карты. Проверьте с какого канала карта берет Line-In (у меня есть вариант Line-In и Rear Out). Могут быть и другие экзотические фишки связанные с вашей моделью оборудования. Например интегрированная звуковая Via vt1828s имеет параметр — loopback. Так вот когда он Enebled звук с тв тюнера идет, но не работают больше никакие звуки (немое кино, и неслышная музыка). При Disabled все наоборот.
Со звуком справились и чтобы окончательно закрыть тему, добавляем в tvtime.xml строку
<option name="MixerDevice" value="hw:0/Master"/>
Она указывает программе каким каналом громкости рулить. Можно указать Line, да и вообще любой канал по вашему вкусу. Названия каналов смотрите в alsamixer. Регистр букв имеет значение.
Можно добавить опции глушить звук при выходе и поверх всех окон.
<option name="MuteOnExit" value="1"/> <option name="AlwaysOnTop" value="1"/>
Настройка каналов
Запускаем:
tvtime-scanner -d /dev/video1 -n SECAM
Вместо /dev/video1 подставьте ваше устройство. Если вы пользуетесь услугами кабельного провайдера, то он может транслировать передачи в стандарте PAL. Ничего страшного в этом нет. Канал будет найден все равно. Изменить кодировку для конкретного канала можно будет позднее в файле stationlist.xml.
После сканирования каналов открываем stationlist.xml, удаляем лишние каналы, добавляем, если что-то не нашлось (но это вряд ли).
Так выглядит строка с каналом.
<station name="1" active="1" position="1" band="VHF Russia" channel="R1" finetune="0" norm="SECAM" audio="auto"/>
name — имя канала, которое будет выводиться на экране при переключении. Если в именах каналах будут не только английские буквы, добавьте в объявление xml
encoding="UTF-8"
Иначе после запуска tvtime буквы преобразуются в Unicode коды.
active — если 0, то при листании каналов он будет пропущен
position — на какой кнопке будет сидеть канал.
Остальные параметры нет необходимости менять вручную.
Программа телепередач
Самое большое преимущество компьютерного тюнера по сравнению с обычным телевизором — это возможность выводить программу телепередач прямо на экран. Переключаем канал и видим рекламу, но мы то знаем ЧТО будет сразу после нее и делаем звук погромче скорее листаем дальше.
Tvtime умеет работать с файлами формата xmltv и мы воспользуемся этим.
В tvtime.xml добавляем.
<option name="XMLTVFile" value="~/.tvtime/xmltv.xml"/> <option name="XMLTVLanguage" value="ru"/>
Качаем и распаковываем программу.
cd ~/.tvtime wget http://www.teleguide.info/download/new3/xmltv.xml.gz gzip -f -d xmltv.xml.gz > xmltv.xml
Теперь нужно связать каналы из xmltv.xml и stationlist.xml. У каждого канала в xmltv.xml есть id. Прописываем его в атрибут xmltvid в файл stationlist.xml вот так:
<station name="Первый" xmltvid="1" active="1" position="1" band="VHF Russia" channel="R1" finetune="0" norm="SECAM" audio="auto"/>
Вот и все. Теперь можно включить телевизор и наслаждаться программой передач на экране. Правда если вы живете не в Default city столице нашей родины Москве, то ваша радость, скорее всего, будет неполной. Так как время фактической трансляции не будет совпадать со временем в программе телепередач. Причем для разных каналов отклонение во времени будет различным.
Исправим это:
sed -i '/channel="1"/s/+0400/+0600/g' xmltv.xml # Первый канал: +2 часа
Изначально в файле xmltv.xml указан часовой пояс +4 часа (видимо от Гринвича), а мы сделаем +6 часов. Нужно выполнить подобную команду для каждого канала.
Настройка пульта
Самый сложный и самый затратный по времени этап.
Есть два способа работы с пультом:
1. Через lirc,
2. Как с дополнительно клавиатурой.
Мы пойдем по второму пути. Частично пульт уже должен работать. Работают цифровые клавиши и кнопки регулировки громкости. Остальные кнопки нет.
Дело в том, что пульт уже определился системой как клавиатура. Соответствие сканкодов и кейкодов клавиатуры задается на уровне ядра.
Порядок конвертации значений следующий (описываю как сам понял дилетантским языком, исправления и уточнения приветсвуются):
1. Драйвер переводит сканкод (физический сигнал) кнопки в однобайтный или многобайтный кейкод (код клавиши) и отправляет «заинтересованным лицам».
2. Заинтересованным лицом, в нашем случае, является X серевер, который в зависимости от модели клавиатуры определяет как интерпретировать полученный кейкод. Т.е. Даже один и тот же код, но полученный от разных моделей устройств X сервер может интерпретировать по разному. Это, обычно не касается буквенно-цифровых символов и основных (вроде стрелок и ентера) кнопок. А вот интересующих нас мультимедийных кнопок очень даже касается.
Есть и еще одна проблема. X сервер способен принимать только однобайтные кейкоды, а некоторые кнопки у пульта бехолдера имеют более длинный код. Будем исправлять. Устанавливаем утилиты:
sudo apt-get install ir-keytable input-utils
Считываем текущую кодовую таблицу для пульта:
sudo ir-keytable -r -d /dev/input/event`cat /proc/bus/input/devices | grep -3 "i2c-.*/.*/ir0" | grep "H:" | awk '{ sub(/event/, "", $3); print $3}'` >/etc/rc_keymaps/behold-key
Пояснение для новичков. На самом деле все не так страшно. Эту строку можно заменить на такую
sudo ir-keytable -r -d /dev/input/event5 > /etc/rc_keymaps/behold-key
и она будет работать ничуть не хуже. Просто нужно знать каким именно event’ом числится ваш пульт в системе. Вся остальная страшная строка — это просто вычисление номера. Этой командой можно прочитать кодовую таблицу любой клавиатуры подключенной к компьютеру.
Появился файл /etc/rc_keymaps/behold-key с текущей раскладкой. Выглядит он так:
scancode 0x6b8600 = KEY_0 (0x0b) scancode 0x6b8601 = KEY_1 (0x02) scancode 0x6b8602 = KEY_2 (0x03) scancode 0x6b8603 = KEY_3 (0x04) scancode 0x6b8604 = KEY_4 (0x05) scancode 0x6b8605 = KEY_5 (0x06) scancode 0x6b8606 = KEY_6 (0x07) scancode 0x6b8607 = KEY_7 (0x08) scancode 0x6b8608 = KEY_8 (0x09) scancode 0x6b8609 = KEY_9 (0x0a) scancode 0x6b860a = KEY_AGAIN (0x81) scancode 0x6b860b = KEY_CHANNELUP (0x192) scancode 0x6b860c = KEY_VOLUMEUP (0x73) scancode 0x6b860d = KEY_INFO (0x166) scancode 0x6b860e = KEY_TEXT (0x184) scancode 0x6b860f = KEY_RECORD (0xa7) scancode 0x6b8610 = KEY_ZOOM (0x174) scancode 0x6b8611 = KEY_MUTE (0x71) scancode 0x6b8612 = KEY_POWER (0x74) scancode 0x6b8613 = KEY_GREEN (0x18f) scancode 0x6b8614 = KEY_SCREEN (0x177) scancode 0x6b8615 = KEY_CHANNELDOWN (0x193) scancode 0x6b8616 = KEY_OK (0x160) scancode 0x6b8617 = KEY_MODE (0x175) scancode 0x6b8618 = KEY_VOLUMEDOWN (0x72) scancode 0x6b8619 = KEY_BLUE (0x191) scancode 0x6b861a = KEY_STOP (0x80) scancode 0x6b861b = KEY_PLAYPAUSE (0xa4) scancode 0x6b861c = KEY_TUNER (0x182) scancode 0x6b861d = KEY_SLEEP (0x8e) scancode 0x6b861e = KEY_VIDEO (0x189) scancode 0x6b861f = KEY_RED (0x18e) scancode 0x6b8658 = KEY_SLOW (0x199) scancode 0x6b865c = KEY_CAMERA (0xd4)
Редактируем этот файл так чтобы не осталось многобайтных кодов и кодов, которые не понимает X сервер:
gksudo gedit /etc/rc_keymaps/behold-key
Записываем обратно:
ir-keytable -c -w /etc/rc_keymaps/behold-key -d /dev/input/event`cat /proc/bus/input/devices | grep -3 "i2c-.*/.*/ir0" | grep "H:" | awk '{ sub(/event/, "", $3); print $3}'`
Получаем до перезагрузки пульт с новой кодовой таблицей. После перезагрузки все станет как раньше. Я не знаю как сделать чтобы результат оставался навсегда, поэтому последнюю команду добавил в автозагрузку файл /etc/rc.local.
Привожу для примера мой отредактированный файл behold-key:
scancode 0x6b861c = KEY_PROG1 (0x94) scancode 0x6b8612 = KEY_CLOSE (0xce) scancode 0x6b8600 = KEY_0 (0x0b) scancode 0x6b8601 = KEY_1 (0x02) scancode 0x6b8602 = KEY_2 (0x03) scancode 0x6b8603 = KEY_3 (0x04) scancode 0x6b8604 = KEY_4 (0x05) scancode 0x6b8605 = KEY_5 (0x06) scancode 0x6b8606 = KEY_6 (0x07) scancode 0x6b8607 = KEY_7 (0x08) scancode 0x6b8608 = KEY_8 (0x09) scancode 0x6b8609 = KEY_9 (0x0a) scancode 0x6b860a = KEY_PROG2 (0x95) scancode 0x6b8614 = KEY_PROG3 (0xca) scancode 0x6b8617 = KEY_SWITCHVIDEOMODE (0xe3) scancode 0x6b8610 = KEY_F11 (0x57) scancode 0x6b860b = KEY_UP (0x67) scancode 0x6b8615 = KEY_DOWN (0x6c) scancode 0x6b860c = KEY_RIGHT (0x6a) scancode 0x6b8618 = KEY_LEFT (0x69) scancode 0x6b8616 = KEY_ENTER (0x1c) scancode 0x6b8611 = KEY_MUTE (0x71) scancode 0x6b860d = KEY_KPEQUAL (0x75) scancode 0x6b860f = KEY_RECORD (0xa7) scancode 0x6b861b = KEY_PLAYPAUSE (0xa4) scancode 0x6b861a = KEY_STOPCD (0xa6) scancode 0x6b860e = KEY_PAUSECD (0xc9) scancode 0x6b861f = KEY_PREVIOUSSONG (0xa5) scancode 0x6b861e = KEY_NEXTSONG (0xa3) scancode 0x6b861d = KEY_MEDIA (0xe2) scancode 0x6b8613 = KEY_VOLUMEDOWN (0x72) scancode 0x6b8619 = KEY_VOLUMEUP (0x73) scancode 0x6b865c = KEY_CAMERA (0xd4) scancode 0x6b8658 = KEY_SPORT (0xdc)
А вот некоторые коды, которые нормально воспринимает X сервер (данные получены методом сурового брутфорса). Обращаю ваше внимание, что так воспринимаются коды именно от пульта бехолдер. От других клавиатур код 0x94 может идентифицироваться вовсе не как KEY_PROG1.
KEY_CLOSE (0xce) KEY_EXIT (0xae) KEY_PROG1 (0x94) KEY_PROG2 (0x95) KEY_PROG3 (0xca) KEY_PROG4 (0xcb) KEY_POWER (0x74) KEY_VOLUMEDOWN (0x72) KEY_VOLUMEUP (0x73) KEY_NEXTSONG (0xa3) KEY_PLAYPAUSE (0xa4) KEY_PREVIOUSSONG (0xa5) KEY_STOPCD (0xa6) KEY_RECORD (0xa7) KEY_PLAYCD (0xc8) KEY_PAUSECD (0xc9) KEY_PLAY (0xcf) KEY_FASTFORWARD (0xd0) KEY_BASSBOOST (0xd1) KEY_CAMERA (0xd4) KEY_SOUND (0xd5) KEY_FINANCE (0xdb) KEY_SPORT (0xdc) KEY_SHOP (0xdd) KEY_ALTERASE (0xde) KEY_MEDIA (0xe2) KEY_VIDEO_NEXT (0xf1) KEY_VIDEO_PREV (0xf2) KEY_LINEFEED (0x65) KEY_MACRO (0x70) KEY_MIN_INTERESTING (0x71) KEY_KPEQUAL (0x75) KEY_KPPLUSMINUS (0x76) KEY_PAUSE (0x77) KEY_KPCOMMA (0x79) KEY_HANJA (0x7b) KEY_YEN (0x7c) KEY_STOP (0x80) KEY_AGAIN (0x81) KEY_PROPS (0x82) KEY_UNDO (0x83) KEY_FRONT (0x84) KEY_COPY (0x85) KEY_OPEN (0x86) KEY_PASTE (0x87) KEY_CUT (0x89) KEY_FIND (0x88) KEY_MENU (0x8b) KEY_CALC (0x8c) KEY_SETUP (0x8d) KEY_WAKEUP (0x8f) KEY_FILE (0x90) KEY_SENDFILE (0x91) KEY_DELETEFILE (0x92) KEY_XFER (0x93) KEY_WWW (0x96) KEY_MSDOS (0x97) KEY_DIRECTION (0x99) KEY_CYCLEWINDOWS (0x9a) KEY_MAIL (0x9b) KEY_BOOKMARKS (0x9c) KEY_COMPUTER (0x9d) KEY_BACK (0x9e) KEY_FORWARD (0x9f) KEY_CLOSECD (0xa0) KEY_EJECTCD (0xa1) KEY_EJECTCLOSECD (0xa2) KEY_REWIND (0xa8) KEY_PHONE (0xa9) KEY_ISO (0xaa) KEY_CONFIG (0xab) KEY_REFRESH (0xad) KEY_EDIT (0xb0) KEY_SCROLLUP (0xb1) KEY_SCROLLDOWN (0xb2) KEY_NEW (0xb5) KEY_REDO (0xb6) KEY_HOMEPAGE (0xac)111 KEY_DASHBOARD (0xcc) KEY_HP (0xd3) KEY_QUESTION (0xd6) KEY_EMAIL (0xd7) KEY_CHAT (0xd8) KEY_CONNECT (0xda) KEY_SEARCH (0xd9) KEY_CANCEL (0xdf) KEY_BRIGHTNESSDOWN (0xe0) KEY_BRIGHTNESSUP (0xe1) KEY_SWITCHVIDEOMODE (0xe3) KEY_KBDILLUMTOGGLE (0xe4) KEY_KBDILLUMDOWN (0xe5) KEY_KBDILLUMUP (0xe6) KEY_SEND (0xe7) KEY_REPLY (0xe8) KEY_FORWARDMAIL (0xe9) KEY_SAVE (0xea) KEY_DOCUMENTS (0xeb) KEY_WLAN (0xee) KEY_UWB (0xef) KEY_BRIGHTNESS_CYCLE (0xf3) KEY_BRIGHTNESS_ZERO (0xf4) KEY_DISPLAY_OFF (0xf5) KEY_WIMAX (0xf6) KEY_RFKILL (0xf7)
При проведении работ по настройке кнопок пульта удобно пользоваться следующим методом мониторинга. Запускаем
sudo input-events -t60 5
Где 60 это время ожидания нажатия в секундах, 5 номер клавиатуры в системе. И жмем кнопки на пульте.
Выдача имеет примерно следующий вид.
00:56:27.954276: EV_MSC MSC_SCAN 7046683 00:56:27.954281: EV_KEY KEY_PLAYPAUSE (0xa4) pressed 00:56:27.954281: EV_SYN code=0 value=0 00:56:28.062206: EV_MSC MSC_SCAN 7046683 00:56:28.062207: EV_SYN code=0 value=0 00:56:28.314253: EV_KEY KEY_PLAYPAUSE (0xa4) released 00:56:28.314254: EV_SYN code=0 value=0
Вывод происходит при нажатии и при отпускании кнопки.
7046683 — это физический сканкод кнопки пульта в десятичной системе. Он будет выводиться в любом случае.
(0xa4) — кейкод который драйвер отправил дальше. Если его длина не равна одному байту, то X сервер его не увидит.
KEY_PLAYPAUSE — это имя кнопки. Если имени нет, то на эту кнопку нельзя будет повесить команду. Меняйте кейкод.
Последние штрихи
Мы получили пульт воспринимаемый системой как дополнительная клавиатура с мультимедийными клавишами. Осталось настроить реакцию системы на нажатия. Громкость и переключение каналов в tvtime уже работают, так как кнопки крестовины настроены как стрелки и Enter.
Идем в Настройки клавиатуры и задаем клавиши воспроизведения, которые будут работать в большинстве плееров.
На остальные кнопки настраиваем дополнительные команды.
Я назначил клавише FullScreen пульта значение F11. Эту клавишу понимает большинство программ как переход в полноэкранный режим и обратно, но не tvtime. Поэтому добавляем в файл tvtime.xml
<bind command="toggle_fullscreen"> <keyboard key="F11"/> </bind>
К сожалению tvtime не понимает мультимедийные клавиши, поэтому задать действие на нажатие KEY_SWITCHVIDEOMODE не получится. Но для этого есть другой способ.
В разделе дополнительных команд настроек клавиатуры задаем команду
tvtime-command TOGGLE_ASPECT
полный список команд tvtime читайте в документации.
Если нужна кнопка для закрытия активного окна, устанавливаем:
sudo apt-get wmctrl
И добавляем допкоманду:
wmctrl -c :ACTIVE:
Вот и все. Буду рад исправлениям и уточнениям. Если тема интересна, то можно будет изучить вопрос по настройке медиакомбайна MythTV в многотюнерной конфигурации и с сетевыми клиентами. Между прочим, у MythTV есть бэкэнды под андроид. Можно смотреть эфирное ТВ с планшета или смарта… Заманчиво?!
ссылка на оригинал статьи http://habrahabr.ru/post/158447/
Добавить комментарий