| @@ -1783,6 +1783,9 @@ void setValueIfHigher(float& value, const float& compare) | |||
| void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t frames) | |||
| { | |||
| CARLA_ASSERT(kData->rack.in != nullptr); | |||
| CARLA_ASSERT(kData->rack.out != nullptr); | |||
| // initialize outputs (zero) | |||
| carla_zeroFloat(outBuf[0], frames); | |||
| carla_zeroFloat(outBuf[1], frames); | |||
| @@ -1514,14 +1514,8 @@ private: | |||
| carla_shm_close(fShmControl.shm); | |||
| } | |||
| void resizeAudioPool(uint32_t bufferSize = 0, double sampleRate = 0.0) | |||
| void resizeAudioPool(uint32_t bufferSize) | |||
| { | |||
| if (bufferSize == 0) | |||
| bufferSize = kData->engine->getBufferSize(); | |||
| if (sampleRate == 0.0) | |||
| sampleRate = kData->engine->getSampleRate(); | |||
| if (fShmAudioPool.data != nullptr) | |||
| carla_shm_unmap(fShmAudioPool.shm, fShmAudioPool.data, fShmAudioPool.size); | |||
| @@ -1067,8 +1067,8 @@ public: | |||
| uint32_t time, nEvents = kData->event.portIn->getEventCount(); | |||
| uint32_t startTime = 0; | |||
| uint32_t timeOffset = 0; | |||
| uint32_t nextBankId = 0; | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0) | |||
| nextBankId = kData->midiprog.data[kData->midiprog.current].bank; | |||
| @@ -1167,6 +1167,7 @@ public: | |||
| continue; | |||
| } | |||
| } | |||
| #endif | |||
| // Control plugin parameters | |||
| for (k=0; k < kData->param.count; ++k) | |||
| @@ -1197,7 +1198,6 @@ public: | |||
| setParameterValue(k, value, false, false, false); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | |||
| } | |||
| #endif | |||
| break; | |||
| } | |||
| @@ -1224,23 +1224,11 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| { | |||
| if (! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
| } | |||
| if (midiEventCount >= MAX_MIDI_EVENTS) | |||
| continue; | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (midiEventCount >= MAX_MIDI_EVENTS) | |||
| continue; | |||
| carla_zeroStruct<snd_seq_event_t>(fMidiEvents[midiEventCount]); | |||
| fMidiEvents[midiEventCount].time.tick = sampleAccurate ? startTime : time; | |||
| @@ -1254,20 +1242,17 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| if (event.channel == kData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| } | |||
| if (midiEventCount >= MAX_MIDI_EVENTS) | |||
| continue; | |||
| if (midiEventCount >= MAX_MIDI_EVENTS) | |||
| continue; | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| carla_zeroStruct<snd_seq_event_t>(fMidiEvents[midiEventCount]); | |||
| fMidiEvents[midiEventCount].time.tick = sampleAccurate ? startTime : time; | |||
| @@ -978,9 +978,9 @@ public: | |||
| uint32_t time, nEvents = kData->event.portIn->getEventCount(); | |||
| uint32_t timeOffset = 0; | |||
| uint32_t nextBankIds[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0 }; | |||
| uint32_t nextBankIds[MAX_MIDI_CHANNELS] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0 }; | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0 && kData->ctrlChannel >= 0 && kData->ctrlChannel < 16) | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0 && kData->ctrlChannel >= 0 && kData->ctrlChannel < MAX_MIDI_CHANNELS) | |||
| nextBankIds[kData->ctrlChannel] = kData->midiprog.data[kData->midiprog.current].bank; | |||
| for (i=0; i < nEvents; ++i) | |||
| @@ -1108,27 +1108,24 @@ public: | |||
| } | |||
| case kEngineControlEventTypeMidiBank: | |||
| if (event.channel < 16 && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||
| if (event.channel < MAX_MIDI_CHANNELS && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||
| nextBankIds[event.channel] = ctrlEvent.param; | |||
| break; | |||
| case kEngineControlEventTypeMidiProgram: | |||
| if (event.channel < 16 && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||
| if (event.channel < MAX_MIDI_CHANNELS && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||
| { | |||
| const uint32_t bankId = nextBankIds[event.channel]; | |||
| const uint32_t progId = ctrlEvent.param; | |||
| const uint32_t bankId(nextBankIds[event.channel]); | |||
| const uint32_t progId(ctrlEvent.param); | |||
| for (k=0; k < kData->midiprog.count; ++k) | |||
| { | |||
| if (kData->midiprog.data[k].bank == bankId && kData->midiprog.data[k].program == progId) | |||
| { | |||
| fluid_synth_program_select(fSynth, event.channel, fSynthId, bankId, progId); | |||
| if (event.channel == kData->ctrlChannel) | |||
| { | |||
| setMidiProgram(k, false, false, false); | |||
| postponeRtEvent(kPluginPostRtEventMidiProgramChange, k, 0, 0.0f); | |||
| } | |||
| else | |||
| fluid_synth_program_select(fSynth, event.channel, fSynthId, bankId, progId); | |||
| break; | |||
| } | |||
| @@ -1137,45 +1134,30 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| 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(fSynth, event.channel, MIDI_CONTROL_ALL_SOUND_OFF, 0); | |||
| #endif | |||
| } | |||
| } | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| if (event.channel == kData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| 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(fSynth, event.channel, MIDI_CONTROL_ALL_NOTES_OFF, 0); | |||
| #endif | |||
| } | |||
| } | |||
| break; | |||
| } | |||
| @@ -1010,18 +1010,7 @@ public: | |||
| case kEngineControlEventTypeMidiBank: | |||
| case kEngineControlEventTypeMidiProgram: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| #ifndef BUILD_BRIDGE | |||
| if (event.channel == kData->ctrlChannel) | |||
| { | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
| } | |||
| #endif | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| break; | |||
| } | |||
| @@ -573,8 +573,8 @@ public: | |||
| uint32_t time, nEvents = kData->event.portIn->getEventCount(); | |||
| uint32_t startTime = 0; | |||
| uint32_t timeOffset = 0; | |||
| uint32_t nextBankId = 0; | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0) | |||
| nextBankId = kData->midiprog.data[kData->midiprog.current].bank; | |||
| @@ -730,34 +730,23 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
| fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, event.channel, sampleAccurate ? startTime : time); | |||
| } | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, k, sampleAccurate ? startTime : time); | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| if (event.channel == kData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| } | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, k, sampleAccurate ? startTime : time); | |||
| fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_NOTES_OFF, 0, event.channel, sampleAccurate ? startTime : time); | |||
| } | |||
| break; | |||
| } | |||
| @@ -2605,8 +2605,8 @@ public: | |||
| uint32_t time, nEvents = fEventsIn.ctrl->port->getEventCount(); | |||
| uint32_t startTime = 0; | |||
| uint32_t timeOffset = 0; | |||
| uint32_t nextBankId = 0; | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0) | |||
| nextBankId = kData->midiprog.data[kData->midiprog.current].bank; | |||
| @@ -2782,37 +2782,46 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| uint8_t midiData[3]; | |||
| midiData[0] = MIDI_STATUS_CONTROL_CHANGE + i; | |||
| midiData[1] = MIDI_CONTROL_ALL_SOUND_OFF; | |||
| midiData[2] = 0; | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
| } | |||
| if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM) | |||
| lv2_atom_buffer_write(&evInAtomIters[fEventsIn.ctrlIndex], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| // TODO | |||
| else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT) | |||
| lv2_event_write(&evInEventIters[fEventsIn.ctrlIndex], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||
| else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) | |||
| lv2midi_put_event(&evInMidiStates[fEventsIn.ctrlIndex], 0, 3, midiData); | |||
| } | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| if (event.channel == kData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| } | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| // TODO | |||
| uint8_t midiData[3]; | |||
| midiData[0] = MIDI_STATUS_CONTROL_CHANGE + i; | |||
| midiData[1] = MIDI_CONTROL_ALL_NOTES_OFF; | |||
| midiData[2] = 0; | |||
| if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_ATOM) | |||
| lv2_atom_buffer_write(&evInAtomIters[fEventsIn.ctrlIndex], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||
| else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_EVENT) | |||
| lv2_event_write(&evInEventIters[fEventsIn.ctrlIndex], 0, 0, CARLA_URI_MAP_ID_MIDI_EVENT, 3, midiData); | |||
| else if (fEventsIn.ctrl->type & CARLA_EVENT_DATA_MIDI_LL) | |||
| lv2midi_put_event(&evInMidiStates[fEventsIn.ctrlIndex], 0, 3, midiData); | |||
| } | |||
| break; | |||
| } | |||
| @@ -1298,8 +1298,8 @@ public: | |||
| uint32_t time, nEvents = kData->event.portIn->getEventCount(); | |||
| uint32_t startTime = 0; | |||
| uint32_t timeOffset = 0; | |||
| uint32_t nextBankId = 0; | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0) | |||
| nextBankId = kData->midiprog.data[kData->midiprog.current].bank; | |||
| @@ -1320,7 +1320,6 @@ public: | |||
| { | |||
| startTime = 0; | |||
| timeOffset = time; | |||
| nextBankId = 0; | |||
| if (kData->midiprog.current >= 0 && kData->midiprog.count > 0) | |||
| nextBankId = kData->midiprog.data[kData->midiprog.current].bank; | |||
| @@ -1462,57 +1461,40 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| { | |||
| if (! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
| } | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| 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; | |||
| fMidiEvents[fMidiEventCount].data[3] = 0; | |||
| fMidiEvents[fMidiEventCount].size = 2; | |||
| fMidiEvents[fMidiEventCount].size = 3; | |||
| fMidiEventCount += 1; | |||
| } | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| if (event.channel == kData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| } | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| 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; | |||
| fMidiEvents[fMidiEventCount].data[3] = 0; | |||
| fMidiEvents[fMidiEventCount].size = 2; | |||
| fMidiEvents[fMidiEventCount].size = 3; | |||
| fMidiEventCount += 1; | |||
| } | |||
| @@ -1299,23 +1299,11 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllSoundOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| { | |||
| if (! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 0.0f); | |||
| postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_ACTIVE, 0, 1.0f); | |||
| } | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| carla_zeroStruct<VstMidiEvent>(fMidiEvents[fMidiEventCount]); | |||
| fMidiEvents[fMidiEventCount].type = kVstMidiType; | |||
| @@ -1329,20 +1317,17 @@ public: | |||
| break; | |||
| case kEngineControlEventTypeAllNotesOff: | |||
| if (event.channel == kData->ctrlChannel) | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| if (! allNotesOffSent) | |||
| if (event.channel == kData->ctrlChannel && ! allNotesOffSent) | |||
| { | |||
| allNotesOffSent = true; | |||
| sendMidiAllNotesOffToCallback(); | |||
| } | |||
| } | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| if (fMidiEventCount >= MAX_MIDI_EVENTS*2) | |||
| continue; | |||
| if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
| { | |||
| carla_zeroStruct<VstMidiEvent>(fMidiEvents[fMidiEventCount]); | |||
| fMidiEvents[fMidiEventCount].type = kVstMidiType; | |||
| @@ -2154,6 +2154,7 @@ void CarlaStyle::drawControl(ControlElement element, const QStyleOption *option, | |||
| return; | |||
| } | |||
| #if 0 // code does nothing? | |||
| if (flip) { | |||
| QRect tmp = rect; | |||
| rect = QRect(tmp.y(), tmp.x(), tmp.height(), tmp.width()); | |||
| @@ -2164,6 +2165,7 @@ void CarlaStyle::drawControl(ControlElement element, const QStyleOption *option, | |||
| x2 = y2; | |||
| y2 = temp; | |||
| } | |||
| #endif | |||
| painter->setRenderHint(QPainter::Antialiasing, true); | |||
| painter->translate(0.5, 0.5); | |||