extmidi.c
author bjarni
Sun, 23 Jan 2005 22:01:51 +0000
changeset 1128 d3ffc98b92ad
parent 342 a97783c4a357
child 1301 313804601383
permissions -rw-r--r--
(svn r1629) added a counter to tell how many engines you have of each type to the autoreplace vehicle windows and made them show only the vehicles you actually have in the left list.
this also fixes some window updates issues when autoreplacing
#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 "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)
			execlp(EXTERNAL_PLAYER, "extmidi", MIDI_ARG, filename, NULL);
		#else
			execlp(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__ */