26 using CreatePluginInstanceAsyncFunc = std::function<void (
27 const juce::PluginDescription &,
30 juce::AudioPluginFormat::AudioPluginFormat::PluginCreationCallback)>;
45 CreatePluginInstanceAsyncFunc create_plugin_instance_async_func,
46 std::function<units::sample_rate_t ()> sample_rate_provider,
47 std::function<
nframes_t ()> buffer_size_provider,
48 PluginHostWindowFactory top_level_window_provider,
49 QObject * parent =
nullptr);
57 void save_state (std::optional<fs::path> abs_state_dir)
override;
58 void load_state (std::optional<fs::path> abs_state_dir)
override;
63 void prepare_for_processing_impl (
64 units::sample_rate_t sample_rate,
73 void on_configuration_changed ();
78 void on_ui_visibility_changed ();
86 void initialize_juce_plugin_async ();
91 void create_ports_from_juce_plugin ();
96 void create_parameters_from_juce_plugin ();
101 void update_parameter_values ();
106 void sync_parameters_to_juce ();
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_;
131 std::unique_ptr<plugins::IPluginHostWindow> top_level_window_;
133 std::function<units::sample_rate_t ()> sample_rate_provider_;
134 std::function<
nframes_t ()> buffer_size_provider_;
136 juce::AudioBuffer<float> juce_audio_buffer_;
137 juce::MidiBuffer juce_midi_buffer_;
139 class JuceParamListener :
public juce::AudioProcessorParameter::Listener
143 : zrythm_param_ (zrythm_param)
147 void parameterValueChanged (
int parameterIndex,
float newValue)
148 [[clang::blocking]]
override
154 "{}: Parameter on JUCE side changed to {}",
156 zrythm_param_.setBaseValue (newValue);
158 void parameterGestureChanged (
int parameterIndex,
bool gestureIsStarting)
159 [[clang::blocking]]
override
171 struct ParameterMapping
173 juce::AudioProcessorParameter * juce_param;
174 dsp::ProcessorParameter * zrythm_param;
175 int juce_param_index;
176 std::unique_ptr<JuceParamListener> juce_param_listener;
179 std::vector<ParameterMapping> parameter_mappings_;
182 std::vector<float *> input_channels_;
183 std::vector<float *> output_channels_;
185 bool juce_initialized_ =
false;
186 bool editor_visible_ =
false;
187 bool plugin_loading_ =
false;
192 std::optional<juce::MemoryBlock> state_to_apply_;
194 PluginHostWindowFactory top_level_window_provider_;
JucePlugin(dsp::ProcessorBase::ProcessorBaseDependencies dependencies, StateDirectoryParentPathProvider state_path_provider, CreatePluginInstanceAsyncFunc create_plugin_instance_async_func, std::function< units::sample_rate_t()> sample_rate_provider, std::function< nframes_t()> buffer_size_provider, PluginHostWindowFactory top_level_window_provider, QObject *parent=nullptr)
Constructor for JucePlugin.
Plugin(ProcessorBaseDependencies dependencies, StateDirectoryParentPathProvider state_path_provider, QObject *parent)
Creates/initializes a plugin and its internal plugin (LV2, etc.) using the given setting.