-bool
-Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter)
-{
- const XMLProperty *prop;
-
- if (node.name() != "Processor") {
- return false;
- }
-
- try {
- if ((prop = node.property ("type")) != 0) {
-
- boost::shared_ptr<Processor> processor;
-
- /* meter, amp, monitor and intreturn are all singletons, deal with them first */
-
- if (prop->value() == "meter") {
-
- if (_meter) {
- if (_meter->set_state (node, Stateful::loading_state_version)) {
- return false;
- } else {
- return true;
- }
- }
-
- PeakMeter* pm = new PeakMeter (_session);
-
- if (pm->set_state (node, Stateful::loading_state_version)) {
- delete pm;
- return false;
- }
-
- _meter.reset (pm);
- _meter->set_display_to_user (_meter_point == MeterCustom);
-
- processor = _meter;
-
- } else if (prop->value() == "monitor") {
-
- if (_monitor_control) {
- if (_monitor_control->set_state (node, Stateful::loading_state_version)) {
- return false;
- } else {
- return true;
- }
- }
-
- MonitorProcessor* mp = new MonitorProcessor (_session);
- if (mp->set_state (node, Stateful::loading_state_version)) {
- delete mp;
- return false;
- }
-
- _monitor_control.reset (mp);
- processor = _monitor_control;
-
- } else if (prop->value() == "amp") {
-
- if (_amp) {
- processor = _amp;
- if (processor->set_state (node, Stateful::loading_state_version)) {
- return false;
- } else {
- /* no reason to add it */
- return true;
- }
- }
-
- Amp* a = new Amp (_session, _mute_master);
- if (_amp->set_state (node, Stateful::loading_state_version)) {
- delete a;
- return false;
- }
-
- _amp.reset (a);
- processor = _amp;
-
- } else if (prop->value() == "intreturn") {
-
- /* a route only has one internal return. If it exists already
- just set its state, and return
- */
-
- if (_intreturn) {
- if (_intreturn->set_state (node, Stateful::loading_state_version)) {
- return false;
- } else {
- return true;
- }
- }
-
- InternalReturn* iret = new InternalReturn (_session);
- if (iret->set_state (node, Stateful::loading_state_version)) {
- delete iret;
- return false;
- }
-
- _intreturn.reset (iret);
- processor = _intreturn;
-
- } else if (prop->value() == "main-outs") {
-
- if (_main_outs) {
- if (_main_outs->set_state (node, Stateful::loading_state_version)) {
- return false;
- } else {
- return true;
- }
- }
-
- Delivery* del = new Delivery (_session, _output, _mute_master, X_("toBeResetFroXML"), Delivery::Role (0));
- if (del->set_state (node, Stateful::loading_state_version)) {
- delete del;
- return false;
- }
-
- _main_outs.reset (del);
- processor = _main_outs;
-
- } else if (prop->value() == "intsend") {
-
- InternalSend* isend = new InternalSend (_session, _mute_master, boost::shared_ptr<Route>(), Delivery::Role (0));
- if (isend->set_state (node, Stateful::loading_state_version)) {
- delete isend;
- return false;
- }
-
- processor.reset (isend);
-
- } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
- prop->value() == "lv2" ||
- prop->value() == "vst" ||
- prop->value() == "audiounit") {
-
- processor.reset (new PluginInsert(_session, node));
-
- } else if (prop->value() == "port") {
-
- processor.reset (new PortInsert (_session, _mute_master, node));
-
- } else if (prop->value() == "send") {
-
- processor.reset (new Send (_session, _mute_master, node));
-
- } else {
- error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
- return false;
- }
-
- if (iter == _processors.end() && processor->display_to_user() && !_processors.empty()) {
- /* check for invisible processors stacked at the end and leave them there */
- ProcessorList::iterator p;
- p = _processors.end();
- --p;
- while (!(*p)->display_to_user() && p != _processors.begin()) {
- --p;
- }
- ++p;
- iter = p;
- }
-
- return (add_processor (processor, iter, 0, false) == 0);
-
- } else {
- error << _("Processor XML node has no type property") << endmsg;
- return false;
- }
- }
-
- catch (failed_constructor &err) {
- warning << _("processor could not be created. Ignored.") << endmsg;
- return false;
- }
-}
-
-