Files @ r1793:7bff71353e69
Branch filter:

Location: cpp/openttd-patchpack/source/extmidi.c - annotation

Darkvater
(svn r2297) - CodeChange: server-check the next batch of commands.
- CodeChange: since only the server will be able to modify difficulty settings, leave the checking of correct values besides, and trust users will join legit servers.
- CodeChange: for renaming signs, only check if GetDParam(); eg _decode_parameters is empty ('\0') or not, instead of the extra check of players, etc. That basically does the same thing. Also dirty sign two times when renaming, once before, once after the action. Because if the name becomes shorter and you update only after, garbage remains on the screen.
- CodeChange: made GetMaskOfTownActions() available to the town-cmd to double-check if the action was available to the player. For this purpose the hardcoded _local_player has been removed from the function and is now passed as a parameter.
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1584:b5fd953db0ea
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r0:d63b455452f6
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r342:7bf7e37541c5
r1608:33d8a75e9241
r1608:33d8a75e9241
r342:7bf7e37541c5
r0:d63b455452f6
r0:d63b455452f6
r1608:33d8a75e9241
r342:7bf7e37541c5
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r0:d63b455452f6
r1608:33d8a75e9241
r342:7bf7e37541c5
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r0:d63b455452f6
r1608:33d8a75e9241
r342:7bf7e37541c5
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r0:d63b455452f6
r1608:33d8a75e9241
r342:7bf7e37541c5
r342:7bf7e37541c5
r0:d63b455452f6
r0:d63b455452f6
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r1608:33d8a75e9241
r0:d63b455452f6
r342:7bf7e37541c5
r0:d63b455452f6
r0:d63b455452f6
#ifndef __BEOS__
#ifndef __MORPHOS__
#include "stdafx.h"

#include "ttd.h"
#include "hal.h"
#include "sound.h"
#include "string.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <errno.h>

static struct {
	char song[MAX_PATH];
	int pid;
} _midi;

static void DoPlay(void);
static void DoStop(void);

static const char* ExtMidiStart(const char* const * parm)
{
	_midi.song[0] = '\0';
	_midi.pid = -1;
	return NULL;
}

static void ExtMidiStop(void)
{
	_midi.song[0] = '\0';
	DoStop();
}

static void ExtMidiPlaySong(const char* filename)
{
	ttd_strlcpy(_midi.song, filename, lengthof(_midi.song));
	DoStop();
}

static void ExtMidiStopSong(void)
{
	_midi.song[0] = '\0';
	DoStop();
}

static bool ExtMidiIsPlaying(void)
{
	if (_midi.pid != -1 && waitpid(_midi.pid, NULL, WNOHANG) == _midi.pid)
		_midi.pid = -1;
	if (_midi.pid == -1 && _midi.song[0] != '\0') DoPlay();
	return _midi.pid != -1;
}

static void ExtMidiSetVolume(byte vol)
{
	fprintf(stderr, "extmidi: set volume not implemented\n");
}

static void DoPlay(void)
{
	_midi.pid = fork();
	switch (_midi.pid) {
		case 0: {
			int d;

			close(0);
			close(1);
			close(2);
			d = open("/dev/null", O_RDONLY);
			if (d != -1) {
				if (dup2(d, 1) != -1 && dup2(d, 2) != -1) {
					#if defined(MIDI_ARG)
						execlp(msf.extmidi, "extmidi", MIDI_ARG, _midi.song, NULL);
					#else
						execlp(msf.extmidi, "extmidi", _midi.song, NULL);
					#endif
				}
			}
			exit(1);
		}

		case -1:
			fprintf(stderr, "extmidi: couldn't fork: %s\n", strerror(errno));
			/* FALLTHROUGH */

		default:
			_midi.song[0] = '\0';
			break;
	}
}

static void DoStop(void)
{
	if (_midi.pid != -1) kill(_midi.pid, SIGTERM);
}

const HalMusicDriver _extmidi_music_driver = {
	ExtMidiStart,
	ExtMidiStop,
	ExtMidiPlaySong,
	ExtMidiStopSong,
	ExtMidiIsPlaying,
	ExtMidiSetVolume,
};

#endif /* __MORPHOS__ */
#endif /* __BEOS__ */