Who needs PIs for Plugin GUIs?

Use abstract base class for plugin UIs wherever possible
This commit is contained in:
Robin Gareus 2022-04-04 20:48:56 +02:00
parent 74a673ce17
commit 9cbf3ae4ad
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
24 changed files with 295 additions and 274 deletions

View File

@ -54,7 +54,7 @@
namespace ARDOUR {
class AUPlugin;
class PluginInsert;
class PlugInsertBase;
class IOProcessor;
}
@ -77,7 +77,7 @@ class AUPluginUI;
class AUPluginUI : public PlugUIBase, public Gtk::VBox
{
public:
AUPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>);
AUPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>);
~AUPluginUI ();
gint get_preferred_width () { return req_width; }

View File

@ -393,8 +393,8 @@ static void interposed_drawIfNeeded (id receiver, SEL selector, NSRect rect)
}
@end
AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
: PlugUIBase (insert)
AUPluginUI::AUPluginUI (boost::shared_ptr<PlugInsertBase> pib)
: PlugUIBase (pib)
, automation_mode_label (_("Automation"))
, preset_label (_("Presets"))
, resizable (false)
@ -415,7 +415,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
set_popdown_strings (automation_mode_selector, automation_mode_strings);
automation_mode_selector.set_active_text (automation_mode_strings.front());
if ((au = boost::dynamic_pointer_cast<AUPlugin> (insert->plugin())) == 0) {
if ((au = boost::dynamic_pointer_cast<AUPlugin> (pib->plugin())) == 0) {
error << _("unknown type of editor-supplying plugin (note: no AudioUnit support in this version of ardour)") << endmsg;
throw failed_constructor ();
}
@ -427,13 +427,7 @@ AUPluginUI::AUPluginUI (boost::shared_ptr<PluginInsert> insert)
top_box.set_spacing (6);
top_box.set_border_width (6);
bool for_auditioner = false;
if (insert->session().the_auditioner()) {
for_auditioner = insert->session().the_auditioner()->the_instrument() == insert;
}
if (!for_auditioner) {
add_common_widgets (&top_box);
}
add_common_widgets (&top_box);
set_spacing (0);
pack_start (top_box, false, false);
@ -819,7 +813,7 @@ AUPluginUI::cocoa_view_resized ()
plugin_requested_resize = 1;
ProcessorWindowProxy* wp = insert->window_proxy();
ProcessorWindowProxy* wp = _pi ? _pi->window_proxy() : NULL;
if (wp) {
/* Once a plugin has requested a resize of its own window, do
* NOT save the window. The user may save state with the plugin
@ -1289,9 +1283,9 @@ AUPluginUI::stop_updating (GdkEventAny*)
}
PlugUIBase*
create_au_gui (boost::shared_ptr<PluginInsert> plugin_insert, VBox** box)
create_au_gui (boost::shared_ptr<PlugInsertBase> pib, VBox** box)
{
AUPluginUI* aup = new AUPluginUI (plugin_insert);
AUPluginUI* aup = new AUPluginUI (pib);
(*box) = aup;
return aup;
}

View File

@ -47,7 +47,6 @@
#include "midi++/midnam_patch.h"
#include "ardour/auditioner.h"
#include "ardour/midi_patch_manager.h"
#include "ardour/midi_track.h"
#include "ardour/plugin.h"
@ -85,8 +84,8 @@ using namespace ArdourWidgets;
using namespace Gtk;
using namespace ARDOUR_UI_UTILS;
GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrollable)
: PlugUIBase (pi)
GenericPluginUI::GenericPluginUI (boost::shared_ptr<PlugInsertBase> pib, bool scrollable)
: PlugUIBase (pib)
, automation_menu (0)
, is_scrollable(scrollable)
, _plugin_pianokeyboard_expander (_("MIDI Keyboard (audition only)"))
@ -94,11 +93,6 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
, _piano_velocity (*manage (new Adjustment (100, 1, 127, 1, 16)))
, _piano_channel (*manage (new Adjustment (0, 1, 16, 1, 1)))
{
bool for_auditioner = false;
if (insert->session().the_auditioner()) {
for_auditioner = insert->session().the_auditioner()->the_instrument() == insert;
}
set_name ("PluginEditor");
set_border_width (6);
//set_homogeneous (false);
@ -109,7 +103,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
smaller_hbox->set_spacing (6);
smaller_hbox->set_border_width (0);
if (for_auditioner) {
if (_pib->ui_elements () == PlugInsertBase::NoGUIToolbar) {
Gtk::Label* spacer = manage (new Gtk::Label());
smaller_hbox->pack_start(*spacer);
} else {
@ -127,42 +121,40 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
automation_latch_all_button.set_text (GainMeterBase::astate_string (ARDOUR::Latch));
automation_latch_all_button.set_name (X_("generic button"));
if (!for_auditioner) { /*auditioner is not run when it isn't auditioning; so the piano keyboard, cpu usage, and other features are not applicable */
if (pi->is_instrument ()) {
_piano = new APianoKeyboard ();
_piano->set_can_focus ();
if (_pib->ui_elements () & PlugInsertBase::MIDIKeyboard) {
_piano = new APianoKeyboard ();
_piano->set_can_focus ();
_piano->NoteOn.connect (sigc::mem_fun (*this, &GenericPluginUI::note_on_event_handler));
_piano->NoteOff.connect (sigc::mem_fun (*this, &GenericPluginUI::note_off_event_handler));
_piano->NoteOn.connect (sigc::mem_fun (*this, &GenericPluginUI::note_on_event_handler));
_piano->NoteOff.connect (sigc::mem_fun (*this, &GenericPluginUI::note_off_event_handler));
HBox* box = manage (new HBox);
box->pack_start (*manage (new Label (_("Channel:"))), false, false);
box->pack_start (_piano_channel, false, false);
box->pack_start (*manage (new Label (_("Velocity:"))), false, false);
box->pack_start (_piano_velocity, false, false);
HBox* box = manage (new HBox);
box->pack_start (*manage (new Label (_("Channel:"))), false, false);
box->pack_start (_piano_channel, false, false);
box->pack_start (*manage (new Label (_("Velocity:"))), false, false);
box->pack_start (_piano_velocity, false, false);
Box* box2 = manage (new HBox ());
box2->pack_start (*box, true, false);
Box* box2 = manage (new HBox ());
box2->pack_start (*box, true, false);
_pianobox.set_spacing (4);
_pianobox.pack_start (*box2, true, true);
_pianobox.pack_start (*_piano, true, true);
_pianobox.set_spacing (4);
_pianobox.pack_start (*box2, true, true);
_pianobox.pack_start (*_piano, true, true);
_plugin_pianokeyboard_expander.set_expanded(false);
_plugin_pianokeyboard_expander.property_expanded().signal_changed().connect( sigc::mem_fun(*this, &GenericPluginUI::toggle_pianokeyboard));
_plugin_pianokeyboard_expander.set_expanded(false);
_plugin_pianokeyboard_expander.property_expanded().signal_changed().connect( sigc::mem_fun(*this, &GenericPluginUI::toggle_pianokeyboard));
pack_end (_plugin_pianokeyboard_expander, false, false);
} else {
pack_end (plugin_analysis_expander, false, false);
}
pack_end (_plugin_pianokeyboard_expander, false, false);
} else if (_pi && _pi->ui_elements () != PlugInsertBase::NoGUIToolbar) {
pack_end (plugin_analysis_expander, false, false);
}
if (insert->provides_stats ()) {
pack_end (cpuload_expander, false, false);
}
if (_pib->provides_stats ()) {
pack_end (cpuload_expander, false, false);
}
if (!plugin->get_docs().empty()) {
pack_end (description_expander, false, false);
}
if (!plugin->get_docs().empty()) {
pack_end (description_expander, false, false);
}
settings_box.set_homogeneous (false);
@ -170,7 +162,31 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
settings_box.set_border_width (0);
settings_box.pack_start (*smaller_hbox, false, false);
if (pi->controls().size() > 0) {
bool has_automatables = false;
for (size_t i = 0; i < plugin->parameter_count(); ++i) {
if (!plugin->parameter_is_control (i)) {
continue;
}
if (!plugin->parameter_is_input (i)) {
continue;
}
const Evoral::Parameter param(PluginAutomation, 0, i);
boost::shared_ptr<ARDOUR::AutomationControl> c (boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(_pib->control (param)));
if (!c) {
continue;
}
if (c->flags () & Controllable::HiddenControl) {
continue;
}
if (c->flags () & Controllable::NotAutomatable) {
continue;
}
has_automatables = true;
break;
}
if (_pi && has_automatables) {
HBox* automation_hbox = manage (new HBox);
automation_hbox->set_spacing (6);
Label* l = manage (new Label (_("All Automation")));
@ -185,8 +201,12 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
main_contents.pack_start (settings_box, false, false);
pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(pi)), gui_context());
_bypass_button.set_active (!pi->enabled());
if (_pi) {
_pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&GenericPluginUI::processor_active_changed, this, boost::weak_ptr<Processor>(_pi)), gui_context());
_bypass_button.set_active (!_pi->enabled());
} else {
_bypass_button.set_sensitive (false);
}
/* ScrolledWindow will wrap hpacker in a Viewport */
scroller.add (hpacker);
@ -198,7 +218,7 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
prefheight = -1;
build ();
if (insert->plugin()->has_midnam() && insert->plugin()->knows_bank_patch()) {
if (_pib->plugin()->has_midnam() && _pib->plugin()->knows_bank_patch()) {
build_midi_table ();
}
@ -336,9 +356,7 @@ GenericPluginUI::build ()
ControlUI* cui;
boost::shared_ptr<ARDOUR::AutomationControl> c
= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
insert->control(param));
boost::shared_ptr<ARDOUR::AutomationControl> c (boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(_pib->control (param)));
if (c && c->flags () & Controllable::HiddenControl) {
continue;
@ -366,9 +384,7 @@ GenericPluginUI::build ()
const ParameterDescriptor& desc = d->second;
const Evoral::Parameter param(PluginPropertyAutomation, 0, desc.key);
boost::shared_ptr<ARDOUR::AutomationControl> c
= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
insert->control(param));
boost::shared_ptr<ARDOUR::AutomationControl> c (boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(_pib->control (param)));
if (!c) {
error << string_compose(_("Plugin Editor: no control for property %1"), desc.key) << endmsg;
@ -396,9 +412,9 @@ GenericPluginUI::build ()
plugin->announce_property_values();
}
if (control_uis.empty ()) {
if (control_uis.empty () && _pi) {
if (has_descriptive_presets ()) {
preset_gui = new PluginPresetsUI (insert);
preset_gui = new PluginPresetsUI (_pi); // XXX
hpacker.pack_start (*preset_gui, true, true);
}
} else {
@ -644,7 +660,7 @@ GenericPluginUI::build_midi_table ()
ArdourWidgets::Frame* frame = manage (new ArdourWidgets::Frame);
frame->set_name ("BaseFrame");
if (dynamic_cast<MidiTrack*> (insert->owner())) {
if (_pi && dynamic_cast<MidiTrack*> (_pi->owner())) {
frame->set_label (_("MIDI Programs (sent to track)"));
} else {
frame->set_label (_("MIDI Programs (volatile)"));
@ -664,16 +680,16 @@ GenericPluginUI::build_midi_table ()
pgm_table->attach (*cui, col + 1, col + 2, row, row+1, SHRINK, SHRINK);
}
insert->plugin ()->read_midnam();
_pib->plugin ()->read_midnam();
midi_refill_patches ();
insert->plugin()->BankPatchChange.connect (
_pib->plugin()->BankPatchChange.connect (
midi_connections, invalidator (*this),
boost::bind (&GenericPluginUI::midi_bank_patch_change, this, _1),
gui_context());
insert->plugin()->UpdatedMidnam.connect (
_pib->plugin()->UpdatedMidnam.connect (
midi_connections, invalidator (*this),
boost::bind (&GenericPluginUI::midi_refill_patches, this),
gui_context());
@ -686,7 +702,7 @@ GenericPluginUI::midi_refill_patches ()
pgm_names.clear ();
const std::string model = insert->plugin ()->midnam_model ();
const std::string model = _pib->plugin ()->midnam_model ();
std::string mode;
const std::list<std::string> device_modes = MIDI::Name::MidiPatchManager::instance().custom_device_mode_names_by_model (model);
if (device_modes.size() > 0) {
@ -722,7 +738,7 @@ void
GenericPluginUI::midi_bank_patch_change (uint8_t chn)
{
assert (chn < 16 && midi_pgmsel.size() == 16);
uint32_t bankpgm = insert->plugin()->bank_patch (chn);
uint32_t bankpgm = _pib->plugin()->bank_patch (chn);
if (bankpgm == UINT32_MAX) {
midi_pgmsel[chn]->set_text (_("--Unset--"));
} else {
@ -742,7 +758,7 @@ GenericPluginUI::midi_bank_patch_select (uint8_t chn, uint32_t bankpgm)
{
int bank = bankpgm >> 7;
int pgm = bankpgm & 127;
MidiTrack* mt = dynamic_cast<MidiTrack*> (insert->owner());
MidiTrack* mt = _pi ? dynamic_cast<MidiTrack*> (_pi->owner()) : NULL;
if (mt) {
/* send to track */
boost::shared_ptr<AutomationControl> bank_msb = mt->automation_control(Evoral::Parameter (MidiCCAutomation, chn, MIDI_CTL_MSB_BANK), true);
@ -757,15 +773,15 @@ GenericPluginUI::midi_bank_patch_select (uint8_t chn, uint32_t bankpgm)
event[0] = (MIDI_CMD_CONTROL | chn);
event[1] = 0x00;
event[2] = bank >> 7;
insert->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
_pib->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
event[1] = 0x20;
event[2] = bank & 127;
insert->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
_pib->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
event[0] = (MIDI_CMD_PGM_CHANGE | chn);
event[1] = pgm;
insert->write_immediate_event (Evoral::MIDI_EVENT, 2, event);
_pib->write_immediate_event (Evoral::MIDI_EVENT, 2, event);
}
}
@ -817,13 +833,18 @@ GenericPluginUI::set_short_autostate (ControlUI* cui, bool value)
void
GenericPluginUI::automation_state_changed (ControlUI* cui)
{
AutoState state;
if (_pi) {
/* don't lock to avoid deadlock because we're triggered by
* AutomationControl::Changed() while the automation lock is taken
*/
state = _pi->get_parameter_automation_state (cui->parameter());
} else {
state = ARDOUR::Off;
}
/* update button label */
// don't lock to avoid deadlock because we're triggered by
// AutomationControl::Changed() while the automation lock is taken
AutoState state = insert->get_parameter_automation_state (cui->parameter());
cui->automate_button.set_active((state != ARDOUR::Off));
if (cui->short_autostate) {
@ -1014,7 +1035,7 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter& param,
}
if (mcontrol->flags () & Controllable::NotAutomatable) {
if (!_pi || mcontrol->flags () & Controllable::NotAutomatable) {
control_ui->automate_button.set_sensitive (false);
set_tooltip(control_ui->automate_button, _("This control cannot be automated"));
} else {
@ -1130,6 +1151,7 @@ GenericPluginUI::knob_size_request(Gtk::Requisition* req, ControlUI* cui) {
bool
GenericPluginUI::astate_button_event (GdkEventButton* ev, ControlUI* cui)
{
assert (_pi);
if (ev->button != 1) {
return true;
}
@ -1157,7 +1179,7 @@ GenericPluginUI::astate_button_event (GdkEventButton* ev, ControlUI* cui)
sigc::bind (sigc::mem_fun(*this, &GenericPluginUI::set_automation_state), (AutoState) Latch, cui)));
anchored_menu_popup (automation_menu, &cui->automate_button,
GainMeterBase::astate_string (insert->get_parameter_automation_state (cui->parameter())),
GainMeterBase::astate_string (_pi->get_parameter_automation_state (cui->parameter())),
1, ev->time);
return true;
@ -1174,7 +1196,9 @@ GenericPluginUI::set_all_automation (AutoState as)
void
GenericPluginUI::set_automation_state (AutoState state, ControlUI* cui)
{
insert->set_parameter_automation_state (cui->parameter(), state);
if (_pi) {
_pi->set_parameter_automation_state (cui->parameter(), state);
}
}
void
@ -1239,7 +1263,7 @@ void
GenericPluginUI::control_combo_changed (ControlUI* cui, float value)
{
if (!cui->ignore_change) {
insert->automation_control (cui->parameter())->set_value (value, Controllable::NoGroup);
cui->combo->get_controllable ()->set_value (value, Controllable::NoGroup);
}
}
@ -1268,7 +1292,7 @@ GenericPluginUI::output_update ()
for (vector<ControlUI*>::iterator i = output_controls.begin(); i != output_controls.end(); ++i) {
float val = plugin->get_parameter ((*i)->parameter().id());
char buf[32];
boost::shared_ptr<ReadOnlyControl> c = insert->control_output ((*i)->parameter().id());
boost::shared_ptr<ReadOnlyControl> c = _pib->control_output ((*i)->parameter().id());
const std::string& str = ARDOUR::value_as_string(c->desc(), Variant(val));
size_t len = str.copy(buf, 31);
buf[len] = '\0';
@ -1322,7 +1346,7 @@ GenericPluginUI::toggle_pianokeyboard ()
void
GenericPluginUI::note_on_event_handler (int note, int)
{
MidiTrack* mt = dynamic_cast<MidiTrack*> (insert->owner());
MidiTrack* mt = _pi ? dynamic_cast<MidiTrack*> (_pi->owner()) : NULL;
_piano->grab_focus ();
uint8_t channel = _piano_channel.get_value_as_int () - 1;
uint8_t event[3];
@ -1332,14 +1356,14 @@ GenericPluginUI::note_on_event_handler (int note, int)
if (mt) {
mt->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
} else {
insert->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
_pib->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
}
}
void
GenericPluginUI::note_off_event_handler (int note)
{
MidiTrack* mt = dynamic_cast<MidiTrack*> (insert->owner());
MidiTrack* mt = _pi ? dynamic_cast<MidiTrack*> (_pi->owner()) : NULL;
uint8_t channel = _piano_channel.get_value_as_int () - 1;
uint8_t event[3];
event[0] = (MIDI_CMD_NOTE_OFF | channel);
@ -1348,6 +1372,6 @@ GenericPluginUI::note_off_event_handler (int note)
if (mt) {
mt->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
} else {
insert->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
_pib->write_immediate_event (Evoral::MIDI_EVENT, 3, event);
}
}

View File

@ -25,8 +25,8 @@
#include <gtkmm/stock.h>
#include "ardour/auditioner.h"
#include "ardour/lv2_plugin.h"
#include "ardour/plugin_insert.h"
#include "ardour/session.h"
#include "pbd/error.h"
@ -73,9 +73,9 @@ LV2PluginUI::write_from_ui(void* controller,
}
} else if (format == URIMap::instance().urids.atom_eventTransfer) {
const int cnt = me->_pi->get_count();
const int cnt = me->_pib->get_count();
for (int i=0; i < cnt; i++ ) {
boost::shared_ptr<LV2Plugin> lv2i = boost::dynamic_pointer_cast<LV2Plugin> (me->_pi->plugin(i));
boost::shared_ptr<LV2Plugin> lv2i = boost::dynamic_pointer_cast<LV2Plugin> (me->_pib->plugin(i));
lv2i->write_from_ui(port_index, format, buffer_size, (const uint8_t*)buffer);
}
}
@ -296,10 +296,10 @@ LV2PluginUI::output_update()
_updates.clear ();
}
LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
LV2PluginUI::LV2PluginUI(boost::shared_ptr<PlugInsertBase> pib,
boost::shared_ptr<LV2Plugin> lv2p)
: PlugUIBase(pi)
, _pi(pi)
: PlugUIBase(pib)
, _pib(pib)
, _lv2(lv2p)
, _gui_widget(NULL)
, _values_last_sent_to_ui(NULL)
@ -309,13 +309,7 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
_ardour_buttons_box.set_spacing (6);
_ardour_buttons_box.set_border_width (6);
bool for_auditioner = false;
if (insert->session().the_auditioner()) {
for_auditioner = insert->session().the_auditioner()->the_instrument() == insert;
}
if (!for_auditioner) {
add_common_widgets (&_ardour_buttons_box);
}
add_common_widgets (&_ardour_buttons_box);
plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&LV2PluginUI::queue_port_update, this), gui_context ());
}
@ -479,7 +473,7 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
_values_last_sent_to_ui[port] = _lv2->get_parameter(port);
_controllables[port] = boost::dynamic_pointer_cast<ARDOUR::AutomationControl> (
insert->control(Evoral::Parameter(PluginAutomation, 0, port)));
_pib->control(Evoral::Parameter(PluginAutomation, 0, port)));
if (_lv2->parameter_is_control(port) && _lv2->parameter_is_input(port)) {
if (_controllables[port]) {

View File

@ -38,21 +38,20 @@
#include "ardour/types.h"
#include "plugin_ui.h"
#include "ardour/plugin_insert.h"
#include "ardour/plug_insert_base.h"
#include "lv2_external_ui.h"
#include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
namespace ARDOUR {
class PluginInsert;
class LV2Plugin;
}
class LV2PluginUI : public PlugUIBase, public Gtk::VBox
{
public:
LV2PluginUI (boost::shared_ptr<ARDOUR::PluginInsert>,
LV2PluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>,
boost::shared_ptr<ARDOUR::LV2Plugin>);
~LV2PluginUI ();
@ -72,28 +71,29 @@ private:
typedef boost::shared_ptr<ARDOUR::AutomationControl> ControllableRef;
boost::shared_ptr<ARDOUR::PluginInsert> _pi;
boost::shared_ptr<ARDOUR::LV2Plugin> _lv2;
std::vector<int> _output_ports;
sigc::connection _screen_update_connection;
sigc::connection _message_update_connection;
Gtk::Widget* _gui_widget;
/** a box containing the focus, bypass, delete, save / add preset buttons etc. */
Gtk::HBox _ardour_buttons_box;
float* _values_last_sent_to_ui;
std::vector<ControllableRef> _controllables;
struct lv2_external_ui_host _external_ui_host;
LV2_Feature _external_ui_feature;
LV2_Feature _external_kxui_feature;
boost::shared_ptr<ARDOUR::PlugInsertBase> _pib;
boost::shared_ptr<ARDOUR::LV2Plugin> _lv2;
std::vector<int> _output_ports;
sigc::connection _screen_update_connection;
sigc::connection _message_update_connection;
Gtk::Widget* _gui_widget;
/** a box containing the focus, bypa s, delete, save / add preset buttons etc. */
Gtk::HBox _ardour_buttons_box;
float* _values_last_sent_to_ui;
std::vector<ControllableRef> _controllables;
struct lv2_external_ui_host _external_ui_host;
LV2_Feature _external_ui_feature;
LV2_Feature _external_kxui_feature;
#ifdef HAVE_LV2_1_17_2
LV2UI_Request_Value _lv2ui_request_value;
LV2_Feature _lv2ui_request_feature;
LV2UI_Request_Value _lv2ui_request_value;
LV2_Feature _lv2ui_request_feature;
#endif
struct lv2_external_ui* _external_ui_ptr;
LV2_Feature _parent_feature;
void* _inst;
struct lv2_external_ui* _external_ui_ptr;
LV2_Feature _parent_feature;
void* _inst;
typedef std::set<uint32_t> Updates;
Updates _updates;
Updates _updates;
static void on_external_ui_closed(void* controller);

View File

@ -33,8 +33,8 @@ using namespace Gtk;
using namespace ARDOUR;
using namespace PBD;
LXVSTPluginUI::LXVSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VSTPlugin> lxvp)
: VSTPluginUI (pi, lxvp)
LXVSTPluginUI::LXVSTPluginUI (boost::shared_ptr<PlugInsertBase> pib, boost::shared_ptr<VSTPlugin> lxvp)
: VSTPluginUI (pib, lxvp)
{
vstfx_run_editor (_vst->state ());
}

View File

@ -26,14 +26,14 @@
#ifdef LXVST_SUPPORT
namespace ARDOUR {
class PluginInsert;
class PlugInsertBase;
class LXVSTPlugin;
}
class LXVSTPluginUI : public VSTPluginUI
{
public:
LXVSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VSTPlugin>);
LXVSTPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VSTPlugin>);
~LXVSTPluginUI ();
int get_preferred_height ();

View File

@ -18,7 +18,7 @@
#include "gtkmm2ext/utils.h"
#include "ardour/session.h"
#include "ardour/audioengine.h"
#include "plugin_dspload_ui.h"
#include "timers.h"
@ -28,8 +28,8 @@
using namespace Gtkmm2ext;
using namespace Gtk;
PluginLoadStatsGui::PluginLoadStatsGui (boost::shared_ptr<ARDOUR::PluginInsert> insert)
: _insert (insert)
PluginLoadStatsGui::PluginLoadStatsGui (boost::shared_ptr<ARDOUR::PlugInsertBase> pib)
: _pib (pib)
, _lbl_min ("", ALIGN_END, ALIGN_CENTER)
, _lbl_max ("", ALIGN_END, ALIGN_CENTER)
, _lbl_avg ("", ALIGN_END, ALIGN_CENTER)
@ -81,7 +81,7 @@ PluginLoadStatsGui::stop_updating () {
void
PluginLoadStatsGui::update_cpu_label()
{
if (_insert->get_stats (_min, _max, _avg, _dev)) {
if (_pib->get_stats (_min, _max, _avg, _dev)) {
_valid = true;
_lbl_min.set_text (string_compose (_("%1 [ms]"), rint (_min / 10.) / 100.));
_lbl_max.set_text (string_compose (_("%1 [ms]"), rint (_max / 10.) / 100.));
@ -124,7 +124,7 @@ PluginLoadStatsGui::draw_bar (GdkEventExpose* ev)
const int w = x1 - x0;
const int h = y1 - y0;
const double cycle_ms = 1000. * _insert->session().get_block_size() / (double)_insert->session().nominal_sample_rate();
const double cycle_ms = ARDOUR::AudioEngine::instance()->usecs_per_cycle () / 1000.0;
const double base_mult = std::max (1.0, cycle_ms / 2.0);
const double log_base = log1p (base_mult);

View File

@ -27,12 +27,12 @@
#include "widgets/ardour_button.h"
#include "ardour/plugin_insert.h"
#include "ardour/plug_insert_base.h"
class PluginLoadStatsGui : public Gtk::Table
{
public:
PluginLoadStatsGui (boost::shared_ptr<ARDOUR::PluginInsert>);
PluginLoadStatsGui (boost::shared_ptr<ARDOUR::PlugInsertBase>);
void start_updating ();
void stop_updating ();
@ -44,10 +44,10 @@ private:
void update_cpu_label ();
bool draw_bar (GdkEventExpose*);
void clear_stats () {
_insert->clear_stats ();
_pib->clear_stats ();
}
boost::shared_ptr<ARDOUR::PluginInsert> _insert;
boost::shared_ptr<ARDOUR::PlugInsertBase> _pib;
sigc::connection update_cpu_label_connection;
Gtk::Label _lbl_min;

View File

@ -21,6 +21,8 @@
#include <gtkmm/viewport.h>
#include "ardour/session.h"
#include "ardour/plugin_insert.h"
#include "gtkmm2ext/gui_thread.h"
#include "plugin_dspload_ui.h"

View File

@ -71,7 +71,7 @@
# include "vst3_hwnd_plugin_ui.h"
# elif defined (__APPLE__)
# include "vst3_plugin_ui.h"
extern VST3PluginUI* create_mac_vst3_gui (boost::shared_ptr<ARDOUR::PluginInsert>, Gtk::VBox**);
extern VST3PluginUI* create_mac_vst3_gui (boost::shared_ptr<ARDOUR::PlugInsertBase>, Gtk::VBox**);
# else
# include "vst3_x11_plugin_ui.h"
# endif
@ -106,9 +106,9 @@ using namespace Gtk;
PluginUIWindow* PluginUIWindow::the_plugin_window = 0;
PluginUIWindow::PluginUIWindow (
boost::shared_ptr<PluginInsert> insert,
bool scrollable,
bool editor)
boost::shared_ptr<PlugInsertBase> pib,
bool scrollable,
bool editor)
: ArdourWindow (string())
, was_visible (false)
, _keyboard_focused (false)
@ -122,22 +122,22 @@ PluginUIWindow::PluginUIWindow (
Label* label = manage (new Label());
label->set_markup ("<b>THIS IS THE PLUGIN UI</b>");
if (editor && insert->plugin()->has_editor()) {
switch (insert->type()) {
if (editor && pib->plugin()->has_editor()) {
switch (pib->type()) {
case ARDOUR::Windows_VST:
have_gui = create_windows_vst_editor (insert);
have_gui = create_windows_vst_editor (pib);
break;
case ARDOUR::LXVST:
have_gui = create_lxvst_editor (insert);
have_gui = create_lxvst_editor (pib);
break;
case ARDOUR::MacVST:
have_gui = create_mac_vst_editor (insert);
have_gui = create_mac_vst_editor (pib);
break;
case ARDOUR::AudioUnit:
have_gui = create_audiounit_editor (insert);
have_gui = create_audiounit_editor (pib);
break;
case ARDOUR::LADSPA:
@ -145,11 +145,11 @@ PluginUIWindow::PluginUIWindow (
break;
case ARDOUR::LV2:
have_gui = create_lv2_editor (insert);
have_gui = create_lv2_editor (pib);
break;
case ARDOUR::VST3:
have_gui = create_vst3_editor (insert);
have_gui = create_vst3_editor (pib);
break;
default:
@ -166,7 +166,7 @@ PluginUIWindow::PluginUIWindow (
}
if (!have_gui) {
GenericPluginUI* pu = new GenericPluginUI (insert, scrollable);
GenericPluginUI* pu = new GenericPluginUI (pib, scrollable);
_pluginui = pu;
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
@ -180,7 +180,7 @@ PluginUIWindow::PluginUIWindow (
set_name ("PluginEditor");
add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
insert->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PluginUIWindow::plugin_going_away, this), gui_context());
pib->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PluginUIWindow::plugin_going_away, this), gui_context());
gint h = _pluginui->get_preferred_height ();
gint w = _pluginui->get_preferred_width ();
@ -260,9 +260,9 @@ PluginUIWindow::set_title(const std::string& title)
bool
#ifdef WINDOWS_VST_SUPPORT
PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert> insert)
PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PlugInsertBase> pib)
#else
PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert>)
PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PlugInsertBase>)
#endif
{
#ifndef WINDOWS_VST_SUPPORT
@ -271,12 +271,12 @@ PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert>)
boost::shared_ptr<WindowsVSTPlugin> vp;
if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (insert->plugin())) == 0) {
if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (pib->plugin())) == 0) {
error << string_compose (_("unknown type of editor-supplying plugin (note: no VST support in this version of %1)"), PROGRAM_NAME)
<< endmsg;
throw failed_constructor ();
} else {
WindowsVSTPluginUI* vpu = new WindowsVSTPluginUI (insert, vp, GTK_WIDGET(this->gobj()));
WindowsVSTPluginUI* vpu = new WindowsVSTPluginUI (pib, vp, GTK_WIDGET(this->gobj()));
_pluginui = vpu;
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
@ -290,9 +290,9 @@ PluginUIWindow::create_windows_vst_editor(boost::shared_ptr<PluginInsert>)
bool
#ifdef LXVST_SUPPORT
PluginUIWindow::create_lxvst_editor(boost::shared_ptr<PluginInsert> insert)
PluginUIWindow::create_lxvst_editor(boost::shared_ptr<PlugInsertBase> pib)
#else
PluginUIWindow::create_lxvst_editor(boost::shared_ptr<PluginInsert>)
PluginUIWindow::create_lxvst_editor(boost::shared_ptr<PlugInsertBase>)
#endif
{
#ifndef LXVST_SUPPORT
@ -301,12 +301,12 @@ PluginUIWindow::create_lxvst_editor(boost::shared_ptr<PluginInsert>)
boost::shared_ptr<LXVSTPlugin> lxvp;
if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (insert->plugin())) == 0) {
if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (pib->plugin())) == 0) {
error << string_compose (_("unknown type of editor-supplying plugin (note: no linuxVST support in this version of %1)"), PROGRAM_NAME)
<< endmsg;
throw failed_constructor ();
} else {
LXVSTPluginUI* lxvpu = new LXVSTPluginUI (insert, lxvp);
LXVSTPluginUI* lxvpu = new LXVSTPluginUI (pib, lxvp);
_pluginui = lxvpu;
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
@ -320,21 +320,21 @@ PluginUIWindow::create_lxvst_editor(boost::shared_ptr<PluginInsert>)
bool
#ifdef MACVST_SUPPORT
PluginUIWindow::create_mac_vst_editor (boost::shared_ptr<PluginInsert> insert)
PluginUIWindow::create_mac_vst_editor (boost::shared_ptr<PlugInsertBase> pib)
#else
PluginUIWindow::create_mac_vst_editor (boost::shared_ptr<PluginInsert>)
PluginUIWindow::create_mac_vst_editor (boost::shared_ptr<PlugInsertBase>)
#endif
{
#ifndef MACVST_SUPPORT
return false;
#else
boost::shared_ptr<MacVSTPlugin> mvst;
if ((mvst = boost::dynamic_pointer_cast<MacVSTPlugin> (insert->plugin())) == 0) {
if ((mvst = boost::dynamic_pointer_cast<MacVSTPlugin> (pib->plugin())) == 0) {
error << string_compose (_("unknown type of editor-supplying plugin (note: no MacVST support in this version of %1)"), PROGRAM_NAME)
<< endmsg;
throw failed_constructor ();
}
VSTPluginUI* vpu = create_mac_vst_gui (insert);
VSTPluginUI* vpu = create_mac_vst_gui (pib);
_pluginui = vpu;
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
add (*vpu);
@ -348,29 +348,29 @@ PluginUIWindow::create_mac_vst_editor (boost::shared_ptr<PluginInsert>)
bool
#ifdef VST3_SUPPORT
PluginUIWindow::create_vst3_editor (boost::shared_ptr<PluginInsert> insert)
PluginUIWindow::create_vst3_editor (boost::shared_ptr<PlugInsertBase> pib)
#else
PluginUIWindow::create_vst3_editor (boost::shared_ptr<PluginInsert>)
PluginUIWindow::create_vst3_editor (boost::shared_ptr<PlugInsertBase>)
#endif
{
#ifndef VST3_SUPPORT
return false;
#else
boost::shared_ptr<VST3Plugin> vst3;
if ((vst3 = boost::dynamic_pointer_cast<VST3Plugin> (insert->plugin())) == 0) {
if ((vst3 = boost::dynamic_pointer_cast<VST3Plugin> (pib->plugin())) == 0) {
error << _("create_vst3_editor called on non-VST3 plugin") << endmsg;
throw failed_constructor ();
} else {
#ifdef PLATFORM_WINDOWS
VST3HWNDPluginUI* pui = new VST3HWNDPluginUI (insert, vst3);
VST3HWNDPluginUI* pui = new VST3HWNDPluginUI (pib, vst3);
add (*pui);
#elif defined (__APPLE__)
VBox* box;
VST3PluginUI* pui = create_mac_vst3_gui (insert, &box);
VST3PluginUI* pui = create_mac_vst3_gui (pib, &box);
add (*box);
Application::instance()->ActivationChanged.connect (mem_fun (*this, &PluginUIWindow::app_activated));
#else
VST3X11PluginUI* pui = new VST3X11PluginUI (insert, vst3);
VST3X11PluginUI* pui = new VST3X11PluginUI (pib, vst3);
add (*pui);
#endif
_pluginui = pui;
@ -384,16 +384,16 @@ PluginUIWindow::create_vst3_editor (boost::shared_ptr<PluginInsert>)
bool
#ifdef AUDIOUNIT_SUPPORT
PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert> insert)
PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PlugInsertBase> pib)
#else
PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PluginInsert>)
PluginUIWindow::create_audiounit_editor (boost::shared_ptr<PlugInsertBase>)
#endif
{
#ifndef AUDIOUNIT_SUPPORT
return false;
#else
VBox* box;
_pluginui = create_au_gui (insert, &box);
_pluginui = create_au_gui (pib, &box);
_pluginui->KeyboardFocused.connect (sigc::mem_fun (*this, &PluginUIWindow::keyboard_focused));
add (*box);
@ -432,16 +432,16 @@ PluginUIWindow::app_activated (bool)
}
bool
PluginUIWindow::create_lv2_editor(boost::shared_ptr<PluginInsert> insert)
PluginUIWindow::create_lv2_editor(boost::shared_ptr<PlugInsertBase> pib)
{
#ifdef HAVE_SUIL
boost::shared_ptr<LV2Plugin> vp;
if ((vp = boost::dynamic_pointer_cast<LV2Plugin> (insert->plugin())) == 0) {
if ((vp = boost::dynamic_pointer_cast<LV2Plugin> (pib->plugin())) == 0) {
error << _("create_lv2_editor called on non-LV2 plugin") << endmsg;
throw failed_constructor ();
} else {
LV2PluginUI* lpu = new LV2PluginUI (insert, vp);
LV2PluginUI* lpu = new LV2PluginUI (pib, vp);
_pluginui = lpu;
add (*lpu);
lpu->package (*this);
@ -523,9 +523,9 @@ PluginUIWindow::plugin_going_away ()
death_connection.disconnect ();
}
PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
: insert (pi)
, plugin (insert->plugin())
PlugUIBase::PlugUIBase (boost::shared_ptr<PlugInsertBase> pib)
: _pib (pib)
, plugin (pib->plugin())
, _add_button (_("Add"))
, _save_button (_("Save"))
, _delete_button (_("Delete"))
@ -543,10 +543,7 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
, preset_gui (0)
, preset_dialog (0)
{
bool for_auditioner = false;
if (insert->session().the_auditioner()) {
for_auditioner = insert->session().the_auditioner()->the_instrument() == insert;
}
_pi = boost::dynamic_pointer_cast<ARDOUR::PluginInsert> (_pib); /* may be NULL */
_preset_modified.set_size_request (16, -1);
_preset_combo.set_text("(default)");
@ -593,15 +590,18 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
_pin_management_button.set_icon (ArdourIcon::PluginPinout);
_pin_management_button.signal_clicked.connect (sigc::mem_fun (*this, &PlugUIBase::manage_pins));
insert->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&PlugUIBase::processor_active_changed, this, boost::weak_ptr<Processor>(insert)), gui_context());
_bypass_button.set_name ("plugin bypass button");
_bypass_button.set_text (_("Bypass"));
_bypass_button.set_icon (ArdourIcon::PluginBypass);
_bypass_button.set_active (!pi->enabled ());
_bypass_button.signal_button_release_event().connect (sigc::mem_fun(*this, &PlugUIBase::bypass_button_release), false);
if (_pi) {
_pi->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&PlugUIBase::processor_active_changed, this, boost::weak_ptr<Processor>(_pi)), gui_context());
_bypass_button.set_active (!_pi->enabled ());
} else {
_bypass_button.set_sensitive (false);
}
_focus_button.signal_button_release_event().connect (sigc::mem_fun(*this, &PlugUIBase::focus_toggled));
_focus_button.add_events (Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
@ -624,18 +624,17 @@ PlugUIBase::PlugUIBase (boost::shared_ptr<PluginInsert> pi)
cpuload_expander.property_expanded().signal_changed().connect( sigc::mem_fun(*this, &PlugUIBase::toggle_cpuload_display));
cpuload_expander.set_expanded(false);
insert->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PlugUIBase::plugin_going_away, this), gui_context());
_pib->DropReferences.connect (death_connection, invalidator (*this), boost::bind (&PlugUIBase::plugin_going_away, this), gui_context());
if (!for_auditioner) { /*auditioner can skip these signal-callbacks because these widgets are not shown anyway */
if (_pib->ui_elements () & PlugInsertBase::PluginPreset) {
plugin->PresetAdded.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::preset_added_or_removed, this), gui_context ());
plugin->PresetRemoved.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::preset_added_or_removed, this), gui_context ());
plugin->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::update_preset, this), gui_context ());
plugin->PresetDirty.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::update_preset_modified, this), gui_context ());
insert->AutomationStateChanged.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::automation_state_changed, this), gui_context());
insert->LatencyChanged.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::set_latency_label, this), gui_context());
}
if (_pi && _pi->ui_elements () != PlugInsertBase::NoGUIToolbar) {
_pi->AutomationStateChanged.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::automation_state_changed, this), gui_context());
_pi->LatencyChanged.connect (*this, invalidator (*this), boost::bind (&PlugUIBase::set_latency_label, this), gui_context());
automation_state_changed();
}
}
@ -658,40 +657,56 @@ PlugUIBase::plugin_going_away ()
{
drop_connections ();
/* drop references to the plugin/insert */
insert.reset ();
_pib.reset ();
_pi.reset ();
plugin.reset ();
}
void
PlugUIBase::add_common_widgets (Gtk::HBox* b, bool with_focus)
{
PlugInsertBase::UIElements const ui_elements = _pib->ui_elements ();
if (ui_elements == PlugInsertBase::NoGUIToolbar) {
return;
}
if (with_focus) {
b->pack_end (_focus_button, false, false);
}
b->pack_end (_bypass_button, false, false, with_focus ? 4 : 0);
if (ui_elements & PlugInsertBase::BypassEnable) {
b->pack_end (_bypass_button, false, false, with_focus ? 4 : 0);
}
if (insert->controls().size() > 0) {
if (_pib->controls().size() > 0) {
b->pack_end (_reset_button, false, false, 4);
}
if (has_descriptive_presets ()) {
b->pack_end (_preset_browser_button, false, false);
}
b->pack_end (_delete_button, false, false);
b->pack_end (_save_button, false, false);
b->pack_end (_add_button, false, false);
b->pack_end (_preset_combo, false, false);
b->pack_end (_preset_modified, false, false);
b->pack_end (_pin_management_button, false, false);
b->pack_start (_latency_button, false, false, 4);
if (ui_elements & PlugInsertBase::PluginPreset) {
b->pack_end (_delete_button, false, false);
b->pack_end (_save_button, false, false);
b->pack_end (_add_button, false, false);
b->pack_end (_preset_combo, false, false);
b->pack_end (_preset_modified, false, false);
}
if (_pi) {
b->pack_end (_pin_management_button, false, false);
b->pack_start (_latency_button, false, false, 4);
}
}
void
PlugUIBase::set_latency_label ()
{
samplecnt_t const l = insert->effective_latency ();
float const sr = insert->session().sample_rate ();
if (!_pi) {
return;
}
samplecnt_t const l = _pi->effective_latency ();
float const sr = _pi->session().sample_rate ();
_latency_button.set_text (samples_as_time_string (l, sr, true));
}
@ -699,8 +714,9 @@ PlugUIBase::set_latency_label ()
void
PlugUIBase::latency_button_clicked ()
{
assert (_pi);
if (!latency_gui) {
latency_gui = new LatencyGUI (*(insert.get()), insert->session().sample_rate(), insert->session().get_block_size());
latency_gui = new LatencyGUI (*(_pi.get()), _pi->session().sample_rate(), _pi->session().get_block_size());
latency_dialog = new ArdourWindow (_("Edit Latency"));
/* use both keep-above and transient for to try cover as many
different WM's as possible.
@ -735,7 +751,7 @@ PlugUIBase::preset_selected (Plugin::PresetRecord preset)
return;
}
if (!preset.label.empty()) {
insert->load_preset (preset);
_pib->load_preset (preset);
} else {
// blank selected = no preset
plugin->clear_preset();
@ -786,19 +802,19 @@ PlugUIBase::delete_plugin_setting ()
void
PlugUIBase::automation_state_changed ()
{
_reset_button.set_sensitive (insert->can_reset_all_parameters());
_reset_button.set_sensitive (_pib->can_reset_all_parameters());
}
void
PlugUIBase::reset_plugin_parameters ()
{
insert->reset_parameters_to_default ();
_pib->reset_parameters_to_default ();
}
bool
PlugUIBase::has_descriptive_presets () const
{
std::vector<Plugin::PresetRecord> presets = insert->plugin()->get_presets();
std::vector<Plugin::PresetRecord> presets = _pib->plugin()->get_presets();
for (std::vector<Plugin::PresetRecord>::const_iterator i = presets.begin(); i != presets.end(); ++i) {
if (i->valid && !i->description.empty()) {
return true;
@ -810,6 +826,9 @@ PlugUIBase::has_descriptive_presets () const
void
PlugUIBase::browse_presets ()
{
if (!_pi) {
return;
}
if (!preset_dialog) {
if (preset_gui) {
/* Do not allow custom window, if preset_gui is used.
@ -823,7 +842,7 @@ PlugUIBase::browse_presets ()
if (win) {
preset_dialog->set_transient_for (*win);
}
preset_gui = new PluginPresetsUI (insert);
preset_gui = new PluginPresetsUI (_pi);
preset_dialog->add (*preset_gui);
}
preset_dialog->show_all ();
@ -832,7 +851,8 @@ PlugUIBase::browse_presets ()
void
PlugUIBase::manage_pins ()
{
PluginPinWindowProxy* proxy = insert->pinmgr_proxy ();
assert (_pi);
PluginPinWindowProxy* proxy = _pi->pinmgr_proxy ();
if (proxy) {
proxy->get (true);
proxy->present ();
@ -843,10 +863,11 @@ PlugUIBase::manage_pins ()
bool
PlugUIBase::bypass_button_release (GdkEventButton*)
{
assert (_pi);
bool view_says_bypassed = (_bypass_button.active_state() != 0);
if (view_says_bypassed != insert->enabled ()) {
insert->enable (view_says_bypassed);
if (view_says_bypassed != _pi->enabled ()) {
_pi->enable (view_says_bypassed);
}
return false;
@ -910,11 +931,12 @@ PlugUIBase::toggle_description()
void
PlugUIBase::toggle_plugin_analysis()
{
assert (_pi);
if (plugin_analysis_expander.get_expanded() &&
!plugin_analysis_expander.get_child()) {
// Create the GUI
if (eqgui == 0) {
eqgui = new PluginEqGui (insert);
eqgui = new PluginEqGui (_pi);
}
plugin_analysis_expander.add (*eqgui);
@ -944,7 +966,7 @@ PlugUIBase::toggle_cpuload_display()
{
if (cpuload_expander.get_expanded() && !cpuload_expander.get_child()) {
if (stats_gui == 0) {
stats_gui = new PluginLoadStatsGui (insert);
stats_gui = new PluginLoadStatsGui (_pib);
}
cpuload_expander.add (*stats_gui);
cpuload_expander.show_all();
@ -967,7 +989,6 @@ PlugUIBase::toggle_cpuload_display()
toplevel->resize (wr.width, wr.height);
}
}
}
void

View File

@ -64,6 +64,7 @@
namespace ARDOUR {
class PluginInsert;
class PlugInsertBase;
class Plugin;
class WindowsVSTPlugin;
class LXVSTPlugin;
@ -90,7 +91,7 @@ class VSTPluginUI;
class PlugUIBase : public virtual sigc::trackable, public PBD::ScopedConnectionList
{
public:
PlugUIBase (boost::shared_ptr<ARDOUR::PluginInsert>);
PlugUIBase (boost::shared_ptr<ARDOUR::PlugInsertBase>);
virtual ~PlugUIBase();
virtual gint get_preferred_height () = 0;
@ -117,7 +118,8 @@ public:
sigc::signal<void,bool> KeyboardFocused;
protected:
boost::shared_ptr<ARDOUR::PluginInsert> insert;
boost::shared_ptr<ARDOUR::PlugInsertBase> _pib;
boost::shared_ptr<ARDOUR::PluginInsert> _pi;
boost::shared_ptr<ARDOUR::Plugin> plugin;
void add_common_widgets (Gtk::HBox*, bool with_focus = true);
@ -208,7 +210,7 @@ private:
class GenericPluginUI : public PlugUIBase, public Gtk::VBox
{
public:
GenericPluginUI (boost::shared_ptr<ARDOUR::PluginInsert> plug, bool scrollable=false);
GenericPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase> plug, bool scrollable=false);
~GenericPluginUI ();
gint get_preferred_height () { return prefheight; }
@ -342,9 +344,9 @@ private:
class PluginUIWindow : public ArdourWindow
{
public:
PluginUIWindow (boost::shared_ptr<ARDOUR::PluginInsert> insert,
bool scrollable=false,
bool editor=true);
PluginUIWindow (boost::shared_ptr<ARDOUR::PlugInsertBase>,
bool scrollable = false,
bool editor = true);
~PluginUIWindow ();
PlugUIBase& pluginui() { return *_pluginui; }
@ -377,12 +379,12 @@ private:
void app_activated (bool);
void plugin_going_away ();
bool create_windows_vst_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_lxvst_editor(boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_mac_vst_editor(boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_lv2_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_vst3_editor (boost::shared_ptr<ARDOUR::PluginInsert>);
bool create_windows_vst_editor (boost::shared_ptr<ARDOUR::PlugInsertBase>);
bool create_lxvst_editor(boost::shared_ptr<ARDOUR::PlugInsertBase>);
bool create_mac_vst_editor(boost::shared_ptr<ARDOUR::PlugInsertBase>);
bool create_audiounit_editor (boost::shared_ptr<ARDOUR::PlugInsertBase>);
bool create_lv2_editor (boost::shared_ptr<ARDOUR::PlugInsertBase>);
bool create_vst3_editor (boost::shared_ptr<ARDOUR::PlugInsertBase>);
static PluginUIWindow* the_plugin_window;
};
@ -391,12 +393,12 @@ private:
/* this function has to be in a .mm file
* because MacVSTPluginUI has Cocoa members
*/
extern VSTPluginUI* create_mac_vst_gui (boost::shared_ptr<ARDOUR::PluginInsert>);
extern VSTPluginUI* create_mac_vst_gui (boost::shared_ptr<ARDOUR::PlugInsertBase>);
#endif
#ifdef AUDIOUNIT_SUPPORT
/* this function has to be in a .mm file */
extern PlugUIBase* create_au_gui (boost::shared_ptr<ARDOUR::PluginInsert>, Gtk::VBox**);
extern PlugUIBase* create_au_gui (boost::shared_ptr<ARDOUR::PlugInsertBase>, Gtk::VBox**);
#endif
#endif /* __ardour_plugin_ui_h__ */

View File

@ -24,7 +24,6 @@
#include "pbd/unwind.h"
#include "ardour/plugin_insert.h"
#include "ardour/vst3_plugin.h"
#include "gtkmm2ext/gui_thread.h"
@ -37,8 +36,8 @@ using namespace ARDOUR;
using namespace Steinberg;
VST3HWNDPluginUI::VST3HWNDPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VST3Plugin> vst3)
: VST3PluginUI (pi, vst3)
VST3HWNDPluginUI::VST3HWNDPluginUI (boost::shared_ptr<PlugInsertBase> pib, boost::shared_ptr<VST3Plugin> vst3)
: VST3PluginUI (pib, vst3)
{
/* TODO register window class, implement wndproc etc */

View File

@ -29,7 +29,7 @@
class VST3HWNDPluginUI : public VST3PluginUI
{
public:
VST3HWNDPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VST3Plugin>);
VST3HWNDPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VST3Plugin>);
~VST3HWNDPluginUI ();
bool on_window_show(const std::string&);

View File

@ -43,7 +43,7 @@
class VST3NSViewPluginUI : public VST3PluginUI
{
public:
VST3NSViewPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VST3Plugin>);
VST3NSViewPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VST3Plugin>);
~VST3NSViewPluginUI ();
bool on_window_show(const std::string&);

View File

@ -28,7 +28,7 @@
#include "pbd/error.h"
#include "pbd/unwind.h"
#include "ardour/plugin_insert.h"
#include "ardour/plug_insert_base.h"
#include "ardour/vst3_plugin.h"
#include "gtkmm2ext/gui_thread.h"
@ -43,16 +43,16 @@ using namespace ARDOUR;
using namespace Steinberg;
VST3PluginUI*
create_mac_vst3_gui (boost::shared_ptr<PluginInsert> plugin_insert, Gtk::VBox** box)
create_mac_vst3_gui (boost::shared_ptr<PlugInsertBase> pib, Gtk::VBox** box)
{
VST3NSViewPluginUI* v = new VST3NSViewPluginUI (plugin_insert, boost::dynamic_pointer_cast<VST3Plugin> (plugin_insert->plugin()));
VST3NSViewPluginUI* v = new VST3NSViewPluginUI (pib, boost::dynamic_pointer_cast<VST3Plugin> (pib->plugin()));
*box = v;
return v;
}
VST3NSViewPluginUI::VST3NSViewPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VST3Plugin> vst3)
: VST3PluginUI (pi, vst3)
VST3NSViewPluginUI::VST3NSViewPluginUI (boost::shared_ptr<PlugInsertBase> pib, boost::shared_ptr<VST3Plugin> vst3)
: VST3PluginUI (pib, vst3)
{
pack_start (_gui_widget, true, true);

View File

@ -18,9 +18,8 @@
#include <glibmm/main.h>
#include "ardour/auditioner.h"
#include "ardour/plug_insert_base.h"
#include "ardour/session.h"
#include "ardour/plugin_insert.h"
#include "ardour/vst3_plugin.h"
#include "gtkmm2ext/gui_thread.h"
@ -36,9 +35,8 @@ using namespace Steinberg;
DEF_CLASS_IID (Presonus::IPlugInViewScaling)
#endif
VST3PluginUI::VST3PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VST3Plugin> vst3)
: PlugUIBase (pi)
, _pi (pi)
VST3PluginUI::VST3PluginUI (boost::shared_ptr<PlugInsertBase> pib, boost::shared_ptr<VST3Plugin> vst3)
: PlugUIBase (pib)
, _vst3 (vst3)
, _req_width (0)
, _req_height (0)
@ -48,16 +46,10 @@ VST3PluginUI::VST3PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_pt
_ardour_buttons_box.set_spacing (6);
_ardour_buttons_box.set_border_width (6);
bool for_auditioner =false;
if (insert->session().the_auditioner()) {
for_auditioner = insert->session().the_auditioner()->the_instrument() == insert;
}
if (!for_auditioner) {
add_common_widgets (&_ardour_buttons_box);
}
add_common_widgets (&_ardour_buttons_box);
_vst3->OnResizeView.connect (_resize_connection, invalidator (*this), boost::bind (&VST3PluginUI::resize_callback, this, _1, _2), gui_context());
//pi->plugin()->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&VST3PluginUI::queue_port_update, this), gui_context ());
//pib->plugin()->PresetLoaded.connect (*this, invalidator (*this), boost::bind (&VST3PluginUI::queue_port_update, this), gui_context ());
pack_start (_ardour_buttons_box, false, false);
_ardour_buttons_box.show_all ();

