Donnerstag, 17. Februar 2011

XBMC gaming Part 2: SNES/NES

Nachdem ich mich ausgiebig mit alten DOS Spielen beschäftigt habe (es ist wirklich herrlich wenn Spiele nur PC Speaker unterstützen - dosbox emuliert diese über die Soundkarte was ein hübsches nostalgisches gedüdel abgibt :D ) habe ich ein weiteres nettes XBMC Plugin gefunden: den ROM Collection Browser.

Wie der Name schon sagt ist es ein Browser für ROMS von verschiedenen Konsolen. Dabei werden (unter anderem) auch NES und SNES unterstützt. Das Plugin bietet dabei nur ein Interface zum Starten der ROMs, das eigentliche abspielen übernehmen externe Emulatoren.

Die Installation kann wie beim Executor über XBMC erfolgen. Beim ersten Start werden die verschiedenen Emulatoren und der Speicherort der ROMs abgefragt. Danach werden die ROMs in den Katalog geladen. Sehr hübsch ist dabei, dass ROM Collection Browser sich dabei Informationen und Covers aus dem Internet lädt; somit ist die Liste auch schön und informativ :D.

Wie bereits erwähnt werden zum Spielen externe Emulatoren verwendet; für SNES verwende ich hierbei den altbewährten ZSNES, für NES den (mir bisher unbekannten) FCEU. Beim Einrichten können noch diverse Parameter für die Emulatoren angegeben werden; will man diese später noch ändern, so kann man dies auch in der config.xml unter

~/.xbmc/userdata/addon_data/script.games.rom.collection.browser  

erledigen. Für das zu startende ROM ist der Platzhalter %ROM% zu verwenden.
Für ZSNES verwende ich folgende Parameter:

-v 14 -m %ROM%

-v 14 gibt dabei 1024x786 FULLSCREEN an; -m startet das ROM ohne Menü; somit wird nach dem Beenden des Spiels auch ZSNES wieder beendet und man kehrt wieder zu XBMC zurück.
Weitere Informationen über Parameter und Auflösungen von ZSNES erhält man mit

zsnes --help


Die Tastenkonfig bzw. die Konfiguration eines Gamepads können über die GUI von ZSNES einmalig erledigt werden. Somit ist die Konfiguration für SNES Roms abgeschlossen.

FCEU ist ein commandline basierter NES Emulator. Die verfügbaren Switches und Parameter erhält man beim Parameterlosen Aufruf von FCEU. Ich verwende folgende Parameter:

-fs 2 -xres 640 -yres 480 -opengl 0 "%ROM%"

Bei den Parametern gilt hier folgendes: Wird eine Zahl größer 0 angegeben, so ist der Parameter aktiviert, 0 deaktiviert den Parameter.
Mit -fs 2 gebe ich an, dass FCEU im Fullscreen Modus gestartet werden soll (-fs 1 hatte seltsame Farbspiele), xres und yres geben die jeweilige Auflösung an. Ich hatte Probleme mit -opengl, weshalb ich OpenGL mit 0 deaktivierte (liegt vermutlich am ATI Treiber, der Teufel hole ihn). FCEU beendet sich automatisch nachdem das Spiel beendet wurde.
Das config File für FCEU liegt unter

~/.fceultra/fceu98.cfg

Dieses File ist allerdings ein Binärfile, das mit einem Hexeditor editiert werden will. Wem das zu mühselig ist, GFCEU (Gnome FCEU) schafft hierbei Abhilfe: Es ist ein kleines GUI Interface zu FCEU, das unter anderem einen Keyeditor beinhaltet. Es schreibt dabei das config File neu; somit kann die Konfiguration für FCEU Kinderleicht editiert werden. Somit steht dem Spielspaß nichts mehr im Wege :D.


Hinweis: ZSNES, FCEU und GFCEU (sowie auch dosbox btw.) sind in den Standard Ubuntu Repositories, man kann diese also bequem über apt installieren.

Donnerstag, 10. Februar 2011

Soundprobleme mit dosbox

Nachdem ich dosbox erfolgreich in XBMC integriert habe tat sich eine neue Baustelle auf: der MIDI Sound ist teilweise abgehackt, lagt und machte auch seltsame Geräusche.
Beim Starten von dosbox erscheint folgende Fehlermeldung:

ALSA:Can't subscribe to MIDI port (65:0)
MIDI:Opened device:oss

Der angegebene MIDI Port schien also nicht zu stimmen. Aufschluss über die verfügbaren MIDI Ports gibt pmidi:

wizard@miraculix:~/.dosbox$ pmidi -l
 Port     Client name                       Port name
 14:0     Midi Through                      Midi Through Port-0


Diesen Port trage ich nun ich nun in die dosbox config ein:

[midi]
[...]
midiconfig=14:0

Nun ist es schon um einiges besser, stellenweise laggt es aber noch immer. Abhilfe schafft prebuffer:

[mixer]
[...]
prebuffer=1000

Und der Sound funktioniert einwandfrei!

XBMC gaming Part 1: Dosbox

Ich bin seit längerem im Besitz eines HTPC. Nach einem langen und schmerzvollen Auswahlprozess (an dieser Stelle noch mal einen Herzlichen Dank an alle Beteiligten: ATI für den ausgezeichneten Treibersupport unter Linux und Microsoft für die hervorragende Unterstützung einer Microsoft Windows Media Remote unter Windows XP; beides natürlich ironisch gemeint) bin ich schlussendlich bei XBMC unter ubuntu angelangt.

