Browse Source

AU: handle UI->DSP state changes

Signed-off-by: falkTX <falktx@falktx.com>
pull/452/head
falkTX 1 year ago
parent
commit
4ae14badca
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
5 changed files with 80 additions and 22 deletions
  1. +39
    -16
      distrho/src/DistrhoPluginAU.cpp
  2. +13
    -2
      distrho/src/DistrhoUIAU.mm
  3. +3
    -0
      examples/Meters/DistrhoPluginInfo.h
  4. +24
    -4
      examples/Meters/ExampleUIMeters.cpp
  5. +1
    -0
      examples/Meters/Makefile

+ 39
- 16
distrho/src/DistrhoPluginAU.cpp View File

@@ -402,6 +402,13 @@ public:
return noErr; return noErr;
#endif #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': case 'DPFp':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); 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(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement);
@@ -409,12 +416,14 @@ public:
outWritable = true; outWritable = true;
return noErr; 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(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; outWritable = true;
return noErr; return noErr;
#endif


// unwanted properties // unwanted properties
case kAudioUnitProperty_CPULoad: case kAudioUnitProperty_CPULoad:
@@ -917,21 +926,18 @@ public:
// TODO // TODO
return noErr; return noErr;


case 'DPFp':
case 'DPFe':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); 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(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; AudioUnitEvent event;
std::memset(&event, 0, sizeof(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.mAudioUnit = fComponent;
event.mArgument.mParameter.mParameterID = inElement; event.mArgument.mParameter.mParameterID = inElement;
event.mArgument.mParameter.mScope = kAudioUnitScope_Global; event.mArgument.mParameter.mScope = kAudioUnitScope_Global;
@@ -939,24 +945,41 @@ public:
} }
return noErr; return noErr;


case 'DPFt':
case 'DPFp':
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); 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(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; AudioUnitEvent event;
std::memset(&event, 0, sizeof(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.mAudioUnit = fComponent;
event.mArgument.mParameter.mParameterID = inElement; event.mArgument.mParameter.mParameterID = inElement;
event.mArgument.mParameter.mScope = kAudioUnitScope_Global; event.mArgument.mParameter.mScope = kAudioUnitScope_Global;
AUEventListenerNotify(NULL, NULL, &event); AUEventListenerNotify(NULL, NULL, &event);
} }
return noErr; 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); d_stdout("TODO SetProperty(%d:%s, %d:%s, %d, %p, %u)", inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement, inData, inDataSize);


+ 13
- 2
distrho/src/DistrhoUIAU.mm View File

@@ -156,7 +156,7 @@ private:


void editParameter(const uint32_t rindex, const bool started) const 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) static void editParameterCallback(void* const ptr, const uint32_t rindex, const bool started)
@@ -175,8 +175,19 @@ private:
} }


#if DISTRHO_PLUGIN_WANT_STATE #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) static void setStateCallback(void* const ptr, const char* const key, const char* const value)


+ 3
- 0
examples/Meters/DistrhoPluginInfo.h View File

@@ -22,6 +22,9 @@
#define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/Meters" #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/examples/Meters"
#define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.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_HAS_UI 1
#define DISTRHO_PLUGIN_IS_RT_SAFE 1 #define DISTRHO_PLUGIN_IS_RT_SAFE 1
#define DISTRHO_PLUGIN_NUM_INPUTS 2 #define DISTRHO_PLUGIN_NUM_INPUTS 2


+ 24
- 4
examples/Meters/ExampleUIMeters.cpp View File

@@ -41,7 +41,9 @@ public:
fColorValue(0), fColorValue(0),
// init meter values to 0 // init meter values to 0
fOutLeft(0.0f), fOutLeft(0.0f),
fOutRight(0.0f)
fOutRight(0.0f),
// FIXME
fNeedsRepaint(false)
{ {
setGeometryConstraints(32, 128, false); setGeometryConstraints(32, 128, false);
} }
@@ -71,7 +73,9 @@ protected:
if (fOutLeft != value) if (fOutLeft != value)
{ {
fOutLeft = value; fOutLeft = value;
repaint();
// FIXME
// repaint();
fNeedsRepaint = true;
} }
break; break;


@@ -84,7 +88,9 @@ protected:
if (fOutRight != value) if (fOutRight != value)
{ {
fOutRight = value; fOutRight = value;
repaint();
// FIXME
// repaint();
fNeedsRepaint = true;
} }
break; break;
} }
@@ -198,6 +204,15 @@ protected:
return true; return true;
} }


void uiIdle() override
{
if (fNeedsRepaint)
{
fNeedsRepaint = false;
repaint();
}
}

// ------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------


private: private:
@@ -213,6 +228,9 @@ private:
*/ */
float fOutLeft, fOutRight; float fOutLeft, fOutRight;


// FIXME this shouldnt be needed!
bool fNeedsRepaint;

/** /**
Update color if needed. Update color if needed.
*/ */
@@ -233,7 +251,9 @@ private:
break; break;
} }


repaint();
// FIXME
// repaint();
fNeedsRepaint = true;
} }


/** /**


+ 1
- 0
examples/Meters/Makefile View File

@@ -40,6 +40,7 @@ TARGETS += lv2_sep
TARGETS += vst2 TARGETS += vst2
TARGETS += vst3 TARGETS += vst3
TARGETS += clap TARGETS += clap
TARGETS += au


endif # HAVE_OPENGL endif # HAVE_OPENGL




Loading…
Cancel
Save