62 lines
2.2 KiB
Bash
62 lines
2.2 KiB
Bash
#!/bin/sh
|
|
|
|
# shell script wrapper for SBo games/opendune
|
|
# written by B. Watson, licensed under the WTFPL.
|
|
|
|
# this wrapper is needed because the game uses timidity in alsa client
|
|
# mode for MIDI audio, but doesn't start timidity itself (it just tells
|
|
# you to). so this script starts it, if necessary (and if possible). if
|
|
# timidity isn't installed, we don't complain about it, just run the
|
|
# game without it (the game will complain so this script doesn't have to).
|
|
|
|
# if timidity or some other alsa client is running (if there are writable
|
|
# MIDI ports other than 'MIDI Through'), we won't start anything.
|
|
|
|
# when the game is through running, we have to kill off timidity if we
|
|
# started it (not if it was already running). unfortunately timidity's
|
|
# daemon mode doesn't write a PID file, and it forks so we can't easily
|
|
# get the PID, so we can't use daemon mode.
|
|
|
|
# the code in src/audio/midi_alsa.c of the game will actually connect
|
|
# to the first writable, subscribable port it can find, other than
|
|
# "Midi Through". so if the user's already running some MIDI daemon
|
|
# like FluidSynth, the game will use it, and we shouldn't be starting
|
|
# timidity here.
|
|
|
|
# KNOWN ISSUE: if lashd is running, it sometimes creates a MIDI port that
|
|
# doesn't appear in aconnect's list, but opendune will see & connect to
|
|
# it. Result is that you get no complaint about timidity not running,
|
|
# but don't hear any audio either.
|
|
|
|
if [ "$( aconnect -o | grep -v 'Midi Through' )" = "" ]; then
|
|
if which timidity &> /dev/null; then
|
|
timidity -iAq &
|
|
kidpid="$!"
|
|
|
|
# it might take timidity a while to start up & register its MIDI port.
|
|
# we wait up to 10 sec for it to start.
|
|
for i in 0 1 2 3 4; do
|
|
sleep $i
|
|
if [ "$( aconnect -o | grep TiMidity )" != "" ]; then
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# run the game, wait for it to exit. its status will be the
|
|
# return value of this script.
|
|
/usr/libexec/opendune/opendune "$@"
|
|
retval="$?"
|
|
|
|
# kill timidity, if we started it. PIDs can get reused, we don't
|
|
# want to kill some random process if timidity already exited and
|
|
# its PID got reused, so check & make sure it really is timidity.
|
|
if [ "$kidpid" != "" ]; then
|
|
if [ "$( ps h -o comm $kidpid )" = "timidity" ]; then
|
|
kill "$kidpid"
|
|
fi
|
|
fi
|
|
|
|
exit $retval
|