From 743c9d55e7eb5c1a204383ae0b0c3983e8016761 Mon Sep 17 00:00:00 2001 From: tpoole Date: Fri, 8 Sep 2017 12:55:44 +0100 Subject: [PATCH] AU: Implemented GetParameterValueStrings for discrete parameters --- .../AU/juce_AU_Wrapper.mm | 63 ++++++++++++++++++- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm index de27773daf..1ee9b0e179 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -90,6 +90,8 @@ static Array activePlugins, activeUIs; static const AudioUnitPropertyID juceFilterObjectPropertyID = 0x1a45ffe9; +template <> struct ContainerDeletePolicy { static void destroy (const __CFString* o) { if (o != nullptr) CFRelease (o); } }; + // make sure the audio processor is initialized before the AUBase class struct AudioProcessorHolder { @@ -880,6 +882,34 @@ public: return kAudioUnitErr_InvalidParameter; } + ComponentResult GetParameterValueStrings (AudioUnitScope inScope, + AudioUnitParameterID inParameterID, + CFArrayRef *outStrings) override + { + if (outStrings == nullptr) + return noErr; + + const int index = getJuceIndexForAUParameterID (inParameterID); + + if (inScope == kAudioUnitScope_Global + && juceFilter != nullptr + && isPositiveAndBelow (index, juceFilter->getNumParameters()) + && juceFilter->isParameterDiscrete (index)) + { + if (auto* valueStrings = parameterValueStringArrays[index]) + { + *outStrings = CFArrayCreate (NULL, + (const void **) valueStrings->getRawDataPointer(), + valueStrings->size(), + NULL); + + return noErr; + } + } + + return kAudioUnitErr_InvalidParameter; + } + ComponentResult GetParameter (AudioUnitParameterID inID, AudioUnitScope inScope, AudioUnitElement inElement, @@ -1613,6 +1643,9 @@ private: //============================================================================== AudioUnitHelpers::ChannelRemapper mapper; + //============================================================================== + OwnedArray> parameterValueStringArrays; + //============================================================================== void pullInputAudio (AudioUnitRenderActionFlags& flags, const AudioTimeStamp& timestamp, const UInt32 nFrames) noexcept { @@ -1747,9 +1780,7 @@ private: if (usingManagedParameter) { - const int n = juceFilter->getNumParameters(); - - for (int i = 0; i < n; ++i) + for (int i = 0; i < numParams; ++i) { const AudioUnitParameterID auParamID = generateAUParameterIDForIndex (i); @@ -1776,6 +1807,32 @@ private: if (param->isDiscrete()) jassert (param->getNumSteps() != juceFilter->getDefaultNumParameterSteps()); #endif + + parameterValueStringArrays.ensureStorageAllocated (numParams); + + for (int index = 0; index < numParams; ++index) + { + OwnedArray* stringValues = nullptr; + + #if ! JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE + if (juceFilter->isParameterDiscrete (index)) + { + if (auto* param = juceFilter->getParameters()[index]) + { + const auto numSteps = juceFilter->getParameterNumSteps (index); + stringValues = new OwnedArray(); + stringValues->ensureStorageAllocated (numSteps); + + const auto maxValue = getMaximumParameterValue (index); + + for (int i = 0; i < numSteps; ++i) + stringValues->add (CFStringCreateCopy (nullptr, (param->getText ((float) i / maxValue, 0)).toCFString())); ; + } + } + #endif + + parameterValueStringArrays.add (stringValues); + } } //==============================================================================