From e021b3460a83e464785c10829af732db185b4a0d Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 3 Dec 2021 02:12:35 +0600 Subject: [PATCH] Make external MIDI options actually appear in Settings --- src/qt/qt_deviceconfig.cpp | 50 +++++++++++++++++++++++++++++++------- src/qt/qt_midi.cpp | 12 +++++++++ src/qt/rtmidi_midi.cpp | 26 ++++++++++++++++++-- 3 files changed, 77 insertions(+), 11 deletions(-) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index a0d62c1c9..a99e1ab26 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -11,6 +11,7 @@ extern "C" { #include <86box/86box.h> #include <86box/config.h> #include <86box/device.h> +#include <86box/plat_midi.h> } #include "qt_filefield.hpp" @@ -58,19 +59,50 @@ void DeviceConfig::ConfigureDevice(const _device_* device) { int currentIndex = -1; int selected = config_get_int(device_context.name, const_cast(config->name), config->default_int); - for (auto* sel = config->selection; (sel->description != nullptr) && (strlen(sel->description) > 0); ++sel) { - int rows = model->rowCount(); - model->insertRow(rows); - auto idx = model->index(rows, 0); + if (config->type == CONFIG_MIDI) { + for (int i = 0; i < plat_midi_get_num_devs(); i++) { + char midiName[512] = { 0 }; + plat_midi_get_dev_name(i, midiName); - model->setData(idx, sel->description, Qt::DisplayRole); - model->setData(idx, sel->value, Qt::UserRole); + int rows = model->rowCount(); + model->insertRow(rows); + auto idx = model->index(rows, 0); - if (selected == sel->value) { - currentIndex = idx.row(); + model->setData(idx, midiName, Qt::DisplayRole); + model->setData(idx, i, Qt::UserRole); + if (selected == i) { + currentIndex = idx.row(); + } + } + } else if (config->type == CONFIG_MIDI_IN) { + for (int i = 0; i < plat_midi_in_get_num_devs(); i++) { + char midiName[512] = { 0 }; + plat_midi_in_get_dev_name(i, midiName); + + int rows = model->rowCount(); + model->insertRow(rows); + auto idx = model->index(rows, 0); + + model->setData(idx, midiName, Qt::DisplayRole); + model->setData(idx, i, Qt::UserRole); + if (selected == i) { + currentIndex = idx.row(); + } + } + } else { + for (auto* sel = config->selection; (sel->description != nullptr) && (strlen(sel->description) > 0); ++sel) { + int rows = model->rowCount(); + model->insertRow(rows); + auto idx = model->index(rows, 0); + + model->setData(idx, sel->description, Qt::DisplayRole); + model->setData(idx, sel->value, Qt::UserRole); + + if (selected == sel->value) { + currentIndex = idx.row(); + } } } - dc.ui->formLayout->addRow(config->description, cbox); cbox->setCurrentIndex(currentIndex); break; diff --git a/src/qt/qt_midi.cpp b/src/qt/qt_midi.cpp index 0027e5b5a..a9b741c9e 100644 --- a/src/qt/qt_midi.cpp +++ b/src/qt/qt_midi.cpp @@ -29,4 +29,16 @@ int plat_midi_get_num_devs() int plat_midi_in_get_num_devs(void) { return 0; } +void plat_midi_get_dev_name(int num, char *s) +{ + s[0] = ' '; + s[1] = 0; +} + +void plat_midi_in_get_dev_name(int num, char *s) +{ + s[0] = ' '; + s[1] = 0; +} + } diff --git a/src/qt/rtmidi_midi.cpp b/src/qt/rtmidi_midi.cpp index b8ab2ca30..fd4ccbbaf 100644 --- a/src/qt/rtmidi_midi.cpp +++ b/src/qt/rtmidi_midi.cpp @@ -24,7 +24,7 @@ void plat_midi_init() { try { - midiout = new RtMidiOut; + if (!midiout) midiout = new RtMidiOut; } catch (RtMidiError& error) { @@ -63,6 +63,17 @@ void plat_midi_close() int plat_midi_get_num_devs() { + if (!midiout) + { + try + { + midiout = new RtMidiOut; + } + catch (RtMidiError& error) + { + pclog("Failed to initialize MIDI output: %s\n", error.getMessage().c_str()); + } + } return midiout ? midiout->getPortCount() : 0; } @@ -91,7 +102,7 @@ void plat_midi_input_init(void) { try { - midiin = new RtMidiIn; + if (!midiin) midiin = new RtMidiIn; } catch (RtMidiError& error) { @@ -132,6 +143,17 @@ void plat_midi_input_close(void) int plat_midi_in_get_num_devs(void) { + if (!midiin) + { + try + { + midiin = new RtMidiIn; + } + catch (RtMidiError& error) + { + pclog("Failed to initialize MIDI input: %s\n", error.getMessage().c_str()); + } + } return midiin ? midiin->getPortCount() : 0; }