X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fprocessor.cc;h=3f8fdf509d08eed5767d0e48c44ddb569e4b8ec3;hb=e2ec54216b921c005a96f890c0e8b23c39860e7f;hp=47211567bf17470cc7961b597700b0b95c2b38dc;hpb=f35dc8b35da3dc11cbb1076193657f8335722041;p=ardour.git diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 47211567bf..3f8fdf509d 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -23,26 +23,18 @@ #include - -#include "pbd/failed_constructor.h" -#include "pbd/enumwriter.h" #include "pbd/xml++.h" +#include "ardour/automatable.h" +#include "ardour/chan_count.h" #include "ardour/processor.h" -#include "ardour/plugin.h" -#include "ardour/port.h" -#include "ardour/route.h" -#include "ardour/ladspa_plugin.h" -#include "ardour/buffer_set.h" -#include "ardour/send.h" -#include "ardour/port_insert.h" -#include "ardour/plugin_insert.h" - -#ifdef VST_SUPPORT -#include "ardour/vst_plugin.h" +#include "ardour/types.h" + +#ifdef WINDOWS_VST_SUPPORT +#include "ardour/windows_vst_plugin.h" #endif -#ifdef HAVE_AUDIOUNITS +#ifdef AUDIOUNIT_SUPPORT #include "ardour/audio_unit.h" #endif @@ -56,19 +48,36 @@ using namespace std; using namespace ARDOUR; using namespace PBD; +namespace ARDOUR { class Session; } + // Always saved as Processor, but may be IOProcessor or Send in legacy sessions const string Processor::state_node_name = "Processor"; Processor::Processor(Session& session, const string& name) : SessionObject(session, name) - , AutomatableControls(session) + , Automatable (session) , _pending_active(false) , _active(false) , _next_ab_is_active(false) , _configured(false) - , _gui(0) , _display_to_user (true) , _pre_fader (false) + , _ui_pointer (0) +{ +} + +Processor::Processor (const Processor& other) + : Evoral::ControlSet (other) + , SessionObject (other.session(), other.name()) + , Automatable (other.session()) + , Latent (other) + , _pending_active(other._pending_active) + , _active(other._active) + , _next_ab_is_active(false) + , _configured(false) + , _display_to_user (true) + , _pre_fader (false) + , _ui_pointer (0) { } @@ -108,25 +117,15 @@ Processor::state (bool full_state) } if (full_state) { - XMLNode& automation = Automatable::get_automation_state(); - if (!automation.children().empty() - || !automation.properties().empty() - || !_visible_controls.empty()) { - - stringstream sstr; - for (set::iterator x = _visible_controls.begin(); - x != _visible_controls.end(); ++x) { - if (x != _visible_controls.begin()) { - sstr << ' '; - } - sstr << *x; - } - - automation.add_property ("visible", sstr.str()); + XMLNode& automation = Automatable::get_automation_xml_state(); + if (!automation.children().empty() || !automation.properties().empty()) { node->add_child_nocopy (automation); } } + snprintf (buf, sizeof (buf), "%" PRId64, _user_latency); + node->add_property("user-latency", buf); + return *node; } @@ -136,24 +135,25 @@ Processor::set_state_2X (const XMLNode & node, int /*version*/) XMLProperty const * prop; XMLNodeList children = node.children (); - + for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) { if ((*i)->name() == X_("IO")) { - + if ((prop = (*i)->property ("name")) != 0) { set_name (prop->value ()); } - - if ((prop = (*i)->property ("id")) != 0) { - _id = prop->value (); - } + + set_id (**i); if ((prop = (*i)->property ("active")) != 0) { - if (_active != string_is_affirmative (prop->value())) { - _active = !_active; - _pending_active = _active; - ActiveChanged (); /* EMIT_SIGNAL */ + bool const a = string_is_affirmative (prop->value ()); + if (_active != a) { + if (a) { + activate (); + } else { + deactivate (); + } } } } @@ -168,23 +168,28 @@ Processor::set_state (const XMLNode& node, int version) if (version < 3000) { return set_state_2X (node, version); } - + const XMLProperty *prop; const XMLProperty *legacy_active = 0; - - // may not exist for legacy 3.0 sessions - if ((prop = node.property ("name")) != 0) { - set_name(prop->value()); - } - - // may not exist for legacy 3.0 sessions - if ((prop = node.property ("id")) != 0) { - _id = prop->value(); + bool leave_name_alone = (node.property ("ignore-name") != 0); + + if (!leave_name_alone) { + // may not exist for legacy 3.0 sessions + if ((prop = node.property ("name")) != 0) { + /* don't let derived classes have a crack at set_name, + as some (like Send) will screw with the one we suggest. + */ + Processor::set_name (prop->value()); + } + + set_id (node); } XMLNodeList nlist = node.children(); XMLNodeIterator niter; + Stateful::save_extra_xml (node); + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == X_("Automation")) { @@ -194,28 +199,9 @@ Processor::set_state (const XMLNode& node, int version) if ((prop = (*niter)->property ("path")) != 0) { old_set_automation_state (*(*niter)); } else { - set_automation_state (*(*niter), Evoral::Parameter(PluginAutomation)); + set_automation_xml_state (*(*niter), Evoral::Parameter(PluginAutomation)); } - if ((prop = (*niter)->property ("visible")) != 0) { - uint32_t what; - stringstream sstr; - - _visible_controls.clear (); - - sstr << prop->value(); - while (1) { - sstr >> what; - if (sstr.fail()) { - break; - } - // FIXME: other automation types? - mark_automation_visible (Evoral::Parameter(PluginAutomation, 0, what), true); - } - } - - } else if ((*niter)->name() == "Extra") { - _extra_xml = new XMLNode (*(*niter)); } else if ((*niter)->name() == "Redirect") { if ( !(legacy_active = (*niter)->property("active"))) { error << string_compose(_("No %1 property flag in element %2"), "active", (*niter)->name()) << endl; @@ -232,15 +218,23 @@ Processor::set_state (const XMLNode& node, int version) } } - if (_active != string_is_affirmative (prop->value())) { - _active = !_active; - _pending_active = _active; - ActiveChanged (); /* EMIT_SIGNAL */ + bool const a = string_is_affirmative (prop->value ()); + if (_active != a) { + if (a) { + activate (); + } else { + deactivate (); + } + } + + if ((prop = node.property ("user-latency")) != 0) { + _user_latency = atoi (prop->value ()); } return 0; } +/** @pre Caller must hold process lock */ bool Processor::configure_io (ChanCount in, ChanCount out) { @@ -259,7 +253,7 @@ Processor::configure_io (ChanCount in, ChanCount out) } void -Processor::set_display_to_user (bool yn) +Processor::set_display_to_user (bool yn) { _display_to_user = yn; } @@ -269,3 +263,9 @@ Processor::set_pre_fader (bool p) { _pre_fader = p; } + +void +Processor::set_ui (void* p) +{ + _ui_pointer = p; +}