X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fport_insert.cc;h=3b02bf41daa6672e1c9ef91720a03763efc8f491;hb=33da74c8e353ac56194956cae8e2b7d74ec1a1b0;hp=8c33d989dd4e42f9f1a92e9b07009edb0626c7fe;hpb=68e943265edf04e63a8e8b8f62bab20f99d9c637;p=ardour.git diff --git a/libs/ardour/port_insert.cc b/libs/ardour/port_insert.cc index 8c33d989dd..3b02bf41da 100644 --- a/libs/ardour/port_insert.cc +++ b/libs/ardour/port_insert.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000,2007 Paul Davis + Copyright (C) 2000,2007 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,18 +21,19 @@ #include -#include -#include +#include "pbd/failed_constructor.h" +#include "pbd/xml++.h" -#include -#include -#include -#include -#include +#include "ardour/delivery.h" +#include "ardour/port_insert.h" +#include "ardour/plugin.h" +#include "ardour/port.h" +#include "ardour/route.h" +#include "ardour/buffer_set.h" -#include -#include -#include +#include "ardour/audioengine.h" +#include "ardour/session.h" +#include "ardour/types.h" #include "i18n.h" @@ -40,38 +41,19 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -PortInsert::PortInsert (Session& s, Placement p) - : IOProcessor (s, string_compose (_("insert %1"), (bitslot = s.next_insert_id()) + 1), p, 1, -1, 1, -1) +PortInsert::PortInsert (Session& s, boost::shared_ptr mm) + : IOProcessor (s, true, true, string_compose (_("insert %1"), (bitslot = s.next_insert_id()) + 1), "") + , _out (new Delivery (s, _output, mm, _name, Delivery::Insert)) { - init (); ProcessorCreated (this); /* EMIT SIGNAL */ } -PortInsert::PortInsert (const PortInsert& other) - : IOProcessor (other._session, string_compose (_("insert %1"), (bitslot = other._session.next_insert_id()) + 1), other.placement(), 1, -1, 1, -1) -{ - init (); - ProcessorCreated (this); /* EMIT SIGNAL */ -} +PortInsert::PortInsert (Session& s, boost::shared_ptr mm, const XMLNode& node) + : IOProcessor (s, true, true, "unnamed port insert") + , _out (new Delivery (s, _output, mm, _name, Delivery::Insert)) -void -PortInsert::init () { - if (_io->add_input_port ("", this)) { - error << _("PortInsert: cannot add input port") << endmsg; - throw failed_constructor(); - } - - if (_io->add_output_port ("", this)) { - error << _("PortInsert: cannot add output port") << endmsg; - throw failed_constructor(); - } -} - -PortInsert::PortInsert (Session& s, const XMLNode& node) - : IOProcessor (s, "unnamed port insert", PreFader) -{ - if (set_state (node)) { + if (set_state (node, Stateful::loading_state_version)) { throw failed_constructor(); } @@ -84,21 +66,23 @@ PortInsert::~PortInsert () } void -PortInsert::run_in_place (BufferSet& bufs, nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset) +PortInsert::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes) { - if (_io->n_outputs().n_total() == 0) { + if (_output->n_ports().n_total() == 0) { return; } - if (!active()) { + if (!_active && !_pending_active) { /* deliver silence */ - _io->silence (nframes, offset); - return; + silence (nframes); + goto out; } - _io->deliver_output(bufs, start_frame, end_frame, nframes, offset); + _out->run (bufs, start_frame, end_frame, nframes); + _input->collect_input (bufs, nframes, ChanCount::ZERO); - _io->collect_input(bufs, nframes, offset); + out: + _active = _pending_active; } XMLNode& @@ -110,7 +94,7 @@ PortInsert::get_state(void) XMLNode& PortInsert::state (bool full) { - XMLNode& node = IOProcessor::state(full); + XMLNode& node = Processor::state(full); char buf[32]; node.add_property ("type", "port"); snprintf (buf, sizeof (buf), "%" PRIu32, bitslot); @@ -120,7 +104,7 @@ PortInsert::state (bool full) } int -PortInsert::set_state(const XMLNode& node) +PortInsert::set_state (const XMLNode& node, int version) { XMLNodeList nlist = node.children(); XMLNodeIterator niter; @@ -131,7 +115,7 @@ PortInsert::set_state(const XMLNode& node) error << _("XML node describing port insert is missing the `type' field") << endmsg; return -1; } - + if (prop->value() != "port") { error << _("non-port insert XML used for port plugin insert") << endmsg; return -1; @@ -153,13 +137,13 @@ PortInsert::set_state(const XMLNode& node) break; } } - - IOProcessor::set_state (*insert_node); + + Processor::set_state (*insert_node, version); return 0; } -ARDOUR::nframes_t +ARDOUR::nframes_t PortInsert::signal_latency() const { /* because we deliver and collect within the same cycle, @@ -169,46 +153,38 @@ PortInsert::signal_latency() const need to take that into account too. */ - return _session.engine().frames_per_cycle() + _io->input_latency(); + return _session.engine().frames_per_cycle() + _input->signal_latency(); } bool PortInsert::configure_io (ChanCount in, ChanCount out) { - /* do not allow configuration to be changed outside the range of - the last request config. or something like that. - */ - - /* this is a bit odd: - - the number of inputs we are required to handle corresponds - to the number of output ports we need. + /* for an insert, processor input corresponds to IO output, and vice versa */ - the number of outputs we are required to have corresponds - to the number of input ports we need. - */ - - _io->set_output_maximum (in); - _io->set_output_minimum (in); - _io->set_input_maximum (out); - _io->set_input_minimum (out); + if (_input->ensure_io (in, false, this) != 0) { + return false; + } - if (_io->ensure_io (out, in, false, this) != 0) { + if (_output->ensure_io (out, false, this) != 0) { return false; } return Processor::configure_io (in, out); } -ChanCount -PortInsert::output_streams() const +bool +PortInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out) const { - return _io->n_inputs (); + out = in; + return true; } -ChanCount -PortInsert::input_streams() const +bool +PortInsert::set_name (const std::string& name) { - return _io->n_outputs (); -} + bool ret = Processor::set_name (name); + + ret = (_input->set_name (name) || _output->set_name (name)); + return ret; +}