diff --git a/distrho/src/DistrhoPluginAU.cpp b/distrho/src/DistrhoPluginAU.cpp index b97bdb0d..88b96ac9 100644 --- a/distrho/src/DistrhoPluginAU.cpp +++ b/distrho/src/DistrhoPluginAU.cpp @@ -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(inData); - DISTRHO_SAFE_ASSERT_RETURN(valueRef != nullptr && CFGetTypeID(valueRef) == CFStringGetTypeID(), + const CFDictionaryRef dictRef = *static_cast(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(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 diff --git a/distrho/src/DistrhoUIAU.mm b/distrho/src/DistrhoUIAU.mm index 1b3f77e5..9ad06aa8 100644 --- a/distrho/src/DistrhoUIAU.mm +++ b/distrho/src/DistrhoUIAU.mm @@ -34,6 +34,8 @@ # error DISTRHO_PLUGIN_UNIQUE_ID undefined! #endif +#include + 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::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); + } } }