Avoid crash on startup when MIDI input/output cannot be created

* Use RtMidi's error callback
* Keep printing warnings/errors to stderr for now (showing the error
  somewhere in the UI would make much more sense)
This commit is contained in:
Martchus 2023-10-14 21:32:52 +02:00
parent 9287b9b7b5
commit cd5b89e4a0
2 changed files with 22 additions and 19 deletions

View File

@ -53,12 +53,14 @@ void CMidiDeviceRt::init()
m_rawDataIndex = 0;
try {
m_midiout = std::make_unique<RtMidiOut>();
} catch (RtMidiError &error) {
m_midiout->setErrorCallback(handleRtMidiError);
} catch (const RtMidiError &error) {
error.printMessage();
}
try {
m_midiin = std::make_unique<RtMidiIn>();
} catch (RtMidiError &error) {
m_midiin->setErrorCallback(handleRtMidiError);
} catch (const RtMidiError &error) {
error.printMessage();
}
}
@ -208,14 +210,7 @@ void CMidiDeviceRt::playMidiEvent(const CMidiEvent & event)
return;
}
try {
m_midiout->sendMessage( &message );
}
catch(RtMidiError &error){
error.printMessage();
m_validConnection = false;
}
m_midiout->sendMessage(&message);
//event.printDetails(); // useful for debugging
}
@ -224,16 +219,9 @@ int CMidiDeviceRt::checkMidiInput()
{
if (m_midiPorts[0] < 0)
return 0;
try {
m_stamp = m_midiin->getMessage( &m_inputMessage );
}
catch(RtMidiError &error){
error.printMessage();
m_validConnection = false;
m_stamp = m_midiin->getMessage( &m_inputMessage );
if (!m_validConnection)
return 0;
}
return m_inputMessage.size() > std::numeric_limits<int>::max() ? std::numeric_limits<int>::max() : static_cast<int>(m_inputMessage.size());
}
@ -328,3 +316,16 @@ int CMidiDeviceRt::midiSettingsGetInt(const QString &name)
Q_UNUSED(name)
return 0;
}
void CMidiDeviceRt::handleRtMidiError(RtMidiError::Type type, const std::string &errorText, void *userData)
{
static_cast<CMidiDeviceRt *>(userData)->handleRtMidiError(type, errorText);
}
void CMidiDeviceRt::handleRtMidiError(RtMidiError::Type type, const std::string &errorText)
{
std::cerr
<< (type == RtMidiError::WARNING || type == RtMidiError::DEBUG_WARNING ? "MIDI warning: " : "MIDI error: ")
<< errorText << '\n';
m_validConnection = false;
}

View File

@ -34,6 +34,8 @@
class CMidiDeviceRt : public CMidiDeviceBase {
virtual void init();
static void handleRtMidiError(RtMidiError::Type type, const std::string &errorText, void *userData);
void handleRtMidiError(RtMidiError::Type type, const std::string &errorText);
//! add a midi event to be played immediately
virtual void playMidiEvent(const CMidiEvent &event);
virtual int checkMidiInput();