From a5674e92712aacae648e8d55ec7b767b6d988542 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 14 Jun 2011 14:49:06 +0000 Subject: [PATCH] fix initialization of gain for Listen internal sends (to monitor bus); remove pannable object from monitor bus after (re)creation from XML git-svn-id: svn://localhost/ardour2/branches/3.0@9730 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/delivery.h | 1 + libs/ardour/ardour/internal_send.h | 2 +- libs/ardour/ardour/route.h | 1 + libs/ardour/delivery.cc | 8 ++++++ libs/ardour/internal_return.cc | 16 +++++++++++ libs/ardour/internal_send.cc | 43 +++++++++++++++++++++++------- libs/ardour/route.cc | 24 +++++++++++++++++ 7 files changed, 84 insertions(+), 11 deletions(-) diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h index 0e55356928..789f1847ba 100644 --- a/libs/ardour/ardour/delivery.h +++ b/libs/ardour/ardour/delivery.h @@ -95,6 +95,7 @@ public: boost::shared_ptr panner_shell() const { return _panshell; } boost::shared_ptr panner() const; + void unpan (); void reset_panner (); void defer_pan_reset (); void allow_pan_reset (); diff --git a/libs/ardour/ardour/internal_send.h b/libs/ardour/ardour/internal_send.h index c7969e9f19..39dca9a6be 100644 --- a/libs/ardour/ardour/internal_send.h +++ b/libs/ardour/ardour/internal_send.h @@ -62,7 +62,7 @@ class InternalSend : public Send void send_to_going_away (); void send_to_property_changed (const PBD::PropertyChange&); int connect_when_legal (); - int set_our_state (XMLNode const &, int); + void init_gain (); int use_target (boost::shared_ptr); }; diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 3b12e4f600..d7f76cbf24 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -526,6 +526,7 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember, framecnt_t update_port_latencies (PortSet& ports, PortSet& feeders, bool playback, framecnt_t) const; void setup_invisible_processors (); + void unpan (); boost::shared_ptr _capturing_processor; diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 44782650c1..619be9a077 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -382,6 +382,14 @@ Delivery::set_state (const XMLNode& node, int version) return 0; } +void +Delivery::unpan () +{ + /* caller must hold process lock */ + + _panshell.reset (); +} + void Delivery::reset_panner () { diff --git a/libs/ardour/internal_return.cc b/libs/ardour/internal_return.cc index 7209236fe8..6402eded81 100644 --- a/libs/ardour/internal_return.cc +++ b/libs/ardour/internal_return.cc @@ -20,6 +20,7 @@ #include "pbd/failed_constructor.h" +#include "ardour/audio_buffer.h" #include "ardour/internal_return.h" #include "ardour/mute_master.h" #include "ardour/session.h" @@ -52,6 +53,21 @@ InternalReturn::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*e } } +#if 0 + if (_session.transport_rolling()) { + for (BufferSet::audio_iterator b = bufs.audio_begin(); b != bufs.audio_end(); ++b) { + Sample* p = b->data (); + for (pframes_t n = 0; n < nframes; ++n) { + if (p[n] != 0.0) { + cerr << "\tnon-zero data received\n"; + break; + } + } + } + } +#endif + + _active = _pending_active; } diff --git a/libs/ardour/internal_send.cc b/libs/ardour/internal_send.cc index e455722dd0..ed7c5e6bc3 100644 --- a/libs/ardour/internal_send.cc +++ b/libs/ardour/internal_send.cc @@ -21,6 +21,7 @@ #include "pbd/failed_constructor.h" #include "ardour/amp.h" +#include "ardour/audio_buffer.h" #include "ardour/internal_send.h" #include "ardour/meter.h" #include "ardour/route.h" @@ -41,7 +42,7 @@ InternalSend::InternalSend (Session& s, boost::shared_ptr p, boost::sh } } - _amp->set_gain (0, this); + init_gain (); } InternalSend::~InternalSend () @@ -51,6 +52,18 @@ InternalSend::~InternalSend () } } +void +InternalSend::init_gain () +{ + if (_role == Listen) { + /* send to monitor bus is always at unity */ + _amp->set_gain (1.0, this); + } else { + /* aux sends start at -inf dB */ + _amp->set_gain (0, this); + } +} + int InternalSend::use_target (boost::shared_ptr sendto) { @@ -73,7 +86,6 @@ InternalSend::use_target (boost::shared_ptr sendto) return 0; } - void InternalSend::send_to_going_away () { @@ -140,6 +152,20 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame } } +#if 0 + if (_session.transport_rolling()) { + for (BufferSet::audio_iterator b = mixbufs.audio_begin(); b != mixbufs.audio_end(); ++b) { + Sample* p = b->data (); + for (pframes_t n = 0; n < nframes; ++n) { + if (p[n] != 0.0) { + cerr << "\tnon-zero data SENT to " << b->data() << endl; + break; + } + } + } + } +#endif + /* target will pick up our output when it is ready */ out: @@ -182,10 +208,14 @@ InternalSend::get_state() } int -InternalSend::set_our_state (const XMLNode& node, int /*version*/) +InternalSend::set_state (const XMLNode& node, int version) { const XMLProperty* prop; + Send::set_state (node, version); + + init_gain (); + if ((prop = node.property ("target")) != 0) { _send_to_id = prop->value(); @@ -205,13 +235,6 @@ InternalSend::set_our_state (const XMLNode& node, int /*version*/) return 0; } -int -InternalSend::set_state (const XMLNode& node, int version) -{ - Send::set_state (node, version); - return set_our_state (node, version); -} - int InternalSend::connect_when_legal () { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 111c22cfd4..8931bca198 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -1901,6 +1901,14 @@ Route::_set_state (const XMLNode& node, int version, bool /*call_base*/) _mute_master->set_solo_ignore (true); } + if (is_monitor()) { + /* monitor bus does not get a panner, but if (re)created + via XML, it will already have one by the time we + call ::set_state(). so ... remove it. + */ + unpan (); + } + /* add all processors (except amp, which is always present) */ nlist = node.children(); @@ -2372,6 +2380,7 @@ Route::set_processor_state (const XMLNode& node) if (prop->value() == "intsend") { processor.reset (new InternalSend (_session, _pannable, _mute_master, boost::shared_ptr(), Delivery::Role (0))); + } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "lv2" || prop->value() == "vst" || @@ -3836,3 +3845,18 @@ Route::should_monitor () const return true; } +void +Route::unpan () +{ + Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); + Glib::RWLock::ReaderLock lp (_processor_lock); + + _pannable.reset (); + + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { + boost::shared_ptr d = boost::dynamic_pointer_cast(*i); + if (d) { + d->unpan (); + } + } +}