summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfalkTX <falktx@gmail.com>2019-01-28 21:59:48 +0000
committerfalkTX <falktx@gmail.com>2019-01-28 21:59:48 +0000
commitf530315314f7bb54e47eb381744bd67f56779bb5 (patch)
treed34e748a229fc6ddd969cc8073683ae599239ed4
parent69633c12ab48c8fd57907929e6a093b97c2af131 (diff)
Working AU parameter changes
-rw-r--r--distrho/src/DistrhoPluginAU.cpp90
1 files changed, 73 insertions, 17 deletions
diff --git a/distrho/src/DistrhoPluginAU.cpp b/distrho/src/DistrhoPluginAU.cpp
index 1a53be1c..04dc4e3b 100644
--- a/distrho/src/DistrhoPluginAU.cpp
+++ b/distrho/src/DistrhoPluginAU.cpp
@@ -49,12 +49,14 @@ public:
: AUEffectBase(component),
fLastValuesInit(),
fPlugin(this, writeMidiCallback),
- fNumChannels(0)
+ fNumChannels(0),
+ fLastParameterValues(nullptr)
{
CreateElements();
// FIXME this does not seem right
fNumChannels = GetNumberOfChannels();
+ d_stdout("fNumChannels %u", fNumChannels);
DISTRHO_SAFE_ASSERT(fNumChannels == DISTRHO_PLUGIN_NUM_INPUTS);
AUElement* const globals = Globals();
@@ -62,15 +64,24 @@ public:
if (const uint32_t paramCount = fPlugin.getParameterCount())
{
+ fLastParameterValues = new float[paramCount];
globals->UseIndexedParameters(paramCount);
for (uint32_t i=0; i < paramCount; ++i)
- globals->SetParameter(i, fPlugin.getParameterValue(i));
+ {
+ fLastParameterValues[i] = fPlugin.getParameterValue(i);
+ globals->SetParameter(i, fLastParameterValues[i]);
+ }
}
}
~PluginAU() override
{
+ if (fLastParameterValues)
+ {
+ delete[] fLastParameterValues;
+ fLastParameterValues = nullptr;
+ }
}
OSStatus GetParameterValueStrings(AudioUnitScope inScope,
@@ -167,9 +178,12 @@ public:
return AUEffectBase::GetProperty (inID, inScope, inElement, outData);
}
+#if 0
void SetParameter(AudioUnitParameterID index,
AudioUnitParameterValue value) override
{
+ d_stdout("SetParameter %u %f", index, value);
+
const uint32_t hints(fPlugin.getParameterHints(index));
const ParameterRanges& ranges(fPlugin.getParameterRanges(index));
@@ -186,13 +200,7 @@ public:
fPlugin.setParameterValue(index, value);
//printf("SET: id=%d val=%f\n", index, value);
}
-
- AudioUnitParameterValue GetParameter(AudioUnitParameterID index) override
- {
- AudioUnitParameterValue value = AUEffectBase::GetParameter(index);
- //printf("GET: id=%d val=%f\n", index, value);
- return value;
- }
+#endif
bool SupportsTail() override
{
@@ -209,19 +217,19 @@ public:
AudioBufferList &outBuffer,
UInt32 inFramesToProcess) override
{
- float* srcBuffer[fNumChannels];
- float* destBuffer[fNumChannels];
+ const float* srcBuffer[fNumChannels];
+ /* */ float* destBuffer[fNumChannels];
for (uint32_t i = 0; i < fNumChannels; ++i) {
- srcBuffer[i] = (Float32 *)inBuffer.mBuffers[i].mData;
- destBuffer[i] = (Float32 *)outBuffer.mBuffers[i].mData;
+ srcBuffer[i] = (const float*)inBuffer.mBuffers[i].mData;
+ destBuffer[i] = (float *)outBuffer.mBuffers[i].mData;
}
- for (uint32_t i = 0; i < fPlugin.getParameterCount(); ++i) {
- SetParameter(i, GetParameter(i));
- }
+ updateParameterInputs();
+
+ fPlugin.run(srcBuffer, destBuffer, inFramesToProcess);
- fPlugin.run((const float **)srcBuffer, (float **)destBuffer, inFramesToProcess);
+ updateParameterOutputsAndTriggers();
ioActionFlags &= ~kAudioUnitRenderAction_OutputIsSilence;
@@ -235,6 +243,54 @@ private:
PluginExporter fPlugin;
uint32_t fNumChannels;
+ // Temporary data
+ float* fLastParameterValues;
+
+ void updateParameterInputs()
+ {
+ float value;
+
+ for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i)
+ {
+ if (! fPlugin.isParameterInput(i))
+ continue;
+
+ value = GetParameter(i);
+
+ if (d_isEqual(fLastParameterValues[i], value))
+ continue;
+
+ fLastParameterValues[i] = value;
+ fPlugin.setParameterValue(i, value);
+ }
+ }
+
+ void updateParameterOutputsAndTriggers()
+ {
+ float value;
+
+ for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i)
+ {
+ if (fPlugin.isParameterOutput(i))
+ {
+ value = fLastParameterValues[i] = fPlugin.getParameterValue(i);
+ SetParameter(i, value);
+ }
+ else if ((fPlugin.getParameterHints(i) & kParameterIsTrigger) == kParameterIsTrigger)
+ {
+ // NOTE: no trigger support in AU, simulate it here
+ value = fPlugin.getParameterRanges(i).def;
+
+ if (d_isEqual(value, fPlugin.getParameterValue(i)))
+ continue;
+
+ fLastParameterValues[i] = value;
+ fPlugin.setParameterValue(i, value);
+ SetParameter(i, value);
+ }
+ }
+ }
+
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginAU)
};