View File

@ -24,14 +24,14 @@
#include "plugin_ui.h"
namespace ARDOUR {
class PluginInsert;
class PlugInsertBase;
class VST3Plugin;
}
class VST3PluginUI : public PlugUIBase, public Gtk::VBox
{
public:
VST3PluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VST3Plugin>);
VST3PluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VST3Plugin>);
virtual ~VST3PluginUI ();
gint get_preferred_height ();
@ -49,7 +49,6 @@ protected:
bool forward_scroll_event (GdkEventScroll*);
boost::shared_ptr<ARDOUR::PluginInsert> _pi;
boost::shared_ptr<ARDOUR::VST3Plugin> _vst3;
Gtk::HBox _ardour_buttons_box;

View File

@ -178,8 +178,8 @@ private:
VST3X11Runloop static_runloop;
VST3X11PluginUI::VST3X11PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VST3Plugin> vst3)
: VST3PluginUI (pi, vst3)
VST3X11PluginUI::VST3X11PluginUI (boost::shared_ptr<PlugInsertBase> pib, boost::shared_ptr<VST3Plugin> vst3)
: VST3PluginUI (pib, vst3)
//, _runloop (new VST3X11Runloop)
{
_vst3->set_runloop (&static_runloop);

View File

@ -29,7 +29,7 @@
class VST3X11PluginUI : public VST3PluginUI
{
public:
VST3X11PluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VST3Plugin>);
VST3X11PluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VST3Plugin>);
~VST3X11PluginUI ();
bool on_window_show(const std::string&);

