Add button in midi settings to refresh midi devices

Deletes and creates a new RT midi instance allowing for midi devices to be plugged in without restarting
This commit is contained in:
Daniel Konar 2023-12-27 08:53:09 +01:00 committed by tildearrow
parent 65b50f4acc
commit c1c2b52ba7
5 changed files with 26 additions and 0 deletions

View file

@ -58,4 +58,9 @@ void TAAudio::quitMidi() {
delete midiOut;
midiOut=NULL;
}
}
bool TAAudio::reinitMidi(bool jack) {
quitMidi();
initMidi(jack);
}

View file

@ -178,6 +178,8 @@ class TAAudio {
virtual std::vector<String> listAudioDevices();
bool initMidi(bool jack);
void quitMidi();
/** remove and reload midi to allow hotswaping midi devices */
bool reinitMidi(bool jack);
virtual bool init(TAAudioDesc& request, TAAudioDesc& response);
TAAudio():

View file

@ -3473,6 +3473,15 @@ void DivEngine::rescanAudioDevices() {
}
}
void DivEngine::rescanMidiDevices() {
if (output!=NULL) {
logV("reloading midi...");
output->reinitMidi(false);
rescanAudioDevices();
}
}
void DivEngine::initDispatch(bool isRender) {
BUSY_BEGIN;
logV("initializing dispatch...");

View file

@ -1077,6 +1077,9 @@ class DivEngine {
// rescan audio devices
void rescanAudioDevices();
/** rescan midi devices */
void rescanMidiDevices();
// set the console mode.
void setConsoleMode(bool enable);

View file

@ -1129,6 +1129,13 @@ void FurnaceGUI::drawSettings() {
ImGui::EndCombo();
}
ImGui::SameLine();
if (ImGui::Button("Reload MIDI devices")) {
e->rescanMidiDevices();
audioEngineChanged=true;
settingsChanged=false;
}
if (hasToReloadMidi) {
midiMap.read(e->getConfigPath()+DIR_SEPARATOR_STR+"midiIn_"+stripName(settings.midiInDevice)+".cfg");
midiMap.compile();