26 using CreatePluginInstanceAsyncFunc = std::function<void (
27 const juce::PluginDescription &,
30 juce::AudioPluginFormat::AudioPluginFormat::PluginCreationCallback)>;
45 CreatePluginInstanceAsyncFunc create_plugin_instance_async_func,
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 (
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)
121 to_json (j,
static_cast<const Plugin &
> (p));
124 juce::MemoryBlock state_data;
125 p.juce_plugin_->getStateInformation (state_data);
126 auto encoded = state_data.toBase64Encoding ();
127 j[kStateKey] = encoded.toStdString ();
130 friend void from_json (
const nlohmann::json &j,
JucePlugin &p)
134 std::string state_str;
135 j[kStateKey].get_to (state_str);
136 p.state_to_apply_.emplace ();
137 p.state_to_apply_->fromBase64Encoding (state_str);
140 from_json (j,
static_cast<Plugin &
> (p));
148 CreatePluginInstanceAsyncFunc create_plugin_instance_async_func_;
150 std::unique_ptr<juce::AudioPluginInstance> juce_plugin_;
151 std::unique_ptr<juce::AudioProcessorEditor> editor_;
152 std::unique_ptr<plugins::IPluginHostWindow> top_level_window_;
155 std::function<
nframes_t ()> buffer_size_provider_;
157 juce::AudioBuffer<float> juce_audio_buffer_;
158 juce::MidiBuffer juce_midi_buffer_;
160 class JuceParamListener :
public juce::AudioProcessorParameter::Listener
164 : zrythm_param_ (zrythm_param)
168 void parameterValueChanged (
int parameterIndex,
float newValue)
169 [[clang::blocking]]
override
175 "{}: Parameter on JUCE side changed to {}",
176 zrythm_param_.get_node_name (), newValue);
177 zrythm_param_.setBaseValue (newValue);
179 void parameterGestureChanged (
int parameterIndex,
bool gestureIsStarting)
180 [[clang::blocking]]
override
188 dsp::ProcessorParameter &zrythm_param_;
192 struct ParameterMapping
194 juce::AudioProcessorParameter * juce_param;
195 dsp::ProcessorParameter * zrythm_param;
196 int juce_param_index;
197 std::unique_ptr<JuceParamListener> juce_param_listener;
200 std::vector<ParameterMapping> parameter_mappings_;
203 std::vector<float *> input_channels_;
204 std::vector<float *> output_channels_;
206 bool juce_initialized_ =
false;
207 bool editor_visible_ =
false;
208 bool plugin_loading_ =
false;
213 std::optional<juce::MemoryBlock> state_to_apply_;
215 PluginHostWindowFactory top_level_window_provider_;
JucePlugin(dsp::ProcessorBase::ProcessorBaseDependencies dependencies, StateDirectoryParentPathProvider state_path_provider, CreatePluginInstanceAsyncFunc create_plugin_instance_async_func, std::function< 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.