prevent exception in MIDI in/out from crashing

This commit is contained in:
tildearrow 2022-07-24 02:45:21 -05:00
parent 9a0609ae1a
commit 1d77719640
1 changed files with 32 additions and 17 deletions

View File

@ -46,23 +46,28 @@ String sanitizePortName(const String& name) {
bool TAMidiInRtMidi::gather() { bool TAMidiInRtMidi::gather() {
std::vector<unsigned char> msg; std::vector<unsigned char> msg;
if (port==NULL) return false; if (port==NULL) return false;
while (true) { try {
TAMidiMessage m; while (true) {
double t=port->getMessage(&msg); TAMidiMessage m;
if (msg.empty()) break; double t=port->getMessage(&msg);
if (msg.empty()) break;
// parse message // parse message
m.time=t; m.time=t;
m.type=msg[0]; m.type=msg[0];
if (m.type!=TA_MIDI_SYSEX && msg.size()>1) { if (m.type!=TA_MIDI_SYSEX && msg.size()>1) {
memcpy(m.data,msg.data()+1,MIN(msg.size()-1,7)); memcpy(m.data,msg.data()+1,MIN(msg.size()-1,7));
} else if (m.type==TA_MIDI_SYSEX) { } else if (m.type==TA_MIDI_SYSEX) {
m.sysExData.reset(new unsigned char[msg.size()]); m.sysExData.reset(new unsigned char[msg.size()]);
m.sysExLen=msg.size(); m.sysExLen=msg.size();
logD("got a SysEx of length %ld!",msg.size()); logD("got a SysEx of length %ld!",msg.size());
memcpy(m.sysExData.get(),msg.data(),msg.size()); memcpy(m.sysExData.get(),msg.data(),msg.size());
}
queue.push(m);
} }
queue.push(m); } catch (RtMidiError& e) {
logE("MIDI input error! %s",e.what());
return false;
} }
return true; return true;
} }
@ -180,7 +185,12 @@ bool TAMidiOutRtMidi::send(const TAMidiMessage& what) {
return false; return false;
} }
len=what.sysExLen; len=what.sysExLen;
port->sendMessage(what.sysExData.get(),len); try {
port->sendMessage(what.sysExData.get(),len);
} catch (RtMidiError& e) {
logE("MIDI output error! %s",e.what());
return false;
}
return true; return true;
break; break;
case TA_MIDI_MTC_FRAME: case TA_MIDI_MTC_FRAME:
@ -194,7 +204,12 @@ bool TAMidiOutRtMidi::send(const TAMidiMessage& what) {
len=1; len=1;
break; break;
} }
port->sendMessage((const unsigned char*)&what.type,len); try {
port->sendMessage((const unsigned char*)&what.type,len);
} catch (RtMidiError& e) {
logE("MIDI output error! %s",e.what());
return false;
}
return true; return true;
} }