Skip to content

Commit f9d4d04

Browse files
committed
MIDI fixes
1 parent 7e2343b commit f9d4d04

File tree

4 files changed

+50
-26
lines changed

4 files changed

+50
-26
lines changed

Source/Components/WelcomePanel.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,8 @@ class WelcomePanel : public Component
236236

237237
public:
238238
WelcomePanelTile(WelcomePanel& welcomePanel, ValueTree subTree, String svgImage, Colour iconColour, float scale, bool favourited, Image const& thumbImage = Image())
239-
: parent(welcomePanel)
240-
, isFavourited(favourited)
239+
: isFavourited(favourited)
240+
, parent(welcomePanel)
241241
, snapshotScale(scale)
242242
, thumbnailImageData(thumbImage)
243243
{
@@ -474,7 +474,7 @@ class WelcomePanel : public Component
474474

475475
Rectangle<int> getHeartIconBounds()
476476
{
477-
return Rectangle<int>(20, getHeight() - 80, 16, 16);
477+
return Rectangle<int>(26, getHeight() - 84, 16, 16);
478478
}
479479

480480
bool hitTest(int x, int y) override

Source/Dialogs/MidiSettingsPanel.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ class MidiSettingsComboBox : public PropertiesPanel::ComboComponent
1717
{
1818
comboBox.getSelectedIdAsValue().referTo(comboValue);
1919
comboValue = processor->getMidiDeviceManager().getMidiDevicePort(isInput, deviceInfo) + 2;
20-
std::cout << midiDeviceInfo.name << ", read port: " << getValue<int>(comboValue) << std::endl;
2120
comboValue.addListener(this);
2221
}
2322

@@ -39,7 +38,6 @@ class MidiSettingsComboBox : public PropertiesPanel::ComboComponent
3938
repaint();
4039
auto port = getValue<int>(comboValue);
4140
processor->getMidiDeviceManager().setMidiDevicePort(isInput, deviceInfo.name, deviceInfo.identifier, port - 2);
42-
std::cout << deviceInfo.name << ", write port: " << port - 2 << std::endl;
4341
}
4442

4543
bool isInput;

Source/PluginProcessor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -685,8 +685,8 @@ void PluginProcessor::processBlock(AudioBuffer<float>& buffer, MidiBuffer& midiB
685685
smoothedGain.setTargetValue(mappedTargetGain);
686686
smoothedGain.applyGain(buffer, buffer.getNumSamples());
687687

688-
midiDeviceManager.getLastMidiOutputEvents(midiOutputHistory, buffer.getNumSamples());
689-
688+
midiDeviceManager.sendAndCollectMidiOutput(midiOutputHistory);
689+
690690
statusbarSource->process(midiInputHistory, midiOutputHistory, totalNumOutputChannels);
691691
statusbarSource->setCPUUsage(cpuLoadMeasurer.getLoadAsPercentage());
692692
statusbarSource->peakBuffer.write(buffer);

Source/Utility/MidiDeviceManager.h

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
class MidiDeviceManager : public ChangeListener
1313
, public AsyncUpdater
1414
, public MidiInputCallback
15-
, public Timer
1615
{
1716

1817
public:
@@ -31,7 +30,7 @@ class MidiDeviceManager : public ChangeListener
3130

3231
updateMidiDevices();
3332
midiBufferIn.ensureSize(2048);
34-
startTimer(2);
33+
midiBufferOut.ensureSize(2048);
3534
}
3635

3736
~MidiDeviceManager()
@@ -252,29 +251,59 @@ class MidiDeviceManager : public ChangeListener
252251
auto& outputPort = outputPorts[port + 1];
253252
if(outputPort.enabled)
254253
{
255-
outputPort.queue.addEvent(message, samplePosition);
254+
outputPort.queue.enqueue({message, samplePosition});
256255
}
257256
}
258257

259258
// Read output buffer for a port. Used to pass back into the DAW or into the internal GM synth
260259
void dequeueMidiOutput(int port, MidiBuffer& buffer, int numSamples)
261260
{
262-
if (outputPorts[port + 1].enabled) {
263-
buffer.addEvents(outputPorts[port].queue, 0, numSamples, 0);
261+
auto& outputPort = outputPorts[port + 1];
262+
if (outputPort.enabled) {
263+
std::pair<MidiMessage, int> message;
264+
while(outputPort.queue.try_dequeue(message))
265+
{
266+
auto& [midiMessage, samplePosition] = message;
267+
outputPort.buffer.addEvent(midiMessage, samplePosition);
268+
}
269+
buffer.addEvents(buffer, 0, numSamples, 0);
264270
}
265271
}
266272

267-
void sendMidiOutput()
273+
// Sends pending MIDI output messages, and return a block with all messages
274+
void sendAndCollectMidiOutput(MidiBuffer& allOutputBuffer)
268275
{
269-
for (auto& port : outputPorts) {
270-
if(!port.enabled || port.queue.isEmpty()) continue;
271-
for (auto* device : port.devices) {
272-
device->sendBlockOfMessages(port.queue, Time::getMillisecondCounterHiRes(), currentSampleRate);
276+
for (auto& outputPort : outputPorts) {
277+
if(outputPort.enabled)
278+
{
279+
std::pair<MidiMessage, int> message;
280+
while(outputPort.queue.try_dequeue(message))
281+
{
282+
auto& [midiMessage, samplePosition] = message;
283+
outputPort.buffer.addEvent(midiMessage, samplePosition);
284+
allOutputBuffer.addEvent(midiMessage, samplePosition);
285+
}
286+
287+
if(!outputPort.buffer.isEmpty()) {
288+
for (auto* device : outputPort.devices) {
289+
device->sendBlockOfMessages(outputPort.buffer, Time::getMillisecondCounterHiRes(), currentSampleRate);
290+
}
291+
outputPort.buffer.clear();
292+
}
273293
}
274-
port.queue.clear();
275294
}
276295
}
277-
296+
297+
void clearMidiOutputBuffers()
298+
{
299+
for (auto& outputPort : outputPorts) {
300+
if(outputPort.enabled && !outputPort.buffer.isEmpty())
301+
{
302+
outputPort.buffer.clear();
303+
}
304+
}
305+
}
306+
278307
// Load last MIDI settings from our settings file
279308
void loadMidiSettings()
280309
{
@@ -343,17 +372,12 @@ class MidiDeviceManager : public ChangeListener
343372
{
344373
for (auto& port : outputPorts) {
345374
if (!port.enabled) continue;
346-
buffer.addEvents(port.queue, 0, numSamples, 0);
375+
buffer.addEvents(port.buffer, 0, numSamples, 0);
347376
}
348377
}
349378

350379
private:
351380

352-
void timerCallback() override
353-
{
354-
sendMidiOutput();
355-
}
356-
357381
void handleIncomingMidiMessage(MidiInput* input, MidiMessage const& message) override
358382
{
359383
auto port = [this, input]() -> int {
@@ -396,10 +420,12 @@ class MidiDeviceManager : public ChangeListener
396420
{
397421
std::atomic<bool> enabled = false;
398422
OwnedArray<MidiOutput> devices;
399-
MidiBuffer queue;
423+
moodycamel::ConcurrentQueue<std::pair<MidiMessage, int>> queue;
424+
MidiBuffer buffer;
400425
};
401426

402427
MidiBuffer midiBufferIn;
428+
MidiBuffer midiBufferOut;
403429

404430
MidiInput* toPlugdata = nullptr;
405431
MidiOutput* fromPlugdata = nullptr;

0 commit comments

Comments
 (0)