X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdelivery.cc;h=e93e550308cd176e90d94942e2832d2f6fa20c64;hb=ad547e53fc168410b22628a8cb125e8d4da4b293;hp=5861e5ea2c70d3c0858b05c0e609bda92b45da7c;hpb=dda06229570980a61de8a9395c1539958cc30b0f;p=ardour.git diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 5861e5ea2c..e93e550308 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -137,7 +137,8 @@ Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) con if (_output) { if (_output->n_ports() != ChanCount::ZERO) { - out = _output->n_ports(); + /* increase number of output ports if the processor chain requires it */ + out = ChanCount::max (_output->n_ports(), in); return true; } else { /* not configured yet - we will passthru */ @@ -189,8 +190,7 @@ Delivery::configure_io (ChanCount in, ChanCount out) if (_output) { if (_output->n_ports() != out) { if (_output->n_ports() != ChanCount::ZERO) { - fatal << _name << " programming error: configure_io with nports = " << _output->n_ports() << " called with " << in << " and " << out << " with " << _output->n_ports() << " output ports" << endmsg; - /*NOTREACHED*/ + _output->ensure_io (out, false, this); } else { /* I/O not yet configured */ } @@ -209,8 +209,9 @@ Delivery::configure_io (ChanCount in, ChanCount out) } } } - } + } + if (!Processor::configure_io (in, out)) { return false; } @@ -221,7 +222,7 @@ Delivery::configure_io (ChanCount in, ChanCount out) } void -Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes, bool result_required) +Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, nframes_t nframes, bool result_required) { assert (_output); @@ -418,50 +419,49 @@ Delivery::reset_panners () void -Delivery::start_pan_touch (uint32_t which) +Delivery::start_pan_touch (uint32_t which, double when) { if (which < _panner->npanners()) { - _panner->pan_control(which)->start_touch(); + _panner->pan_control(which)->start_touch(when); } } void -Delivery::end_pan_touch (uint32_t which) +Delivery::end_pan_touch (uint32_t which, bool mark, double when) { if (which < _panner->npanners()) { - _panner->pan_control(which)->stop_touch(); + _panner->pan_control(which)->stop_touch(mark, when); } } -void -Delivery::transport_stopped (sframes_t frame) -{ - _panner->transport_stopped (frame); -} void -Delivery::flush (nframes_t nframes, nframes64_t time) +Delivery::flush_buffers (nframes_t nframes, nframes64_t time) { /* io_lock, not taken: function must be called from Session::process() calltree */ PortSet& ports (_output->ports()); - + for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { (*i).flush_buffers (nframes, time, _output_offset); } } void -Delivery::transport_stopped () +Delivery::transport_stopped (framepos_t now) { - /* turn off any notes that are on */ + Processor::transport_stopped (now); - PortSet& ports (_output->ports()); + _panner->transport_stopped (now); - for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { - (*i).transport_stopped (); - } + if (_output) { + PortSet& ports (_output->ports()); + + for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { + (*i).transport_stopped (); + } + } } gain_t @@ -481,9 +481,7 @@ Delivery::target_gain () return 0.0; } - gain_t desired_gain = -1.0f; - - MuteMaster::MutePoint mp; + MuteMaster::MutePoint mp = MuteMaster::Main; // stupid gcc uninit warning switch (_role) { case Main: @@ -495,13 +493,15 @@ Delivery::target_gain () case Send: case Insert: case Aux: - /* XXX FIX ME this is wrong, we need per-delivery muting */ - mp = MuteMaster::PreFader; + if (_pre_fader) { + mp = MuteMaster::PreFader; + } else { + mp = MuteMaster::PostFader; + } break; } - // cerr << name() << ' '; - desired_gain = _mute_master->mute_gain_at (mp); + gain_t desired_gain = _mute_master->mute_gain_at (mp); if (_role == Listen && _session.monitor_out() && !_session.listening()) { @@ -538,7 +538,7 @@ Delivery::set_name (const std::string& name) void Delivery::output_changed (IOChange change, void* /*src*/) { - if (change & ARDOUR::ConfigurationChanged) { + if (change.type & IOChange::ConfigurationChanged) { reset_panner (); } }