diff options
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardev_common.sh.in | 2 | ||||
-rw-r--r-- | gtk2_ardour/mixer_strip.cc | 54 | ||||
-rw-r--r-- | gtk2_ardour/mixer_strip.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/mono_panner.cc | 69 | ||||
-rw-r--r-- | gtk2_ardour/mono_panner.h | 8 | ||||
-rw-r--r-- | gtk2_ardour/panner_ui.cc | 160 | ||||
-rw-r--r-- | gtk2_ardour/panner_ui.h | 6 | ||||
-rw-r--r-- | gtk2_ardour/stereo_panner.cc | 46 | ||||
-rw-r--r-- | gtk2_ardour/stereo_panner.h | 8 |
9 files changed, 267 insertions, 88 deletions
diff --git a/gtk2_ardour/ardev_common.sh.in b/gtk2_ardour/ardev_common.sh.in index 850a83c954..8724ff2c7d 100644 --- a/gtk2_ardour/ardev_common.sh.in +++ b/gtk2_ardour/ardev_common.sh.in @@ -12,7 +12,7 @@ libs=$TOP/@LIBS@ export ARDOUR_PATH=$TOP/gtk2_ardour/icons:$TOP/gtk2_ardour/pixmaps:$TOP/build/gtk2_ardour:$TOP/gtk2_ardour:. export ARDOUR_SURFACES_PATH=$libs/surfaces/osc:$libs/surfaces/generic_midi:$libs/surfaces/tranzport:$libs/surfaces/powermate:$libs/surfaces/mackie:$libs/surfaces/wiimote -export ARDOUR_PANNER_PATH=$libs/panners/2in2out:$libs/panners/1in2out:$libs/panners/vbap +export ARDOUR_PANNER_PATH=$libs/panners export ARDOUR_DATA_PATH=$TOP:$TOP/build:$TOP/gtk2_ardour:$TOP/build/gtk2_ardour:. export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:. export ARDOUR_MCP_PATH=$TOP/mcp:. diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index aa49e20d0c..e7c3f138b8 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -41,6 +41,7 @@ #include "ardour/pannable.h" #include "ardour/panner.h" #include "ardour/panner_shell.h" +#include "ardour/panner_manager.h" #include "ardour/port.h" #include "ardour/profile.h" #include "ardour/route.h" @@ -515,7 +516,10 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt) _route->output()->changed.connect (*this, invalidator (*this), boost::bind (&MixerStrip::update_output_display, this), gui_context()); _route->route_group_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::route_group_changed, this), gui_context()); + _route->io_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::io_changed_proxy, this), gui_context ()); + if (_route->panner_shell()) { + update_panner_choices(); _route->panner_shell()->Changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::connect_to_pan, this), gui_context()); } @@ -1019,9 +1023,48 @@ MixerStrip::connect_to_pan () p->automation_state_changed.connect (panstate_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_state_changed, &panners), gui_context()); p->automation_style_changed.connect (panstyle_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_style_changed, &panners), gui_context()); - panners.panshell_changed (); + /* This call reduncant, PannerUI::set_panner() connects to _panshell->Changed itself + * However, that only works a panner was previously set. + * + * PannerUI must remain subscribed to _panshell->Changed() in case + * we switch the panner eg. AUX-Send and back + * _route->panner_shell()->Changed() vs _panshell->Changed + */ + if (panners._panner == 0) { + panners.panshell_changed (); + } } +void +MixerStrip::update_panner_choices () +{ + ENSURE_GUI_THREAD (*this, &MixerStrip::update_panner_choices) + if (!_route->panner_shell()) { return; } + + int in = _route->output()->n_ports().n_audio(); + int out = in; + + if (_route->panner()) { + in = _route->panner()->in().n_audio(); + } + + if (out < 2 || in == 0) { + panners.set_available_panners(_route, std::map<std::string,std::string>()); + return; + } + + std::map<std::string,std::string> panner_list; + std::list<PannerInfo*> panner_info = PannerManager::instance().panner_info; + /* get available panners for current configuration. */ + for (list<PannerInfo*>::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { + PanPluginDescriptor* d = &(*p)->descriptor; + if (d->in != -1 && d->in != in) continue; + if (d->out != -1 && d->out != out) continue; + if (d->in == -1 && d->out == -1 && out <= 2) continue; + panner_list.insert(std::pair<std::string,std::string>(d->panner_uri,d->name)); + } + panners.set_available_panners(_route, panner_list); +} /* * Output port labelling @@ -1273,6 +1316,12 @@ MixerStrip::diskstream_changed () } void +MixerStrip::io_changed_proxy () +{ + Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_panner_choices)); +} + +void MixerStrip::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost::weak_ptr<Port> wb) { boost::shared_ptr<Port> a = wa.lock (); @@ -1843,6 +1892,8 @@ MixerStrip::show_send (boost::shared_ptr<Send> send) gain_meter().setup_meters (); panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner()); + panner_ui().set_available_panners(boost::shared_ptr<ARDOUR::Route>(), std::map<std::string,std::string>()); + panner_ui().setup_pan (); /* make sure the send has audio output */ @@ -1884,6 +1935,7 @@ MixerStrip::revert_to_default_display () gain_meter().setup_meters (); panner_ui().set_panner (_route->main_outs()->panner_shell(), _route->main_outs()->panner()); + update_panner_choices(); panner_ui().setup_pan (); if (has_audio_outputs ()) { diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index fe10070fbb..883bfffdba 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -226,6 +226,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox void edit_output_configuration (); void diskstream_changed (); + void io_changed_proxy (); Gtk::Menu *send_action_menu; Gtk::MenuItem* rename_menu_item; @@ -237,6 +238,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox PBD::ScopedConnection panstate_connection; PBD::ScopedConnection panstyle_connection; void connect_to_pan (); + void update_panner_choices (); void update_diskstream_display (); void update_input_display (); diff --git a/gtk2_ardour/mono_panner.cc b/gtk2_ardour/mono_panner.cc index daec1eede1..c1039092c5 100644 --- a/gtk2_ardour/mono_panner.cc +++ b/gtk2_ardour/mono_panner.cc @@ -35,6 +35,7 @@ #include "ardour/pannable.h" #include "ardour/panner.h" +#include "ardour/panner_shell.h" #include "ardour_ui.h" #include "global_signals.h" @@ -57,23 +58,25 @@ static const int top_step = 2; MonoPanner::ColorScheme MonoPanner::colors; bool MonoPanner::have_colors = false; -MonoPanner::MonoPanner (boost::shared_ptr<ARDOUR::Panner> panner) - : PannerInterface (panner) +MonoPanner::MonoPanner (boost::shared_ptr<ARDOUR::PannerShell> p) + : PannerInterface (p->panner()) + , _panner_shell (p) , position_control (_panner->pannable()->pan_azimuth_control) - , drag_start_x (0) - , last_drag_x (0) - , accumulated_delta (0) - , detented (false) - , position_binder (position_control) + , drag_start_x (0) + , last_drag_x (0) + , accumulated_delta (0) + , detented (false) + , position_binder (position_control) , _dragging (false) { - if (!have_colors) { - set_colors (); - have_colors = true; - } + if (!have_colors) { + set_colors (); + have_colors = true; + } - position_control->Changed.connect (connections, invalidator(*this), boost::bind (&MonoPanner::value_change, this), gui_context()); + position_control->Changed.connect (connections, invalidator(*this), boost::bind (&MonoPanner::value_change, this), gui_context()); + _panner_shell->Changed.connect (connections, invalidator (*this), boost::bind (&MonoPanner::bypass_handler, this), gui_context()); ColorsChanged.connect (sigc::mem_fun (*this, &MonoPanner::color_handler)); set_tooltip (); @@ -87,6 +90,10 @@ MonoPanner::~MonoPanner () void MonoPanner::set_tooltip () { + if (_panner_shell->bypassed()) { + _tooltip.set_tip (_("bypassed")); + return; + } double pos = position_control->get_value(); // 0..1 /* We show the position of the center of the image relative to the left & right. @@ -128,13 +135,17 @@ MonoPanner::on_expose_event (GdkEventExpose*) /* background */ - context->set_source_rgba (UINT_RGBA_R_FLT(b), UINT_RGBA_G_FLT(b), UINT_RGBA_B_FLT(b), UINT_RGBA_A_FLT(b)); + if (!_panner_shell->bypassed()) { + context->set_source_rgba (UINT_RGBA_R_FLT(b), UINT_RGBA_G_FLT(b), UINT_RGBA_B_FLT(b), UINT_RGBA_A_FLT(b)); + } else { + context->set_source_rgba (0.1, 0.1, 0.1, 0.2); + } context->rectangle (0, 0, width, height); context->fill (); - double usable_width = width - pos_box_size; + double usable_width = width - pos_box_size; - /* compute the centers of the L/R boxes based on the current stereo width */ + /* compute the centers of the L/R boxes based on the current stereo width */ if (fmod (usable_width,2.0) == 0) { /* even width, but we need odd, so that there is an exact center. @@ -158,6 +169,10 @@ MonoPanner::on_expose_event (GdkEventExpose*) context->line_to ((pos_box_size/2.0) + (usable_width/2.0), height); context->stroke (); + if (_panner_shell->bypassed()) { + return true; + } + /* left box */ rounded_rectangle (context, @@ -250,6 +265,9 @@ MonoPanner::on_button_press_event (GdkEventButton* ev) if (PannerInterface::on_button_press_event (ev)) { return true; } + if (_panner_shell->bypassed()) { + return false; + } drag_start_x = ev->x; last_drag_x = ev->x; @@ -319,6 +337,10 @@ MonoPanner::on_button_release_event (GdkEventButton* ev) return false; } + if (_panner_shell->bypassed()) { + return false; + } + _dragging = false; _tooltip.target_stop_drag (); accumulated_delta = 0; @@ -340,6 +362,10 @@ MonoPanner::on_scroll_event (GdkEventScroll* ev) double pv = position_control->get_value(); // 0..1.0 ; 0 = left double step; + if (_panner_shell->bypassed()) { + return false; + } + if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { step = one_degree; } else { @@ -365,6 +391,9 @@ MonoPanner::on_scroll_event (GdkEventScroll* ev) bool MonoPanner::on_motion_notify_event (GdkEventMotion* ev) { + if (_panner_shell->bypassed()) { + _dragging = false; + } if (!_dragging) { return false; } @@ -406,6 +435,10 @@ MonoPanner::on_key_press_event (GdkEventKey* ev) double pv = position_control->get_value(); // 0..1.0 ; 0 = left double step; + if (_panner_shell->bypassed()) { + return false; + } + if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { step = one_degree; } else { @@ -450,6 +483,12 @@ MonoPanner::color_handler () queue_draw (); } +void +MonoPanner::bypass_handler () +{ + queue_draw (); +} + PannerEditor* MonoPanner::editor () { diff --git a/gtk2_ardour/mono_panner.h b/gtk2_ardour/mono_panner.h index 1c387ad32c..523f9731de 100644 --- a/gtk2_ardour/mono_panner.h +++ b/gtk2_ardour/mono_panner.h @@ -28,6 +28,10 @@ #include "panner_interface.h" +namespace ARDOUR { + class PannerShell; +} + namespace PBD { class Controllable; } @@ -35,7 +39,7 @@ namespace PBD { class MonoPanner : public PannerInterface { public: - MonoPanner (boost::shared_ptr<ARDOUR::Panner>); + MonoPanner (boost::shared_ptr<ARDOUR::PannerShell>); ~MonoPanner (); boost::shared_ptr<PBD::Controllable> get_controllable() const { return position_control; } @@ -53,6 +57,7 @@ class MonoPanner : public PannerInterface private: PannerEditor* editor (); + boost::shared_ptr<ARDOUR::PannerShell> _panner_shell; boost::shared_ptr<PBD::Controllable> position_control; PBD::ScopedConnectionList connections; @@ -80,6 +85,7 @@ class MonoPanner : public PannerInterface static void set_colors (); static bool have_colors; void color_handler (); + void bypass_handler (); }; #endif /* __gtk_ardour_mono_panner_h__ */ diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index c82a44f399..3ee794e578 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -51,6 +51,7 @@ PannerUI::PannerUI (Session* s) , _current_nins (-1) , pan_automation_style_button ("") , pan_automation_state_button ("") + , _panner_list() { set_session (s); @@ -203,7 +204,7 @@ PannerUI::~PannerUI () void PannerUI::panshell_changed () { - set_panner (_panshell, _panshell->panner()); + set_panner (_panshell, _panshell->panner()); setup_pan (); } @@ -233,73 +234,51 @@ PannerUI::setup_pan () return; } - if (nouts == 0 || nouts == 1) { + if (_panshell->panner_gui_uri() == "http://ardour.org/plugin/panner_2in2out#ui") + { + boost::shared_ptr<Pannable> pannable = _panner->pannable(); - /* stick something into the panning viewport so that it redraws */ - - EventBox* eb = manage (new EventBox()); - pan_vbox.pack_start (*eb, false, false); - - delete big_window; - big_window = 0; - - } else if (nouts == 2) { - - if (nins == 2) { - - /* add integrated 2in/2out panner GUI */ - - boost::shared_ptr<Pannable> pannable = _panner->pannable(); - - _stereo_panner = new StereoPanner (_panner); - _stereo_panner->set_size_request (-1, pan_bar_height); - pan_vbox.pack_start (*_stereo_panner, false, false); - - boost::shared_ptr<AutomationControl> ac; + _stereo_panner = new StereoPanner (_panshell); + _stereo_panner->set_size_request (-1, pan_bar_height); + pan_vbox.pack_start (*_stereo_panner, false, false); - ac = pannable->pan_azimuth_control; - _stereo_panner->StartPositionGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch), - boost::weak_ptr<AutomationControl> (ac))); - _stereo_panner->StopPositionGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch), - boost::weak_ptr<AutomationControl>(ac))); + boost::shared_ptr<AutomationControl> ac; - ac = pannable->pan_width_control; - _stereo_panner->StartWidthGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch), - boost::weak_ptr<AutomationControl> (ac))); - _stereo_panner->StopWidthGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch), - boost::weak_ptr<AutomationControl>(ac))); - _stereo_panner->signal_button_release_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event)); + ac = pannable->pan_azimuth_control; + _stereo_panner->StartPositionGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch), + boost::weak_ptr<AutomationControl> (ac))); + _stereo_panner->StopPositionGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch), + boost::weak_ptr<AutomationControl>(ac))); - } else if (nins == 1) { - /* 1-in/2out */ - - boost::shared_ptr<Pannable> pannable = _panner->pannable(); - boost::shared_ptr<AutomationControl> ac = pannable->pan_azimuth_control; - - _mono_panner = new MonoPanner (_panner); - - _mono_panner->StartGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch), - boost::weak_ptr<AutomationControl> (ac))); - _mono_panner->StopGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch), - boost::weak_ptr<AutomationControl>(ac))); - - _mono_panner->signal_button_release_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event)); - - _mono_panner->set_size_request (-1, pan_bar_height); + ac = pannable->pan_width_control; + _stereo_panner->StartWidthGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch), + boost::weak_ptr<AutomationControl> (ac))); + _stereo_panner->StopWidthGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch), + boost::weak_ptr<AutomationControl>(ac))); + _stereo_panner->signal_button_release_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event)); + } + else if (_panshell->panner_gui_uri() == "http://ardour.org/plugin/panner_1in2out#ui" + || _panshell->panner_gui_uri() == "http://ardour.org/plugin/panner_balance#ui") + { + boost::shared_ptr<Pannable> pannable = _panner->pannable(); + boost::shared_ptr<AutomationControl> ac = pannable->pan_azimuth_control; - update_pan_sensitive (); - pan_vbox.pack_start (*_mono_panner, false, false); + _mono_panner = new MonoPanner (_panshell); - } else { - warning << string_compose (_("No panner user interface is currently available for %1-in/2out tracks/busses"), - nins) << endmsg; - } + _mono_panner->StartGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::start_touch), + boost::weak_ptr<AutomationControl> (ac))); + _mono_panner->StopGesture.connect (sigc::bind (sigc::mem_fun (*this, &PannerUI::stop_touch), + boost::weak_ptr<AutomationControl>(ac))); - delete big_window; - big_window = 0; + _mono_panner->signal_button_release_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event)); - } else { + _mono_panner->set_size_request (-1, pan_bar_height); + update_pan_sensitive (); + pan_vbox.pack_start (*_mono_panner, false, false); + } + else if (_panshell->panner_gui_uri() == "http://ardour.org/plugin/panner_vbap#ui") + { if (!twod_panner) { twod_panner = new Panner2d (_panshell, 61); twod_panner->set_name ("MixerPanZone"); @@ -309,17 +288,26 @@ PannerUI::setup_pan () update_pan_sensitive (); twod_panner->reset (nins); - if (big_window) { - big_window->reset (nins); - } + if (big_window) { + big_window->reset (nins); + } twod_panner->set_size_request (-1, 61); /* and finally, add it to the panner frame */ - pan_vbox.pack_start (*twod_panner, false, false); + pan_vbox.pack_start (*twod_panner, false, false); + } + else + { + /* stick something into the panning viewport so that it redraws */ + EventBox* eb = manage (new EventBox()); + pan_vbox.pack_start (*eb, false, false); + + delete big_window; + big_window = 0; } - pan_vbox.show_all (); + pan_vbox.show_all (); } void @@ -388,8 +376,27 @@ PannerUI::build_pan_menu () bypass_menu_item->set_active (_panshell->bypassed()); bypass_menu_item->signal_toggled().connect (sigc::mem_fun(*this, &PannerUI::pan_bypass_toggle)); - items.push_back (MenuElem (_("Reset"), sigc::mem_fun (*this, &PannerUI::pan_reset))); - items.push_back (MenuElem (_("Edit..."), sigc::mem_fun (*this, &PannerUI::pan_edit))); + if (!_panshell->bypassed()) { + items.push_back (MenuElem (_("Reset"), sigc::mem_fun (*this, &PannerUI::pan_reset))); + items.push_back (MenuElem (_("Edit..."), sigc::mem_fun (*this, &PannerUI::pan_edit))); + } + + if (_route && _panner_list.size() > 1 && !_panshell->bypassed()) { + RadioMenuItem::Group group; + items.push_back (SeparatorElem()); + + assert(_panshell->user_selected_panner_uri() == "" + || _panshell->user_selected_panner_uri() == _panshell->current_panner_uri()); + + _suspend_menu_callbacks = true; + for (std::map<std::string,std::string>::const_iterator p = _panner_list.begin(); p != _panner_list.end(); ++p) { + items.push_back (RadioMenuElem (group, p->second, + sigc::bind(sigc::mem_fun (*this, &PannerUI::pan_set_custom_type), p->first))); + RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ()); + i->set_active (_panshell->current_panner_uri() == p->first); + } + _suspend_menu_callbacks = false; + } } void @@ -403,6 +410,9 @@ PannerUI::pan_bypass_toggle () void PannerUI::pan_edit () { + if (_panshell->bypassed()) { + return; + } if (_mono_panner) { _mono_panner->edit (); } else if (_stereo_panner) { @@ -413,10 +423,21 @@ PannerUI::pan_edit () void PannerUI::pan_reset () { + if (_panshell->bypassed()) { + return; + } _panner->reset (); } void +PannerUI::pan_set_custom_type (std::string uri) { + if (_suspend_menu_callbacks) return; + if (_route) { + _route->set_custom_panner_uri(uri); + } +} + +void PannerUI::effective_pan_display () { if (_stereo_panner) { @@ -609,3 +630,10 @@ void PannerUI::position_adjusted () { } + +void +PannerUI::set_available_panners(boost::shared_ptr<ARDOUR::Route> r, std::map<std::string,std::string> p) +{ + _route = r; + _panner_list = p; +} diff --git a/gtk2_ardour/panner_ui.h b/gtk2_ardour/panner_ui.h index de93d49956..dca24451d1 100644 --- a/gtk2_ardour/panner_ui.h +++ b/gtk2_ardour/panner_ui.h @@ -73,6 +73,7 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void set_width (Width); void setup_pan (); + void set_available_panners(boost::shared_ptr<ARDOUR::Route>, std::map<std::string,std::string>); void effective_pan_display (); @@ -141,6 +142,7 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void pan_reset (); void pan_bypass_toggle (); void pan_edit (); + void pan_set_custom_type (std::string type); void pan_automation_state_changed(); void pan_automation_style_changed(); @@ -158,6 +160,10 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void start_touch (boost::weak_ptr<ARDOUR::AutomationControl>); void stop_touch (boost::weak_ptr<ARDOUR::AutomationControl>); + + boost::shared_ptr<ARDOUR::Route> _route; + std::map<std::string,std::string> _panner_list; + bool _suspend_menu_callbacks; }; #endif /* __ardour_gtk_panner_ui_h__ */ diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc index 721567bf10..c2b38867ab 100644 --- a/gtk2_ardour/stereo_panner.cc +++ b/gtk2_ardour/stereo_panner.cc @@ -34,6 +34,7 @@ #include "ardour/pannable.h" #include "ardour/panner.h" +#include "ardour/panner_shell.h" #include "ardour_ui.h" #include "global_signals.h" @@ -58,8 +59,9 @@ bool StereoPanner::have_colors = false; using namespace ARDOUR; -StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner) - : PannerInterface (panner) +StereoPanner::StereoPanner (boost::shared_ptr<PannerShell> p) + : PannerInterface (p->panner()) + , _panner_shell (p) , position_control (_panner->pannable()->pan_azimuth_control) , width_control (_panner->pannable()->pan_width_control) , dragging_position (false) @@ -80,6 +82,7 @@ StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner) position_control->Changed.connect (connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context()); width_control->Changed.connect (connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context()); + _panner_shell->Changed.connect (connections, invalidator (*this), boost::bind (&StereoPanner::bypass_handler, this), gui_context()); ColorsChanged.connect (sigc::mem_fun (*this, &StereoPanner::color_handler)); @@ -94,6 +97,10 @@ StereoPanner::~StereoPanner () void StereoPanner::set_tooltip () { + if (_panner_shell->bypassed()) { + _tooltip.set_tip (_("bypassed")); + return; + } double pos = position_control->get_value(); // 0..1 /* We show the position of the center of the image relative to the left & right. @@ -145,7 +152,11 @@ StereoPanner::on_expose_event (GdkEventExpose*) /* background */ - context->set_source_rgba (UINT_RGBA_R_FLT(b), UINT_RGBA_G_FLT(b), UINT_RGBA_B_FLT(b), UINT_RGBA_A_FLT(b)); + if (!_panner_shell->bypassed()) { + context->set_source_rgba (UINT_RGBA_R_FLT(b), UINT_RGBA_G_FLT(b), UINT_RGBA_B_FLT(b), UINT_RGBA_A_FLT(b)); + } else { + context->set_source_rgba (0.1, 0.1, 0.1, 0.2); + } cairo_rectangle (context->cobj(), 0, 0, width, height); context->fill (); @@ -183,6 +194,10 @@ StereoPanner::on_expose_event (GdkEventExpose*) context->set_source_rgba (UINT_RGBA_R_FLT(r), UINT_RGBA_G_FLT(r), UINT_RGBA_B_FLT(r), UINT_RGBA_A_FLT(r)); context->stroke (); + if (_panner_shell->bypassed()) { + return true; + } + /* compute & draw the line through the box */ context->set_line_width (2); @@ -267,6 +282,10 @@ StereoPanner::on_button_press_event (GdkEventButton* ev) if (PannerInterface::on_button_press_event (ev)) { return true; } + + if (_panner_shell->bypassed()) { + return true; + } drag_start_x = ev->x; last_drag_x = ev->x; @@ -412,6 +431,10 @@ StereoPanner::on_button_release_event (GdkEventButton* ev) return false; } + if (_panner_shell->bypassed()) { + return false; + } + bool const dp = dragging_position; _dragging = false; @@ -443,6 +466,10 @@ StereoPanner::on_scroll_event (GdkEventScroll* ev) double wv = width_control->get_value(); // 0..1.0 ; 0 = left double step; + if (_panner_shell->bypassed()) { + return false; + } + if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { step = one_degree; } else { @@ -474,6 +501,9 @@ StereoPanner::on_scroll_event (GdkEventScroll* ev) bool StereoPanner::on_motion_notify_event (GdkEventMotion* ev) { + if (_panner_shell->bypassed()) { + _dragging = false; + } if (!_dragging) { return false; } @@ -566,6 +596,10 @@ StereoPanner::on_key_press_event (GdkEventKey* ev) double wv = width_control->get_value(); // 0..1.0 ; 0 = left double step; + if (_panner_shell->bypassed()) { + return false; + } + if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) { step = one_degree; } else { @@ -641,6 +675,12 @@ StereoPanner::color_handler () queue_draw (); } +void +StereoPanner::bypass_handler () +{ + queue_draw (); +} + PannerEditor* StereoPanner::editor () { diff --git a/gtk2_ardour/stereo_panner.h b/gtk2_ardour/stereo_panner.h index 8b62b7d82a..bb4687d209 100644 --- a/gtk2_ardour/stereo_panner.h +++ b/gtk2_ardour/stereo_panner.h @@ -24,6 +24,10 @@ #include "gtkmm2ext/binding_proxy.h" #include "panner_interface.h" +namespace ARDOUR { + class PannerShell; +} + namespace PBD { class Controllable; } @@ -35,7 +39,7 @@ namespace ARDOUR { class StereoPanner : public PannerInterface { public: - StereoPanner (boost::shared_ptr<ARDOUR::Panner>); + StereoPanner (boost::shared_ptr<ARDOUR::PannerShell>); ~StereoPanner (); boost::shared_ptr<PBD::Controllable> get_position_controllable() const { return position_control; } @@ -56,6 +60,7 @@ class StereoPanner : public PannerInterface private: PannerEditor* editor (); + boost::shared_ptr<ARDOUR::PannerShell> _panner_shell; boost::shared_ptr<PBD::Controllable> position_control; boost::shared_ptr<PBD::Controllable> width_control; @@ -94,6 +99,7 @@ class StereoPanner : public PannerInterface static void set_colors (); static bool have_colors; void color_handler (); + void bypass_handler (); }; #endif /* __gtk_ardour_stereo_panner_h__ */ |