X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fprocessor.cc;h=3bc9db024bef1873c5b1d0db710cb38f5a8648b6;hb=1e424e11460812262df89c08c6af521a935760cf;hp=82591effa4cf6f80cf63dfcc16e1fcde16eba30b;hpb=e14187aadd574d46c82d8eb0d151b526b84ddcc7;p=ardour.git diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 82591effa4..3bc9db024b 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2000 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 @@ -17,35 +17,39 @@ */ +#ifdef WAF_BUILD +#include "libardour-config.h" +#endif + #include #include -#include -#include -#include +#include "pbd/failed_constructor.h" +#include "pbd/enumwriter.h" +#include "pbd/xml++.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include +#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 +#include "ardour/vst_plugin.h" #endif #ifdef HAVE_AUDIOUNITS -#include +#include "ardour/audio_unit.h" #endif -#include -#include -#include +#include "ardour/audioengine.h" +#include "ardour/session.h" +#include "ardour/types.h" #include "i18n.h" @@ -58,58 +62,30 @@ sigc::signal Processor::ProcessorCreated; // 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, Placement p) +Processor::Processor(Session& session, const string& name) : SessionObject(session, name) , AutomatableControls(session) + , _pending_active(false) , _active(false) , _next_ab_is_active(false) , _configured(false) - , _placement(p) , _gui(0) + , _display_to_user (true) { } -boost::shared_ptr -Processor::clone (boost::shared_ptr other) -{ - boost::shared_ptr send; - boost::shared_ptr port_insert; - boost::shared_ptr plugin_insert; - - if ((send = boost::dynamic_pointer_cast(other)) != 0) { - return boost::shared_ptr (new Send (*send)); - } else if ((port_insert = boost::dynamic_pointer_cast(other)) != 0) { - return boost::shared_ptr (new PortInsert (*port_insert)); - } else if ((plugin_insert = boost::dynamic_pointer_cast(other)) != 0) { - return boost::shared_ptr (new PluginInsert (*plugin_insert)); - } else { - fatal << _("programming error: unknown Processor type in Processor::Clone!\n") - << endmsg; - /*NOTREACHED*/ - } - return boost::shared_ptr(); -} - -void -Processor::set_sort_key (uint32_t key) -{ - _sort_key = key; -} - -void -Processor::set_placement (Placement p) -{ - if (_placement != p) { - _placement = p; - PlacementChanged (); /* EMIT SIGNAL */ - } -} - -void -Processor::set_active (bool yn) +Processor::Processor (Session& session, const XMLNode& node) + : SessionObject(session, "renameMe") + , AutomatableControls(session) + , _pending_active(false) + , _active(false) + , _next_ab_is_active(false) + , _configured(false) + , _gui(0) + , _display_to_user (true) { - _active = yn; - ActiveChanged (); + set_state (node, Stateful::loading_state_version); + _pending_active = _active; } XMLNode& @@ -118,8 +94,8 @@ Processor::get_state (void) return state (true); } -/* NODE STRUCTURE - +/* NODE STRUCTURE + @@ -137,54 +113,90 @@ Processor::state (bool full_state) { XMLNode* node = new XMLNode (state_node_name); stringstream sstr; - - // FIXME: This conflicts with "id" used by plugin for name in legacy sessions (ugh). - // Do we need to serialize this? - /* char buf[64]; + id().print (buf, sizeof (buf)); node->add_property("id", buf); - */ - node->add_property("name", _name); - node->add_property("active", active() ? "yes" : "no"); - node->add_property("placement", enum_2_string (_placement)); + node->add_property("active", active() ? "yes" : "no"); if (_extra_xml){ node->add_child_copy (*_extra_xml); } - - if (full_state) { - XMLNode& automation = Automatable::get_automation_state(); - - for (set::iterator x = _visible_controls.begin(); x != _visible_controls.end(); ++x) { - if (x != _visible_controls.begin()) { - sstr << ' '; + if (full_state) { + XMLNode& automation = Automatable::get_automation_state(); + if (!automation.children().empty() + || !automation.properties().empty() + || !_visible_controls.empty()) { + + for (set::iterator x = _visible_controls.begin(); + x != _visible_controls.end(); ++x) { + if (x != _visible_controls.begin()) { + sstr << ' '; + } + sstr << *x; } - sstr << *x; + + automation.add_property ("visible", sstr.str()); + node->add_child_nocopy (automation); } + } + + return *node; +} + +int +Processor::set_state_2X (const XMLNode & node, int /*version*/) +{ + XMLProperty const * prop; + + XMLNodeList children = node.children (); - automation.add_property ("visible", sstr.str()); + for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) { - node->add_child_nocopy (automation); + if ((*i)->name() == X_("IO")) { + + if ((prop = (*i)->property ("name")) != 0) { + set_name (prop->value ()); + } + + if ((prop = (*i)->property ("id")) != 0) { + _id = prop->value (); + } + + if ((prop = (*i)->property ("active")) != 0) { + if (_active != string_is_affirmative (prop->value())) { + _active = !_active; + ActiveChanged (); /* EMIT_SIGNAL */ + } + } + } } - return *node; + return 0; } int -Processor::set_state (const XMLNode& node) +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; - const XMLProperty *legacy_placement = 0; - // may not exist for legacy sessions + // 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(); + } + XMLNodeList nlist = node.children(); XMLNodeIterator niter; @@ -192,13 +204,12 @@ Processor::set_state (const XMLNode& node) if ((*niter)->name() == X_("Automation")) { - XMLProperty *prop; - + if ((prop = (*niter)->property ("path")) != 0) { old_set_automation_state (*(*niter)); } else { - set_automation_state (*(*niter), Parameter(PluginAutomation)); + set_automation_state (*(*niter), Evoral::Parameter(PluginAutomation)); } if ((prop = (*niter)->property ("visible")) != 0) { @@ -206,7 +217,7 @@ Processor::set_state (const XMLNode& node) stringstream sstr; _visible_controls.clear (); - + sstr << prop->value(); while (1) { sstr >> what; @@ -214,24 +225,22 @@ Processor::set_state (const XMLNode& node) break; } // FIXME: other automation types? - mark_automation_visible (Parameter(PluginAutomation, what), true); + mark_automation_visible (Evoral::Parameter(PluginAutomation, 0, what), true); } } - } else if ((*niter)->name() == "extra") { + } 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; } - if ( !(legacy_placement = (*niter)->property("placement"))) { - error << string_compose(_("No %1 property flag in element %2"), "placement", (*niter)->name()) << endl; - } } } if ((prop = node.property ("active")) == 0) { - warning << _("XML node describing a processor is missing the `active' field, trying legacy active flag from child node") << endmsg; + warning << _("XML node describing a processor is missing the `active' field," + "trying legacy active flag from child node") << endmsg; if (legacy_active) { prop = legacy_active; } else { @@ -240,49 +249,34 @@ Processor::set_state (const XMLNode& node) } } - if (_active != (prop->value() == "yes")) { + if (_active != string_is_affirmative (prop->value())) { _active = !_active; ActiveChanged (); /* EMIT_SIGNAL */ - } - - if ((prop = node.property ("placement")) == 0) { - warning << _("XML node describing a processor is missing the `placement' field, trying legacy placement flag from child node") << endmsg; - if (legacy_placement) { - prop = legacy_placement; - } else { - error << _("No child node with placement property") << endmsg; - return -1; - } - } - - /* hack to handle older sessions before we only used EnumWriter */ - - string pstr; - - if (prop->value() == "pre") { - pstr = "PreFader"; - } else if (prop->value() == "post") { - pstr = "PostFader"; - } else { - pstr = prop->value(); } - Placement p = Placement (string_2_enum (pstr, p)); - set_placement (p); - return 0; } bool Processor::configure_io (ChanCount in, ChanCount out) { - /* this class assumes static output stream count. - Derived classes must override, and must set "out" - to reflect "in" before calling this. + /* This class assumes 1:1 input:output.static output stream count. + Derived classes must override and set _configured_output appropriately + if this is not the case */ - _configured_input = in; + _configured_input = in; + _configured_output = out; _configured = true; + ConfigurationChanged.emit (in, out); + return true; } + +void +Processor::set_display_to_user (bool yn) +{ + _display_to_user = yn; +} +