{"title":"//在JUCE7.0.5的代码中,我选择了预置参数,然后分别保存选择前后的MemoryBlock 发现他们没有变化\n //Using setCurrentProgram() in VST2 plugins doesn’t change parameters or state (host side)\n struct ProgramAudioProcessorEditor : public AudioProcessorEditor\n {\n explicit ProgramAudioProcessorEditor (AudioProcessor& p)\n : AudioProcessorEditor (p)\n {\n setOpaque (true);\n\n addAndMakeVisible (listBox);\n listBox.updateContent();\n\n const auto rowHeight = listBox.getRowHeight();\n\n setSize (400, jlimit (rowHeight, 400, p.getNumPrograms() * rowHeight));\n }\n\n void paint (Graphics& g) override\n {\n g.fillAll (Colours::grey);\n }\n\n void resized() override\n {\n listBox.setBounds (getLocalBounds());\n }\n\n private:\n class Model : public ListBoxModel\n {\n public:\n Model (Component& o, AudioProcessor& p)\n : owner (o), proc (p) {}\n\n int getNumRows() override\n {\n return proc.getNumPrograms();\n }\n\n void paintListBoxItem (int rowNumber,\n Graphics& g,\n int width,\n int height,\n bool rowIsSelected) override\n {\n const auto textColour = owner.findColour (ListBox::textColourId);\n\n if (rowIsSelected)\n {\n const auto defaultColour = owner.findColour (ListBox::backgroundColourId);\n const auto c = rowIsSelected ? defaultColour.interpolatedWith (textColour, 0.5f)\n : defaultColour;\n\n g.fillAll (c);\n }\n\n g.setColour (textColour);\n g.drawText (proc.getProgramName (rowNumber),\n Rectangle { width, height }.reduced (2),\n Justification::left,\n true);\n }\n //选择了插件的预设\n void selectedRowsChanged (int row) override\n {\n if (0 <= row)\n {\n const Array < AudioProcessorParameter* >& parameters = proc.getParameters();\n //将所有的参数内容写出到 "D:\360MoveData\Users\Administrator\Desktop\test.ini" 稍后要进行比对\n File file("D:\360MoveData\Users\Administrator\Desktop\test.ini");\n for (AudioProcessorParameter* audioP : parameters)\n {\n auto value = audioP->getValue();\n auto name = audioP->getName(100);\n \n file.appendText(name + " " + String(value) + "\n");\n \n audioP->beginChangeGesture();\n }\n MemoryBlock mb1;\n proc.getStateInformation(mb1);\n\n \n proc.setCurrentProgram (row);// 设置当前的预设\n \n \n const Array < AudioProcessorParameter* >& parameters2 = proc.getParameters();\n File file2("D:\360MoveData\Users\Administrator\Desktop\test2.ini");\n for (AudioProcessorParameter* audioP : parameters2)\n {\n \n auto value = audioP->getValue();\n auto Index = audioP->getParameterIndex();\n proc.setParameterNotifyingHost(Index, value);// \n audioP->setValueNotifyingHost(audioP->getValue());\n\n\n //VST3 可以直接调用这个函数,但是AU和VST2不行,所以我选择了上面的方法\n // audioP->cachedParamValues.set(Index, value);\n // audioP->parameterDispatcher.push(Index, value);\n //但是上面的方法也没能更新插件的 state\n\n\n \n audioP->endChangeGesture();\n auto name = audioP->getName(100);\n file2.appendText(name + " " + String(value) + "\n");\n }\n\n //比较mb1 和 mb2 两个MemoryBlock 我发现他们是一样的,而 file1和 file2 内容是不一样的,所以选择了预设以后 虽然参数都改变了 ,但是state 还没有发生改变\n //那么如何在选择预设以后 更新state呢?\n //juce官方说所有的参数更改都要先路由到 cachedParamValues 里面,然后再更新state\n \n \n\n \n proc.refreshParameterList();\n proc.updateHostDisplay();\n proc.processorLayoutsChanged();\n\n \n MemoryBlock mb2;\n proc.getStateInformation(mb2);\n File StateInformation("D:\360MoveData\Users\Administrator\Desktop\StateInformation2.ini");\n StateInformation.appendText(mb2.toBase64Encoding());\n\n \n //比较 mb1 和 mb2\n if (mb1 == mb2)\n {\n juce::AlertWindow::showMessageBoxAsync(juce::AlertWindow::AlertIconType::InfoIcon, "===", "mb1 == mb2");\n }\n else\n {\n juce::AlertWindow::showMessageBoxAsync(juce::AlertWindow::AlertIconType::InfoIcon, "!!!===", "mb1 !!!== mb2");\n }\n\n }\n \n\n \n\n }\n\n private:\n Component& owner;\n AudioProcessor& proc;\n };\n\n Model model { *this, *getAudioProcessor() };\n ListBox listBox { "Programs", &model };\n\n JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProgramAudioProcessorEditor)\n };

JUCE VST2 插件:使用 setCurrentProgram() 更新参数和状态

原文地址: https://www.cveoy.top/t/topic/pn87 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录