void refreshParameterList()

in pedalboard/juce_overrides/juce_PatchedVST3PluginFormat.cpp [3100:3176]


  void refreshParameterList() override {
    AudioProcessorParameterGroup newParameterTree;

    // We're going to add parameter groups to the tree recursively in the same
    // order as the first parameters contained within them.
    std::map<Vst::UnitID, Vst::UnitInfo> infoMap;
    std::map<Vst::UnitID, AudioProcessorParameterGroup *> groupMap;
    groupMap[Vst::kRootUnitId] = &newParameterTree;

    if (unitInfo != nullptr) {
      const auto numUnits = unitInfo->getUnitCount();

      for (int i = 1; i < numUnits; ++i) {
        Vst::UnitInfo ui{};
        unitInfo->getUnitInfo(i, ui);
        infoMap[ui.id] = std::move(ui);
      }
    }

    {
      auto allIds = getAllParamIDs(*editController);
      inputParameterChanges->initialise(allIds);
      outputParameterChanges->initialise(allIds);
      cachedParamValues = CachedParamValues{std::move(allIds)};
    }

    for (int i = 0; i < editController->getParameterCount(); ++i) {
      auto paramInfo = getParameterInfoForIndex(i);
      auto *param = new VST3Parameter(
          *this, i, paramInfo.id,
          (paramInfo.flags & Vst::ParameterInfo::kCanAutomate) != 0);

      if ((paramInfo.flags & Vst::ParameterInfo::kIsBypass) != 0)
        bypassParam = param;

      std::function<AudioProcessorParameterGroup *(Vst::UnitID)>
          findOrCreateGroup;
      findOrCreateGroup = [&groupMap, &infoMap,
                           &findOrCreateGroup](Vst::UnitID groupID) {
        auto existingGroup = groupMap.find(groupID);

        if (existingGroup != groupMap.end())
          return existingGroup->second;

        auto groupInfo = infoMap.find(groupID);

        if (groupInfo == infoMap.end())
          return groupMap[Vst::kRootUnitId];

        auto *group = new AudioProcessorParameterGroup(
            String(groupInfo->first), toString(groupInfo->second.name), {});
        groupMap[groupInfo->first] = group;

        auto *parentGroup = findOrCreateGroup(groupInfo->second.parentUnitId);
        parentGroup->addChild(
            std::unique_ptr<AudioProcessorParameterGroup>(group));

        return group;
      };

      auto *group = findOrCreateGroup(paramInfo.unitId);
      group->addChild(std::unique_ptr<AudioProcessorParameter>(param));
    }

    setHostedParameterTree(std::move(newParameterTree));

    idToParamMap = [this] {
      std::map<Vst::ParamID, VST3Parameter *> result;

      for (auto *parameter : getParameters()) {
        auto *vst3Param = static_cast<VST3Parameter *>(parameter);
        result.emplace(vst3Param->getParamID(), vst3Param);
      }

      return result;
    }();
  }