diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index d2dffa09fc..f761684665 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -1141,6 +1141,7 @@ public: void refreshParameterList() override { parameters.clear(); + paramIDToIndex.clear(); if (audioUnit != nullptr) { @@ -1171,6 +1172,7 @@ public: ParamInfo* const param = new ParamInfo(); parameters.add (param); param->paramID = ids[i]; + paramIDToIndex[ids[i]] = i; param->minValue = info.minValue; param->maxValue = info.maxValue; param->automatable = (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0; @@ -1263,6 +1265,7 @@ private: }; OwnedArray parameters; + std::unordered_map paramIDToIndex; MidiDataConcatenator midiConcatenator; CriticalSection midiInLock; @@ -1348,13 +1351,10 @@ private: || event.mEventType == kAudioUnitEvent_BeginParameterChangeGesture || event.mEventType == kAudioUnitEvent_EndParameterChangeGesture) { - for (paramIndex = 0; paramIndex < parameters.size(); ++paramIndex) - { - const ParamInfo& p = *parameters.getUnchecked(paramIndex); + auto it = paramIDToIndex.find (event.mArgument.mParameter.mParameterID) - if (p.paramID == event.mArgument.mParameter.mParameterID) - break; - } + if (it != paramIDToIndex.end()) + paramIndex = it->second; if (! isPositiveAndBelow (paramIndex, parameters.size())) return; @@ -1364,7 +1364,7 @@ private: { case kAudioUnitEvent_ParameterValueChange: { - const ParamInfo& p = *parameters.getUnchecked(paramIndex); + auto& p = *parameters.getUnchecked (paramIndex); sendParamChangeMessageToListeners (paramIndex, (newValue - p.minValue) / (p.maxValue - p.minValue)); } break;