XBMC и игрища

Опубликовано

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

Вопреки расхожему мнению под Linux (именно на базе этой ОС у меня работает медиацентр) есть во что поиграть, от простых вариантов типа Солитера, Косынки и Сапера до игрущек, доступных через Steam, но сегодня речь не о них, а об игровых консолях.

Сначала небольшое лирическое отступление.

Не знаю как у вас, а в мои школьные годы у меня была 8-битная игровая приставка, вот такая

ее мне подарил мой дядя Алексей на какой-то из дней рождения, вот запамятовал, к сожалению, на какой именно, но точно где-то в интервале от 8 до 11. Среди моего окружения конкретно данная модель пользовалась репутацией очень надежного и безотказного аппарата, поломалась она всего один раз, чинили ее долго, поэтому родители прикупили мне взамен на китайском рынке приставку внешне похожую на японский Famicom

т.н. Famiclone. У джойстиков от интенсивного дергания ломались провода, снашивались резинки, ломались печатные платы, но все эти проблемы не мешали рубиться в танчики, контру и дабл драгон. Последняя приставка прожила у меня до вполне сознательного возраста, лет 26 мне было, когда я решил показать ребенку танчики, как раз на этом показательном выступлении она и сдохла. Мой друг электронщик взялся починить, да так она у него и осталась.

В общем для кого как, а для меня это были культовые игрушки и мысль, что эмуляторы спасли их от смерти греет душу. В общем решил я прикрутить к своему медиацентру возможность поиграть в танчики, что из этого получилось читаем ниже.

Итак нам потребуется:

  1. медиацентр с XBMC
  2. эмулятор для запуска ROM'ов
  3. манипулятор для управления игрой (у меня есть дешевый геймпад, но сойдет и клавиатура)
  4. средство для запуска эмулятора из XBMC

Настроенный медиацентр на базе Ubuntu mini и XBMC 12 Frodo у меня в наличии. Работает эта штука на платформе Foxconn AHD1S-K с интергрированным процессором AMD Zacate и 2 Гб ОЗУ, за декодирование и вывод видео отвечает видеокарта Nvidia GeForce 512GT. В общем на просмотр HD-видео, ТВ и прослушивание музыки конфигурации вполне хватает, а уж для игрушек, работавших на консолях с 2 кБ ОЗУ, таким же количеством видео памяти и 8-ми разрядным процессором должно хватать с лихвой.

К выбору эмулятора я подошел со всей серьезностью - поставил кучу разных на свой нетбук и поиграл в каждый. Больше всех понравился FCE Ultra, т.к. в отличии от других эмуляторов его картинка при растягивании на весь экран не вызывала боли в глазах, но в нем мне не удалось настроить мой геймпад, он упорно не видел нажатия клавиши влево. После некоторых поисков я обратил внимание на эмулятор Mednafen, который в части эмуляции NES базируется на коде FCE Ultra, к сожалению, среди пакетов Ubuntu присутствует только старая версия 0.8, актуальную (крайняя запись в Changelog'е от 13 января 2013 года) придется собрать самостоятельно примерно так:

$ sudo apt-get install build-essential pkg-config \
libasound2-dev libcdio-dev libsdl1.2-dev \
libsndfile1-dev zlib1g-dev
$ wget -O mednafen-0.9.28-wip.tar.bz2 http://goo.gl/L7RTh
$ tar xjf mednafen-0.9.28-wip.tar.bz2
$ cd mednafen
$ ./configure
$ make
$ make install

В результате этой нехитрой последовательности действий эмулятор будет установлен в /usr/local/bin/mednafen, теперь можно переходить к его настройке, для выполнения которой неплохо бы положить в домашнюю директорию ROM с какой-нибудь игрушкой, я взял Battle City.nes

Для начала необходимо отключить XBMC и вывести на экран xterm, у меня XBMC запускается при старте системы вот таким скриптом

cat /etc/init.d/xbmc
#! /bin/sh

### BEGIN INIT INFO
# Provides:          xbmc
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts instance of XBMC
# Description:       starts instance of XBMC using start-stop-daemon and xinit
### END INIT INFO

############### EDIT ME ##################

# path to xinit exec
DAEMON=/usr/bin/xinit

# startup args
#DAEMON_OPTS=" /usr/bin/xbmc --standalone -- :0"
#DAEMON_OPTS=" /usr/bin/xbmc-standalone -- :0"
DAEMON_OPTS=" /usr/bin/xbmc-standalone"

# script name
NAME=xbmc

# app name
DESC=XBMC

# user
RUN_AS=xbmc

# Path of the PID file
PID_FILE=/var/run/xbmc.pid

############### END EDIT ME ##################

test -x $DAEMON || exit 0

set -e

case "$1" in
  start)
        echo "Starting $DESC"
        start-stop-daemon --start -c $RUN_AS --background \
