@@ -542,11 +542,11 @@ public: | |||
/*! | |||
* Overloaded functions, to be called from within RT context only. | |||
*/ | |||
void setDryWetRT(const float value) noexcept; | |||
void setVolumeRT(const float value) noexcept; | |||
void setBalanceLeftRT(const float value) noexcept; | |||
void setBalanceRightRT(const float value) noexcept; | |||
void setPanningRT(const float value) noexcept; | |||
void setDryWetRT(const float value, const bool sendCallbackLater) noexcept; | |||
void setVolumeRT(const float value, const bool sendCallbackLater) noexcept; | |||
void setBalanceLeftRT(const float value, const bool sendCallbackLater) noexcept; | |||
void setBalanceRightRT(const float value, const bool sendCallbackLater) noexcept; | |||
void setPanningRT(const float value, const bool sendCallbackLater) noexcept; | |||
#endif // ! BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
/*! | |||
@@ -576,7 +576,7 @@ public: | |||
/*! | |||
* Overloaded function, to be called from within RT context only. | |||
*/ | |||
virtual void setParameterValueRT(const uint32_t parameterId, const float value) noexcept; | |||
virtual void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept; | |||
/*! | |||
* Set a plugin's parameter value, including internal parameters. | |||
@@ -660,8 +660,8 @@ public: | |||
/*! | |||
* Overloaded functions, to be called from within RT context only. | |||
*/ | |||
virtual void setProgramRT(const uint32_t index) noexcept; | |||
virtual void setMidiProgramRT(const uint32_t index) noexcept; | |||
virtual void setProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept; | |||
virtual void setMidiProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept; | |||
// ------------------------------------------------------------------- | |||
// Plugin state | |||
@@ -571,12 +571,12 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | |||
std::snprintf(tmpBuf, STR_MAX, "%f:%f:%f:%f:%f:%f\n", | |||
static_cast<double>(paramRanges.def), | |||
static_cast<double>(paramRanges.min), | |||
static_cast<double>(paramRanges.max), | |||
static_cast<double>(paramRanges.step), | |||
static_cast<double>(paramRanges.stepSmall), | |||
static_cast<double>(paramRanges.stepLarge)); | |||
static_cast<double>(paramRanges.def), | |||
static_cast<double>(paramRanges.min), | |||
static_cast<double>(paramRanges.max), | |||
static_cast<double>(paramRanges.step), | |||
static_cast<double>(paramRanges.stepSmall), | |||
static_cast<double>(paramRanges.stepLarge)); | |||
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); | |||
std::snprintf(tmpBuf, STR_MAX, "PARAMVAL_%i:%i\n", pluginId, i); | |||
@@ -1042,7 +1042,10 @@ protected: | |||
if (CarlaPlugin* const plugin = _getFirstPlugin()) | |||
{ | |||
if (index < plugin->getParameterCount()) | |||
plugin->setParameterValueRT(index, value); | |||
{ | |||
const float rvalue = plugin->getParameterRanges(index).getUnnormalizedValue(value); | |||
plugin->setParameterValueRT(index, rvalue, false); | |||
} | |||
} | |||
fParameters[index] = value; | |||
@@ -50,7 +50,7 @@ static const MidiProgramData kMidiProgramDataNull = { 0, 0, nullptr }; | |||
static const CustomData kCustomDataFallback = { nullptr, nullptr, nullptr }; | |||
static /* */ CustomData kCustomDataFallbackNC = { nullptr, nullptr, nullptr }; | |||
static const PluginPostRtEvent kPluginPostRtEventFallback = { kPluginPostRtEventNull, 0, 0, 0, 0.0f }; | |||
static const PluginPostRtEvent kPluginPostRtEventFallback = { kPluginPostRtEventNull, false, 0, 0, 0, 0.0f }; | |||
// ------------------------------------------------------------------- | |||
// ParamSymbol struct, needed for CarlaPlugin::loadStateSave() | |||
@@ -1508,7 +1508,7 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s | |||
nullptr); | |||
} | |||
void CarlaPlugin::setDryWetRT(const float value) noexcept | |||
void CarlaPlugin::setDryWetRT(const float value, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f); | |||
@@ -1518,10 +1518,10 @@ void CarlaPlugin::setDryWetRT(const float value) noexcept | |||
return; | |||
pData->postProc.dryWet = fixedValue; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_DRYWET, 0, 0, fixedValue); | |||
} | |||
void CarlaPlugin::setVolumeRT(const float value) noexcept | |||
void CarlaPlugin::setVolumeRT(const float value, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.27f); | |||
@@ -1531,10 +1531,10 @@ void CarlaPlugin::setVolumeRT(const float value) noexcept | |||
return; | |||
pData->postProc.volume = fixedValue; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_VOLUME, 0, 0, fixedValue); | |||
} | |||
void CarlaPlugin::setBalanceLeftRT(const float value) noexcept | |||
void CarlaPlugin::setBalanceLeftRT(const float value, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); | |||
@@ -1544,10 +1544,10 @@ void CarlaPlugin::setBalanceLeftRT(const float value) noexcept | |||
return; | |||
pData->postProc.balanceLeft = fixedValue; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_BALANCE_LEFT, 0, 0, fixedValue); | |||
} | |||
void CarlaPlugin::setBalanceRightRT(const float value) noexcept | |||
void CarlaPlugin::setBalanceRightRT(const float value, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); | |||
@@ -1557,10 +1557,10 @@ void CarlaPlugin::setBalanceRightRT(const float value) noexcept | |||
return; | |||
pData->postProc.balanceRight = fixedValue; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_BALANCE_RIGHT, 0, 0, fixedValue); | |||
} | |||
void CarlaPlugin::setPanningRT(const float value) noexcept | |||
void CarlaPlugin::setPanningRT(const float value, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); | |||
@@ -1570,6 +1570,7 @@ void CarlaPlugin::setPanningRT(const float value) noexcept | |||
return; | |||
pData->postProc.panning = fixedValue; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_PANNING, 0, 0, fixedValue); | |||
} | |||
#endif // ! BUILD_BRIDGE_ALTERNATIVE_ARCH | |||
@@ -1626,9 +1627,10 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu | |||
nullptr); | |||
} | |||
void CarlaPlugin::setParameterValueRT(const uint32_t parameterId, const float value) noexcept | |||
void CarlaPlugin::setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(parameterId), 1, 0, value); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, | |||
sendCallbackLater, static_cast<int32_t>(parameterId), 0, 0, value); | |||
} | |||
void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept | |||
@@ -1832,7 +1834,7 @@ void CarlaPlugin::setMidiProgramById(const uint32_t bank, const uint32_t program | |||
} | |||
} | |||
void CarlaPlugin::setProgramRT(const uint32_t uindex) noexcept | |||
void CarlaPlugin::setProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(uindex < pData->prog.count,); | |||
@@ -1851,10 +1853,10 @@ void CarlaPlugin::setProgramRT(const uint32_t uindex) noexcept | |||
break; | |||
} | |||
pData->postponeRtEvent(kPluginPostRtEventProgramChange, index, 0, 0, 0.0f); | |||
pData->postponeRtEvent(kPluginPostRtEventProgramChange, sendCallbackLater, index, 0, 0, 0.0f); | |||
} | |||
void CarlaPlugin::setMidiProgramRT(const uint32_t uindex) noexcept | |||
void CarlaPlugin::setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); | |||
@@ -1873,7 +1875,7 @@ void CarlaPlugin::setMidiProgramRT(const uint32_t uindex) noexcept | |||
break; | |||
} | |||
pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, index, 0, 0, 0.0f); | |||
pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, sendCallbackLater, index, 0, 0, 0.0f); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1962,7 +1964,7 @@ void CarlaPlugin::idle() | |||
uiParameterChange(static_cast<uint32_t>(event.value1), event.valuef); | |||
} | |||
if (event.value2 != 0) | |||
if (event.sendCallback) | |||
{ | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
@@ -2007,13 +2009,15 @@ void CarlaPlugin::idle() | |||
nullptr); | |||
} | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_PROGRAM_CHANGED, | |||
pData->id, | |||
event.value1, | |||
0, 0, 0.0f, nullptr); | |||
if (event.sendCallback) | |||
{ | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_PROGRAM_CHANGED, | |||
pData->id, | |||
event.value1, | |||
0, 0, 0.0f, nullptr); | |||
} | |||
} break; | |||
case kPluginPostRtEventMidiProgramChange: { | |||
@@ -2048,13 +2052,15 @@ void CarlaPlugin::idle() | |||
nullptr); | |||
} | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, | |||
pData->id, | |||
event.value1, | |||
0, 0, 0.0f, nullptr); | |||
if (event.sendCallback) | |||
{ | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, | |||
pData->id, | |||
event.value1, | |||
0, 0, 0.0f, nullptr); | |||
} | |||
} break; | |||
case kPluginPostRtEventNoteOn: { | |||
@@ -2075,14 +2081,17 @@ void CarlaPlugin::idle() | |||
uiNoteOn(channel, note, velocity); | |||
} | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_NOTE_ON, | |||
pData->id, | |||
event.value1, | |||
event.value2, | |||
event.value3, | |||
0.0f, nullptr); | |||
if (event.sendCallback) | |||
{ | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_NOTE_ON, | |||
pData->id, | |||
event.value1, | |||
event.value2, | |||
event.value3, | |||
0.0f, nullptr); | |||
} | |||
} break; | |||
case kPluginPostRtEventNoteOff: { | |||
@@ -2101,13 +2110,16 @@ void CarlaPlugin::idle() | |||
uiNoteOff(channel, note); | |||
} | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_NOTE_OFF, | |||
pData->id, | |||
event.value1, | |||
event.value2, | |||
0, 0.0f, nullptr); | |||
if (event.sendCallback) | |||
{ | |||
// Update Host | |||
pData->engine->callback(true, true, | |||
ENGINE_CALLBACK_NOTE_OFF, | |||
pData->id, | |||
event.value1, | |||
event.value2, | |||
0, 0.0f, nullptr); | |||
} | |||
} break; | |||
} | |||
} | |||
@@ -2201,12 +2213,12 @@ void CarlaPlugin::postponeRtAllNotesOff() | |||
if (pData->ctrlChannel < 0 || pData->ctrlChannel >= MAX_MIDI_CHANNELS) | |||
return; | |||
PluginPostRtEvent postEvent; | |||
postEvent.type = kPluginPostRtEventNoteOff; | |||
postEvent.value1 = pData->ctrlChannel; | |||
postEvent.value2 = 0; | |||
postEvent.value3 = 0; | |||
postEvent.valuef = 0.0f; | |||
PluginPostRtEvent postEvent = { | |||
kPluginPostRtEventNoteOff, | |||
true, | |||
pData->ctrlChannel, | |||
0, 0, 0.0f | |||
}; | |||
for (int32_t i=0; i < MAX_MIDI_NOTE; ++i) | |||
{ | |||
@@ -781,6 +781,21 @@ public: | |||
CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback, doingInit); | |||
} | |||
void setProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(index < pData->prog.count,); | |||
{ | |||
const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | |||
fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetProgram); | |||
fShmNonRtClientControl.writeInt(static_cast<int32_t>(index)); | |||
fShmNonRtClientControl.commitWrite(); | |||
} | |||
CarlaPlugin::setProgramRT(index, sendCallbackLater); | |||
} | |||
void setMidiProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool doingInit) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast<int32_t>(pData->midiprog.count),); | |||
@@ -797,7 +812,7 @@ public: | |||
CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback, doingInit); | |||
} | |||
void setMidiProgramRT(const uint32_t uindex) noexcept override | |||
void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); | |||
@@ -809,7 +824,7 @@ public: | |||
fShmNonRtClientControl.commitWrite(); | |||
} | |||
CarlaPlugin::setMidiProgramRT(uindex); | |||
CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); | |||
} | |||
void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override | |||
@@ -1244,13 +1259,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -1274,8 +1289,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1399,6 +1414,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
midiData[2], | |||
@@ -1407,6 +1423,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
0, 0.0f); | |||
@@ -564,7 +564,7 @@ public: | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
} | |||
void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override | |||
void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
@@ -572,7 +572,7 @@ public: | |||
const float fixedValue(pData->param.getFixedValue(parameterId, value)); | |||
fParamBuffers[parameterId] = fixedValue; | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); | |||
} | |||
void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override | |||
@@ -661,7 +661,7 @@ public: | |||
CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback, doingInit); | |||
} | |||
void setMidiProgramRT(const uint32_t uindex) noexcept override | |||
void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor->select_program != nullptr,); | |||
@@ -669,7 +669,7 @@ public: | |||
setMidiProgramInDSSI(uindex); | |||
CarlaPlugin::setMidiProgramRT(uindex); | |||
CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); | |||
} | |||
void setMidiProgramInDSSI(const uint32_t uindex) noexcept | |||
@@ -1459,13 +1459,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -1489,8 +1489,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1523,7 +1523,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -1558,7 +1558,7 @@ public: | |||
{ | |||
if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId) | |||
{ | |||
setMidiProgramRT(k); | |||
setMidiProgramRT(k, true); | |||
break; | |||
} | |||
} | |||
@@ -1636,7 +1636,7 @@ public: | |||
seqEvent.data.note.channel = event.channel; | |||
seqEvent.data.note.note = note; | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, event.channel, note, 0, 0.0f); | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f); | |||
break; | |||
} | |||
@@ -1649,7 +1649,7 @@ public: | |||
seqEvent.data.note.note = note; | |||
seqEvent.data.note.velocity = velo; | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, event.channel, note, velo, 0.0f); | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f); | |||
break; | |||
} | |||
@@ -409,11 +409,11 @@ public: | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
} | |||
void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override | |||
void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override | |||
{ | |||
const float fixedValue = setParameterValueInFluidSynth(parameterId, value); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); | |||
} | |||
float setParameterValueInFluidSynth(const uint32_t parameterId, const float value) noexcept | |||
@@ -564,7 +564,7 @@ public: | |||
} | |||
// FIXME: this is never used | |||
void setMidiProgramRT(const uint32_t uindex) noexcept override | |||
void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fSynth != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); | |||
@@ -581,7 +581,7 @@ public: | |||
fCurMidiProgs[pData->ctrlChannel] = static_cast<int32_t>(uindex); | |||
} | |||
CarlaPlugin::setMidiProgramRT(uindex); | |||
CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1198,13 +1198,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -1228,8 +1228,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1262,7 +1262,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -1294,6 +1294,7 @@ public: | |||
if (event.channel == pData->ctrlChannel) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, | |||
true, | |||
static_cast<int32_t>(k), | |||
0, 0, 0.0f); | |||
} | |||
@@ -1347,7 +1348,7 @@ public: | |||
fluid_synth_noteoff(fSynth, event.channel, note); | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, event.channel, note, 0, 0.0f); | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f); | |||
break; | |||
} | |||
@@ -1357,7 +1358,7 @@ public: | |||
fluid_synth_noteon(fSynth, event.channel, note, velo); | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, event.channel, note, velo, 0.0f); | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f); | |||
break; | |||
} | |||
@@ -750,6 +750,7 @@ void CarlaPlugin::ProtectedData::postponeRtEvent(const PluginPostRtEvent& rtEven | |||
} | |||
void CarlaPlugin::ProtectedData::postponeRtEvent(const PluginPostRtEventType type, | |||
const bool sendCallbackLater, | |||
const int32_t value1, | |||
const int32_t value2, | |||
const int32_t value3, | |||
@@ -757,7 +758,7 @@ void CarlaPlugin::ProtectedData::postponeRtEvent(const PluginPostRtEventType typ | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(type != kPluginPostRtEventNull,); | |||
PluginPostRtEvent rtEvent = { type, value1, value2, value3, valuef }; | |||
PluginPostRtEvent rtEvent = { type, sendCallbackLater, value1, value2, value3, valuef }; | |||
postRtEvents.appendRT(rtEvent); | |||
} | |||
@@ -74,7 +74,7 @@ enum SpecialParameterType { | |||
enum PluginPostRtEventType { | |||
kPluginPostRtEventNull = 0, | |||
kPluginPostRtEventDebug, | |||
kPluginPostRtEventParameterChange, // param, SP (*), unused, value (SP: if 1 report to Callback and OSC) | |||
kPluginPostRtEventParameterChange, // param, (unused), (unused), value | |||
kPluginPostRtEventProgramChange, // index | |||
kPluginPostRtEventMidiProgramChange, // index | |||
kPluginPostRtEventNoteOn, // channel, note, velo | |||
@@ -87,6 +87,7 @@ enum PluginPostRtEventType { | |||
*/ | |||
struct PluginPostRtEvent { | |||
PluginPostRtEventType type; | |||
bool sendCallback; | |||
int32_t value1; | |||
int32_t value2; | |||
int32_t value3; | |||
@@ -360,6 +361,7 @@ struct CarlaPlugin::ProtectedData { | |||
void postponeRtEvent(const PluginPostRtEvent& rtEvent) noexcept; | |||
void postponeRtEvent(const PluginPostRtEventType type, | |||
const bool sendCallbackLater, | |||
const int32_t value1, const int32_t value2, const int32_t value3, | |||
const float valuef) noexcept; | |||
@@ -1008,13 +1008,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -1038,8 +1038,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1136,6 +1136,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
midiData[2], | |||
@@ -1144,6 +1145,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
0, 0.0f); | |||
@@ -821,13 +821,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -851,8 +851,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -886,7 +886,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -999,6 +999,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
midiData[2], | |||
@@ -1007,6 +1008,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
0, 0.0f); | |||
@@ -400,7 +400,7 @@ public: | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
} | |||
void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override | |||
void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater = true) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
@@ -408,7 +408,7 @@ public: | |||
const float fixedValue(pData->param.getFixedValue(parameterId, value)); | |||
fParamBuffers[parameterId] = fixedValue; | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -979,13 +979,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -1009,8 +1009,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1365,14 +1365,14 @@ public: | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
} | |||
void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override | |||
void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
const float fixedValue = setParamterValueCommon(parameterId, value); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); | |||
} | |||
void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override | |||
@@ -1455,7 +1455,7 @@ public: | |||
CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback, doingInit); | |||
} | |||
void setMidiProgramRT(const uint32_t uindex) noexcept override | |||
void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); | |||
@@ -1477,7 +1477,7 @@ public: | |||
} | |||
} | |||
CarlaPlugin::setMidiProgramRT(uindex); | |||
CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -3342,6 +3342,7 @@ public: | |||
if (doPostRt) | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, | |||
true, | |||
static_cast<int32_t>(k), | |||
0, | |||
0, | |||
@@ -3604,13 +3605,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -3634,8 +3635,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -3669,7 +3670,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -3731,7 +3732,7 @@ public: | |||
{ | |||
if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId) | |||
{ | |||
setMidiProgramRT(k); | |||
setMidiProgramRT(k, true); | |||
break; | |||
} | |||
} | |||
@@ -3849,6 +3850,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
midiData[2], | |||
@@ -3857,6 +3859,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
0, 0.0f); | |||
@@ -4139,6 +4142,7 @@ public: | |||
{ | |||
fParamBuffers[k] = pData->param.ranges[k].def; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, | |||
true, | |||
static_cast<int32_t>(k), | |||
1, 0, | |||
fParamBuffers[k]); | |||
@@ -4411,6 +4415,7 @@ public: | |||
fParamBuffers[k] = sampleRatef; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, | |||
true, | |||
static_cast<int32_t>(k), | |||
0, | |||
0, | |||
@@ -4429,6 +4434,7 @@ public: | |||
{ | |||
fParamBuffers[k] = isOffline ? pData->param.ranges[k].max : pData->param.ranges[k].min; | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, | |||
true, | |||
static_cast<int32_t>(k), | |||
0, | |||
0, | |||
@@ -5459,7 +5465,7 @@ public: | |||
{ | |||
if (pData->param.data[i].rindex == rindex) | |||
{ | |||
setParameterValueRT(i, paramValue); | |||
setParameterValueRT(i, paramValue, true); | |||
break; | |||
} | |||
} | |||
@@ -688,7 +688,7 @@ public: | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
} | |||
void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override | |||
void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->set_parameter_value != nullptr,); | |||
@@ -703,7 +703,7 @@ public: | |||
if (fHandle2 != nullptr) | |||
fDescriptor->set_parameter_value(fHandle2, parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); | |||
} | |||
void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override | |||
@@ -826,7 +826,7 @@ public: | |||
} | |||
// FIXME: this is never used | |||
void setMidiProgramRT(const uint32_t index) noexcept override | |||
void setMidiProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||
@@ -834,7 +834,7 @@ public: | |||
// TODO, put into check below | |||
if ((pData->hints & PLUGIN_IS_SYNTH) != 0 && (pData->ctrlChannel < 0 || pData->ctrlChannel >= MAX_MIDI_CHANNELS)) | |||
return CarlaPlugin::setMidiProgramRT(index); | |||
return CarlaPlugin::setMidiProgramRT(index, sendCallbackLater); | |||
const uint8_t channel = uint8_t((pData->ctrlChannel >= 0 && pData->ctrlChannel < MAX_MIDI_CHANNELS) ? pData->ctrlChannel : 0); | |||
const uint32_t bank = pData->midiprog.data[index].bank; | |||
@@ -853,7 +853,7 @@ public: | |||
fCurMidiProgs[channel] = static_cast<int32_t>(index); | |||
CarlaPlugin::setMidiProgramRT(index); | |||
CarlaPlugin::setMidiProgramRT(index, sendCallbackLater); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1816,13 +1816,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||
@@ -1846,8 +1846,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1880,7 +1880,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -1944,6 +1944,7 @@ public: | |||
if (event.channel == pData->ctrlChannel) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, | |||
true, | |||
static_cast<int32_t>(k), | |||
0, 0, 0.0f); | |||
} | |||
@@ -2055,6 +2056,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiEvent.data[1], | |||
midiEvent.data[2], | |||
@@ -2063,6 +2065,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiEvent.data[1], | |||
0, 0.0f); | |||
@@ -416,13 +416,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -446,8 +446,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -477,7 +477,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -543,6 +543,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
midiData[2], | |||
@@ -551,6 +552,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiData[1], | |||
0, 0.0f); | |||
@@ -388,7 +388,7 @@ public: | |||
CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); | |||
} | |||
void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override | |||
void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | |||
@@ -396,7 +396,7 @@ public: | |||
const float fixedValue(pData->param.getFixedValue(parameterId, value)); | |||
fEffect->setParameter(fEffect, static_cast<int32_t>(parameterId), fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue); | |||
CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); | |||
} | |||
void setChunkData(const void* const data, const std::size_t dataSize) override | |||
@@ -459,7 +459,7 @@ public: | |||
CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback, doingInit); | |||
} | |||
void setProgramRT(const uint32_t uindex) noexcept override | |||
void setProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(uindex < pData->prog.count,); | |||
@@ -476,7 +476,7 @@ public: | |||
dispatcher(effEndSetProgram); | |||
} CARLA_SAFE_EXCEPTION("effEndSetProgram"); | |||
CarlaPlugin::setProgramRT(uindex); | |||
CarlaPlugin::setProgramRT(uindex, sendCallbackLater); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -1310,13 +1310,13 @@ public: | |||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||
{ | |||
value = ctrlEvent.value; | |||
setDryWetRT(value); | |||
setDryWetRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||
{ | |||
value = ctrlEvent.value*127.0f/100.0f; | |||
setVolumeRT(value); | |||
setVolumeRT(value, true); | |||
} | |||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||
@@ -1340,8 +1340,8 @@ public: | |||
right = 1.0f; | |||
} | |||
setBalanceLeftRT(left); | |||
setBalanceRightRT(right); | |||
setBalanceLeftRT(left, true); | |||
setBalanceRightRT(right, true); | |||
} | |||
} | |||
#endif | |||
@@ -1375,7 +1375,7 @@ public: | |||
value = std::rint(value); | |||
} | |||
setParameterValueRT(k, value); | |||
setParameterValueRT(k, value, true); | |||
} | |||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
@@ -1428,7 +1428,7 @@ public: | |||
{ | |||
if (ctrlEvent.param < pData->prog.count) | |||
{ | |||
setProgramRT(ctrlEvent.param); | |||
setProgramRT(ctrlEvent.param, true); | |||
break; | |||
} | |||
} | |||
@@ -1533,6 +1533,7 @@ public: | |||
if (status == MIDI_STATUS_NOTE_ON) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, | |||
true, | |||
event.channel, | |||
midiEvent.data[1], | |||
midiEvent.data[2], | |||
@@ -1541,6 +1542,7 @@ public: | |||
else if (status == MIDI_STATUS_NOTE_OFF) | |||
{ | |||
pData->postponeRtEvent(kPluginPostRtEventNoteOff, | |||
true, | |||
event.channel, | |||
midiEvent.data[1], | |||
0, 0.0f); | |||
@@ -1911,19 +1913,19 @@ protected: | |||
else if (pthread_equal(thisThread, fProcThread)) | |||
{ | |||
CARLA_SAFE_ASSERT(fIsProcessing); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, index, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, true, index, 0, 0, fixedValue); | |||
} | |||
// Called from effSetChunk or effSetProgram | |||
else if (pthread_equal(thisThread, fChangingValuesThread)) | |||
{ | |||
carla_debug("audioMasterAutomate called while setting state"); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, index, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, true, index, 0, 0, fixedValue); | |||
} | |||
// Called from effIdle | |||
else if (pthread_equal(thisThread, fIdleThread)) | |||
{ | |||
carla_debug("audioMasterAutomate called from idle thread"); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, index, 1, 0, fixedValue); | |||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, true, index, 0, 0, fixedValue); | |||
} | |||
// Called from UI? | |||
else if (fUI.isVisible) | |||