commit 4ae14badcad9e6e0c30ea9d360fb9c44b20dd5fe
parent 9c1fabc52a54cbaf11e578a00d03b4f8cf774ef7
Author: falkTX <falktx@falktx.com>
Date: Fri, 23 Feb 2024 02:15:04 +0100
AU: handle UI->DSP state changes
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
5 files changed, 80 insertions(+), 22 deletions(-)
diff --git a/distrho/src/DistrhoPluginAU.cpp b/distrho/src/DistrhoPluginAU.cpp
@@ -402,6 +402,13 @@ public:
return noErr;
#endif
+ case 'DPFe':
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement);
+ outDataSize = sizeof(bool);
+ outWritable = true;
+ return noErr;
+
case 'DPFp':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement);
@@ -409,12 +416,14 @@ public:
outWritable = true;
return noErr;
- case 'DPFt':
+ #if DISTRHO_PLUGIN_WANT_STATE
+ case 'DPFs':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
- DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement);
- outDataSize = sizeof(bool);
+ DISTRHO_SAFE_ASSERT_RETURN(inElement != 0, kAudioUnitErr_InvalidElement);
+ outDataSize = inElement;
outWritable = true;
return noErr;
+ #endif
// unwanted properties
case kAudioUnitProperty_CPULoad:
@@ -917,21 +926,18 @@ public:
// TODO
return noErr;
- case 'DPFp':
+ case 'DPFe':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement);
- DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(float), inDataSize, kAudioUnitErr_InvalidPropertyValue);
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(bool), inDataSize, kAudioUnitErr_InvalidPropertyValue);
{
- const float value = *static_cast<const float*>(inData);
- DISTRHO_SAFE_ASSERT_RETURN(std::isfinite(value), kAudioUnitErr_InvalidParameterValue);
-
- fLastParameterValues[inElement] = value;
- fPlugin.setParameterValue(inElement, value);
+ const bool started = *static_cast<const bool*>(inData);
AudioUnitEvent event;
std::memset(&event, 0, sizeof(event));
- event.mEventType = kAudioUnitEvent_ParameterValueChange;
+ event.mEventType = started ? kAudioUnitEvent_BeginParameterChangeGesture
+ : kAudioUnitEvent_EndParameterChangeGesture;
event.mArgument.mParameter.mAudioUnit = fComponent;
event.mArgument.mParameter.mParameterID = inElement;
event.mArgument.mParameter.mScope = kAudioUnitScope_Global;
@@ -939,24 +945,41 @@ public:
}
return noErr;
- case 'DPFt':
+ case 'DPFp':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement);
- DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(bool), inDataSize, kAudioUnitErr_InvalidPropertyValue);
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(float), inDataSize, kAudioUnitErr_InvalidPropertyValue);
{
- const bool started = *static_cast<const bool*>(inData);
+ const float value = *static_cast<const float*>(inData);
+ DISTRHO_SAFE_ASSERT_RETURN(std::isfinite(value), kAudioUnitErr_InvalidParameterValue);
+
+ fLastParameterValues[inElement] = value;
+ fPlugin.setParameterValue(inElement, value);
AudioUnitEvent event;
std::memset(&event, 0, sizeof(event));
- event.mEventType = started ? kAudioUnitEvent_BeginParameterChangeGesture
- : kAudioUnitEvent_EndParameterChangeGesture;
+ event.mEventType = kAudioUnitEvent_ParameterValueChange;
event.mArgument.mParameter.mAudioUnit = fComponent;
event.mArgument.mParameter.mParameterID = inElement;
event.mArgument.mParameter.mScope = kAudioUnitScope_Global;
AUEventListenerNotify(NULL, NULL, &event);
}
return noErr;
+
+ #if DISTRHO_PLUGIN_WANT_STATE
+ case 'DPFs':
+ DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
+ DISTRHO_SAFE_ASSERT_RETURN(inElement != 0, kAudioUnitErr_InvalidElement);
+ DISTRHO_SAFE_ASSERT_UINT2_RETURN(inDataSize == inElement, inDataSize, inElement, kAudioUnitErr_InvalidPropertyValue);
+ {
+ const char* const key = static_cast<const char*>(inData);
+ const char* const value = key + std::strlen(key) + 1;
+
+ fPlugin.setState(key, value);
+ }
+ return noErr;
+ #endif
}
d_stdout("TODO SetProperty(%d:%s, %d:%s, %d, %p, %u)", inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement, inData, inDataSize);
diff --git a/distrho/src/DistrhoUIAU.mm b/distrho/src/DistrhoUIAU.mm
@@ -156,7 +156,7 @@ private:
void editParameter(const uint32_t rindex, const bool started) const
{
- AudioUnitSetProperty(fComponent, 'DPFt', kAudioUnitScope_Global, rindex, &started, sizeof(bool));
+ AudioUnitSetProperty(fComponent, 'DPFe', kAudioUnitScope_Global, rindex, &started, sizeof(bool));
}
static void editParameterCallback(void* const ptr, const uint32_t rindex, const bool started)
@@ -175,8 +175,19 @@ private:
}
#if DISTRHO_PLUGIN_WANT_STATE
- void setState(const char*, const char*)
+ void setState(const char* const key, const char* const value)
{
+ const size_t len_key = std::strlen(key);
+ const size_t len_value = std::strlen(value);
+ const size_t len_combined = len_key + len_value + 2;
+ char* const data = new char[len_combined];
+ std::memcpy(data, key, len_key);
+ std::memcpy(data + len_key + 1, value, len_value);
+ data[len_key] = data[len_key + len_value + 1] = '\0';
+
+ AudioUnitSetProperty(fComponent, 'DPFs', kAudioUnitScope_Global, len_combined, data, len_combined);
+
+ delete[] data;
}
static void setStateCallback(void* const ptr, const char* const key, const char* const value)
diff --git a/examples/Meters/DistrhoPluginInfo.h b/examples/Meters/DistrhoPluginInfo.h
@@ -22,6 +22,9 @@
#define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/Meters"
#define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.examples.meters"
+#define DISTRHO_PLUGIN_AU_SUBTYPE mtrs
+#define DISTRHO_PLUGIN_AU_MANUFACTURER Dstr
+
#define DISTRHO_PLUGIN_HAS_UI 1
#define DISTRHO_PLUGIN_IS_RT_SAFE 1
#define DISTRHO_PLUGIN_NUM_INPUTS 2
diff --git a/examples/Meters/ExampleUIMeters.cpp b/examples/Meters/ExampleUIMeters.cpp
@@ -41,7 +41,9 @@ public:
fColorValue(0),
// init meter values to 0
fOutLeft(0.0f),
- fOutRight(0.0f)
+ fOutRight(0.0f),
+ // FIXME
+ fNeedsRepaint(false)
{
setGeometryConstraints(32, 128, false);
}
@@ -71,7 +73,9 @@ protected:
if (fOutLeft != value)
{
fOutLeft = value;
- repaint();
+ // FIXME
+ // repaint();
+ fNeedsRepaint = true;
}
break;
@@ -84,7 +88,9 @@ protected:
if (fOutRight != value)
{
fOutRight = value;
- repaint();
+ // FIXME
+ // repaint();
+ fNeedsRepaint = true;
}
break;
}
@@ -198,6 +204,15 @@ protected:
return true;
}
+ void uiIdle() override
+ {
+ if (fNeedsRepaint)
+ {
+ fNeedsRepaint = false;
+ repaint();
+ }
+ }
+
// -------------------------------------------------------------------------------------------------------
private:
@@ -213,6 +228,9 @@ private:
*/
float fOutLeft, fOutRight;
+ // FIXME this shouldnt be needed!
+ bool fNeedsRepaint;
+
/**
Update color if needed.
*/
@@ -233,7 +251,9 @@ private:
break;
}
- repaint();
+ // FIXME
+ // repaint();
+ fNeedsRepaint = true;
}
/**
diff --git a/examples/Meters/Makefile b/examples/Meters/Makefile
@@ -40,6 +40,7 @@ TARGETS += lv2_sep
TARGETS += vst2
TARGETS += vst3
TARGETS += clap
+TARGETS += au
endif # HAVE_OPENGL