[Scummvm-cvs-logs] CVS: scummvm/backends/midi windows.cpp,1.4,1.5

Jamieson Christian jamieson630 at users.sourceforge.net
Fri Jan 10 06:41:03 CET 2003


Update of /cvsroot/scummvm/scummvm/backends/midi
In directory sc8-pr-cvs1:/tmp/cvs-serv13798/backends/midi

Modified Files:
	windows.cpp 
Log Message:
First-revision SysEx support for -ewindows.

Index: windows.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/backends/midi/windows.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- windows.cpp	12 Dec 2002 01:35:57 -0000	1.4
+++ windows.cpp	10 Jan 2003 14:40:22 -0000	1.5
@@ -32,6 +32,9 @@
 
 class MidiDriver_WIN : public MidiDriver_MPU401 {
 private:
+	MIDIHDR _streamHeader;
+	byte _streamBuffer [258];	// SysEx blocks should be no larger than 256 bytes
+	HANDLE _streamEvent;
 	HMIDIOUT _mo;
 	bool _isOpen;
 
@@ -43,6 +46,7 @@
 	int open();
 	void close();
 	void send(uint32 b);
+	void sysEx (byte *msg, uint16 length);
 };
 
 int MidiDriver_WIN::open()
@@ -50,7 +54,8 @@
 	if (_isOpen)
 		return MERR_ALREADY_OPEN;
 
-	MMRESULT res = midiOutOpen((HMIDIOUT *) &_mo, MIDI_MAPPER, 0, 0, 0);
+	_streamEvent = CreateEvent (NULL, true, true, NULL);
+	MMRESULT res = midiOutOpen((HMIDIOUT *) &_mo, MIDI_MAPPER, (unsigned long) _streamEvent, 0, CALLBACK_EVENT);
 	if (res != MMSYSERR_NOERROR) {
 		check_error(res);
 		return MERR_DEVICE_NOT_AVAILABLE;
@@ -64,6 +69,7 @@
 {
 	_isOpen = false;
 	check_error(midiOutClose(_mo));
+	CloseHandle (_streamEvent);
 }
 
 void MidiDriver_WIN::send(uint32 b)
@@ -80,6 +86,42 @@
 
 	// printMidi(u.bData[0], u.bData[1], u.bData[2], u.bData[3]);
 	check_error(midiOutShortMsg(_mo, u.dwData));
+}
+
+void MidiDriver_WIN::sysEx (byte *msg, uint16 length)
+{
+	if (!_isOpen)
+		return;
+
+	if (WaitForSingleObject (_streamEvent, 2000) == WAIT_TIMEOUT) {
+		warning ("Could not send SysEx - MMSYSTEM is still trying to send data.");
+		return;
+	}
+
+	midiOutUnprepareHeader (_mo, &_streamHeader, sizeof (_streamHeader));
+	_streamBuffer [0] = 0xFF;
+	memcpy (&_streamBuffer[1], msg, length);
+	_streamBuffer [length+1] = 0xF7;
+
+	_streamHeader.lpData = (char *) _streamBuffer;
+	_streamHeader.dwBufferLength = length + 2;
+	_streamHeader.dwBytesRecorded = length + 2;
+	_streamHeader.dwUser = 0;
+	_streamHeader.dwFlags |= MHDR_ISSTRM;
+
+	MMRESULT result = midiOutPrepareHeader (_mo, &_streamHeader, sizeof (_streamHeader));
+	if (result != MMSYSERR_NOERROR) {
+		check_error (result);
+		return;
+	}
+
+	ResetEvent (_streamEvent);
+	result = midiOutLongMsg (_mo, &_streamHeader, sizeof (_streamHeader));
+	if (result != MMSYSERR_NOERROR) {
+		check_error (result);
+		SetEvent (_streamEvent);
+		return;
+	}
 }
 
 void MidiDriver_WIN::check_error(MMRESULT result)





More information about the Scummvm-git-logs mailing list