Надеюсь, что эта статья поможет кому-нибудь сэкономить время на настройку. Статья рассчитана на новичков, но надеюсь и опытные пользователи найдут что-нибудь полезное. Все действия производились в linux mint, но полагаю, что все будет работать и на Ububntu и на других дебианоподобных дистрибутивах.
Картинка для привлечения внимания. На фото тюнер 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 есть бэкэнды под андроид. Можно смотреть эфирное ТВ с планшета или смарта… Заманчиво?!
Автор: UrsusMaritimus