summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-01-13 23:21:30 +0100
committerRobin Gareus <robin@gareus.org>2014-01-13 23:21:30 +0100
commite45151b89c64912077c03fc979f1581780ac9e27 (patch)
tree0fa6c5fbcb350dd40fadb36f97b472ae25bd0e73 /libs
parent5b0c90299785d46357a70cc7625c9b3ee87486f1 (diff)
first stab at send+route panner link
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/panner_shell.h18
-rw-r--r--libs/ardour/ardour/rc_configuration_vars.h2
-rw-r--r--libs/ardour/delivery.cc8
-rw-r--r--libs/ardour/panner_shell.cc52
-rw-r--r--libs/ardour/route.cc11
5 files changed, 71 insertions, 20 deletions
diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h
index 765acad16a..60db264b4d 100644
--- a/libs/ardour/ardour/panner_shell.h
+++ b/libs/ardour/ardour/panner_shell.h
@@ -49,7 +49,7 @@ class Pannable;
class PannerShell : public SessionObject
{
public:
- PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>);
+ PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>, bool is_send = false);
virtual ~PannerShell ();
std::string describe_parameter (Evoral::Parameter param);
@@ -63,19 +63,25 @@ public:
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
+ PBD::Signal0<void> PannableChanged; /* Pannable changed -- l*/
PBD::Signal0<void> Changed; /* panner and/or outputs count and/or bypass state changed */
boost::shared_ptr<Panner> panner() const { return _panner; }
- boost::shared_ptr<Pannable> pannable() const { return _pannable; }
+ boost::shared_ptr<Pannable> pannable() const { return _panlinked ? _pannable_route : _pannable_internal; }
bool bypassed () const;
void set_bypassed (bool);
+ bool is_send () const { return (_is_send); }
+ bool is_linked_to_route () const { return (_is_send && _panlinked); }
+ /* this function takes the process lock: */
+ void set_linked_to_route (bool);
+
std::string current_panner_uri() const { return _current_panner_uri; }
std::string user_selected_panner_uri() const { return _user_selected_panner_uri; }
std::string panner_gui_uri() const { return _panner_gui_uri; }
- /* this function takes the process lock */
+ /* this function takes the process lock: */
bool select_panner_by_uri (std::string const uri);
private:
@@ -84,7 +90,11 @@ public:
bool set_user_selected_panner_uri (std::string const uri);
boost::shared_ptr<Panner> _panner;
- boost::shared_ptr<Pannable> _pannable;
+
+ boost::shared_ptr<Pannable> _pannable_internal;
+ boost::shared_ptr<Pannable> _pannable_route;
+ bool _is_send;
+ bool _panlinked;
bool _bypassed;
std::string _current_panner_uri;
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index e1f8b42914..b92d0e152a 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -113,6 +113,8 @@ CONFIG_VARIABLE (gain_t, solo_mute_gain, "solo-mute-gain", 0.0)
CONFIG_VARIABLE (std::string, monitor_bus_preferred_bundle, "monitor-bus-preferred-bundle", "")
CONFIG_VARIABLE (bool, quieten_at_speed, "quieten-at-speed", true)
+CONFIG_VARIABLE (bool, link_send_and_route_panner, "link-send-and-route-panner", true)
+
/* click */
CONFIG_VARIABLE (bool, clicking, "clicking", false)
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index 8e636ed861..b4b9831d97 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -58,7 +58,9 @@ Delivery::Delivery (Session& s, boost::shared_ptr<IO> io, boost::shared_ptr<Pann
, _no_panner_reset (false)
{
if (pannable) {
- _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable));
+ bool is_send = false;
+ if (r & (Delivery::Send|Delivery::Aux)) is_send = true;
+ _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable, is_send));
}
_display_to_user = false;
@@ -80,7 +82,9 @@ Delivery::Delivery (Session& s, boost::shared_ptr<Pannable> pannable, boost::sha
, _no_panner_reset (false)
{
if (pannable) {
- _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable));
+ bool is_send = false;
+ if (r & (Delivery::Send|Delivery::Aux)) is_send = true;
+ _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable, is_send));
}
_display_to_user = false;
diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc
index ccb8aa8e87..b489354e21 100644
--- a/libs/ardour/panner_shell.cc
+++ b/libs/ardour/panner_shell.cc
@@ -61,21 +61,31 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p)
+PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p, bool is_send)
: SessionObject (s, name)
- , _pannable (p)
+ , _pannable_route (p)
+ , _is_send (is_send)
+ , _panlinked (true)
, _bypassed (false)
, _current_panner_uri("")
, _user_selected_panner_uri("")
, _panner_gui_uri("")
, _force_reselect (false)
{
+ if (is_send) {
+ _pannable_internal.reset(new Pannable (s));
+ if (Config->get_link_send_and_route_panner()) {
+ _panlinked = true;
+ } else {
+ _panlinked = false;
+ }
+ }
set_name (name);
}
PannerShell::~PannerShell ()
{
- DEBUG_TRACE(DEBUG::Destruction, string_compose ("panner shell %3 for %1 destructor, panner is %4, pannable is %2\n", _name, _pannable, this, _panner));
+ DEBUG_TRACE(DEBUG::Destruction, string_compose ("panner shell %3 for %1 destructor, panner is %4, pannable is %2\n", _name, _pannable_route, this, _panner));
}
void
@@ -122,7 +132,8 @@ PannerShell::configure_io (ChanCount in, ChanCount out)
speakers.reset (s);
}
- Panner* p = pi->descriptor.factory (_pannable, speakers);
+ /* TODO don't allow to link _is_send if internal & route panners are different types */
+ Panner* p = pi->descriptor.factory (pannable(), speakers);
// boost_debug_shared_ptr_mark_interesting (p, "Panner");
_panner.reset (p);
_panner->configure_io (in, out);
@@ -139,8 +150,9 @@ PannerShell::get_state ()
node->add_property (X_("bypassed"), _bypassed ? X_("yes") : X_("no"));
node->add_property (X_("user-panner"), _user_selected_panner_uri);
+ node->add_property (X_("linked-to-route"), _panlinked ? X_("yes") : X_("no"));
- if (_panner) {
+ if (_panner && _is_send) {
node->add_child_nocopy (_panner->get_state ());
}
@@ -159,6 +171,10 @@ PannerShell::set_state (const XMLNode& node, int version)
set_bypassed (string_is_affirmative (prop->value ()));
}
+ if ((prop = node.property (X_("linked-to-route"))) != 0) {
+ _panlinked = string_is_affirmative (prop->value ());
+ }
+
if ((prop = node.property (X_("user-panner"))) != 0) {
_user_selected_panner_uri = prop->value ();
}
@@ -172,7 +188,8 @@ PannerShell::set_state (const XMLNode& node, int version)
if ((prop = (*niter)->property (X_("uri")))) {
PannerInfo* p = PannerManager::instance().get_by_uri(prop->value());
if (p) {
- _panner.reset (p->descriptor.factory (_pannable, _session.get_speakers ()));
+ _panner.reset (p->descriptor.factory (
+ _is_send ? _pannable_internal : _pannable_route, _session.get_speakers ()));
_current_panner_uri = p->descriptor.panner_uri;
_panner_gui_uri = p->descriptor.gui_uri;
if (_panner->set_state (**niter, version) == 0) {
@@ -195,7 +212,8 @@ PannerShell::set_state (const XMLNode& node, int version)
assumption, but it's still an assumption.
*/
- _panner.reset ((*p)->descriptor.factory (_pannable, _session.get_speakers ()));
+ _panner.reset ((*p)->descriptor.factory (
+ _is_send ? _pannable_internal : _pannable_route, _session.get_speakers ()));
_current_panner_uri = (*p)->descriptor.panner_uri;
_panner_gui_uri = (*p)->descriptor.gui_uri;
@@ -413,3 +431,23 @@ PannerShell::select_panner_by_uri (std::string const uri)
}
return true;
}
+
+void
+PannerShell::set_linked_to_route (bool onoff)
+{
+ if (!_is_send || onoff == _panlinked) {
+ return;
+ }
+ _panlinked = onoff;
+
+ _force_reselect = true;
+ if (_panner) {
+ Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
+ ChanCount in = _panner->in();
+ ChanCount out = _panner->out();
+ configure_io(in, out);
+ pannable()->set_panner(_panner);
+ _session.set_dirty ();
+ }
+ PannableChanged();
+}
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index ccfe38e9e1..a2176e8d45 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -1069,8 +1069,7 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
} else if (node.name() == "Send") {
- boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
- processor.reset (new Send (_session, sendpan, _mute_master));
+ processor.reset (new Send (_session, _pannable, _mute_master));
} else {
@@ -2553,8 +2552,7 @@ Route::set_processor_state (const XMLNode& node)
if (prop->value() == "intsend") {
- boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
- processor.reset (new InternalSend (_session, sendpan, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0)));
+ processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr<Route>(), Delivery::Aux));
} else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
prop->value() == "lv2" ||
@@ -2571,7 +2569,7 @@ Route::set_processor_state (const XMLNode& node)
} else if (prop->value() == "send") {
boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
- processor.reset (new Send (_session, sendpan, _mute_master));
+ processor.reset (new Send (_session, _pannable, _mute_master));
} else {
error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
@@ -2761,8 +2759,7 @@ Route::add_aux_send (boost::shared_ptr<Route> route, boost::shared_ptr<Processor
{
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
- boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
- listener.reset (new InternalSend (_session, sendpan, _mute_master, route, Delivery::Aux));
+ listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
}
add_processor (listener, before);