X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fprocessor.cc;h=39c3d68ad7941d8ac35a852e057cd2f0486521f6;hb=e4304f3bf2daa24395f7b520476115ca418ad93e;hp=315fb6662e1ac2bcf944f103943ff74b97683354;hpb=22b07e0233a29d9633ffa825a79503befaf2e16e;p=ardour.git diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 315fb6662e..39c3d68ad7 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -24,9 +24,11 @@ #include #include "pbd/xml++.h" +#include "pbd/types_convert.h" #include "ardour/automatable.h" #include "ardour/chan_count.h" +#include "ardour/debug.h" #include "ardour/processor.h" #include "ardour/types.h" @@ -42,7 +44,7 @@ #include "ardour/session.h" #include "ardour/types.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -64,7 +66,13 @@ Processor::Processor(Session& session, const string& name) , _pre_fader (false) , _ui_pointer (0) , _window_proxy (0) + , _pinmgr_proxy (0) , _owner (0) + , _input_latency (0) + , _output_latency (0) + , _capture_offset (0) + , _playback_offset (0) + , _loop_location (0) { } @@ -81,14 +89,25 @@ Processor::Processor (const Processor& other) , _pre_fader (false) , _ui_pointer (0) , _window_proxy (0) + , _pinmgr_proxy (0) , _owner (0) + , _input_latency (0) + , _output_latency (0) + , _capture_offset (0) + , _playback_offset (0) + , _loop_location (other._loop_location) { } +Processor::~Processor () +{ + DEBUG_TRACE (DEBUG::Destruction, string_compose ("processor %1 destructor\n", _name)); +} + XMLNode& Processor::get_state (void) { - return state (true); + return state (); } /* NODE STRUCTURE @@ -106,29 +125,28 @@ Processor::get_state (void) */ XMLNode& -Processor::state (bool full_state) +Processor::state () { XMLNode* node = new XMLNode (state_node_name); - 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->set_property("id", id()); + node->set_property("name", name()); + node->set_property("active", active()); if (_extra_xml){ node->add_child_copy (*_extra_xml); } - if (full_state) { + if (!skip_saving_automation) { XMLNode& automation = Automatable::get_automation_xml_state(); if (!automation.children().empty() || !automation.properties().empty()) { node->add_child_nocopy (automation); + } else { + delete &automation; } } - snprintf (buf, sizeof (buf), "%" PRId64, _user_latency); - node->add_property("user-latency", buf); + node->set_property("user-latency", _user_latency); return *node; } @@ -176,17 +194,16 @@ Processor::set_state (const XMLNode& node, int version) return set_state_2X (node, version); } - const XMLProperty *prop; - const XMLProperty *legacy_active = 0; - bool leave_name_alone = (node.property ("ignore-name") != 0); - - if (!leave_name_alone) { + bool ignore_name; + // Only testing for the presence of the property not value + if (!node.get_property("ignore-name", ignore_name)) { + string name; // may not exist for legacy 3.0 sessions - if ((prop = node.property ("name")) != 0) { + if (node.get_property ("name", name)) { /* 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()); + Processor::set_name (name); } set_id (node); @@ -197,12 +214,13 @@ Processor::set_state (const XMLNode& node, int version) Stateful::save_extra_xml (node); + XMLProperty const * prop = 0; + XMLProperty const * legacy_active = 0; + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == X_("Automation")) { - XMLProperty *prop; - if ((prop = (*niter)->property ("path")) != 0) { old_set_automation_state (*(*niter)); } else { @@ -225,7 +243,7 @@ Processor::set_state (const XMLNode& node, int version) } } - bool const a = string_is_affirmative (prop->value ()) && !_session.get_bypass_all_loaded_plugins(); + bool const a = string_to (prop->value ()) && !_session.get_bypass_all_loaded_plugins(); if (_active != a) { if (a) { activate (); @@ -234,9 +252,7 @@ Processor::set_state (const XMLNode& node, int version) } } - if ((prop = node.property ("user-latency")) != 0) { - _user_latency = atoi (prop->value ()); - } + node.get_property ("user-latency", _user_latency); return 0; } @@ -259,28 +275,44 @@ Processor::configure_io (ChanCount in, ChanCount out) return true; } -void -Processor::set_display_to_user (bool yn) +bool +Processor::map_loop_range (samplepos_t& start, samplepos_t& end) const { - _display_to_user = yn; -} + if (!_loop_location) { + return false; + } + if (start >= end) { + /* no backwards looping */ + return false; + } -void -Processor::set_pre_fader (bool p) -{ - _pre_fader = p; + const samplepos_t loop_end = _loop_location->end (); + if (start < loop_end) { + return false; + } + + const samplepos_t loop_start = _loop_location->start (); + const samplecnt_t looplen = loop_end - loop_start; + const sampleoffset_t start_off = (start - loop_start) % looplen; + const samplepos_t start_pos = loop_start + start_off; + + assert (start >= start_pos); + end -= start - start_pos; + start = start_pos; + assert (end > start); + return true; } void -Processor::set_ui (void* p) +Processor::set_display_to_user (bool yn) { - _ui_pointer = p; + _display_to_user = yn; } void -Processor::set_window_proxy (ProcessorWindowProxy* wp) +Processor::set_pre_fader (bool p) { - _window_proxy = wp; + _pre_fader = p; } void