26 using CreatePluginInstanceAsyncFunc = std::function<void (
27 const juce::PluginDescription &,
30 juce::AudioPluginFormat::AudioPluginFormat::PluginCreationCallback)>;
44 CreatePluginInstanceAsyncFunc create_plugin_instance_async_func,
45 std::function<units::sample_rate_t ()> sample_rate_provider,
46 std::function<units::sample_u32_t ()> buffer_size_provider,
47 PluginHostWindowFactory top_level_window_provider,
48 QObject * parent =
nullptr);
59 void prepare_for_processing_impl (
60 units::sample_rate_t sample_rate,
61 units::sample_u32_t max_block_length)
override;
65 std::string save_state_impl ()
const override;
66 void load_state_impl (
const std::string &base64_state)
override;
72 void on_configuration_changed (
74 bool generateNewPluginPortsAndParams);
79 void on_ui_visibility_changed ();
87 void initialize_juce_plugin_async (
bool generateNewPluginPortsAndParams);
92 void create_ports_from_juce_plugin ();
97 void create_parameters_from_juce_plugin ();
106 void sync_changed_params_to_juce () noexcept [[clang::nonblocking]];
118 static constexpr auto kStateKey =
"state"sv;
119 friend
void to_json (nlohmann::json &j, const
JucePlugin &p);
120 friend
void from_json (const nlohmann::json &j,
JucePlugin &p);
127 CreatePluginInstanceAsyncFunc create_plugin_instance_async_func_;
129 std::unique_ptr<juce::AudioPluginInstance> juce_plugin_;
130 std::unique_ptr<juce::AudioProcessorEditor> editor_;
133 std::function<units::sample_rate_t ()> sample_rate_provider_;
134 std::function<units::sample_u32_t ()> buffer_size_provider_;
136 juce::AudioBuffer<
float> juce_audio_buffer_;
137 juce::MidiBuffer juce_midi_buffer_;
139 class JuceParamListener : public juce::AudioProcessorParameter::Listener
142 JuceParamListener (
JucePlugin &parent) : parent_ (parent) { }
144 void parameterValueChanged (
int parameterIndex,
float newValue)
145 [[clang::blocking]]
override;
146 void parameterGestureChanged (
int parameterIndex,
bool gestureIsStarting)
147 [[clang::blocking]]
override;
154 struct ParameterMapping
156 juce::AudioProcessorParameter * juce_param;
158 int juce_param_index;
159 size_t zrythm_param_index;
160 std::unique_ptr<JuceParamListener> juce_param_listener;
163 std::vector<ParameterMapping> parameter_mappings_;
169 std::unordered_map<int, size_t> juce_param_index_to_mapping_;
176 std::unordered_map<size_t, size_t> zrythm_param_index_to_mapping_;
179 std::vector<float *> input_channels_;
180 std::vector<float *> output_channels_;
182 bool juce_initialized_ =
false;
183 bool editor_visible_ =
false;
184 bool plugin_loading_ =
false;
189 std::optional<juce::MemoryBlock> state_to_apply_;
191 PluginHostWindowFactory top_level_window_provider_;
JucePlugin(dsp::ProcessorBase::ProcessorBaseDependencies dependencies, CreatePluginInstanceAsyncFunc create_plugin_instance_async_func, std::function< units::sample_rate_t()> sample_rate_provider, std::function< units::sample_u32_t()> buffer_size_provider, PluginHostWindowFactory top_level_window_provider, QObject *parent=nullptr)
Constructor for JucePlugin.