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;
66 std::string save_state_impl ()
const override;
67 void load_state_impl (
const std::string &base64_state)
override;
73 void on_configuration_changed (
75 bool generateNewPluginPortsAndParams);
80 void on_ui_visibility_changed ();
88 void initialize_juce_plugin_async (
bool generateNewPluginPortsAndParams);
93 void create_ports_from_juce_plugin ();
98 void create_parameters_from_juce_plugin ();
107 void sync_changed_params_to_juce () noexcept [[clang::nonblocking]];
119 static constexpr auto kStateKey =
"state"sv;
120 friend
void to_json (nlohmann::json &j, const
JucePlugin &p);
121 friend
void from_json (const nlohmann::json &j,
JucePlugin &p);
128 CreatePluginInstanceAsyncFunc create_plugin_instance_async_func_;
130 std::unique_ptr<juce::AudioPluginInstance> juce_plugin_;
131 std::unique_ptr<juce::AudioProcessorEditor> editor_;
134 std::function<units::sample_rate_t ()> sample_rate_provider_;
135 std::function<units::sample_u32_t ()> buffer_size_provider_;
137 juce::AudioBuffer<
float> juce_audio_buffer_;
138 juce::MidiBuffer juce_midi_buffer_;
140 class JuceParamListener : public juce::AudioProcessorParameter::Listener
143 JuceParamListener (
JucePlugin &parent) : parent_ (parent) { }
145 void parameterValueChanged (
int parameterIndex,
float newValue)
146 [[clang::blocking]]
override;
147 void parameterGestureChanged (
int parameterIndex,
bool gestureIsStarting)
148 [[clang::blocking]]
override;
155 struct ParameterMapping
157 juce::AudioProcessorParameter * juce_param;
159 int juce_param_index;
160 size_t zrythm_param_index;
161 std::unique_ptr<JuceParamListener> juce_param_listener;
164 std::vector<ParameterMapping> parameter_mappings_;
170 std::unordered_map<int, size_t> juce_param_index_to_mapping_;
177 std::unordered_map<size_t, size_t> zrythm_param_index_to_mapping_;
180 std::vector<float *> input_channels_;
181 std::vector<float *> output_channels_;
183 bool juce_initialized_ =
false;
184 bool editor_visible_ =
false;
185 bool plugin_loading_ =
false;
190 std::optional<juce::MemoryBlock> state_to_apply_;
192 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.