View File

@ -35,21 +35,15 @@
#include <gdk/gdkx.h>
#endif
VSTPluginUI::VSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert> insert, boost::shared_ptr<ARDOUR::VSTPlugin> plugin)
: PlugUIBase (insert)
VSTPluginUI::VSTPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase> pib, boost::shared_ptr<ARDOUR::VSTPlugin> plugin)
: PlugUIBase (pib)
, _vst (plugin)
{
Gtk::HBox* box = manage (new Gtk::HBox);
box->set_spacing (6);
box->set_border_width (6);
bool for_auditioner =false;
if (insert->session().the_auditioner()) {
for_auditioner = insert->session().the_auditioner()->the_instrument() == insert;
}
if (!for_auditioner) {
add_common_widgets (box);
}
add_common_widgets (box);
pack_start (*box, false, false);
box->signal_size_allocate().connect (sigc::mem_fun (*this, &VSTPluginUI::top_box_allocated));

View File

@ -28,7 +28,7 @@ namespace ARDOUR {
class VSTPluginUI : public PlugUIBase, public Gtk::VBox
{
public:
VSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VSTPlugin>);
VSTPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VSTPlugin>);
virtual ~VSTPluginUI ();
virtual int get_preferred_height ();

View File

@ -22,7 +22,7 @@
#include <gtk/gtksocket.h>
#include "gtkmm2ext/gui_thread.h"
#include "fst.h"
#include "ardour/plugin_insert.h"
#include "ardour/plug_insert_base.h"
#include "ardour/windows_vst_plugin.h"
#include "windows_vst_plugin_ui.h"
@ -39,8 +39,8 @@ using namespace Gtk;
using namespace ARDOUR;
using namespace PBD;
WindowsVSTPluginUI::WindowsVSTPluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<VSTPlugin> vp, GtkWidget *parent)
: VSTPluginUI (pi, vp)
WindowsVSTPluginUI::WindowsVSTPluginUI (boost::shared_ptr<PlugInsertBase> pib, boost::shared_ptr<VSTPlugin> vp, GtkWidget *parent)
: VSTPluginUI (pib, vp)
{
#ifdef GDK_WINDOWING_WIN32

View File

@ -26,7 +26,7 @@
class WindowsVSTPluginUI : public VSTPluginUI
{
public:
WindowsVSTPluginUI (boost::shared_ptr<ARDOUR::PluginInsert>, boost::shared_ptr<ARDOUR::VSTPlugin>, GtkWidget *parent);
WindowsVSTPluginUI (boost::shared_ptr<ARDOUR::PlugInsertBase>, boost::shared_ptr<ARDOUR::VSTPlugin>, GtkWidget *parent);
~WindowsVSTPluginUI ();
bool start_updating (GdkEventAny*) { return false; }