diff options
Diffstat (limited to 'extmidi.c')
-rw-r--r-- | extmidi.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/extmidi.c b/extmidi.c new file mode 100644 index 000000000..168191fc2 --- /dev/null +++ b/extmidi.c @@ -0,0 +1,103 @@ +#ifndef __BEOS__ +#ifndef __MORPHOS__ +#include "stdafx.h" + +#include "ttd.h" +#include "hal.h" +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> +#include <signal.h> +#include <sys/stat.h> +#include <errno.h> + +#ifndef EXTERNAL_PLAYER +#define EXTERNAL_PLAYER "/usr/bin/timidity" +#endif + +static pid_t _pid; + +static void extmidi_kill(void) { + if(_pid > 0) { + kill(_pid, SIGKILL); + while(waitpid(_pid, NULL, WNOHANG) != _pid); + } + _pid = 0; +} + +static char *extmidi_start(char **parm) { + _pid = 0; + + return NULL; +} + +static void extmidi_stop(void) { + extmidi_kill(); +} + +static void extmidi_play_song(const char *filename) { + extmidi_kill(); + + _pid = fork(); + if(_pid < 0) { + fprintf(stderr, "extmidi: couldn't fork: %s\n", strerror(errno)); + _pid = 0; + return; + } + + if(_pid == 0) { + #if defined(MIDI_ARG) + execl(EXTERNAL_PLAYER, "extmidi", MIDI_ARG, filename, NULL); + #else + execl(EXTERNAL_PLAYER, "extmidi", filename, NULL); + #endif + + fprintf(stderr, "extmidi: couldn't execl: %s\n", strerror(errno)); + + exit(0); + } + + + + usleep(500); + + + if(_pid == waitpid(_pid, NULL, WNOHANG)) { + fprintf(stderr, "extmidi: play song failed\n"); + _pid = 0; + + usleep(5000); + + } +} + +static void extmidi_stop_song(void) { + extmidi_kill(); +} + +static bool extmidi_is_playing(void) { + if(_pid == 0) + return 0; + + if(waitpid(_pid, NULL, WNOHANG) == _pid) { + _pid = 0; + return 0; + } + + return 1; +} + +static void extmidi_set_volume(byte vol) { + fprintf(stderr, "extmidi: set volume not implemented\n"); +} + +const HalMusicDriver _extmidi_music_driver = { + extmidi_start, + extmidi_stop, + extmidi_play_song, + extmidi_stop_song, + extmidi_is_playing, + extmidi_set_volume, +}; +#endif /* __MORPHOS__ */ +#endif /* __BEOS__ */ |