diff --git a/mscore/pm.cpp b/mscore/pm.cpp index 486f2922e7a74..dfb98df8527bd 100644 --- a/mscore/pm.cpp +++ b/mscore/pm.cpp @@ -51,10 +51,18 @@ PortMidiDriver::PortMidiDriver(Seq* s) PortMidiDriver::~PortMidiDriver() { + if (timer) { + timer->stop(); + delete timer; + } if (inputStream) { Pt_Stop(); Pm_Close(inputStream); } + if (outputStream) { + Pt_Stop(); + Pm_Close(outputStream); + } } //--------------------------------------------------------- @@ -64,41 +72,38 @@ PortMidiDriver::~PortMidiDriver() bool PortMidiDriver::init() { - inputId = getDeviceIn(preferences.getString(PREF_IO_PORTMIDI_INPUTDEVICE)); - if (inputId == -1) - inputId = Pm_GetDefaultInputDeviceID(); - - if (inputId == pmNoDevice) - return false; - + inputId = getDeviceIn(preferences.getString(PREF_IO_PORTMIDI_INPUTDEVICE)); // Note: allow init even if inputId == pmNoDevice, in case of output outputId = getDeviceOut(preferences.getString(PREF_IO_PORTMIDI_OUTPUTDEVICE)); // Note: allow init even if outputId == pmNoDevice, since input is more important than output. - + if ((inputId == -1) && (preferences.getString(PREF_IO_PORTMIDI_INPUTDEVICE) != " ")) + inputId = Pm_GetDefaultInputDeviceID(); + if ((inputId == pmNoDevice) && (outputId == pmNoDevice)) + return false; static const int DRIVER_INFO = 0; static const int TIME_INFO = 0; Pt_Start(20, 0, 0); // timer started, 20 millisecond accuracy - PmError error = Pm_OpenInput(&inputStream, - inputId, - (void*)DRIVER_INFO, - preferences.getInt(PREF_IO_PORTMIDI_INPUTBUFFERCOUNT), - ((PmTimeProcPtr) Pt_Time), - (void*)TIME_INFO); - if (error != pmNoError) { - const char* p = Pm_GetErrorText(error); - qDebug("PortMidi: open input (id=%d) failed: %s", int(inputId), p); - Pt_Stop(); - return false; + if (inputId != pmNoDevice) { + PmError error = Pm_OpenInput(&inputStream, + inputId, + (void*)DRIVER_INFO, + preferences.getInt(PREF_IO_PORTMIDI_INPUTBUFFERCOUNT), + ((PmTimeProcPtr) Pt_Time), + (void*)TIME_INFO); + if (error != pmNoError) { + const char* p = Pm_GetErrorText(error); + qDebug("PortMidi: open input (id=%d) failed: %s", int(inputId), p); + Pt_Stop(); + return false; + } + Pm_SetFilter(inputStream, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX); + PmEvent buffer[1]; + while (Pm_Poll(inputStream)) + Pm_Read(inputStream, buffer, 1); } - Pm_SetFilter(inputStream, PM_FILT_ACTIVE | PM_FILT_CLOCK | PM_FILT_SYSEX); - - PmEvent buffer[1]; - while (Pm_Poll(inputStream)) - Pm_Read(inputStream, buffer, 1); - if (outputId != pmNoDevice) { - error = Pm_OpenOutput(&outputStream, + PmError error = Pm_OpenOutput(&outputStream, outputId, (void*)DRIVER_INFO, preferences.getInt(PREF_IO_PORTMIDI_OUTPUTBUFFERCOUNT), diff --git a/mscore/pm.h b/mscore/pm.h index 69339dd35a8cf..3f5544003c522 100644 --- a/mscore/pm.h +++ b/mscore/pm.h @@ -62,6 +62,7 @@ class PortMidiDriver : public MidiDriver { PmStream* getOutputStream() { return outputStream; } bool canOutput() { return outputStream != 0; } bool isSameCoreMidiIacBus(const QString& inInterfaceAndName, const QString& outInterfaceAndName); + int inputId() { return inputId } }; diff --git a/mscore/prefsdialog.cpp b/mscore/prefsdialog.cpp index 374bbf4f05678..1781b56f893a1 100644 --- a/mscore/prefsdialog.cpp +++ b/mscore/prefsdialog.cpp @@ -450,12 +450,20 @@ void PreferenceDialog::updateValues(bool useDefaultValues) PortMidiDriver* midiDriver = static_cast(audio->mididriver()); if (midiDriver) { QStringList midiInputs = midiDriver->deviceInList(); - int curMidiInIdx = 0; + int curMidiInIdx = -1; portMidiInput->clear(); + portMidiInput->addItem(" ", -1); // note: a space to be different from the default empty string. + // The current input device can be different from the saved preference if the preference was empty + // because of automatic grabbing of the default input device if not explicitly told otherwise. + // Therefore, comparison must be done with respect to the actual current input device name. + const PmDeviceInfo* info = Pm_GetDeviceInfo(midiDriver->inputId()); + QString portmidiInputDevice; + if(info && (info->input)) + portmidiInputDevice = QString(info->interf) + "," + QString(info->name); for(int i = 0; i < midiInputs.size(); ++i) { portMidiInput->addItem(midiInputs.at(i), i); - if (midiInputs.at(i) == preferences.getString(PREF_IO_PORTMIDI_INPUTDEVICE)) - curMidiInIdx = i; + if (midiInputs.at(i) == portmidiInputDevice) + curMidiInIdx = i + 1; } portMidiInput->setCurrentIndex(curMidiInIdx);