diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-06-10 13:59:06 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-06-10 13:59:06 +0000 |
commit | ff26317d4f7904c071d7ecfb96fd84e71728f6d0 (patch) | |
tree | 245b8f3ad569b09de84110eae6dce6297ac5d4b8 /libs/ardour/delivery.cc | |
parent | cc8598b0712dfc756fd62f002b1fa1ea0e3cda25 (diff) |
fix mute & solo behaviour mostly ; remove some verbose debugging output
git-svn-id: svn://localhost/ardour2/branches/3.0@5153 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/delivery.cc')
-rw-r--r-- | libs/ardour/delivery.cc | 88 |
1 files changed, 42 insertions, 46 deletions
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 75b026618b..4d79aad2b9 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -148,6 +148,9 @@ Delivery::run_in_place (BufferSet& bufs, sframes_t start_frame, sframes_t end_fr return; } + PortSet& ports (_output->ports()); + output_buffers().attach_buffers (ports, nframes, _output_offset); + // this Delivery processor is not a derived type, and thus we assume // we really can modify the buffers passed in (it is almost certainly // the main output stage of a Route). Contrast with Send::run_in_place() @@ -156,15 +159,31 @@ Delivery::run_in_place (BufferSet& bufs, sframes_t start_frame, sframes_t end_fr gain_t tgain = target_gain (); if (tgain != _current_gain) { + + /* target gain has changed */ + Amp::apply_gain (bufs, nframes, _current_gain, tgain); _current_gain = tgain; + + } else if (tgain == 0.0) { + + /* we were quiet last time, and we're still supposed to be quiet. + Silence the outputs, and make sure the buffers are quiet too, + */ + + _output->silence (nframes); + Amp::apply_simple_gain (bufs, nframes, 0.0); + + return; + + } else if (tgain != 1.0) { + + /* target gain has not changed, but is not unity */ + Amp::apply_simple_gain (bufs, nframes, tgain); } // Attach output buffers to port buffers - PortSet& ports (_output->ports()); - output_buffers().attach_buffers (ports, nframes, _output_offset); - if (_panner && _panner->npanners() && !_panner->bypassed()) { // Use the panner to distribute audio to output port buffers @@ -229,7 +248,6 @@ Delivery::set_state (const XMLNode& node) XMLNode* pan_node = node.child (X_("Panner")); if (pan_node) { - cerr << _name << " reset pan state from XML\n"; _panner->set_state (*pan_node); } @@ -241,16 +259,11 @@ Delivery::set_state (const XMLNode& node) void Delivery::reset_panner () { - cerr << _name << " reset panner - plegal ? " << panners_legal << endl; - if (panners_legal) { if (!no_panner_reset) { - cerr << "\treset panner with " << _output->name() << " = " << _output->n_ports() - << " vs. " << pans_required () << endl; _panner->reset (_output->n_ports().n_audio(), pans_required()); } } else { - cerr << "\tdefer pan reset till later\n"; panner_legal_c.disconnect (); panner_legal_c = PannersLegal.connect (mem_fun (*this, &Delivery::panners_became_legal)); } @@ -259,8 +272,6 @@ Delivery::reset_panner () int Delivery::panners_became_legal () { - cerr << _name << " panners now legal, outputs @ " << _output << " on " << _output->name() - << " = " << _output->n_ports() << " vs. " << pans_required() << endl; _panner->reset (_output->n_ports().n_audio(), pans_required()); _panner->load (); // automation panner_legal_c.disconnect (); @@ -345,51 +356,36 @@ Delivery::target_gain () gain_t desired_gain; MuteMaster::MutePoint mp; + switch (_role) { + case Main: + mp = MuteMaster::Main; + break; + case Listen: + mp = MuteMaster::Listen; + break; + case Send: + case Insert: + if (_placement == PreFader) { + mp = MuteMaster::PreFader; + } else { + mp = MuteMaster::PostFader; + } + break; + } + if (_solo_level) { desired_gain = 1.0; } else { if (_solo_isolated) { - switch (_role) { - case Main: - mp = MuteMaster::Main; - break; - case Listen: - mp = MuteMaster::Listen; - break; - case Send: - case Insert: - if (_placement == PreFader) { - mp = MuteMaster::PreFader; - } else { - mp = MuteMaster::PostFader; - } - break; - } - desired_gain = _mute_master->mute_gain_at (mp); - } else if (_session.soloing()) { - switch (_role) { - case Main: - mp = MuteMaster::Main; - break; - case Listen: - mp = MuteMaster::Listen; - break; - case Send: - case Insert: - if (_placement == PreFader) { - mp = MuteMaster::PreFader; - } else { - mp = MuteMaster::PostFader; - } - break; - } + } else if (_session.soloing()) { desired_gain = min (Config->get_solo_mute_gain(), _mute_master->mute_gain_at (mp)); + } else { - desired_gain = 1.0; + desired_gain = _mute_master->mute_gain_at (mp); } } |