@@ -1651,25 +1651,23 @@ public: | |||||
#if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fStateCount, inElement, kAudioUnitErr_InvalidElement); | 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); | 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 | // 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; | return noErr; | ||||
#else | #else | ||||
@@ -34,6 +34,8 @@ | |||||
# error DISTRHO_PLUGIN_UNIQUE_ID undefined! | # error DISTRHO_PLUGIN_UNIQUE_ID undefined! | ||||
#endif | #endif | ||||
#include <iostream> | |||||
START_NAMESPACE_DISTRHO | START_NAMESPACE_DISTRHO | ||||
// -------------------------------------------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------------------------------------------- | ||||
@@ -322,14 +324,23 @@ private: | |||||
#if DISTRHO_PLUGIN_WANT_STATE | #if DISTRHO_PLUGIN_WANT_STATE | ||||
void setState(const char* const key, const char* const value) | 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); | |||||
} | |||||
} | } | ||||
} | } | ||||