Hi Guys,
I’m writing an app that needs to handle multiple MIDI devices on Android in a robust way. I’ve found that if a device is unplugged, then reconnected to the same USB port, the whole app will hang until one or more MIDI devices is also disconnected, then spring back to life.
I’ve created a super simple test app that mimics the core of my main app. It just runs a timer, detects if there has been a change of midi device and opens ports to any devices present, and can replicate the hang every time.
void MainContentComponent::timerCallback()
{
StringArray newInputList = MidiInput::getDevices();
StringArray newOutputList = MidiOutput::getDevices();
bool inputHasChanged = false;
for (int i = 0; i < newInputList.size(); i++)
{
if (!inputList.contains(newInputList[i]))
{
inputHasChanged = true;
break;
}
}
for (int i = 0; i < inputList.size(); i++)
{
if (!newInputList.contains(inputList[i]))
{
inputHasChanged = true;
break;
}
}
bool outputHasChanged = false;
for (int i = 0; i < newOutputList.size(); i++)
{
if (!outputList.contains(newOutputList[i]))
{
outputHasChanged = true;
break;
}
}
for (int i = 0; i < outputList.size(); i++)
{
if (!newOutputList.contains(outputList[i]))
{
outputHasChanged = true;
break;
}
}
if (inputList.size() != newInputList.size())
{
inputHasChanged = true;
}
if (outputList.size() != newOutputList.size())
{
outputHasChanged = true;
}
if (inputHasChanged)
{
inputLog += "--------------------------------\n";
inputLog += "Input has changed: \n";
for (int i = 0; i < midiInputs.size(); ++i)
{
midiInputs[i]->stop();
}
midiInputs.clearQuick(true);
for (int i = 0; i < newInputList.size(); i++)
{
inputLog = inputLog + newInputList[i] + "\n";
DBG("Opening Device: " + newInputList[i]);
midiInputs.add(MidiInput::openDevice(i, this));
if (midiInputs.getLast() == nullptr)
{
inputLog += "input device error: " + midiInputs[i]->getName() + "\n";
}
}
inputList = newInputList;
inputDisp.setText(inputLog);
inputDisp.moveCaretToEnd();
}
if (outputHasChanged)
{
outputLog += "--------------------------------\n";
outputLog += "Output has changed: \n";
for (int i = 0; i < midiOutputs.size(); ++i)
{
if (midiOutputs[i] != nullptr)
{
midiOutputs[i]->stopBackgroundThread();
}
else
{
outputLog += "Output device error: " + midiOutputs[i]->getName() + "\n";
}
}
midiOutputs.clearQuick(true);
for (int i = 0; i < newOutputList.size(); i++)
{
outputLog = outputLog + newOutputList[i] + "\n";
DBG("Opening Device: " + newOutputList[i]);
midiOutputs.add(MidiOutput::openDevice(i));
if (midiInputs.getLast() == nullptr)
{
inputLog += "Output device error: " + midiInputs[i]->getName() + "\n";
}
else
{
midiOutputs[i]->startBackgroundThread();
}
}
outputList = newOutputList;
outputDisp.setText(outputLog);
outputDisp.moveCaretToEnd();
}
}
I’m not getting anything useful from ADB, any input would be appreciated.