aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/midi/windows.cpp44
-rw-r--r--scumm/instrument.cpp2
-rw-r--r--scumm/instrument.h2
3 files changed, 45 insertions, 3 deletions
diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp
index bb2f33c050..c78dea3a6e 100644
--- a/backends/midi/windows.cpp
+++ b/backends/midi/windows.cpp
@@ -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 @@ public:
int open();
void close();
void send(uint32 b);
+ void sysEx (byte *msg, uint16 length);
};
int MidiDriver_WIN::open()
@@ -50,7 +54,8 @@ int MidiDriver_WIN::open()
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 @@ void MidiDriver_WIN::close()
{
_isOpen = false;
check_error(midiOutClose(_mo));
+ CloseHandle (_streamEvent);
}
void MidiDriver_WIN::send(uint32 b)
@@ -82,6 +88,42 @@ void MidiDriver_WIN::send(uint32 b)
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)
{
char buf[200];
diff --git a/scumm/instrument.cpp b/scumm/instrument.cpp
index 897c6d4086..f7759e81ad 100644
--- a/scumm/instrument.cpp
+++ b/scumm/instrument.cpp
@@ -25,6 +25,8 @@
#include "scumm/instrument.h"
#include "sound/mididrv.h"
+#define NATIVE_MT32 true
+
static const byte mt32_to_gm[128] = {
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0, 1, 0, 2, 4, 4, 5, 3, 16, 17, 18, 16, 16, 19, 20, 21, // 0x
diff --git a/scumm/instrument.h b/scumm/instrument.h
index a3ab367142..9a64243068 100644
--- a/scumm/instrument.h
+++ b/scumm/instrument.h
@@ -25,8 +25,6 @@
#include "stdafx.h"
#include "common/scummsys.h"
-#define NATIVE_MT32 false
-
class Serializer;
class MidiChannel;