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