@@ -471,6 +471,8 @@ public: | |||
const LADSPA_PortDescriptor portType = fDescriptor->PortDescriptors[i]; | |||
const LADSPA_PortRangeHint portRangeHints = fDescriptor->PortRangeHints[i]; | |||
CARLA_ASSERT(fDescriptor->PortNames[i] != nullptr); | |||
if (LADSPA_IS_PORT_AUDIO(portType)) | |||
{ | |||
portName.clear(); | |||
@@ -948,7 +950,7 @@ public: | |||
if (kData->needsReset || ! kData->activeBefore) | |||
{ | |||
if (kData->event.portIn != nullptr) | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
for (unsigned char j=0, l=MAX_MIDI_CHANNELS; j < MAX_MIDI_CHANNELS; j++) | |||
{ | |||
@@ -1181,7 +1183,7 @@ public: | |||
if (kData->midiprog.data[k].bank == nextBankId && kData->midiprog.data[k].program == nextProgramId) | |||
{ | |||
setMidiProgram(k, false, false, false); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f); | |||
break; | |||
} | |||
} | |||
@@ -1192,7 +1194,10 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
sendMidiAllNotesOff(); | |||
allNotesOffSent = true; | |||
} | |||
if (fDescriptor->deactivate != nullptr) | |||
{ | |||
@@ -1210,24 +1215,25 @@ public: | |||
fDescriptor->activate(fHandle2); | |||
} | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0); | |||
allNotesOffSent = true; | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
} | |||
if (midiEventCount >= MAX_MIDI_EVENTS) | |||
continue; | |||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[midiEventCount]); | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[midiEventCount]); | |||
fMidiEvents[midiEventCount].time.tick = sampleAccurate ? startTime : time; | |||
fMidiEvents[midiEventCount].time.tick = sampleAccurate ? startTime : time; | |||
fMidiEvents[midiEventCount].type = SND_SEQ_EVENT_CONTROLLER; | |||
fMidiEvents[midiEventCount].data.control.channel = event.channel; | |||
fMidiEvents[midiEventCount].data.control.param = MIDI_CONTROL_ALL_SOUND_OFF; | |||
fMidiEvents[midiEventCount].type = SND_SEQ_EVENT_CONTROLLER; | |||
fMidiEvents[midiEventCount].data.control.channel = event.channel; | |||
fMidiEvents[midiEventCount].data.control.param = MIDI_CONTROL_ALL_SOUND_OFF; | |||
midiEventCount += 1; | |||
midiEventCount += 1; | |||
} | |||
break; | |||
@@ -1235,23 +1241,27 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
allNotesOffSent = true; | |||
} | |||
} | |||
if (midiEventCount >= MAX_MIDI_EVENTS) | |||
continue; | |||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[midiEventCount]); | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents[midiEventCount]); | |||
fMidiEvents[midiEventCount].time.tick = sampleAccurate ? startTime : time; | |||
fMidiEvents[midiEventCount].time.tick = sampleAccurate ? startTime : time; | |||
fMidiEvents[midiEventCount].type = SND_SEQ_EVENT_CONTROLLER; | |||
fMidiEvents[midiEventCount].data.control.channel = event.channel; | |||
fMidiEvents[midiEventCount].data.control.param = MIDI_CONTROL_ALL_NOTES_OFF; | |||
fMidiEvents[midiEventCount].type = SND_SEQ_EVENT_CONTROLLER; | |||
fMidiEvents[midiEventCount].data.control.channel = event.channel; | |||
fMidiEvents[midiEventCount].data.control.param = MIDI_CONTROL_ALL_NOTES_OFF; | |||
midiEventCount += 1; | |||
midiEventCount += 1; | |||
} | |||
break; | |||
} | |||
@@ -1285,7 +1295,7 @@ public: | |||
fMidiEvents[midiEventCount].data.note.channel = channel; | |||
fMidiEvents[midiEventCount].data.note.note = note; | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0); | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0f); | |||
} | |||
else if (MIDI_IS_STATUS_NOTE_ON(status)) | |||
{ | |||
@@ -886,15 +886,18 @@ public: | |||
if (kData->needsReset || ! kData->activeBefore) | |||
{ | |||
for (int c=0; c < MAX_MIDI_CHANNELS; c++) | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
for (int c=0; c < MAX_MIDI_CHANNELS; c++) | |||
{ | |||
#ifdef FLUIDSYNTH_VERSION_NEW_API | |||
fluid_synth_all_notes_off(fSynth, c); | |||
fluid_synth_all_sounds_off(fSynth, c); | |||
fluid_synth_all_notes_off(fSynth, c); | |||
fluid_synth_all_sounds_off(fSynth, c); | |||
#else | |||
fluid_synth_cc(f_synth, c, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||
fluid_synth_cc(f_synth, c, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||
fluid_synth_cc(f_synth, c, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||
fluid_synth_cc(f_synth, c, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||
#endif | |||
} | |||
} | |||
kData->needsReset = false; | |||
@@ -1079,7 +1082,7 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
setMidiProgram(k, false, false, false); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f); | |||
} | |||
else | |||
fluid_synth_program_select(fSynth, event.channel, fSynthId, bankId, progId); | |||
@@ -1094,18 +1097,22 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
} | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0); | |||
allNotesOffSent = true; | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
#ifdef FLUIDSYNTH_VERSION_NEW_API | |||
fluid_synth_all_sounds_off(fSynth, event.channel); | |||
fluid_synth_all_sounds_off(fSynth, event.channel); | |||
#else | |||
fluid_synth_cc(f_synth, event.channel, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||
fluid_synth_cc(f_synth, event.channel, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||
#endif | |||
} | |||
} | |||
break; | |||
@@ -1113,15 +1120,19 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
} | |||
allNotesOffSent = true; | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
#ifdef FLUIDSYNTH_VERSION_NEW_API | |||
fluid_synth_all_notes_off(fSynth, event.channel); | |||
fluid_synth_all_notes_off(fSynth, event.channel); | |||
#else | |||
fluid_synth_cc(f_synth, event.channel, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||
fluid_synth_cc(f_synth, event.channel, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||
#endif | |||
} | |||
} | |||
break; | |||
} | |||
@@ -1146,7 +1157,7 @@ public: | |||
fluid_synth_noteoff(fSynth, channel, note); | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0); | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0f); | |||
} | |||
else if (MIDI_IS_STATUS_NOTE_ON(status)) | |||
{ | |||
@@ -986,8 +986,8 @@ public: | |||
fDescriptor->activate(fHandle2); | |||
} | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
} | |||
break; | |||
@@ -472,7 +472,7 @@ public: | |||
if (kData->needsReset || ! kData->activeBefore) | |||
{ | |||
if (kData->event.portIn != nullptr) | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; k++) | |||
{ | |||
@@ -670,7 +670,7 @@ public: | |||
if (kData->midiprog.data[k].bank == nextBankId && kData->midiprog.data[k].program == nextProgramId) | |||
{ | |||
setMidiProgram(k, false, false, false); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f); | |||
break; | |||
} | |||
} | |||
@@ -681,18 +681,20 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
} | |||
fAudioOutputDevice->Stop(); | |||
fAudioOutputDevice->Play(); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0); | |||
allNotesOffSent = true; | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
} | |||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, k, sampleAccurate ? startTime : time); | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, k, sampleAccurate ? startTime : time); | |||
break; | |||
@@ -700,12 +702,14 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
allNotesOffSent = true; | |||
} | |||
} | |||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, k, sampleAccurate ? startTime : time); | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, k, sampleAccurate ? startTime : time); | |||
break; | |||
} | |||
@@ -732,7 +736,7 @@ public: | |||
fMidiInputPort->DispatchNoteOff(note, 0, channel, fragmentPos); | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0); | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, note, 0.0f); | |||
} | |||
else if (MIDI_IS_STATUS_NOTE_ON(status)) | |||
{ | |||
@@ -1061,9 +1061,9 @@ public: | |||
// -------------------------------------------------------------------------------------------------------- | |||
// Check if not active before | |||
if (! kData->activeBefore) | |||
if (kData->needsReset || ! kData->activeBefore) | |||
{ | |||
if (kData->event.portIn != nullptr) | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; k++) | |||
{ | |||
@@ -1304,7 +1304,7 @@ public: | |||
if (kData->midiprog.data[k].bank == nextBankId && kData->midiprog.data[k].program == nextProgramId) | |||
{ | |||
setMidiProgram(k, false, false, false); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f); | |||
break; | |||
} | |||
} | |||
@@ -1315,7 +1315,10 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
} | |||
if (fDescriptor->deactivate != nullptr) | |||
{ | |||
@@ -1333,22 +1336,23 @@ public: | |||
fDescriptor->activate(fHandle2); | |||
} | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0); | |||
allNotesOffSent = true; | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
} | |||
if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
continue; | |||
fMidiEvents[fMidiEventCount].port = 0; | |||
fMidiEvents[fMidiEventCount].time = sampleAccurate ? startTime : time; | |||
fMidiEvents[fMidiEventCount].data[0] = MIDI_STATUS_CONTROL_CHANGE + event.channel; | |||
fMidiEvents[fMidiEventCount].data[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||
fMidiEvents[fMidiEventCount].data[2] = 0; | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
fMidiEvents[fMidiEventCount].port = 0; | |||
fMidiEvents[fMidiEventCount].time = sampleAccurate ? startTime : time; | |||
fMidiEvents[fMidiEventCount].data[0] = MIDI_STATUS_CONTROL_CHANGE + event.channel; | |||
fMidiEvents[fMidiEventCount].data[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||
fMidiEvents[fMidiEventCount].data[2] = 0; | |||
fMidiEventCount += 1; | |||
fMidiEventCount += 1; | |||
} | |||
break; | |||
@@ -1356,21 +1360,25 @@ public: | |||
if (event.channel == kData->ctrlChannel) | |||
{ | |||
if (! allNotesOffSent) | |||
{ | |||
allNotesOffSent = true; | |||
sendMidiAllNotesOff(); | |||
allNotesOffSent = true; | |||
} | |||
} | |||
if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
continue; | |||
fMidiEvents[fMidiEventCount].port = 0; | |||
fMidiEvents[fMidiEventCount].time = sampleAccurate ? startTime : time; | |||
fMidiEvents[fMidiEventCount].data[0] = MIDI_STATUS_CONTROL_CHANGE + event.channel; | |||
fMidiEvents[fMidiEventCount].data[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||
fMidiEvents[fMidiEventCount].data[2] = 0; | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
fMidiEvents[fMidiEventCount].port = 0; | |||
fMidiEvents[fMidiEventCount].time = sampleAccurate ? startTime : time; | |||
fMidiEvents[fMidiEventCount].data[0] = MIDI_STATUS_CONTROL_CHANGE + event.channel; | |||
fMidiEvents[fMidiEventCount].data[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||
fMidiEvents[fMidiEventCount].data[2] = 0; | |||
fMidiEventCount += 1; | |||
fMidiEventCount += 1; | |||
} | |||
break; | |||
} | |||
@@ -1413,7 +1421,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
postponeRtEvent(kPluginPostRtEventNoteOn, channel, midiEvent.data[1], midiEvent.data[2]); | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, midiEvent.data[1], 0.0); | |||
postponeRtEvent(kPluginPostRtEventNoteOff, channel, midiEvent.data[1], 0.0f); | |||
break; | |||
} | |||
@@ -97,6 +97,8 @@ public: | |||
dispatcher(effStopProcess, 0, 0, nullptr, 0.0f); | |||
dispatcher(effMainsChanged, 0, 0, nullptr, 0.0f); | |||
dispatcher(effClose, 0, 0, nullptr, 0.0f); | |||
fEffect = nullptr; | |||
} | |||
// ------------------------------------------------------------------- | |||