summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-07-14 22:17:43 +0000
committerCarl Hetherington <carl@carlh.net>2011-07-14 22:17:43 +0000
commit48de21b1201fdf828c32ab396ac75dc884a96d90 (patch)
treeac89601041c49a8f572668ede9883fe2ab0ca20e /libs
parenta5efa9a500d2c1b592656e91e9ea7ef7d535dcb3 (diff)
Move panner bypass state up to the PannerShell so that it is preserved even when new Panners are dropped in (refixes #4185).
git-svn-id: svn://localhost/ardour2/branches/3.0@9877 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/panner.h12
-rw-r--r--libs/ardour/ardour/panner_shell.h10
-rw-r--r--libs/ardour/delivery.cc10
-rw-r--r--libs/ardour/internal_send.cc16
-rw-r--r--libs/ardour/panner.cc34
-rw-r--r--libs/ardour/panner_shell.cc33
-rw-r--r--libs/panners/1in2out/panner_1in2out.cc15
-rw-r--r--libs/panners/1in2out/panner_1in2out.h4
-rw-r--r--libs/panners/2in2out/panner_2in2out.cc16
-rw-r--r--libs/panners/2in2out/panner_2in2out.h4
-rw-r--r--libs/panners/vbap/vbap.cc12
-rw-r--r--libs/panners/vbap/vbap.h2
12 files changed, 48 insertions, 120 deletions
diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h
index ebb90ac50a..f770a181c1 100644
--- a/libs/ardour/ardour/panner.h
+++ b/libs/ardour/ardour/panner.h
@@ -83,9 +83,6 @@ public:
virtual void reset() {}
- virtual bool bypassed() const { return _bypassed; }
- virtual void set_bypassed (bool yn);
-
void set_automation_state (AutoState);
AutoState automation_state() const;
void set_automation_style (AutoStyle);
@@ -140,11 +137,9 @@ public:
framepos_t start, framepos_t end, pframes_t nframes,
pan_t** buffers);
- PBD::Signal0<void> StateChanged;
-
int set_state (const XMLNode&, int version);
- virtual XMLNode& state (bool full_state) = 0;
-
+ XMLNode& get_state ();
+
boost::shared_ptr<Pannable> pannable() const { return _pannable; }
//virtual std::string describe_parameter (Evoral::Parameter);
@@ -161,9 +156,6 @@ public:
protected:
boost::shared_ptr<Pannable> _pannable;
- bool _bypassed;
-
- XMLNode& get_state ();
virtual void distribute_one (AudioBuffer&, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes, uint32_t which) = 0;
virtual void distribute_one_automated (AudioBuffer&, BufferSet& obufs,
diff --git a/libs/ardour/ardour/panner_shell.h b/libs/ardour/ardour/panner_shell.h
index 4749cd4dce..aad2836306 100644
--- a/libs/ardour/ardour/panner_shell.h
+++ b/libs/ardour/ardour/panner_shell.h
@@ -60,20 +60,22 @@ public:
/// The fundamental Panner function
void run (BufferSet& src, BufferSet& dest, framepos_t start_frame, framepos_t end_frames, pframes_t nframes);
-
- XMLNode& get_state (void);
- XMLNode& state (bool full);
+ XMLNode& get_state ();
int set_state (const XMLNode&, int version);
- PBD::Signal0<void> Changed; /* panner and/or outputs count changed */
+ 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; }
+ bool bypassed () const;
+ void set_bypassed (bool);
+
private:
void distribute_no_automation (BufferSet& src, BufferSet& dest, pframes_t nframes, gain_t gain_coeff);
boost::shared_ptr<Panner> _panner;
boost::shared_ptr<Pannable> _pannable;
+ bool _bypassed;
static float current_automation_version_number;
};
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index 4a6b761f33..e7d435bacf 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -233,8 +233,6 @@ Delivery::configure_io (ChanCount in, ChanCount out)
void
Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
{
- boost::shared_ptr<Panner> panner;
-
assert (_output);
PortSet& ports (_output->ports());
@@ -287,10 +285,6 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
Amp::apply_simple_gain (bufs, nframes, tgain);
}
- if (_panshell) {
- panner = _panshell->panner();
- }
-
#if 0
if (_session.transport_rolling()) {
cerr << name() << " first value written : " << scnt << endl;
@@ -306,7 +300,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
}
#endif
- if (panner && !panner->bypassed()) {
+ if (_panshell && !_panshell->bypassed()) {
// Use the panner to distribute audio to output port buffers
@@ -350,7 +344,7 @@ Delivery::state (bool full_state)
node.add_property("role", enum_2_string(_role));
if (_panshell) {
- node.add_child_nocopy (_panshell->state (full_state));
+ node.add_child_nocopy (_panshell->get_state ());
}
return node;
diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc
index 3dbc27f45a..171a5bb210 100644
--- a/libs/ardour/internal_send.cc
+++ b/libs/ardour/internal_send.cc
@@ -109,13 +109,7 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
assert(mixbufs.available() >= bufs.count());
- boost::shared_ptr<Panner> panner;
-
- if (_panshell) {
- panner = _panshell->panner();
- }
-
- if (panner && !panner->bypassed()) {
+ if (_panshell && !_panshell->bypassed()) {
mixbufs.set_count (_send_to->n_outputs ());
_panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
} else {
@@ -320,14 +314,8 @@ InternalSend::send_to_property_changed (const PropertyChange& what_changed)
void
InternalSend::set_can_pan (bool yn)
{
- boost::shared_ptr<Panner> panner;
-
if (_panshell) {
- panner = _panshell->panner ();
- }
-
- if (panner) {
- panner->set_bypassed (!yn);
+ _panshell->set_bypassed (!yn);
}
}
diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc
index 05676c107d..a182f0b99c 100644
--- a/libs/ardour/panner.cc
+++ b/libs/ardour/panner.cc
@@ -32,7 +32,6 @@ using namespace ARDOUR;
Panner::Panner (boost::shared_ptr<Pannable> p)
: _pannable (p)
- , _bypassed (false)
{
}
@@ -41,35 +40,10 @@ Panner::~Panner ()
DEBUG_TRACE(PBD::DEBUG::Destruction, string_compose ("panner @ %1 destructor, pannable is %2\n", this, _pannable));
}
-void
-Panner::set_bypassed (bool yn)
-{
- if (yn != _bypassed) {
- _bypassed = yn;
- StateChanged ();
- }
-}
-
-int
-Panner::set_state (const XMLNode& node, int version)
-{
- const XMLProperty* prop;
-
- if ((prop = node.property (X_("bypassed"))) != 0) {
- set_bypassed (string_is_affirmative (prop->value()));
- }
-
- return 0;
-}
-
XMLNode&
Panner::get_state ()
{
- XMLNode* node = new XMLNode (X_("Panner"));
-
- node->add_property (X_("bypassed"), (bypassed() ? "yes" : "no"));
-
- return *node;
+ return *(new XMLNode (X_("Panner")));
}
void
@@ -140,3 +114,9 @@ Panner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
{
return _pannable->value_as_string (ac);
}
+
+int
+Panner::set_state (XMLNode const &, int)
+{
+ return 0;
+}
diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc
index e60012d8b4..c3ca2b4694 100644
--- a/libs/ardour/panner_shell.cc
+++ b/libs/ardour/panner_shell.cc
@@ -66,6 +66,7 @@ using namespace PBD;
PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p)
: SessionObject (s, name)
, _pannable (p)
+ , _bypassed (false)
{
set_name (name);
}
@@ -124,18 +125,14 @@ PannerShell::configure_io (ChanCount in, ChanCount out)
}
XMLNode&
-PannerShell::get_state (void)
-{
- return state (true);
-}
-
-XMLNode&
-PannerShell::state (bool full)
+PannerShell::get_state ()
{
XMLNode* node = new XMLNode ("PannerShell");
+ node->add_property (X_("bypassed"), _bypassed ? X_("yes") : X_("no"));
+
if (_panner) {
- node->add_child_nocopy (_panner->state (full));
+ node->add_child_nocopy (_panner->get_state ());
}
return *node;
@@ -149,6 +146,10 @@ PannerShell::set_state (const XMLNode& node, int version)
const XMLProperty *prop;
LocaleGuard lg (X_("POSIX"));
+ if ((prop = node.property (X_("bypassed"))) != 0) {
+ set_bypassed (string_is_affirmative (prop->value ()));
+ }
+
_panner.reset ();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
@@ -326,3 +327,19 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame,
}
}
+void
+PannerShell::set_bypassed (bool yn)
+{
+ if (yn == _bypassed) {
+ return;
+ }
+
+ _bypassed = yn;
+ Changed (); /* EMIT SIGNAL */
+}
+
+bool
+PannerShell::bypassed () const
+{
+ return _bypassed;
+}
diff --git a/libs/panners/1in2out/panner_1in2out.cc b/libs/panners/1in2out/panner_1in2out.cc
index 6c002c1591..19b8dadd6d 100644
--- a/libs/panners/1in2out/panner_1in2out.cc
+++ b/libs/panners/1in2out/panner_1in2out.cc
@@ -323,26 +323,13 @@ Panner1in2out::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speaker
}
XMLNode&
-Panner1in2out::get_state (void)
-{
- return state (true);
-}
-
-XMLNode&
-Panner1in2out::state (bool /*full_state*/)
+Panner1in2out::get_state ()
{
XMLNode& root (Panner::get_state ());
root.add_property (X_("type"), _descriptor.name);
return root;
}
-int
-Panner1in2out::set_state (const XMLNode& node, int version)
-{
- LocaleGuard lg (X_("POSIX"));
- Panner::set_state (node, version);
- return 0;
-}
std::set<Evoral::Parameter>
Panner1in2out::what_can_be_automated() const
diff --git a/libs/panners/1in2out/panner_1in2out.h b/libs/panners/1in2out/panner_1in2out.h
index c36e3e87c7..bd1b1a9c12 100644
--- a/libs/panners/1in2out/panner_1in2out.h
+++ b/libs/panners/1in2out/panner_1in2out.h
@@ -56,9 +56,7 @@ class Panner1in2out : public Panner
std::string describe_parameter (Evoral::Parameter);
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
- XMLNode& state (bool full_state);
- XMLNode& get_state (void);
- int set_state (const XMLNode&, int version);
+ XMLNode& get_state ();
protected:
float left;
diff --git a/libs/panners/2in2out/panner_2in2out.cc b/libs/panners/2in2out/panner_2in2out.cc
index 0c5184efe6..1ac3974c49 100644
--- a/libs/panners/2in2out/panner_2in2out.cc
+++ b/libs/panners/2in2out/panner_2in2out.cc
@@ -435,27 +435,13 @@ Panner2in2out::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speaker
}
XMLNode&
-Panner2in2out::get_state (void)
-{
- return state (true);
-}
-
-XMLNode&
-Panner2in2out::state (bool /*full_state*/)
+Panner2in2out::get_state ()
{
XMLNode& root (Panner::get_state ());
root.add_property (X_("type"), _descriptor.name);
return root;
}
-int
-Panner2in2out::set_state (const XMLNode& node, int version)
-{
- LocaleGuard lg (X_("POSIX"));
- Panner::set_state (node, version);
- return 0;
-}
-
std::set<Evoral::Parameter>
Panner2in2out::what_can_be_automated() const
{
diff --git a/libs/panners/2in2out/panner_2in2out.h b/libs/panners/2in2out/panner_2in2out.h
index b9b9a73dfb..48f441fbd0 100644
--- a/libs/panners/2in2out/panner_2in2out.h
+++ b/libs/panners/2in2out/panner_2in2out.h
@@ -62,9 +62,7 @@ class Panner2in2out : public Panner
std::string describe_parameter (Evoral::Parameter);
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
- XMLNode& state (bool full_state);
- XMLNode& get_state (void);
- int set_state (const XMLNode&, int version);
+ XMLNode& get_state ();
void update ();
diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc
index 2f047b2342..d4a7030d9b 100644
--- a/libs/panners/vbap/vbap.cc
+++ b/libs/panners/vbap/vbap.cc
@@ -371,23 +371,11 @@ VBAPanner::distribute_one_automated (AudioBuffer& src, BufferSet& obufs,
XMLNode&
VBAPanner::get_state ()
{
- return state (true);
-}
-
-XMLNode&
-VBAPanner::state (bool full_state)
-{
XMLNode& node (Panner::get_state());
node.add_property (X_("type"), _descriptor.name);
return node;
}
-int
-VBAPanner::set_state (const XMLNode& node, int /*version*/)
-{
- return 0;
-}
-
Panner*
VBAPanner::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> s)
{
diff --git a/libs/panners/vbap/vbap.h b/libs/panners/vbap/vbap.h
index 6174600270..752a0c9be6 100644
--- a/libs/panners/vbap/vbap.h
+++ b/libs/panners/vbap/vbap.h
@@ -58,9 +58,7 @@ public:
std::string describe_parameter (Evoral::Parameter);
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
- XMLNode& state (bool full_state);
XMLNode& get_state ();
- int set_state (const XMLNode&, int version);
PBD::AngularVector signal_position (uint32_t n) const;
boost::shared_ptr<Speakers> get_speakers() const;