diff options
| author | Jamieson Christian | 2003-05-17 14:26:58 +0000 | 
|---|---|---|
| committer | Jamieson Christian | 2003-05-17 14:26:58 +0000 | 
| commit | 66cbaa1df73087ac40e4cfb9f3cc89e2ee19119e (patch) | |
| tree | 3011b56aa8bd9cb79f9e88755e02a77dafd08d07 /backends | |
| parent | 61c2430a98f992a740a84fdc737dc3f3450249a7 (diff) | |
| download | scummvm-rg350-66cbaa1df73087ac40e4cfb9f3cc89e2ee19119e.tar.gz scummvm-rg350-66cbaa1df73087ac40e4cfb9f3cc89e2ee19119e.tar.bz2 scummvm-rg350-66cbaa1df73087ac40e4cfb9f3cc89e2ee19119e.zip  | |
Moved SEQ driver to its own file
svn-id: r7605
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/midi/seq.cpp | 168 | 
1 files changed, 168 insertions, 0 deletions
diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp new file mode 100644 index 0000000000..ff6196738a --- /dev/null +++ b/backends/midi/seq.cpp @@ -0,0 +1,168 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001  Ludvig Strigeus + * Copyright (C) 2001-2003 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * $Header$ + */ + +/* + * Raw output support by Michael Pearce + * Alsa support by Nicolas Noble <nicolas@nobis-crew.org> copied from + *    both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html) + */ + +#if defined(UNIX) && !defined(__BEOS__) + +#include "stdafx.h" +#include "sound/mpu401.h" +#include "common/engine.h"	// for warning/error/debug + +//////////////////////////////////////// +// +// Unix dev/sequencer driver +// +//////////////////////////////////////// + +#define SEQ_MIDIPUTC 5 + +class MidiDriver_SEQ : public MidiDriver_MPU401 { +public: +	MidiDriver_SEQ(); +	int open(); +	void close(); +	void send(uint32 b); +	void sysEx(byte *msg, uint16 length); + +private: +	bool _isOpen; +	int device, _device_num; +}; + +MidiDriver_SEQ::MidiDriver_SEQ() { +	_isOpen = false; +	device = 0; +	_device_num = 0; +} + +int MidiDriver_SEQ::open() { +	if (_isOpen) +		return MERR_ALREADY_OPEN; +	_isOpen = true; +	device = 0; + +	char *device_name = getenv("SCUMMVM_MIDI"); +	if (device_name != NULL) { +		device = (::open((device_name), O_RDWR, 0)); +	} else { +		warning("You need to set-up the SCUMMVM_MIDI environment variable properly (see README) "); +	} +	if ((device_name == NULL) || (device < 0)) { +		if (device_name == NULL) +			warning("Opening /dev/null (no music will be heard) "); +		else +			warning("Cannot open rawmidi device %s - using /dev/null (no music will be heard) ", +							device_name); +		device = (::open(("/dev/null"), O_RDWR, 0)); +		if (device < 0) +			error("Cannot open /dev/null to dump midi output"); +	} + +	if (getenv("SCUMMVM_MIDIPORT")) +		_device_num = atoi(getenv("SCUMMVM_MIDIPORT")); +	return 0; +} + +void MidiDriver_SEQ::close() { +	::close(device); +	_isOpen = false; +} + +void MidiDriver_SEQ::send(uint32 b) { +	unsigned char buf[256]; +	int position = 0; + +	switch (b & 0xF0) { +	case 0x80: +	case 0x90: +	case 0xA0: +	case 0xB0: +	case 0xE0: +		buf[position++] = SEQ_MIDIPUTC; +		buf[position++] = (unsigned char)b; +		buf[position++] = _device_num; +		buf[position++] = 0; +		buf[position++] = SEQ_MIDIPUTC; +		buf[position++] = (unsigned char)((b >> 8) & 0x7F); +		buf[position++] = _device_num; +		buf[position++] = 0; +		buf[position++] = SEQ_MIDIPUTC; +		buf[position++] = (unsigned char)((b >> 16) & 0x7F); +		buf[position++] = _device_num; +		buf[position++] = 0; +		break; +	case 0xC0: +	case 0xD0: +		buf[position++] = SEQ_MIDIPUTC; +		buf[position++] = (unsigned char)b; +		buf[position++] = _device_num; +		buf[position++] = 0; +		buf[position++] = SEQ_MIDIPUTC; +		buf[position++] = (unsigned char)((b >> 8) & 0x7F); +		buf[position++] = _device_num; +		buf[position++] = 0; +		break; +	default: +		fprintf(stderr, "Unknown : %08x\n", (int)b); +		break; +	} +	write(device, buf, position); +} + +void MidiDriver_SEQ::sysEx (byte *msg, uint16 length) { +	if (length > 254) { +		warning ("Cannot send SysEx block - data too large"); +		return; +	} + +	unsigned char buf [1024]; +	int position = 0; +	byte *chr = msg; + +	// Should be we using EV_SYSEX instead of SEQ_MIDIPUTC? +	// I'm not sure how to send EV_SYSEX. +	buf[position++] = SEQ_MIDIPUTC; +	buf[position++] = 0xFF; +	buf[position++] = _device_num; +	buf[position++] = 0; +	for (; length; --length) { +		buf[position++] = SEQ_MIDIPUTC; +		buf[position++] = (unsigned char) *chr; +		buf[position++] = _device_num; +		buf[position++] = 0; +	} +	buf[position++] = SEQ_MIDIPUTC; +	buf[position++] = 0xF7; +	buf[position++] = _device_num; +	buf[position++] = 0; +	write (device, buf, position); +} + +MidiDriver *MidiDriver_SEQ_create() { +	return new MidiDriver_SEQ(); +} + +#endif  | 
