mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 19:56:31 +01:00
Fix WinMME midi driver shutdown with sysex enabled
midiInReset triggers the sysex callback to tell the application that it has finished with the buffer. Calling midiInAddBuffer results in an infinite loop so just return during shutdown.
This commit is contained in:
parent
1c0265e27c
commit
4ebc6ef0b4
2 changed files with 13 additions and 2 deletions
|
|
@ -37,6 +37,7 @@ namespace ARDOUR {
|
||||||
WinMMEMidiInputDevice::WinMMEMidiInputDevice (int index)
|
WinMMEMidiInputDevice::WinMMEMidiInputDevice (int index)
|
||||||
: m_handle(0)
|
: m_handle(0)
|
||||||
, m_started(false)
|
, m_started(false)
|
||||||
|
, m_in_reset(false)
|
||||||
, m_midi_buffer(new RingBuffer<uint8_t>(MIDI_BUFFER_SIZE))
|
, m_midi_buffer(new RingBuffer<uint8_t>(MIDI_BUFFER_SIZE))
|
||||||
, m_sysex_buffer(new uint8_t[SYSEX_BUFFER_SIZE])
|
, m_sysex_buffer(new uint8_t[SYSEX_BUFFER_SIZE])
|
||||||
{
|
{
|
||||||
|
|
@ -92,12 +93,14 @@ WinMMEMidiInputDevice::close (std::string& error_msg)
|
||||||
// return error message for first error encountered?
|
// return error message for first error encountered?
|
||||||
bool success = true;
|
bool success = true;
|
||||||
|
|
||||||
|
m_in_reset = true;
|
||||||
MMRESULT result = midiInReset (m_handle);
|
MMRESULT result = midiInReset (m_handle);
|
||||||
if (result != MMSYSERR_NOERROR) {
|
if (result != MMSYSERR_NOERROR) {
|
||||||
error_msg = get_error_string (result);
|
error_msg = get_error_string (result);
|
||||||
DEBUG_MIDI (error_msg);
|
DEBUG_MIDI (error_msg);
|
||||||
success = false;
|
success = false;
|
||||||
}
|
}
|
||||||
|
m_in_reset = false;
|
||||||
result = midiInUnprepareHeader (m_handle, &m_sysex_header, sizeof(MIDIHDR));
|
result = midiInUnprepareHeader (m_handle, &m_sysex_header, sizeof(MIDIHDR));
|
||||||
if (result != MMSYSERR_NOERROR) {
|
if (result != MMSYSERR_NOERROR) {
|
||||||
error_msg = get_error_string (result);
|
error_msg = get_error_string (result);
|
||||||
|
|
@ -258,12 +261,19 @@ WinMMEMidiInputDevice::handle_sysex_msg (MIDIHDR* const midi_header,
|
||||||
|
|
||||||
uint8_t* data = (uint8_t*)header->lpData;
|
uint8_t* data = (uint8_t*)header->lpData;
|
||||||
|
|
||||||
if ((data[0] != 0xf0) || (data[byte_count - 1] != 0xf7)) {
|
DEBUG_MIDI(string_compose("WinMME sysex flags: %1\n", header->dwFlags));
|
||||||
DEBUG_MIDI (string_compose ("Discarding %1 byte sysex chunk\n", byte_count));
|
|
||||||
|
if (m_in_reset) {
|
||||||
|
DEBUG_MIDI(string_compose("Midi device %1 being reset ignoring sysex msg\n",
|
||||||
|
name()));
|
||||||
|
return;
|
||||||
|
} else if ((data[0] != 0xf0) || (data[byte_count - 1] != 0xf7)) {
|
||||||
|
DEBUG_MIDI(string_compose("Discarding %1 byte sysex chunk\n", byte_count));
|
||||||
} else {
|
} else {
|
||||||
enqueue_midi_msg (data, byte_count, timestamp);
|
enqueue_midi_msg (data, byte_count, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MMRESULT result = midiInAddBuffer (m_handle, &m_sysex_header, sizeof(MIDIHDR));
|
MMRESULT result = midiInAddBuffer (m_handle, &m_sysex_header, sizeof(MIDIHDR));
|
||||||
if (result != MMSYSERR_NOERROR) {
|
if (result != MMSYSERR_NOERROR) {
|
||||||
DEBUG_MIDI (get_error_string (result));
|
DEBUG_MIDI (get_error_string (result));
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,7 @@ private: // data
|
||||||
MIDIHDR m_sysex_header;
|
MIDIHDR m_sysex_header;
|
||||||
|
|
||||||
bool m_started;
|
bool m_started;
|
||||||
|
bool m_in_reset;
|
||||||
|
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue