fix initialization of gain for Listen internal sends (to monitor bus); remove pannabl...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 14 Jun 2011 14:49:06 +0000 (14:49 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 14 Jun 2011 14:49:06 +0000 (14:49 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9730 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/delivery.h
libs/ardour/ardour/internal_send.h
libs/ardour/ardour/route.h
libs/ardour/delivery.cc
libs/ardour/internal_return.cc
libs/ardour/internal_send.cc
libs/ardour/route.cc

index 0e55356928fc259f640b93d7859e8c58b082fea0..789f1847ba139b07579479ac65cb6ac77b6c7c7f 100644 (file)
@@ -95,6 +95,7 @@ public:
        boost::shared_ptr<PannerShell> panner_shell() const { return _panshell; }
        boost::shared_ptr<Panner> panner() const;
 
+       void unpan ();
        void reset_panner ();
        void defer_pan_reset ();
        void allow_pan_reset ();
index c7969e9f1978d2f5ddfc0ca7758f6f2e1ef00a23..39dca9a6bed9ffd36c26dbca69b9af0643c627a9 100644 (file)
@@ -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<Route>);
 };
 
index 3b12e4f6004d72c1e21f36cd8d872e16d91c9251..d7f76cbf2438fcb543735936a7f2675ea7e34376 100644 (file)
@@ -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<CapturingProcessor> _capturing_processor;
 
index 44782650c16c23904bfe8104ef29dc69d0b1cde4..619be9a07764cb35d0a04cfaf77aa3e7d211d69e 100644 (file)
@@ -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 ()
 {
index 7209236fe8ddcbe4b4abd6c6c03631a0476e09b5..6402eded81a481895e3f558703f4795129ce65b3 100644 (file)
@@ -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;
 }
 
index e455722dd087b90688b2ab6dbc7649e70ad34d35..ed7c5e6bc3c91edd64451522eb98a7e700d92d28 100644 (file)
@@ -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<Pannable> 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<Route> sendto)
 {
@@ -73,7 +86,6 @@ InternalSend::use_target (boost::shared_ptr<Route> 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 ()
 {
index 111c22cfd42971a7f062dd4bc2014dbff59961e7..8931bca198b292ac1b951c55e935ed0ba54672a7 100644 (file)
@@ -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<Route>(), 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<Delivery> d = boost::dynamic_pointer_cast<Delivery>(*i);
+               if (d) {
+                       d->unpan ();
+               }
+       }
+}