Browse Source

Updated setState on AU components to allow arbitrary key-value pairs to have parity with other plugin formats on macOS.

pull/498/head
TheOnlyJoey 1 month ago
parent
commit
870ac0b4f2
2 changed files with 29 additions and 20 deletions
  1. +11
    -13
      distrho/src/DistrhoPluginAU.cpp
  2. +18
    -7
      distrho/src/DistrhoUIAU.mm

+ 11
- 13
distrho/src/DistrhoPluginAU.cpp View File

@@ -1651,25 +1651,23 @@ public:
#if DISTRHO_PLUGIN_WANT_STATE
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fStateCount, inElement, kAudioUnitErr_InvalidElement);
{
const CFStringRef valueRef = *static_cast<const CFStringRef*>(inData);
DISTRHO_SAFE_ASSERT_RETURN(valueRef != nullptr && CFGetTypeID(valueRef) == CFStringGetTypeID(),
const CFDictionaryRef dictRef = *static_cast<const CFDictionaryRef*>(inData);
DISTRHO_SAFE_ASSERT_RETURN(dictRef != nullptr && CFGetTypeID(dictRef) == CFDictionaryGetTypeID(),
kAudioUnitErr_InvalidPropertyValue);
const void * keyArr;
const void * valueArr;
CFDictionaryGetKeysAndValues(dictRef, &keyArr, &valueArr);

const CFIndex valueLen = CFStringGetLength(valueRef);
char* const value = static_cast<char*>(std::malloc(valueLen + 1));
DISTRHO_SAFE_ASSERT_RETURN(value != nullptr, kAudio_ParamError);
DISTRHO_SAFE_ASSERT_RETURN(CFStringGetCString(valueRef, value, valueLen + 1, kCFStringEncodingUTF8),
kAudioUnitErr_InvalidPropertyValue);
const char* cKey = [keyArr UTF8String];
const char* cValue = [valueArr UTF8String];

const String& key(fPlugin.getStateKey(inElement));
const String stringKey(cKey);

// save this key as needed
if (fPlugin.wantStateKey(key))
fStateMap[key] = value;

fPlugin.setState(key, value);
if (fPlugin.wantStateKey(stringKey))
fStateMap[stringKey] = cValue;

std::free(value);
fPlugin.setState(stringKey, cValue);
}
return noErr;
#else


+ 18
- 7
distrho/src/DistrhoUIAU.mm View File

@@ -34,6 +34,8 @@
# error DISTRHO_PLUGIN_UNIQUE_ID undefined!
#endif

#include <iostream>

START_NAMESPACE_DISTRHO

// --------------------------------------------------------------------------------------------------------------------
@@ -322,14 +324,23 @@ private:
#if DISTRHO_PLUGIN_WANT_STATE
void setState(const char* const key, const char* const value)
{
const std::vector<String>::iterator it = std::find(fStateKeys.begin(), fStateKeys.end(), key);
DISTRHO_SAFE_ASSERT_RETURN(it != fStateKeys.end(),);

if (const CFStringRef valueRef = CFStringCreateWithCString(nullptr, value, kCFStringEncodingUTF8))
if (const CFStringRef keyRef = CFStringCreateWithCString((CFAllocatorRef )NULL,key,kCFStringEncodingUTF8))
{
const uint32_t index = it - fStateKeys.begin();
AudioUnitSetProperty(fComponent, 'DPFs', kAudioUnitScope_Global, index, &valueRef, sizeof(CFStringRef));
CFRelease(valueRef);
if (const CFStringRef valueRef = CFStringCreateWithCString(( CFAllocatorRef )NULL,
value,kCFStringEncodingUTF8))
{
CFTypeRef keyArrayRef[1] = {keyRef};
CFTypeRef valueArrayRef[1] = {valueRef};

CFDictionaryRef dictRef = CFDictionaryCreate((CFAllocatorRef)NULL,( const void ** )keyArrayRef,
( const void ** )valueArrayRef, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

AudioUnitSetProperty(fComponent, 'DPFs', kAudioUnitScope_Global, 0, &dictRef, sizeof(dictRef));

CFRelease(keyRef);
CFRelease(valueRef);
CFRelease(dictRef);
}
}
}



Loading…
Cancel
Save