Ardour  8.12
plugin_ui.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2006 Taybin Rutkin <taybin@taybin.com>
3  * Copyright (C) 2005-2015 Paul Davis <paul@linuxaudiosystems.com>
4  * Copyright (C) 2006-2009 Sampo Savolainen <v2@iki.fi>
5  * Copyright (C) 2007-2015 David Robillard <d@drobilla.net>
6  * Copyright (C) 2009-2012 Carl Hetherington <carl@carlh.net>
7  * Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org>
8  * Copyright (C) 2016-2017 Julien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License along
21  * with this program; if not, write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23  */
24 
25 #ifndef __ardour_plugin_ui_h__
26 #define __ardour_plugin_ui_h__
27 
28 #ifdef WAF_BUILD
29 #include "gtk2ardour-config.h"
30 #endif
31 
32 #include <vector>
33 #include <map>
34 #include <list>
35 
36 #include <sigc++/signal.h>
37 
38 #include <gtkmm/adjustment.h>
39 #include <gtkmm/box.h>
40 #include <gtkmm/button.h>
41 #include <gtkmm/eventbox.h>
42 #include <gtkmm/expander.h>
44 #include <gtkmm/image.h>
45 #include <gtkmm/label.h>
46 #include <gtkmm/menu.h>
47 #include <gtkmm/scrolledwindow.h>
48 #include <gtkmm/socket.h>
49 #include <gtkmm/table.h>
50 #include <gtkmm/togglebutton.h>
51 #include <gtkmm/viewport.h>
52 
53 #include "ardour/types.h"
54 #include "ardour/plugin.h"
55 #include "ardour/variant.h"
56 
57 #include "widgets/ardour_button.h"
59 #include "widgets/ardour_spinner.h"
60 
61 #include "ardour_window.h"
62 #include "automation_controller.h"
63 #include "pianokeyboard.h"
64 
65 namespace ARDOUR {
66  class PluginInsert;
67  class PlugInsertBase;
68  class Plugin;
69  class WindowsVSTPlugin;
70  class LXVSTPlugin;
71  class IOProcessor;
72  class AUPlugin;
73  class Processor;
74 }
75 
76 namespace PBD {
77  class Controllable;
78 }
79 
80 namespace ArdourWidgets {
81  class FastMeter;
82 }
83 
84 class TimeCtlGUI;
85 class ArdourWindow;
86 class PluginEqGui;
87 class PluginLoadStatsGui;
88 class PluginPresetsUI;
89 class VSTPluginUI;
90 
91 class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionList
92 {
93 public:
94  PlugUIBase (std::shared_ptr<ARDOUR::PlugInsertBase>);
95  virtual ~PlugUIBase();
96 
97  virtual gint get_preferred_height () = 0;
98  virtual gint get_preferred_width () = 0;
99  virtual bool resizable () { return true; }
100  virtual bool start_updating(GdkEventAny*) = 0;
101  virtual bool stop_updating(GdkEventAny*) = 0;
102 
103  virtual bool is_external () const { return false; }
104  virtual bool is_external_visible () const { return false; }
105 
106  virtual void activate () {}
107  virtual void deactivate () {}
108 
110  void update_preset ();
111 
114 
115  virtual bool on_window_show(const std::string& /*title*/) { return true; }
116  virtual void on_window_hide() {}
117 
118  virtual void forward_key_event (GdkEventKey*) {}
119  virtual void grab_focus () {}
120  virtual bool non_gtk_gui() const { return false; }
121 
122  sigc::signal<void,bool> KeyboardFocused;
123 
124 protected:
125  std::shared_ptr<ARDOUR::PlugInsertBase> _pib;
126  std::shared_ptr<ARDOUR::PluginInsert> _pi;
127  std::shared_ptr<ARDOUR::Plugin> plugin;
128 
129  void add_common_widgets (Gtk::HBox*, bool with_focus = true);
130 
131  /* UI elements that subclasses can add to their widgets */
132 
173 
177 
181 
186 
188 
194  void browse_presets ();
195  void manage_pins ();
201  void processor_active_changed (std::weak_ptr<ARDOUR::Processor> p);
206 
207  bool has_descriptive_presets () const;
208 
214 
215 private:
218 };
219 
220 class GenericPluginUI : public PlugUIBase, public Gtk::VBox
221 {
222 public:
223  GenericPluginUI (std::shared_ptr<ARDOUR::PlugInsertBase> plug, bool scrollable=false);
225 
226  gint get_preferred_height () { return prefheight; }
227  gint get_preferred_width () { return -1; }
228 
231 
232 private:
237 
240 
241  struct MeterInfo {
243  bool packed;
244 
246  meter = 0;
247  packed = false;
248  }
249  };
250 
251  /* FIXME: Unify with AutomationController */
252  struct ControlUI : public Gtk::HBox {
253 
254  const Evoral::Parameter parameter() const { return param; }
255 
257  std::shared_ptr<ARDOUR::AutomationControl> control;
258 
259  /* input */
260 
261  std::shared_ptr<ARDOUR::ScalePoints> scale_points;
262  std::shared_ptr<AutomationController> controller;
263 
269 
270  bool button;
273 
274 
275  /* output */
276 
279 
283 
286 
287  /* layout */
289  int x0, x1, y0, y1;
290 
291  bool short_autostate; // modify with set_short_autostate below
292  };
293 
294  void set_short_autostate(ControlUI* cui, bool value);
295 
296  std::vector<ControlUI*> input_controls; // workaround for preset load
297  std::vector<ControlUI*> input_controls_with_automation;
298  std::vector<ControlUI*> output_controls;
299 
300  sigc::connection screen_update_connection;
301 
303 
304  void build ();
305  void automatic_layout (const std::vector<ControlUI *>& control_uis);
306 
308  const ARDOUR::ParameterDescriptor& desc,
309  std::shared_ptr<ARDOUR::AutomationControl> mcontrol,
310  float value,
311  bool is_input,
312  bool use_knob = false);
313 
316  void update_input_displays (); // workaround for preset load
317  void control_combo_changed (ControlUI* cui, float value);
318 
323 
325 
326  typedef std::map<uint32_t, Gtk::FileChooserButton*> FilePathControls;
329  Gtk::FileChooserButton* widget);
330  void path_property_changed (uint32_t key, const ARDOUR::Variant& value);
331 
334 
340 
341  void note_on_event_handler (int, int);
343 
347  void midi_bank_patch_change (uint8_t chn);
348  void midi_bank_patch_select (uint8_t chn, uint32_t bankpgm);
349  std::vector<ArdourWidgets::ArdourDropdown*> midi_pgmsel;
351  std::map<uint32_t, std::string> pgm_names;
352 };
353 
355 {
356 public:
357  PluginUIWindow (std::shared_ptr<ARDOUR::PlugInsertBase>,
358  bool scrollable = false,
359  bool editor = true);
361 
362  PlugUIBase& pluginui() { return *_pluginui; }
363 
366  void set_title(const std::string& title);
367 
368 
371  void on_show ();
372  void on_hide ();
373 
374 private:
375  std::string _title;
382 #ifdef AUDIOUNIT_SUPPORT
383  int pre_deactivate_x;
384  int pre_deactivate_y;
385 #endif
386 
387  void keyboard_focused (bool yn);
388 
389  void app_activated (bool);
391 
392  bool create_windows_vst_editor (std::shared_ptr<ARDOUR::PlugInsertBase>);
393  bool create_lxvst_editor(std::shared_ptr<ARDOUR::PlugInsertBase>);
394  bool create_mac_vst_editor(std::shared_ptr<ARDOUR::PlugInsertBase>);
395  bool create_audiounit_editor (std::shared_ptr<ARDOUR::PlugInsertBase>);
396  bool create_lv2_editor (std::shared_ptr<ARDOUR::PlugInsertBase>);
397  bool create_vst3_editor (std::shared_ptr<ARDOUR::PlugInsertBase>);
398 
400 };
401 
402 #ifdef MACVST_SUPPORT
403 /* this function has to be in a .mm file
404  * because MacVSTPluginUI has Cocoa members
405  */
406 extern VSTPluginUI* create_mac_vst_gui (std::shared_ptr<ARDOUR::PlugInsertBase>);
407 #endif
408 
409 #ifdef AUDIOUNIT_SUPPORT
410 /* this function has to be in a .mm file */
411 extern PlugUIBase* create_au_gui (std::shared_ptr<ARDOUR::PlugInsertBase>, Gtk::VBox**);
412 #endif
413 
414 #endif /* __ardour_plugin_ui_h__ */
void output_update()
gint get_preferred_height()
Definition: plugin_ui.h:226
Gtk::Expander _plugin_pianokeyboard_expander
Definition: plugin_ui.h:335
void midi_bank_patch_change(uint8_t chn)
void midi_bank_patch_select(uint8_t chn, uint32_t bankpgm)
bool start_updating(GdkEventAny *)
void automatic_layout(const std::vector< ControlUI * > &control_uis)
FilePathControls _filepath_controls
Definition: plugin_ui.h:327
Gtk::SpinButton _piano_velocity
Definition: plugin_ui.h:338
Gtk::Menu * automation_menu
Definition: plugin_ui.h:236
void midi_refill_patches()
Gtk::VBox main_contents
Definition: plugin_ui.h:233
std::vector< ControlUI * > output_controls
Definition: plugin_ui.h:298
std::vector< ArdourWidgets::ArdourDropdown * > midi_pgmsel
Definition: plugin_ui.h:349
void ui_parameter_changed(ControlUI *cui)
void update_control_display(ControlUI *cui)
void build_midi_table()
void set_automation_state(ARDOUR::AutoState state, ControlUI *cui)
void set_path_property(const ARDOUR::ParameterDescriptor &desc, Gtk::FileChooserButton *widget)
void automation_state_changed(ControlUI *)
void control_combo_changed(ControlUI *cui, float value)
Gtk::HBox hpacker
Definition: plugin_ui.h:235
bool is_scrollable
Definition: plugin_ui.h:239
Gtk::VBox settings_box
Definition: plugin_ui.h:234
void set_all_automation(ARDOUR::AutoState state)
std::map< uint32_t, std::string > pgm_names
Definition: plugin_ui.h:351
sigc::connection screen_update_connection
Definition: plugin_ui.h:300
void path_property_changed(uint32_t key, const ARDOUR::Variant &value)
bool stop_updating(GdkEventAny *)
void toggle_pianokeyboard()
gint get_preferred_width()
Definition: plugin_ui.h:227
GenericPluginUI(std::shared_ptr< ARDOUR::PlugInsertBase > plug, bool scrollable=false)
std::vector< ControlUI * > input_controls_with_automation
Definition: plugin_ui.h:297
void note_on_event_handler(int, int)
void scroller_size_request(Gtk::Requisition *)
bool astate_button_event(GdkEventButton *ev, ControlUI *)
void set_short_autostate(ControlUI *cui, bool value)
APianoKeyboard * _piano
Definition: plugin_ui.h:336
void update_input_displays()
void note_off_event_handler(int)
Gtk::SpinButton _piano_channel
Definition: plugin_ui.h:339
Gtk::ScrolledWindow scroller
Definition: plugin_ui.h:333
std::vector< ControlUI * > input_controls
Definition: plugin_ui.h:296
std::map< uint32_t, Gtk::FileChooserButton * > FilePathControls
Definition: plugin_ui.h:326
PBD::ScopedConnectionList midi_connections
Definition: plugin_ui.h:350
ControlUI * build_control_ui(const Evoral::Parameter &param, const ARDOUR::ParameterDescriptor &desc, std::shared_ptr< ARDOUR::AutomationControl > mcontrol, float value, bool is_input, bool use_knob=false)
Gtk::VBox _pianobox
Definition: plugin_ui.h:337
void knob_size_request(Gtk::Requisition *req, ControlUI *cui)
virtual void on_window_hide()
Definition: plugin_ui.h:116
void update_preset_list()
Gtk::Image * _focus_in_image
Definition: plugin_ui.h:217
bool focus_toggled(GdkEventButton *)
virtual void preset_selected(ARDOUR::Plugin::PresetRecord preset)
virtual bool stop_updating(GdkEventAny *)=0
PBD::ScopedConnection preset_removed_connection
Definition: plugin_ui.h:212
ArdourWidgets::ArdourButton _add_button
Definition: plugin_ui.h:138
Gtk::EventBox _focus_button
Definition: plugin_ui.h:152
ArdourWidgets::ArdourButton automation_latch_all_button
Definition: plugin_ui.h:172
void set_tailtime_label()
virtual void forward_key_event(GdkEventKey *)
Definition: plugin_ui.h:118
ArdourWindow * tailtime_dialog
Definition: plugin_ui.h:180
virtual gint get_preferred_width()=0
void add_plugin_setting()
ArdourWidgets::ArdourButton _pin_management_button
Definition: plugin_ui.h:150
virtual bool non_gtk_gui() const
Definition: plugin_ui.h:120
Gtk::Label _preset_modified
Definition: plugin_ui.h:136
void update_preset_modified()
PBD::ScopedConnection active_connection
Definition: plugin_ui.h:210
ArdourWidgets::ArdourButton automation_play_all_button
Definition: plugin_ui.h:166
std::shared_ptr< ARDOUR::PlugInsertBase > _pib
Definition: plugin_ui.h:125
Gtk::Image * _focus_out_image
Definition: plugin_ui.h:216
PluginPresetsUI * preset_gui
Definition: plugin_ui.h:184
void delete_plugin_setting()
virtual gint get_preferred_height()=0
void latency_button_clicked()
std::shared_ptr< ARDOUR::PluginInsert > _pi
Definition: plugin_ui.h:126
ArdourWidgets::ArdourButton _save_button
Definition: plugin_ui.h:140
virtual bool is_external_visible() const
Definition: plugin_ui.h:104
ArdourWidgets::ArdourButton _reset_button
Definition: plugin_ui.h:146
Gtk::Expander plugin_analysis_expander
Definition: plugin_ui.h:156
Gtk::Expander description_expander
Definition: plugin_ui.h:154
void toggle_cpuload_display()
void toggle_plugin_analysis()
virtual bool on_window_show(const std::string &)
Definition: plugin_ui.h:115
void reset_plugin_parameters()
void plugin_going_away()
virtual void deactivate()
Definition: plugin_ui.h:107
void automation_state_changed()
PluginLoadStatsGui * stats_gui
Definition: plugin_ui.h:183
ArdourWidgets::ArdourButton automation_touch_all_button
Definition: plugin_ui.h:170
void processor_active_changed(std::weak_ptr< ARDOUR::Processor > p)
sigc::signal< void, bool > KeyboardFocused
Definition: plugin_ui.h:122
virtual ~PlugUIBase()
void toggle_description()
ArdourWidgets::ArdourButton automation_manual_all_button
Definition: plugin_ui.h:164
virtual bool is_external() const
Definition: plugin_ui.h:103
void save_plugin_setting()
ArdourWindow * latency_dialog
Definition: plugin_ui.h:176
void tailtime_button_clicked()
TimeCtlGUI * tailtime_gui
Definition: plugin_ui.h:179
TimeCtlGUI * latency_gui
Definition: plugin_ui.h:175
ArdourWidgets::ArdourButton _preset_browser_button
Definition: plugin_ui.h:144
int _no_load_preset
Definition: plugin_ui.h:187
ArdourWidgets::ArdourButton _tailtime_button
Definition: plugin_ui.h:162
void add_common_widgets(Gtk::HBox *, bool with_focus=true)
Gtk::Expander cpuload_expander
Definition: plugin_ui.h:158
PBD::ScopedConnectionList control_connections
Definition: plugin_ui.h:213
PlugUIBase(std::shared_ptr< ARDOUR::PlugInsertBase >)
PBD::ScopedConnection death_connection
Definition: plugin_ui.h:209
void set_latency_label()
ArdourWidgets::ArdourButton _bypass_button
Definition: plugin_ui.h:148
virtual void activate()
Definition: plugin_ui.h:106
PBD::ScopedConnection preset_added_connection
Definition: plugin_ui.h:211
ArdourWindow * preset_dialog
Definition: plugin_ui.h:185
void preset_added_or_removed()
virtual bool start_updating(GdkEventAny *)=0
void manage_pins()
void browse_presets()
ArdourWidgets::ArdourButton _delete_button
Definition: plugin_ui.h:142
bool bypass_button_release(GdkEventButton *)
void update_preset()
std::shared_ptr< ARDOUR::Plugin > plugin
Definition: plugin_ui.h:127
ArdourWidgets::ArdourButton automation_write_all_button
Definition: plugin_ui.h:168
virtual bool resizable()
Definition: plugin_ui.h:99
bool has_descriptive_presets() const
virtual void grab_focus()
Definition: plugin_ui.h:119
ArdourWidgets::ArdourButton _latency_button
Definition: plugin_ui.h:160
ArdourWidgets::ArdourDropdown _preset_combo
Definition: plugin_ui.h:134
PluginEqGui * eqgui
Definition: plugin_ui.h:182
bool was_visible
Definition: plugin_ui.h:380
void keyboard_focused(bool yn)
Gtk::VBox vbox
Definition: plugin_ui.h:379
bool create_windows_vst_editor(std::shared_ptr< ARDOUR::PlugInsertBase >)
void on_hide()
This is a default handler for the signal signal_hide().
bool create_lv2_editor(std::shared_ptr< ARDOUR::PlugInsertBase >)
std::string _title
Definition: plugin_ui.h:375
bool create_vst3_editor(std::shared_ptr< ARDOUR::PlugInsertBase >)
void set_title(const std::string &title)
void app_activated(bool)
void plugin_going_away()
Gtk::Window * parent
Definition: plugin_ui.h:378
bool _keyboard_focused
Definition: plugin_ui.h:381
PlugUIBase & pluginui()
Definition: plugin_ui.h:362
void resize_preferred()
void set_parent(Gtk::Window *)
bool create_lxvst_editor(std::shared_ptr< ARDOUR::PlugInsertBase >)
bool create_audiounit_editor(std::shared_ptr< ARDOUR::PlugInsertBase >)
PlugUIBase * _pluginui
Definition: plugin_ui.h:376
bool on_key_press_event(GdkEventKey *)
This is a default handler for the signal signal_key_press_event().
static PluginUIWindow * the_plugin_window
Definition: plugin_ui.h:399
bool on_key_release_event(GdkEventKey *)
This is a default handler for the signal signal_key_release_event().
PluginUIWindow(std::shared_ptr< ARDOUR::PlugInsertBase >, bool scrollable=false, bool editor=true)
void on_show()
This is a default handler for the signal signal_show().
PBD::ScopedConnection death_connection
Definition: plugin_ui.h:377
bool create_mac_vst_editor(std::shared_ptr< ARDOUR::PlugInsertBase >)
std::shared_ptr< PBD::Controllable > Controllable
Definition: console1.h:80
Definition: axis_view.h:42
Gtk::EventBox * display
Definition: plugin_ui.h:277
Gtk::FileChooserButton * file_button
Definition: plugin_ui.h:267
ArdourWidgets::ArdourButton automate_button
Definition: plugin_ui.h:264
std::shared_ptr< AutomationController > controller
Definition: plugin_ui.h:262
std::shared_ptr< ARDOUR::ScalePoints > scale_points
Definition: plugin_ui.h:261
Gtk::Label * display_label
Definition: plugin_ui.h:278
ControlUI(const Evoral::Parameter &param)
ArdourWidgets::ArdourSpinner * spin_box
Definition: plugin_ui.h:268
Evoral::Parameter param
Definition: plugin_ui.h:256
const Evoral::Parameter parameter() const
Definition: plugin_ui.h:254
ArdourWidgets::ArdourDropdown * combo
Definition: plugin_ui.h:266
std::shared_ptr< ARDOUR::AutomationControl > control
Definition: plugin_ui.h:257
ArdourWidgets::FastMeter * meter
Definition: plugin_ui.h:242