Mit dem letzten XBMC Update (Dharma, 10.0) ist unter anderem der Plugin Support verbessert worden. Plugins können nun direkt über XBMC heruntergeladen und installiert werden.
Unter den vielen Plugins gibt es ein Programm Plugin namens "Executor" dass es erlaubt Starter zu definieren und diese von XBMC aus zu starten.
Dieses Plugin werde ich benutzen um auf meinem HTPC alte DOS-Spiele zu starten. Die meisten alten Kracher wie z.B. Prince of Persia oder The Lost Vikings sind abandonware und sind auf http://www.abandonia.com/ frei erhältlich.

Da diese Spiele natürlich native auf einem Linux System nicht funktionieren (sie funktionieren auf Windows meist auch nicht mehr) braucht man einen Emulator: dosbox emuliert einen kompletten DOS PC und ist unter anderem für Windows und Linux erhältlich.

Nach dem Start erhält man einen DOS prompt:














Um auf lokale Verzeichnisse zugreifen zu können müssen diese erst per mount eingebunden werden. Die Syntax ist folgende:

mount <laufwerk> <verzeichnis>

Danach kann man schon loslegen und Spielen!
Sollen diverse Befehle automatisch beim Start ausgeführt werden so können diese in der [autoexec] Section in der config angegeben werden. Unter Linux befindet sich diese im Verzeichnis ~/.dosbox:

[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.
mount c /home/wizard/games
c:

Somit wird /home/wizard/games auf c gemounted und anschließend das Laufwerk gewechselt.
Standardmässig ist das Tastaturlayout auf Englisch; will man es auf Deutsch haben, so kann man das in der [dos] Section in der config ändern:

[dos]
[...]
keyboardlayout=gr

Eine Liste der verfügbaren Layouts befindet sich hier.

Wer Dosbox im Vollbildschirmmodus starten will, kann dies ebenfalls in der config angeben:

[sdl]
[...]
fullscreen=true

Eine ausführliche Erklärung zur dosbox config findet sich im dosbox wiki.

Nachdem man dosbox fertig konfiguriert hat kann man daran gehen, Starter für Spiele zu basteln. Mit -c kann dosbox ein Befehl übergeben werden, der ausgeführt werden soll. Wird dosbox z.B. folgendermaßen gestartet:

dosbox -c "cd lotus" -c "lotus"

so wird zuerst in das Verzeichnis "Lotus" gewechselt, und dann das Spiel gestartet. Wird das Spiel beendet so wird allerdings dosbox nicht beendet. Dies ist allerdings notwendig, damit später wenn dosbox von XBMC aufgerufen wird die Kontrolle wieder an XBMC zurückgeht wenn das Spiel beendet wird. Ein hinzufügen von

dosbox -c [...] -c "exit"

bringt leider nicht das gewünschte Ergebnis, und beendet dosbox sofort wieder. Der Switch -exit brachte bei mir leider nicht das gewünschte Ergebnis, und beendete dosbox nicht. Als Abhilfe habe ich mir ein kleines Shell-Script geschrieben, das dosbox startet und bei bedarf ein batchscript schreibt das dosbox nachdem das Spiel beendet wurde auch beendet:

#!/bin/bash
export basedir=/home/wizard/games
export folder=$1
export executable=$2
#etwaige spezialsettings für games
if [ -e "$basedir/startscripts/$executable_start.sh" ]; then
  echo calling specific script
  $basedir/startscripts/$executable_start.sh
fi
#dosbox soll sich nach beenden des spiels auch wieder beenden;
#leider führt ein weiteres -c "exit" zum sofortigen beenden
#darum bei bedarf ein batchscript schreiben dass nach beenden 
#des spieles dosbox beendet
if [ ! -e "$basedir/$folder/$executable.bat" ]; then
  echo batchscript does not exist, create it
  echo $executable.exe > $basedir/$folder/$executable.bat
  echo exit >> $basedir/$folder/$executable.bat
fi
dosbox -c "cd $folder" -c "$executable.bat" -noconsole -exit
if [ -e "$basedir/startscripts/$executable_stop.sh" ]; then
  echo calling specific script
  $basedir/startscripts/$executable_stop.sh
fi

Diesem Script muss nun nur noch der Unterordner und die Executable übergeben werden und los gehts.
Benötigt ein Spiel vor dem Start von dosbox noch irgendwelche Spezialsettings oder muss vorher noch etwas gestartet werden, so starte ich diese Programme im <spielname>_start.sh; in <spielname>_stop.sh können Aktionen nach dem Beenden des Spieles ausgeführt werden (z.B. in _start gestartete Programme beenden etc.).
Sollten in dosbox für ein Spiel noch spezielle Settings vorgenommen werden, so kann ich dies im erzeugten Batchscript hinzufügen. Da dieses File nur geschrieben wird wenn es noch nicht existiert bleiben etwaige Änderungen erhalten.

Um ein DOS Spiel zu starten muss ich nun also nur noch das Script mit den Parametern aufrufen:

./startdosgame.sh lotus lotus

Nun kann ich darangehen, die Spiele in Executor einzubinden. Dies kann ich entweder über die GUI in XBMC machen, oder ich editiere das zugehörige config File. Will man mehr als nur ein Spiel hinzufügen ist man eindeutig über das config File schneller.

Das File programs.cfg befindet sich unter

~/.xbmc/userdata/addon_data/plugin.program.executor

Dort gibt es je Spiel einen Eintrag:

[name]
exec = /pfad/zu/executable
icon = /pfad/zu/image

Hier füge ich unser Script ein und rufe es mit den Richtigen Parametern auf. Im Verzeichnis "lotus" liegt die executable "lotus"; das Spiel heißt Lotus:

[lotus]
exec = /home/wizard/games/startscripts/startdosgame.sh lotus lotus
icon = /home/wizard/games/icons/lotus.png

Und schon erscheint es im Executor Menü:


Von dort aus kann ich das Spiel nun starten, und es heißt Gamepad krallen und Spielen bis der Daumen glüht!