--pidfile $PID_FILE --make-pidfile --exec $DAEMON \
-- $DAEMON_OPTS ;; stop) echo "Stopping $DESC" start-stop-daemon --stop --pidfile $PID_FILE ;; restart|force-reload) echo "Restarting $DESC" start-stop-daemon --stop --pidfile $PID_FILE sleep 5 start-stop-daemon --start -c $RUN_AS --background \
--pidfile $PID_FILE --make-pidfile --exec $DAEMON \
-- $DAEMON_OPTS ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0

Поэтому для выполнения действий по настройке я набросал вот такой простенький скриптик:

#!/bin/sh
sudo service xbmc stop
sleep 2
xinit xterm
sleep 2
sudo service xbmc start

Будучи запущенным по SSH данный скрипт завершит работу xbmc и запустит xterm, а по выходу из xterm снова запустит xbmc. В появившемся на экране терминале пишем

$ mednafen ~/Battle\ City.nes

Это нужно для того, чтобы убедиться, что эмулятор работает, и для того чтобы создалась директория ~/.mednafen c его настройками. Кнопка Esc завершит работу эмулятора, а мы начнем конфигурировать его под себя внося изменения в файл ~/.mednafen/mednafen-09x.cfg. Я внес следующие изменения

;Использовать указанный метод масштабирования видео.
nes.special nn2x
;Растянуть на весь экран
nes.stretch full
;Enable (bi)linear interpolation.
nes.videoip 1
;Полноэкранное разрешение по горизонтали.
nes.xres 1920
;Полноэкранное разрешение по вертикали.
nes.yres 1080

Сохраняем файл, снова запускаем наши танчики и радуемся тому, что они теперь работают в полноэкранном режиме. Справедливости ради отмечу, что опции конфигурационного файла не только прокомментированы внутри него (кое-где даже по-русски), но и отлично документированы на официальном сайте. Кроме того помимо Nintendo Entertainmen System/Famicon mednafen умеет эмулировать и другие девайсы (Atari Lynx, GameBoy, Sony Playstation), я себе настроил Sega MegaDrive, за подробностями отсылаю интересующихся к официальной документации.

Собственно теперь все круто, но поиграть пока еще не получится, надо еще настроить управление игрой, здесь все просто комбинация клавиш Ctrl+Shift+1 позволяет выбрать какое устройство будет эмулироваться на первом порту нашей виртуальной приставки, каждое повторное нажатие меняет устройства по кругу. Вообще кроме джойстика (gamepad) и светового пистолета (zapper) я других устройств не видел, но список в документации достаточно большой, процитирую:

Mednafen emulates the standard NES gamepad, the Four-Score multiplayer adapter, the Zapper, the Power Pad, and the Arkanoid controller. The Famicom version of the Arkanoid controller, the "Space Shadow" gun, the Famicom 4-player adapter, the Family Keyboard, the HyperShot controller, the Mahjong controller, the Oeka Kids tablet, the Party Tap, the Family Trainer, and the Barcode World barcode reader are also emulated.

Нажатие Ctrl+Shift+2 позволит выбрать контроллер для второго порта, всего портов может быть 4, плюс еще один специальный - порт расширения, т.е. в итоге можно занять игрой до 4 человек включительно.

В общем нажатием Ctrl+Shift+1 выбираем Gamepad, далее нажимаем Alt+Shift+1 приступаем к калибровке - назначению соответствия виртуальных кнопок реальным. Эмулятор нам пишет на экране какую кнопку виртуального геймпада он программирует, нажимаем клавишу на к геймпаде, либо если его нет - на клавиатуре, которой хотим назначить на эту кнопку. Успешность калибровки напрямую зависит от качества геймпада, а именно от точности нажатия кнопок. На каждую виртуальную кнопку требуется по два нажатия реальной, если эмулятор запросил 3 и последующее нажатие - проще прервать калибровку (делается это повторным нажатием Alt+Shift+1) и начать ее заново, т.к. работать нормально после этого управление не будет. Клавиатура у меня откалибровалась без проблем, а вот дешевый геймпад DVTech заставил помучаться.

Ну вот эмулятор готов. Поиграв какое-то время с супругой в танчики, я задумался над тем а как же это все запускать. Терминал вещь жутко не удобная, и ее надо бы заменить. Очень желательно заменить нажатием одной единственной кнопки.

