21 #include "gtk2ardour-config.h"
28 #include <sigc++/bind.h>
32 #include <glibmm/miscutils.h>
34 #include <gtkmm/messagedialog.h>
79 #ifdef AUDIOUNIT_SUPPORT
109 , _output_icon(false)
141 for (set<Evoral::Parameter>::iterator i = p.begin(); i != p.end(); ++i) {
145 if (boost::dynamic_pointer_cast<Send> (
_processor)) {
147 }
else if (boost::dynamic_pointer_cast<Return> (
_processor)) {
155 if (boost::dynamic_pointer_cast<Amp> (
_processor) == 0) {
170 _vbox.set_size_request (-1,
_button.size_request().height);
229 _button.set_name (
"processor prefader");
233 _button.set_name (
"processor fader");
237 _button.set_name (
"processor postfader");
303 std::string postfix =
"";
305 if ((replicated = pi->
get_count()) > 1) {
306 postfix =
string_compose(
_(
"\nThis mono plugin has been replicated %1 times."), replicated);
308 if (pi->
plugin()->has_editor()) {
310 string_compose (
_(
"<b>%1</b>\nDouble-click to show GUI.\nAlt+double-click to show generic GUI.%2"),
name (
Wide), postfix));
331 if ((send = boost::dynamic_pointer_cast<Send> (
_processor)) != 0 &&
332 !boost::dynamic_pointer_cast<InternalSend>(
_processor)) {
338 string::size_type lbracket, rbracket;
339 lbracket = send->
name().find (
'[');
340 rbracket = send->
name().find (
']');
344 name_display += send->
name().substr (lbracket+1, lbracket-rbracket-1);
354 if ((pi = boost::dynamic_pointer_cast<ARDOUR::PluginInsert> (
_processor)) != 0
378 (*i)->set_visible (
true);
388 (*i)->set_visible (
false);
397 for (list<Control*>::const_iterator i =
_controls.begin(); i !=
_controls.end(); ++i) {
398 (*i)->add_state (node);
405 for (list<Control*>::const_iterator i =
_controls.begin(); i !=
_controls.end(); ++i) {
406 (*i)->set_state (node);
420 (*i)->hide_things ();
428 using namespace Menu_Helpers;
429 Menu* menu = manage (
new Menu);
430 MenuList& items = menu->items ();
441 items.push_back (SeparatorElem ());
445 items.push_back (CheckMenuElem ((*i)->name ()));
446 Gtk::CheckMenuItem* c =
dynamic_cast<Gtk::CheckMenuItem*
> (&items.back ());
447 c->set_active ((*i)->visible ());
464 using namespace Menu_Helpers;
465 Menu* menu = manage (
new Menu);
466 MenuList& items = menu->items ();
471 items.push_back (CheckMenuElem (
_(
"Link panner controls")));
472 Gtk::CheckMenuItem* c =
dynamic_cast<Gtk::CheckMenuItem*
> (&items.back ());
473 c->set_active (send->
panner_shell()->is_linked_to_route());
493 , _slider_persistant_tooltip (&_slider)
495 , _ignore_ui_adjustment (false)
500 box.set_padding(0, 0, 4, 4);
505 _button.set_name (
"processor control button");
515 _slider.set_name (
"ProcessorControlSlider");
528 if (smallstep == 0.0) {
529 smallstep = up / 1000.;
534 if (largestep == 0.0) {
535 largestep = up / 40.;
573 s << setprecision(2) << fixed;
577 string sm = Glib::Markup::escape_text (s.str());
579 _slider_persistant_tooltip.set_tip (sm);
586 if (_ignore_ui_adjustment) {
624 _ignore_ui_adjustment =
true;
636 _ignore_ui_adjustment =
false;
721 sinks.
set(DataType::MIDI, 1);
722 sources.
set(DataType::MIDI, 1);
764 cairo_t* cr = gdk_cairo_create (get_window()->gobj());
766 cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
769 Gtk::Allocation a = get_allocation();
770 double const width = a.get_width();
771 double const height = a.get_height();
773 Gdk::Color
const bg = get_style()->get_bg (STATE_NORMAL);
774 cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
776 cairo_rectangle (cr, 0, 0, width, height);
780 if (_ports.n_total() > 1) {
781 for (uint32_t i = 0; i < _ports.n_total(); ++i) {
782 if (i < _ports.n_midi()) {
783 cairo_set_source_rgb (cr,
788 cairo_set_source_rgb (cr,
793 const float x = rintf(width * (.2
f + .6
f * i / (_ports.n_total() - 1.f)));
794 cairo_rectangle (cr, x-dx * .5, 0, 1+dx, height);
797 }
else if (_ports.n_total() == 1) {
798 if (_ports.n_midi() == 1) {
799 cairo_set_source_rgb (cr,
804 cairo_set_source_rgb (cr,
809 const float x = rintf(width * .5);
810 cairo_rectangle (cr, x-dx * .5, 0, 1+dx, height);
822 cairo_t* cr = gdk_cairo_create (get_window()->gobj());
824 cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height);
828 cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
830 Gtk::Allocation a = get_allocation();
831 double const width = a.get_width();
832 double const height = a.get_height();
834 Gdk::Color
const bg = get_style()->get_bg (STATE_NORMAL);
835 cairo_set_source_rgb (cr, bg.get_red_p (), bg.get_green_p (), bg.get_blue_p ());
837 cairo_rectangle (cr, 0, 0, width, height);
840 Gdk::Color
const fg = get_style()->get_fg (STATE_NORMAL);
841 cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ());
843 const uint32_t sources = _sources.n_total();
844 const uint32_t sinks = _sinks.n_total();
847 const uint32_t midi_sources = _sources.n_midi();
848 const uint32_t midi_sinks = _sinks.n_midi();
850 cairo_set_source_rgb (cr,
854 if (midi_sources > 0 && midi_sinks > 0 && sinks > 1 && sources > 1) {
855 for (uint32_t i = 0 ; i < midi_sources; ++i) {
856 const float si_x = rintf(width * (.2
f + .6
f * i / (sinks - 1.
f))) + .5f;
857 const float si_x0 = rintf(width * (.2
f + .6
f * i / (sources - 1.
f))) + .5f;
858 cairo_move_to (cr, si_x, height);
859 cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
862 }
else if (midi_sources == 1 && midi_sinks == 1 && sinks == 1 && sources == 1) {
863 const float si_x = rintf(width * .5
f) + .5f;
864 cairo_move_to (cr, si_x, height);
865 cairo_line_to (cr, si_x, 0);
867 }
else if (midi_sources == 1 && midi_sinks == 1) {
869 const float si_x = rintf(width * (sinks > 1 ? .2
f : .5
f)) + .5f;
870 const float si_x0 = rintf(width * (sources > 1 ? .2f : .5f)) + .5f;
871 cairo_move_to (cr, si_x, height);
872 cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
877 const uint32_t audio_sources = _sources.n_audio();
878 const uint32_t audio_sinks = _sinks.n_audio();
879 cairo_set_source_rgb (cr,
885 assert(audio_sources < 2);
886 assert(audio_sinks > 1);
888 const float si_x0 = rintf(width * (midi_sources > 0 ? .8
f : .5
f)) + .5f;
889 for (uint32_t i = midi_sinks; i < sinks; ++i) {
890 const float si_x = rintf(width * (.2f + .6f * i / (sinks - 1.f))) + .5f;
891 cairo_move_to (cr, si_x, height);
892 cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
895 }
else if (audio_sources > 1) {
896 for (uint32_t i = 0 ; i < audio_sources; ++i) {
897 const float si_x = rintf(width * (.2
f + .6
f * (i + midi_sinks) / (sinks - 1.
f))) + .5f;
898 const float si_x0 = rintf(width * (.2
f + .6
f * (i + midi_sources) / (sources - 1.
f))) + .5f;
899 cairo_move_to (cr, si_x, height);
900 cairo_curve_to (cr, si_x, 0, si_x0, height, si_x0, 0);
903 }
else if (audio_sources == 1 && audio_sinks == 1) {
904 const float si_x = rintf(width * .5
f) + .5f;
905 cairo_move_to (cr, si_x, height);
906 cairo_line_to (cr, si_x, 0);
915 : _parent_strip (parent)
916 , _owner_is_mixer (owner_is_mixer)
917 , ab_direction (true)
918 , _get_plugin_selector (get_plugin_selector)
920 , _visible_prefader_processors (0)
921 , _rr_selection(rsel)
922 , _redisplay_pending (false)
1022 list<ProcessorEntry*>::iterator i = c.begin ();
1024 assert (i != c.end ());
1025 p = (*i)->processor ();
1030 list<ProcessorEntry*> children = source->
selection ();
1031 list<boost::shared_ptr<Processor> > procs;
1032 for (list<ProcessorEntry*>::const_iterator i = children.begin(); i != children.end(); ++i) {
1033 if ((*i)->processor ()) {
1034 procs.push_back ((*i)->processor ());
1039 XMLNode& state = (*i)->get_state ();
1041 nlist.push_back (&state);
1050 if ((context->get_suggested_action() == Gdk::ACTION_MOVE) && source) {
1068 for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
1069 (*i)->set_enum_width (w);
1085 using namespace Menu_Helpers;
1086 Menu* menu = manage (
new Menu);
1087 MenuList& items = menu->items();
1089 for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) {
1110 if (plugin_menu_item) {
1118 if (aux_menu_item) {
1120 if (m && !m->items().empty()) {
1121 aux_menu_item->set_submenu (*m);
1122 aux_menu_item->set_sensitive (
true);
1125 gtk_menu_item_set_submenu (aux_menu_item->gobj(), 0);
1126 aux_menu_item->set_sensitive (
false);
1139 if (controls_menu_item) {
1140 if (single_selection) {
1142 if (m && !m->items().empty()) {
1143 controls_menu_item->set_submenu (*m);
1144 controls_menu_item->set_sensitive (
true);
1146 gtk_menu_item_set_submenu (controls_menu_item->gobj(), 0);
1147 controls_menu_item->set_sensitive (
false);
1150 controls_menu_item->set_sensitive (
false);
1155 if (send_menu_item) {
1156 if (single_selection) {
1158 if (m && !m->items().empty()) {
1159 send_menu_item->set_submenu (*m);
1160 send_menu_item->set_sensitive (
true);
1162 gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
1163 send_menu_item->set_sensitive (
false);
1166 send_menu_item->set_sensitive (
false);
1181 if (single_selection) {
1189 rename_action->set_sensitive (single_selection && !pi && !boost::dynamic_pointer_cast<Amp> (single_selection->
processor ()));
1259 if (targets.empty()) {
1271 for (ProcSelection::iterator i = targets.begin(); i != targets.end(); ++i) {
1272 if ((*i)->active()) {
1273 (*i)->deactivate ();
1309 if (processor && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS))) {
1318 if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
1327 }
else if (Keyboard::is_context_menu_event (ev)) {
1333 }
else if (processor && ev->button == 1 && selected) {
1338 }
else if (!processor && ev->button == 1 && ev->type == GDK_2BUTTON_PRESS) {
1355 if (processor && Keyboard::is_delete_event (ev)) {
1357 Glib::signal_idle().connect (sigc::bind (
1361 }
else if (processor && Keyboard::is_button2_event (ev)
1363 && (Keyboard::no_modifier_keys_pressed (ev) && ((ev->state & Gdk::BUTTON2_MASK) == Gdk::BUTTON2_MASK))
1369 if (processor->
active()) {
1409 for (SelectedPlugins::const_iterator p = plugins.begin(); p != plugins.end(); ++p) {
1436 string text =
string_compose(
_(
"You attempted to add the plugin \"%1\" in slot %2.\n"),
1442 text +=
_(
"\nThis plugin has:\n");
1452 text +=
_(
"\nbut at the insertion point, there are:\n");
1462 text +=
string_compose (
_(
"\n%1 is unable to insert this plugin here.\n"), PROGRAM_NAME);
1463 label.set_text(text);
1465 dialog.get_vbox()->pack_start (label);
1466 dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
1468 dialog.set_name (
X_(
"PluginIODialog"));
1469 dialog.set_modal (
true);
1497 send->
output()->ensure_io (outs,
false,
this);
1498 }
catch (AudioEngine::PortRegistrationFailure& err) {
1544 processor->activate ();
1572 processor->activate ();
1647 #if 0 // is this still needed? Why?
1672 void* existing_ui = p->
get_ui ();
1675 wp->
use_window (*(reinterpret_cast<Gtk::Window*>(existing_ui)));
1687 if (processor && processor->display_to_user()) {
1689 if (boost::dynamic_pointer_cast<Amp>(processor)) {
1704 if (!processor || !processor->display_to_user()) {
1711 if (plugin_insert) {
1721 if (!send && !plugin_insert && !ext)
1722 e->set_selectable(
false);
1724 bool mark_send_visible =
false;
1731 if (!st.
get_node(strip, e->state_id())) {
1732 mark_send_visible =
true;
1739 e->set_control_state (proc);
1742 if (mark_send_visible) {
1743 e->show_all_controls ();
1760 bool pre_fader =
true;
1763 for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
1764 if (boost::dynamic_pointer_cast<Amp>((*i)->processor())) {
1783 for (list<ProcessorEntry*>::iterator i = children.begin(); i != children.end(); ++i) {
1784 if ((*i)->processor()) {
1785 our_processors.push_back ((*i)->processor ());
1811 label.set_text (
_(
"\
1812 You cannot reorder these plugins/sends/inserts\n\
1813 in that way because the inputs and\n\
1814 outputs will not work correctly."));
1816 dialog.get_vbox()->set_border_width (12);
1817 dialog.get_vbox()->pack_start (label);
1818 dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
1820 dialog.set_name (
X_(
"PluginIODialog"));
1821 dialog.set_modal (
true);
1834 if (to_be_renamed.empty()) {
1838 for (ProcSelection::iterator i = to_be_renamed.begin(); i != to_be_renamed.end(); ++i) {
1846 vector<boost::shared_ptr<Processor> > sel;
1854 if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0 ||
1867 if (to_be_removed.empty()) {
1875 for (ProcSelection::const_iterator i = to_be_removed.begin(); i != to_be_removed.end(); ++i) {
1877 if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0 ||
1887 XMLNode& child ((*i)->get_state());
1889 to_cut.push_back (*i);
1908 if (to_be_copied.empty()) {
1914 for (ProcSelection::const_iterator i = to_be_copied.begin(); i != to_be_copied.end(); ++i) {
1916 if (boost::dynamic_pointer_cast<PluginInsert>((*i)) != 0 ||
1929 if (targets.empty()) {
1935 for (ProcSelection::const_iterator i = targets.begin(); i != targets.end(); ++i) {
1953 list<boost::shared_ptr<Processor> >::const_iterator x;
1956 for (x = procs.begin(); x != procs.end(); ++x) {
1995 name_prompter.set_title (
_(
"Rename Processor"));
1998 name_prompter.add_button (
_(
"Rename"), Gtk::RESPONSE_ACCEPT);
1999 name_prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT,
false);
2000 name_prompter.show_all ();
2002 switch (name_prompter.run ()) {
2004 case Gtk::RESPONSE_ACCEPT:
2006 if (result.length()) {
2009 string test = result;
2011 while (tries < 100) {
2026 (
string_compose (
_(
"At least 100 IO objects exist with a name like %1 - name not changed"), result));
2060 list<boost::shared_ptr<Processor> > copies;
2062 if (nlist.empty()) {
2066 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2068 XMLProperty const * type = (*niter)->property (
"type");
2069 XMLProperty const * role = (*niter)->property (
"role");
2074 if (type->
value() ==
"meter" ||
2075 type->
value() ==
"main-outs" ||
2076 type->
value() ==
"amp" ||
2077 type->
value() ==
"intreturn") {
2081 }
else if (type->
value() ==
"intsend") {
2089 if (role->
value() !=
"Aux") {
2098 IOProcessor::prepare_for_reset (n, s->
name());
2100 if (s->
set_state (n, Stateful::loading_state_version)) {
2107 }
else if (type->
value() ==
"send") {
2114 IOProcessor::prepare_for_reset (n, s->
name());
2116 if (s->
set_state (n, Stateful::loading_state_version)) {
2123 }
else if (type->
value() ==
"return") {
2128 IOProcessor::prepare_for_reset (n, r->
name());
2130 if (r->
set_state (n, Stateful::loading_state_version)) {
2137 }
else if (type->
value() ==
"port") {
2142 IOProcessor::prepare_for_reset (n, pi->
name());
2144 if (pi->
set_state (n, Stateful::loading_state_version)) {
2156 p->
set_state (**niter, Stateful::current_state_version);
2159 copies.push_back (p);
2163 error <<
_(
"plugin insert constructor failed") <<
endmsg;
2167 if (copies.empty()) {
2174 "Copying the set of processors on the clipboard failed,\n\
2175 probably because the I/O configuration of the plugins\n\
2176 could not match the configuration of this track.");
2177 MessageDialog am (msg);
2186 for (list<ProcessorEntry*>::const_iterator i = selection.begin(); i != selection.end(); ++i) {
2187 processors.push_back ((*i)->processor ());
2195 for (list<ProcessorEntry*>::iterator i = selection.begin(); i != selection.end(); ++i) {
2196 (this->*method) ((*i)->processor ());
2218 vector<string> choices;
2220 prompt =
string_compose (
_(
"Do you really want to remove all processors from %1?\n"
2223 choices.push_back (
_(
"Cancel"));
2224 choices.push_back (
_(
"Yes, remove them all"));
2228 if (prompter.run () == 1) {
2238 vector<string> choices;
2241 prompt =
string_compose (
_(
"Do you really want to remove all pre-fader processors from %1?\n"
2244 prompt =
string_compose (
_(
"Do you really want to remove all post-fader processors from %1?\n"
2248 choices.push_back (
_(
"Cancel"));
2249 choices.push_back (
_(
"Yes, remove them all"));
2253 if (prompter.run () == 1) {
2267 boost::dynamic_pointer_cast<Send> (processor) ||
2269 boost::dynamic_pointer_cast<PluginInsert> (processor) ||
2282 list<ProcessorEntry*>::iterator i = selection.begin();
2287 return (i != selection.end());
2312 if (boost::dynamic_pointer_cast<AudioTrack>(
_route) != 0) {
2314 if (boost::dynamic_pointer_cast<AudioTrack> (
_route)->freeze_state() == AudioTrack::Frozen) {
2319 if (boost::dynamic_pointer_cast<Amp> (processor)) {
2325 }
else if ((send = boost::dynamic_pointer_cast<Send> (processor)) != 0) {
2331 if (boost::dynamic_pointer_cast<InternalSend> (processor) == 0) {
2336 }
else if ((retrn = boost::dynamic_pointer_cast<Return> (processor)) != 0) {
2338 if (boost::dynamic_pointer_cast<InternalReturn> (retrn)) {
2355 return_ui->set_title (retrn->
name ());
2364 }
else if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert> (processor)) != 0) {
2373 plugin_ui =
new PluginUIWindow (plugin_insert,
false, use_custom);
2383 }
else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (processor)) != 0) {
2386 MessageDialog msg (
_(
"Not connected to audio engine - no I/O changes are possible"));
2403 gidget = io_selector;
2415 if (!plugin_insert) {
2428 Glib::RefPtr<Gtk::ActionGroup> popup_act_grp = Gtk::ActionGroup::create(
X_(
"ProcessorMenu"));
2429 Glib::RefPtr<Action> act;
2486 popup_act_grp,
X_(
"edit"),
_(
"Edit..."),
2490 popup_act_grp,
X_(
"edit-generic"),
_(
"Edit with generic controls..."),
2685 if (boost::dynamic_pointer_cast<InternalSend> (processor) == 0) {
2751 for (list<ProcessorEntry*>::iterator iter = children.begin(); iter != children.end(); ++iter) {
2753 processor = (*iter)->processor ();
2767 if ((send = boost::dynamic_pointer_cast<Send> (processor)) != 0) {
2768 w->set_title (send->
name ());
2769 }
else if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert> (processor)) != 0) {
2778 string maker = pi->
plugin()->maker() ? pi->
plugin()->maker() :
"";
2779 string::size_type email_pos;
2781 if ((email_pos = maker.find_first_of (
'<')) != string::npos) {
2782 maker = maker.substr (0, email_pos - 1);
2785 if (maker.length() > 32) {
2786 maker = maker.substr (0, 32);
2833 list<ProcessorEntry*>::const_iterator i = children.begin();
2834 while (i != children.end() && (*i)->processor() != d) {
2838 if (i == children.end()) {
2850 for (list<ProcessorEntry*>::iterator i = c.begin(); i != c.end(); ++i) {
2851 (*i)->hide_things ();
2895 :
WM::ProxyBase (name, string())
2896 , _processor_box (box)
2897 , _processor (processor)
2899 , want_custom (false)
2940 node = &ProxyBase::get_state();
2949 XMLNodeList::const_iterator i = children.begin ();
2950 while (i != children.end()) {
2952 if ((*i)->name() ==
X_(
"Window") && prop && prop->
value() ==
_name) {
2958 if (i != children.end()) {
2960 if ((prop = (*i)->property (
X_(
"custom-ui"))) != 0) {
2965 ProxyBase::set_state(node);
bool processor_button_press_event(GdkEventButton *, ProcessorEntry *)
void set_control_state(XMLNode const *)
void compute_processor_sort_keys()
static void rb_choose_insert()
void add_processor_to_display(boost::weak_ptr< ARDOUR::Processor >)
boost::shared_ptr< ARDOUR::Route > _route
void set_ports(ARDOUR::ChanCount const ports)
bool use_plugins(const SelectedPlugins &)
void object_drop(Gtkmm2ext::DnDVBox< ProcessorEntry > *, ProcessorEntry *, Glib::RefPtr< Gdk::DragContext > const &)
LIBGTKMM2EXT_API Gtk::Widget * get_widget(const char *name)
bool one_processor_can_be_edited()
void show_processor_menu(int)
PBD::ScopedConnection _splitting_connection
std::string name(Width) const
void processor_going_away()
PBD::ScopedConnection going_away_connection
void all_visible_processors_active(bool state)
float lower
Minimum value (in Hz, for frequencies)
ChanCount natural_output_streams() const
float normal
Default value.
std::list< T * > selection() const
PBD::Signal0< void > DropReferences
void show_send(boost::shared_ptr< ARDOUR::Send >)
PBD::ScopedConnectionList _mixer_strip_connections
const std::string & value() const
PBD::Signal1< void, const PropertyChange & > PropertyChanged
boost::shared_ptr< Send > internal_send_for(boost::shared_ptr< const Route > target) const
PBD::Signal0< void > PluginIoReConfigure
void processor_configuration_changed(const ARDOUR::ChanCount in, const ARDOUR::ChanCount out)
gint idle_delete_processor(boost::weak_ptr< ARDOUR::Processor >)
bool processor_operation(ProcessorOperation)
void processor_active_changed()
#define ngettext(Msgid1, Msgid2, N)
void weird_plugin_dialog(ARDOUR::Plugin &p, ARDOUR::Route::ProcessorStreams streams)
int add_processors(const ProcessorList &, boost::shared_ptr< Processor >, ProcessorStreams *err=0)
static Glib::RefPtr< Gtk::Action > edit_action
int add_processor_by_index(boost::shared_ptr< Processor >, int, ProcessorStreams *err=0, bool activation_allowed=true)
bool edit_aux_send(boost::shared_ptr< ARDOUR::Processor >)
void set_window_proxy(ProcessorWindowProxy *wp)
boost::shared_ptr< ARDOUR::Processor > _processor_being_created
PluginInsertProcessorEntry(ProcessorBox *, boost::shared_ptr< ARDOUR::PluginInsert >, Width)
PBD::ScopedConnectionList _route_connections
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
static ARDOUR_UI * instance()
LIBARDOUR_API PBD::PropertyDescriptor< std::string > name
void send_io_finished(IOSelector::Result, boost::weak_ptr< ARDOUR::Processor >, IOSelectorWindow *)
#define UINT_RGBA_G_FLT(x)
void revert_to_default_display()
boost::shared_ptr< Pannable > pannable() const
std::vector< Glib::RefPtr< Gtk::Action > > engine_sensitive_actions
static Glib::RefPtr< Gtk::Action > edit_generic_action
static void rb_choose_plugin()
static Manager & instance()
Gtk::Menu * build_processor_menu()
int set_state(const XMLNode &, int version)
static void rb_select_all()
void edit_processor(boost::shared_ptr< ARDOUR::Processor >)
static Glib::RefPtr< Gtk::Action > cut_action
static void rb_choose_aux(boost::weak_ptr< ARDOUR::Route >)
void delete_dragged_processors(const std::list< boost::shared_ptr< ARDOUR::Processor > > &)
void route_processors_changed(ARDOUR::RouteProcessorChange)
ProcessorBox * _processor_box
LIBPBD_API Transmitter error
#define UINT_RGBA_B_FLT(x)
boost::shared_ptr< ARDOUR::Delivery > current_delivery() const
int remove_processor(boost::shared_ptr< Processor >, ProcessorStreams *err=0, bool need_process_lock=true)
const XMLNodeList & children(const std::string &str=std::string()) const
Gtk::Window * get_generic_editor_window(boost::shared_ptr< ARDOUR::Processor >)
void processor_menu_unmapped()
PBD::ScopedConnection active_connection
std::ostream & endmsg(std::ostream &ostr)
PBD::Signal2< void, ChanCount, ChanCount > ConfigurationChanged
boost::shared_ptr< Plugin > plugin(uint32_t num=0) const
boost::shared_ptr< MuteMaster > mute_master() const
static const uint32_t midi_port_color
void plugin_insert_splitting_changed()
void set_route(boost::shared_ptr< ARDOUR::Route >)
void set_visual_state(Gtkmm2ext::VisualState, bool)
void setup_entry_positions()
void set_enum_width(Width)
uint32_t get_count() const
void register_window(ProxyBase *)
int set_state(const XMLNode &, int version)
static XMLNode * get_node(const XMLNode *, const std::string &)
ProcessorEntry(ProcessorBox *, boost::shared_ptr< ARDOUR::Processor >, Width)
#define ENSURE_GUI_THREAD(obj, method,...)
static void rb_deselect_all()
Gtk::Window * get(bool create=false)
void add_internal_send(boost::shared_ptr< Route >, int, boost::shared_ptr< Route >)
Gtk::Menu * build_controls_menu()
uint32_t _visible_prefader_processors
bool meter_visibly_changed
void set_initial_text(std::string txt)
void redisplay_processors()
void mixer_strip_delivery_changed(boost::weak_ptr< ARDOUR::Delivery >)
void use_window(Gtk::Window &)
void update_gui_object_state(ProcessorEntry *)
static void rb_clear_pre()
std::string state_id() const
void get_selected_processors(ProcSelection &) const
std::list< XMLNode * > XMLNodeList
void maybe_add_processor_to_ui_list(boost::weak_ptr< ARDOUR::Processor >)
sigc::signal< void, DnDVBox *, T *, Glib::RefPtr< Gdk::DragContext > const & > DropFromAnotherBox
sigc::signal< void, boost::shared_ptr< ARDOUR::Processor > > ProcessorSelected
std::vector< ARDOUR::PluginPtr > SelectedPlugins
Gtk::Menu * processor_menu
void set_position(Position, uint32_t)
XMLNode * entry_gui_object_state(ProcessorEntry *)
virtual void deactivate()
void processor_property_changed(const PBD::PropertyChange &)
ChanCount natural_input_streams() const
LIBGTKMM2EXT_API void set_sensitive(std::vector< Glib::RefPtr< Gtk::Action > > &actions, bool)
boost::function< PluginSelector *()> _get_plugin_selector
virtual std::string display_name() const
ProcessorBox(ARDOUR::Session *, boost::function< PluginSelector *()> get_plugin_selector, RouteProcessorSelection &, MixerStrip *parent, bool owner_is_mixer=false)
bool io_name_is_legal(const std::string &)
void return_io_finished(IOSelector::Result, boost::weak_ptr< ARDOUR::Processor >, IOSelectorWindow *)
static void rb_ab_plugins()
ChanCount output_streams() const
XMLProperty * property(const char *)
LIBARDOUR_API RCConfiguration * Config
void route_property_changed(const PBD::PropertyChange &)
bool on_expose_event(GdkEventExpose *)
float upper
Maximum value (in Hz, for frequencies)
LIBGTKMM2EXT_API void set_no_tooltip_whatsoever(Gtk::Widget &)
void delete_when_idle(T *obj)
void set_default_value(float)
void set_prompt(std::string prompt)
void set_sinks(ARDOUR::ChanCount const sinks)
void set_sources(ARDOUR::ChanCount const sources)
XMLNode * get_or_add_node(const std::string &)
std::vector< boost::shared_ptr< ARDOUR::Processor > > ProcSelection
const ParameterDescriptor & desc() const
virtual double internal_to_interface(double i) const
virtual std::string describe_parameter(Evoral::Parameter param)
XMLNode & get_state() const
bool string_is_affirmative(const std::string &str)
bool on_expose_event(GdkEventExpose *)
int set_state(const XMLNode &, int version)
bool processor_can_be_edited(boost::shared_ptr< ARDOUR::Processor >)
boost::shared_ptr< Route > master_out() const
boost::shared_ptr< ARDOUR::PluginInsert > _plugin_insert
ChanCount input_streams() const
Gtk::Menu * build_send_options_menu()
void all_visible_processors_active(bool)
const PBD::ID & id() const
virtual bool set_name(const std::string &str)
int add_placeholder(double y)
ARDOUR::SessionHandlePtr * session_handle()
const std::set< Evoral::Parameter > & what_can_be_automated() const
static void rb_choose_send()
ChanCount n_outputs() const
void set_text(const std::string &, bool centered=true, bool expose=true)
RouteProcessorSelection & _rr_selection
Control(boost::shared_ptr< ARDOUR::AutomationControl >, std::string const &)
PBD::ScopedConnection name_connection
void generic_edit_processor(boost::shared_ptr< ARDOUR::Processor >)
bool leave_notify(GdkEventCrossing *ev)
void toggle_panner_link()
static void rb_clear_post()
void foreach_processor(boost::function< void(boost::weak_ptr< Processor >)> method)
virtual void setup_visuals()
void choose_aux(boost::weak_ptr< ARDOUR::Route >)
void paste_processor_state(const XMLNodeList &, boost::shared_ptr< ARDOUR::Processor >)
static Glib::RefPtr< Gtk::Action > rename_action
static ProcessorBox * _current_processor_box
void deselect_all_processors()
std::string generate_processor_title(boost::shared_ptr< ARDOUR::PluginInsert > pi)
int remove_processors(const ProcessorList &, ProcessorStreams *err=0)
std::string state_id() const
void delete_processors(const ProcSelection &)
void toggle_control_visibility(Control *)
void set_title(const std::string &title)
Gtk::Window * get_editor_window(boost::shared_ptr< ARDOUR::Processor >, bool)
std::vector< Glib::RefPtr< Gtk::Action > > plugin_selection_sensitive_actions
void help_count_visible_prefader_processors(boost::weak_ptr< ARDOUR::Processor >, uint32_t *, bool *)
MixerStrip * _parent_strip
static GUIObjectState & gui_object_state()
void remove(const ProxyBase *)
LIBARDOUR_API RuntimeProfile * Profile
void get_result(std::string &str, bool strip=true)
bool processor_button_release_event(GdkEventButton *, ProcessorEntry *)
PluginInfoPtr get_info() const
sigc::signal< void > Reordered
ProcessorWindowProxy * window_proxy() const
void set_custom_ui_mode(bool use_custom)
void cut_processors(const ProcSelection &)
void set_tip(Gtk::Widget &w, const gchar *tip)
static Glib::RefPtr< Gtk::Action > paste_action
XMLProperty * add_property(const char *name, const std::string &value)
ChanCount count
Input requested of processor.
void for_selected_processors(void(ProcessorBox::*pmf)(boost::shared_ptr< ARDOUR::Processor >))
bool no_processor_redisplay
uint32_t index
Index of processor where configuration failed.
PBD::Signal1< void, RouteProcessorChange > processors_changed
LIBARDOUR_API double gain_to_slider_position_with_max(double g, double max_gain=2.0)
void copy_processors(const ProcSelection &)
SessionObject * owner() const
void add_child_nocopy(XMLNode &)
PBD::ScopedConnection config_connection
void remove_placeholder()
uint32_t get(DataType t) const
std::list< T * > children()
std::list< Control * > _controls
void set_state(const XMLNode &)
Gtk::Adjustment _adjustment
ProcessorWindowProxy * find_window_proxy(boost::shared_ptr< ARDOUR::Processor >) const
static void rb_edit_generic()
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > position
boost::shared_ptr< IO > output()
void set_processor_ui(boost::shared_ptr< ARDOUR::Processor >, Gtk::Window *)
void set(DataType t, uint32_t count)
Gtk::EventBox & action_widget()
std::list< boost::shared_ptr< Processor > > ProcessorList
PBD::Signal1< void, boost::weak_ptr< ARDOUR::Delivery > > DeliveryChanged
PBD::Signal0< void > Changed
boost::weak_ptr< ARDOUR::Processor > _processor
boost::shared_ptr< ARDOUR::Processor > processor() const
static void rb_activate_all()
PBD::Signal0< void > ActiveChanged
int reorder_processors(const ProcessorList &new_order, ProcessorStreams *err=0)
virtual const char * name() const =0
PBD::ScopedConnection _connection
virtual double interface_to_internal(double i) const
void select_all_processors()
void set_splitting(const bool splitting)
XMLNode * extra_xml(const std::string &str, bool add_if_missing=false)
sigc::signal< void, Result > Finished
string short_version(string orig, string::size_type target_length)
void rename_processor(boost::shared_ptr< ARDOUR::Processor >)
void add_state(XMLNode *) const
boost::shared_ptr< AutomationControl > automation_control(const Evoral::Parameter &id, bool create_if_missing=false)
FreezeState freeze_state() const
bool contains(PropertyDescriptor< T > p) const
static void register_actions()
virtual void set_session(ARDOUR::Session *)
Gtkmm2ext::DnDVBox< ProcessorEntry > processor_display
void set_controllable(boost::shared_ptr< PBD::Controllable > c)
void ab_plugins(bool forward)
std::string state_id() const
Gtk::ScrolledWindow processor_scroller
sigc::signal< bool, GdkEventButton *, T * > ButtonRelease
int set_state(const XMLNode &node, int version)
void remove_nodes_and_delete(const std::string &)
static const uint32_t audio_port_color
#define MISSING_INVALIDATOR
boost::shared_ptr< ARDOUR::Processor > _processor
LIBGTKMM2EXT_API void add_action_group(Glib::RefPtr< Gtk::ActionGroup >)
RoutingIcon _routing_icon
sigc::connection rapid_connect(const sigc::slot< void > &slot)
XMLNodeList::const_iterator XMLNodeConstIterator
boost::shared_ptr< PannerShell > panner_shell() const
bool selected(T *child) const
ProcessorWindowProxy(std::string const &, ProcessorBox *, boost::weak_ptr< ARDOUR::Processor >)
boost::shared_ptr< RouteList > get_routes_with_internal_returns() const
virtual ChanCount input_streams() const
LIBGTKMM2EXT_API Glib::RefPtr< Gtk::Action > register_action(Glib::RefPtr< Gtk::ActionGroup > group, const char *name, const char *label)
virtual double internal_to_user(double i) const
ARDOUR::Session * _session
void add_control_state(XMLNode *) const
sigc::signal< bool, GdkEventButton *, T * > ButtonPress
static void rb_deactivate_all()
virtual void hide_things()
std::string string_compose(const std::string &fmt, const T1 &o1)
bool is_editor_mixer_strip() const
std::string drag_text() const
Gtk::Window * get_processor_ui(boost::shared_ptr< ARDOUR::Processor >) const
Gtk::Menu * build_possible_aux_menu()
virtual ChanCount output_streams() const
ProcessorSelection processors
void report_failed_reorder()
Gtkmm2ext::HSliderController _slider
void popup_error(const std::string &text)
int set_state(const XMLNode &, int version)
void clear_processors(Placement)
void set_state(XMLNode const *)
bool enter_notify(GdkEventCrossing *ev)
const XMLNode & get_node() const
#define UINT_RGBA_R_FLT(x)