slackbuilds/games/opendune/opendune.sh

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