Для XBMC существуют специальные Addon'ы для организации подобных игровых коллекций, ярчайшими представителями можно считать Rom Collection Browser - XBMC Game Frontend и Advanced Launcher, оба как раз ориентированы на то, чтобы запускать игры и другие приложения из XBMC. Я попробовал оба и остановился на Advanced Launcher с менее загруженным всякими рюшечками интерфейсом.

С запуском эмулятора по нажатию кнопки изначально обнаружились проблемы, т.к. использовалась сессия XBMC без оконного менеджера, т.н. XBMC Live. Выхода из ситуации виделось два, либо перед запуском эмулятора завершать XBMC, либо перенастроить XBMC на использование обычной НЕ Live версии. Первый способ не понравился. Не удобно когда хочешь запустить другую игрушку снова лезти до списка через систему меню XBMC, поэтому я пошел по второму пути.

Для использования не Live версии XBMC необходим оконный менеджер, я выбрал Openbox. Ставим его

$ sudo apt-get install openbox

подправляем скрипт запуска XBMC

$ sudo vi /etc/init.d/xbmc

приводим его вот к такому виду

#! /bin/sh

### BEGIN INIT INFO
# Provides:          xbmc
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts instance of XBMC
# Description:       starts instance of XBMC using start-stop-daemon and xinit
### END INIT INFO

############### EDIT ME ##################

# path to xinit exec
DAEMON=/usr/bin/xinit

# startup args
#DAEMON_OPTS=" /usr/bin/xbmc --standalone -- :0"
#DAEMON_OPTS=" /usr/bin/xbmc-standalone -- :0"
#DAEMON_OPTS=" /usr/bin/xbmc-standalone"
DAEMON_OPTS" /usr/bin/openbox-session"

# script name
NAME=xbmc

# app name
DESC=XBMC

# user
RUN_AS=xbmc

# Path of the PID file
PID_FILE=/var/run/xbmc.pid

############### END EDIT ME ##################

test -x $DAEMON || exit 0

set -e

case "$1" in
  start)
        echo "Starting $DESC"
        start-stop-daemon --start -c $RUN_AS --background \
--pidfile $PID_FILE --make-pidfile --exec $DAEMON \
-- $DAEMON_OPTS ;; stop) echo "Stopping $DESC" start-stop-daemon --stop --pidfile $PID_FILE ;; restart|force-reload) echo "Restarting $DESC" start-stop-daemon --stop --pidfile $PID_FILE sleep 5 start-stop-daemon --start -c $RUN_AS --background \
--pidfile $PID_FILE --make-pidfile --exec $DAEMON \
-- $DAEMON_OPTS ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0

и настраиваем автоматический старт XBMC

$ mkdir -p ~/.config/openbox
$ vi ~/.config/openbox/autostart

пишем в этот файл следующее

/usr/bin/xbmc &

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

  1. Переключиться на соседний рабочий стол.
  2. Поставить процесс xbmc на паузу.
  3. Запустить эмулятор.

По выходу из игры нужно

  1. Снять процесс xbmc с паузы.
  2. Вернуться обратно на рабочий стол с XBMC.
  3. Вернуть фокус на окно XBMC.

В виде кода на шелле это будет выглядеть так

#!/bin/sh
# Переключаемся на рабочий стол 1
/usr/bin/wmctrl -s 1
# Ждем чуть-чуть
/bin/sleep 0.5
# Паузим XBMC
/usr/bin/killall -STOP xbmc.bin
# Запускаем эмулятор передавая путь до ROM'а как аргумент
/usr/local/bin/mednafen "$1"
# По выходу снимаем XBMC с паузы
/usr/bin/killall -CONT xbmc.bin
# Возвращаемся в окно XBMC
/usr/bin/wmctrl -s 0

Теперь осталось только сохранить этот скриптик куда-нибудь в удобное место, дать права на исполнение и добавить его в Advanced Launcher. Для этого:

  1. Заходим в меню Программы.
  2. Выбираем Advanced Launcher.
  3. Жмем на пульте кнопку Menu.
  4. Выбираем Create new launcher.
  5. Выбираем File launcher.
  6. Указываем путь до нашего скрипта.
  7. Указываем агрументы "%rom" - именно так в кавычках.
  8. Указываем директории с ромами, эскизами и фанартами.
  9. Указываем возможные расширения файлов с играми.
  10. Выходим в список launcher'ов, встаем на наш свежесозданный.
  11. Жмем кнопку Menu и выбираем Add Items.
  12. Выбираем Scan for new items.
  13. Снова встаем на наш launcher, тыкаем ок и видим список игр.

Все, можно наслаждаться играми, знакомыми с детства.

Есть возможность скачать картинки и описания, но я не парился...