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:
parent
9287b9b7b5
commit
cd5b89e4a0
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue