13
0

lincoln's patch to get loading 2.X sessions to work better

git-svn-id: svn://localhost/ardour2/branches/3.0@6804 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-03-28 19:07:23 +00:00
parent 5e8b3f0832
commit f297e9fa51
7 changed files with 169 additions and 61 deletions

View File

@ -23,6 +23,7 @@
#include "evoral/Parameter.hpp"
#include "pbd/signals.h"
#include "pbd/stateful.h"
#include <string>
namespace ARDOUR {
@ -61,6 +62,7 @@ class MuteMaster : public PBD::Stateful
XMLNode& get_state();
int set_state(const XMLNode&, int version);
int set_state(std::string mute_point);
private:
MutePoint _mute_point;

View File

@ -748,8 +748,12 @@ IO::get_port_counts_2X (XMLNode const & node, int /*version*/, ChanCount& n, boo
if ((prop = node.property ("inputs")) != 0 && _direction == Input) {
n_audio = count (prop->value().begin(), prop->value().end(), '{');
} else if ((prop = node.property ("input-connection")) != 0 && _direction == Input) {
n_audio = 1;
} else if ((prop = node.property ("outputs")) != 0 && _direction == Output) {
n_audio = count (prop->value().begin(), prop->value().end(), '{');
} else if ((prop = node.property ("output-connection")) != 0 && _direction == Output) {
n_audio = 2;
}
}

View File

@ -352,7 +352,7 @@ LV2Plugin::has_editor() const
}
int
LV2Plugin::set_state(const XMLNode& node, int /*version*/)
LV2Plugin::set_state(const XMLNode& node, int version)
{
XMLNodeList nodes;
XMLProperty *prop;
@ -368,8 +368,12 @@ LV2Plugin::set_state(const XMLNode& node, int /*version*/)
return -1;
}
nodes = node.children ("Port");
if (version < 3000){
nodes = node.children ("port");
} else {
nodes = node.children ("Port");
}
for (iter = nodes.begin(); iter != nodes.end(); ++iter){
child = *iter;
@ -382,6 +386,7 @@ LV2Plugin::set_state(const XMLNode& node, int /*version*/)
}
map<string,uint32_t>::iterator i = _port_indices.find(sym);
if (i != _port_indices.end()) {
port_id = i->second;
} else {

View File

@ -76,6 +76,14 @@ MuteMaster::mute_gain_at (MutePoint mp) const
}
}
int
MuteMaster::set_state (std::string mute_point)
{
_mute_point = (MutePoint) string_2_enum (mute_point, _mute_point);
return 0;
}
int
MuteMaster::set_state (const XMLNode& node, int /*version*/)
{

View File

@ -798,8 +798,11 @@ PluginInsert::set_state(const XMLNode& node, int version)
set_automatable ();
}
/* Handle the node list for this Processor (or Insert if an A2 session) */
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == plugin->state_node_name()) {
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
(*i)->set_state (**niter, version);
}
@ -808,6 +811,7 @@ PluginInsert::set_state(const XMLNode& node, int version)
}
if (version < 3000) {
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == "Redirect") {
/* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
@ -815,7 +819,9 @@ PluginInsert::set_state(const XMLNode& node, int version)
break;
}
}
set_parameter_state_2X (node, version);
} else {
Processor::set_state (node, version);
set_parameter_state (node, version);
@ -910,7 +916,7 @@ PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
cnodes = (*niter)->children ("port");
for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){
for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
child = *iter;

View File

@ -1214,6 +1214,14 @@ Region::_set_state (const XMLNode& node, int version, PropertyChange& what_chang
cerr << endl;
send_change (what_changed);
}
/* Quick fix for 2.x sessions when region is muted */
if ((prop = node.property (X_("flags")))) {
if (string::npos != prop->value().find("Muted")){
set_muted (true);
}
}
return 0;
}

View File

@ -2037,11 +2037,6 @@ Route::_set_state_2X (const XMLNode& node, int version)
/* 2X things which still remain to be handled:
* default-type
* muted
* mute-affects-pre-fader
* mute-affects-post-fader
* mute-affects-control-outs
* mute-affects-main-outs
* automation
* controlouts
*/
@ -2056,58 +2051,7 @@ Route::_set_state_2X (const XMLNode& node, int version)
} else {
_flags = Flag (0);
}
/* add standard processors */
_meter.reset (new PeakMeter (_session));
add_processor (_meter, PreFader);
if (is_monitor()) {
/* where we listen to tracks */
_intreturn.reset (new InternalReturn (_session));
add_processor (_intreturn, PreFader);
_monitor_control.reset (new MonitorProcessor (_session));
add_processor (_monitor_control, PostFader);
}
_main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
add_processor (_main_outs, PostFader);
/* IOs */
nlist = node.children ();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
child = *niter;
if (child->name() == IO::state_node_name) {
/* there is a note in IO::set_state_2X() about why we have to call
this directly.
*/
_input->set_state_2X (*child, version, true);
_output->set_state_2X (*child, version, false);
if ((prop = child->property (X_("name"))) != 0) {
set_name (prop->value ());
}
if ((prop = child->property (X_("id"))) != 0) {
_id = prop->value ();
}
if ((prop = child->property (X_("active"))) != 0) {
bool yn = string_is_affirmative (prop->value());
_active = !yn; // force switch
set_active (yn);
}
}
/* XXX: panners? */
}
if ((prop = node.property (X_("phase-invert"))) != 0) {
set_phase_invert (string_is_affirmative (prop->value()));
}
@ -2124,6 +2068,65 @@ Route::_set_state_2X (const XMLNode& node, int version)
set_solo (yn, this);
}
if ((prop = node.property (X_("muted"))) != 0) {
bool first = true;
bool muted = string_is_affirmative (prop->value());
if(muted){
string mute_point;
if ((prop = node.property (X_("mute-affects-pre-fader"))) != 0) {
if (string_is_affirmative (prop->value())){
mute_point = mute_point + "PreFader";
first = false;
}
}
if ((prop = node.property (X_("mute-affects-post-fader"))) != 0) {
if (string_is_affirmative (prop->value())){
if (!first) {
mute_point = mute_point + ",";
}
mute_point = mute_point + "PostFader";
first = false;
}
}
if ((prop = node.property (X_("mute-affects-control-outs"))) != 0) {
if (string_is_affirmative (prop->value())){
if (!first) {
mute_point = mute_point + ",";
}
mute_point = mute_point + "Listen";
first = false;
}
}
if ((prop = node.property (X_("mute-affects-main-outs"))) != 0) {
if (string_is_affirmative (prop->value())){
if (!first) {
mute_point = mute_point + ",";
}
mute_point = mute_point + "Main";
}
}
_mute_master->set_state (mute_point);
}
}
if ((prop = node.property (X_("meter-point"))) != 0) {
_meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
}
@ -2163,6 +2166,78 @@ Route::_set_state_2X (const XMLNode& node, int version)
}
}
/* add standard processors */
//_meter.reset (new PeakMeter (_session));
//add_processor (_meter, PreFader);
if (is_monitor()) {
/* where we listen to tracks */
_intreturn.reset (new InternalReturn (_session));
add_processor (_intreturn, PreFader);
_monitor_control.reset (new MonitorProcessor (_session));
add_processor (_monitor_control, PostFader);
}
_main_outs.reset (new Delivery (_session, _output, _mute_master, _name, Delivery::Main));
add_processor (_main_outs, PostFader);
/* IOs */
nlist = node.children ();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
child = *niter;
if (child->name() == IO::state_node_name) {
/* there is a note in IO::set_state_2X() about why we have to call
this directly.
*/
_input->set_state_2X (*child, version, true);
_output->set_state_2X (*child, version, false);
if ((prop = child->property (X_("name"))) != 0) {
Route::set_name (prop->value ());
}
if ((prop = child->property (X_("id"))) != 0) {
_id = prop->value ();
}
if ((prop = child->property (X_("active"))) != 0) {
bool yn = string_is_affirmative (prop->value());
_active = !yn; // force switch
set_active (yn);
}
if ((prop = child->property (X_("gain"))) != 0) {
gain_t val;
if (sscanf (prop->value().c_str(), "%f", &val) == 1) {
_amp->gain_control()->set_value (val);
}
}
/* Set up Panners in the IO */
XMLNodeList io_nlist = child->children ();
XMLNodeConstIterator io_niter;
XMLNode *io_child;
for (io_niter = io_nlist.begin(); io_niter != io_nlist.end(); ++io_niter) {
io_child = *io_niter;
if (io_child->name() == X_("Panner")) {
_main_outs->panner()->set_state(*io_child, version);
}
}
}
}
XMLNodeList redirect_nodes;
for (niter = nlist.begin(); niter != nlist.end(); ++niter){