|
|
@@ -55,7 +55,8 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, |
|
|
|
std::auto_ptr<JackMidiBufferWriteQueue> write_queue_ptr(write_queue); |
|
|
|
sysex_buffer = new jack_midi_data_t[max_bytes]; |
|
|
|
char error_message[MAXERRORLENGTH]; |
|
|
|
MMRESULT result = midiInOpen(&handle, index, (DWORD_PTR)HandleMidiInputEvent, |
|
|
|
MMRESULT result = midiInOpen(&handle, index, |
|
|
|
(DWORD_PTR) HandleMidiInputEvent, |
|
|
|
(DWORD_PTR)this, |
|
|
|
CALLBACK_FUNCTION | MIDI_IO_STATUS); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
@@ -108,7 +109,8 @@ JackWinMMEInputPort::JackWinMMEInputPort(const char *alias_name, |
|
|
|
close_handle: |
|
|
|
result = midiInClose(handle); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
|
WriteInError("JackWinMMEInputPort [constructor]", "midiInClose", result); |
|
|
|
WriteInError("JackWinMMEInputPort [constructor]", "midiInClose", |
|
|
|
result); |
|
|
|
} |
|
|
|
delete_sysex_buffer: |
|
|
|
delete[] sysex_buffer; |
|
|
@@ -123,8 +125,8 @@ JackWinMMEInputPort::~JackWinMMEInputPort() |
|
|
|
} |
|
|
|
result = midiInUnprepareHeader(handle, &sysex_header, sizeof(MIDIHDR)); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
|
WriteInError("JackWinMMEInputPort [destructor]", "midiInUnprepareHeader", |
|
|
|
result); |
|
|
|
WriteInError("JackWinMMEInputPort [destructor]", |
|
|
|
"midiInUnprepareHeader", result); |
|
|
|
} |
|
|
|
result = midiInClose(handle); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
@@ -155,6 +157,15 @@ JackWinMMEInputPort::EnqueueMessage(jack_nframes_t time, size_t length, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
JackWinMMEInputPort::GetInErrorString(MMRESULT error, LPTSTR text) |
|
|
|
{ |
|
|
|
MMRESULT result = midiInGetErrorText(error, text, MAXERRORLENGTH); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
|
snprintf(text, MAXERRORLENGTH, "Unknown error code '%d'", error); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
JackWinMMEInputPort::ProcessJack(JackMidiBuffer *port_buffer, |
|
|
|
jack_nframes_t frames) |
|
|
@@ -164,7 +175,7 @@ JackWinMMEInputPort::ProcessJack(JackMidiBuffer *port_buffer, |
|
|
|
jack_event = thread_queue->DequeueEvent(); |
|
|
|
} |
|
|
|
for (; jack_event; jack_event = thread_queue->DequeueEvent()) { |
|
|
|
switch (write_queue->EnqueueEvent(jack_event)) { |
|
|
|
switch (write_queue->EnqueueEvent(jack_event, frames)) { |
|
|
|
case JackMidiWriteQueue::BUFFER_TOO_SMALL: |
|
|
|
jack_error("JackWinMMEMidiInputPort::Process - The buffer write " |
|
|
|
"queue couldn't enqueue a %d-byte event. Dropping " |
|
|
@@ -181,7 +192,7 @@ void |
|
|
|
JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) |
|
|
|
{ |
|
|
|
set_threaded_log_function(); |
|
|
|
jack_nframes_t current_frame = GetCurrentFrame();
|
|
|
|
jack_nframes_t current_frame = GetCurrentFrame(); |
|
|
|
|
|
|
|
switch (message) { |
|
|
|
case MIM_CLOSE: |
|
|
@@ -219,17 +230,23 @@ JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) |
|
|
|
return; |
|
|
|
} |
|
|
|
EnqueueMessage(current_frame, (size_t) length, message_buffer); |
|
|
|
break;
|
|
|
|
break; |
|
|
|
} |
|
|
|
case MIM_LONGDATA: { |
|
|
|
LPMIDIHDR header = (LPMIDIHDR) param1; |
|
|
|
size_t byte_count = header->dwBytesRecorded; |
|
|
|
if (! byte_count) { |
|
|
|
jack_info("JackWinMMEInputPort::ProcessWinMME - WinMME driver has " |
|
|
|
"returned sysex header to us with no bytes. The JACK " |
|
|
|
"driver is probably being stopped."); |
|
|
|
break; |
|
|
|
} |
|
|
|
jack_midi_data_t *data = (jack_midi_data_t *) header->lpData; |
|
|
|
size_t length1 = header->dwBytesRecorded; |
|
|
|
if ((data[0] != 0xf0) || (data[length1 - 1] != 0xf7)) { |
|
|
|
if ((data[0] != 0xf0) || (data[byte_count - 1] != 0xf7)) { |
|
|
|
jack_error("JackWinMMEInputPort::ProcessWinMME - Discarding " |
|
|
|
"%d-byte sysex chunk.", length1); |
|
|
|
"%d-byte sysex chunk.", byte_count); |
|
|
|
} else { |
|
|
|
EnqueueMessage(current_frame, length1, data); |
|
|
|
EnqueueMessage(current_frame, byte_count, data); |
|
|
|
} |
|
|
|
// Is this realtime-safe? This function isn't run in the JACK thread, |
|
|
|
// but we still want it to perform as quickly as possible. Even if |
|
|
@@ -237,10 +254,10 @@ JackWinMMEInputPort::ProcessWinMME(UINT message, DWORD param1, DWORD param2) |
|
|
|
MMRESULT result = midiInAddBuffer(handle, &sysex_header, |
|
|
|
sizeof(MIDIHDR)); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
|
WriteInError("JackWinMMEInputPort::ProcessWinMME", "midiInAddBuffer", |
|
|
|
result); |
|
|
|
WriteInError("JackWinMMEInputPort::ProcessWinMME", |
|
|
|
"midiInAddBuffer", result); |
|
|
|
} |
|
|
|
break;
|
|
|
|
break; |
|
|
|
} |
|
|
|
case MIM_LONGERROR: |
|
|
|
jack_error("JackWinMMEInputPort::ProcessWinMME - Invalid or " |
|
|
@@ -277,15 +294,6 @@ JackWinMMEInputPort::Stop() |
|
|
|
return ! started; |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
JackWinMMEInputPort::GetInErrorString(MMRESULT error, LPTSTR text) |
|
|
|
{ |
|
|
|
MMRESULT result = midiInGetErrorText(error, text, MAXERRORLENGTH); |
|
|
|
if (result != MMSYSERR_NOERROR) { |
|
|
|
snprintf(text, MAXERRORLENGTH, "Unknown error code '%d'", error); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
JackWinMMEInputPort::WriteInError(const char *jack_func, const char *mm_func, |
|
|
|
MMRESULT result) |
|
|
@@ -294,5 +302,3 @@ JackWinMMEInputPort::WriteInError(const char *jack_func, const char *mm_func, |
|
|
|
GetInErrorString(result, error_message); |
|
|
|
jack_error("%s - %s: %s", jack_func, mm_func, error_message); |
|
|
|
} |
|
|
|
|
|
|
|
|