summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-01-09 00:18:29 +0100
committerRobin Gareus <robin@gareus.org>2014-01-09 00:18:45 +0100
commit21ca6a10a96c135e7435f1cc786f4395020ca232 (patch)
tree4632787db26f6495f97b4bcdd9a6210bf5fdce2a /gtk2_ardour
parentf45ec9f87ba140560038fd36d31c1324e779548f (diff)
rework panning -- Squashed commit of the following:
commit 6f4f4f161b00cb36252727f67ecc4913eb944fd7 Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 22:13:09 2014 +0100 fix panner plugin discovery (prev commit) commit 26e514f4a80af9192cae3cbd62fde0ae95474dfc Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 18:56:59 2014 +0100 update panner plugin discovery * recurse dirs in 'PANNER_PATH' and 'panner_dir_name' up to 1 level. * don't look in ardour_dll_directory() -- no panners are supposed to be in there * use .dylib on OSX exclusively. commit a514c3f1c425dccf3d42eee9d2b183b44fd26a03 Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 16:48:34 2014 +0100 remove debug/devel printf()s commit d863742ddc69af493ee6a8817bc778968d9b0800 Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 16:17:13 2014 +0100 panner-type: session backward/forward compatibility commit 25d5e4c663ada34129451b0f9045ab047d6cc2f0 Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 16:09:07 2014 +0100 update URIs -> URLs commit 00a606a43d9456cfbaf43cae4fb598549326ba71 Merge: 0f1cec1 382eb0f Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 03:29:45 2014 +0100 Merge branch 'master' into panning commit 0f1cec19babae538c9697eed4be5d6ddc851b013 Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 02:41:15 2014 +0100 switch panner ID to URI commit 575282b412c3ae1cd8219cf75f00a1a4239e2813 Author: Robin Gareus <robin@gareus.org> Date: Wed Jan 8 00:50:15 2014 +0100 prepare API for panner URI commit ea62cd049308859782a7bb16e4f18169d8638b46 Author: Robin Gareus <robin@gareus.org> Date: Tue Jan 7 19:57:06 2014 +0100 update development doc relating to panner selection commit 586d7de2392e26b9d7f597b1a00b98dfaa42ecdc Author: Robin Gareus <robin@gareus.org> Date: Tue Jan 7 19:56:24 2014 +0100 clean up PanShell::set_user_selected_panner_type() API commit 99077886a5a1cacece908d87c29c3be12903027e Author: Robin Gareus <robin@gareus.org> Date: Tue Jan 7 04:46:22 2014 +0100 panner bypass: visualize & [in]sensitivity commit 46d688d216f0e67d672376a607157af02b359fb2 Merge: 4e67573 c4cdf61 Author: Robin Gareus <robin@gareus.org> Date: Tue Jan 7 02:18:54 2014 +0100 Merge branch 'master' into panning commit 4e67573517b3d60ddf65729783687b16cfb2adb7 Author: Robin Gareus <robin@gareus.org> Date: Tue Jan 7 01:05:17 2014 +0100 don't call configure_io() for merely swapping panners commit d32a4c51f6967f48f7680554866f1f7b311ccde1 Merge: a3226d4 cec3116 Author: Robin Gareus <robin@gareus.org> Date: Mon Jan 6 23:49:55 2014 +0100 Merge branch 'master' into panning commit a3226d46b598afae54a65ac69320eca84669f347 Author: Robin Gareus <robin@gareus.org> Date: Mon Jan 6 17:52:38 2014 +0100 add notes about panner re-design commit d1ae2366024605f22b05572a81ee249e6fdbcd2f Author: Robin Gareus <robin@gareus.org> Date: Mon Jan 6 15:06:40 2014 +0100 add simple stereo-balance panner for testing commit e0ddd256ff2288b8d8cfad3ad485a916964ce5b5 Author: Robin Gareus <robin@gareus.org> Date: Mon Jan 6 17:02:52 2014 +0100 add frontend/GUI for panner selection commit 2cb8f846755eb5aea8a2620d31ea981c446c4041 Author: Robin Gareus <robin@gareus.org> Date: Mon Jan 6 17:02:20 2014 +0100 prepare backend for panner selection
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardev_common.sh.in2
-rw-r--r--gtk2_ardour/mixer_strip.cc54
-rw-r--r--gtk2_ardour/mixer_strip.h2
-rw-r--r--gtk2_ardour/mono_panner.cc69
-rw-r--r--gtk2_ardour/mono_panner.h8
-rw-r--r--gtk2_ardour/panner_ui.cc160
-rw-r--r--gtk2_ardour/panner_ui.h6
-rw-r--r--gtk2_ardour/stereo_panner.cc46
-rw-r--r--gtk2_ardour/stereo_panner.h8
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__ */