mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-11 09:06:33 +01:00
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:
parent
5e8b3f0832
commit
f297e9fa51
7 changed files with 169 additions and 61 deletions
|
|
@ -23,6 +23,7 @@
|
||||||
#include "evoral/Parameter.hpp"
|
#include "evoral/Parameter.hpp"
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
#include "pbd/stateful.h"
|
#include "pbd/stateful.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace ARDOUR {
|
namespace ARDOUR {
|
||||||
|
|
||||||
|
|
@ -61,6 +62,7 @@ class MuteMaster : public PBD::Stateful
|
||||||
|
|
||||||
XMLNode& get_state();
|
XMLNode& get_state();
|
||||||
int set_state(const XMLNode&, int version);
|
int set_state(const XMLNode&, int version);
|
||||||
|
int set_state(std::string mute_point);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MutePoint _mute_point;
|
MutePoint _mute_point;
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
if ((prop = node.property ("inputs")) != 0 && _direction == Input) {
|
||||||
n_audio = count (prop->value().begin(), prop->value().end(), '{');
|
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) {
|
} else if ((prop = node.property ("outputs")) != 0 && _direction == Output) {
|
||||||
n_audio = count (prop->value().begin(), prop->value().end(), '{');
|
n_audio = count (prop->value().begin(), prop->value().end(), '{');
|
||||||
|
} else if ((prop = node.property ("output-connection")) != 0 && _direction == Output) {
|
||||||
|
n_audio = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -352,7 +352,7 @@ LV2Plugin::has_editor() const
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
LV2Plugin::set_state(const XMLNode& node, int /*version*/)
|
LV2Plugin::set_state(const XMLNode& node, int version)
|
||||||
{
|
{
|
||||||
XMLNodeList nodes;
|
XMLNodeList nodes;
|
||||||
XMLProperty *prop;
|
XMLProperty *prop;
|
||||||
|
|
@ -368,8 +368,12 @@ LV2Plugin::set_state(const XMLNode& node, int /*version*/)
|
||||||
return -1;
|
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){
|
for (iter = nodes.begin(); iter != nodes.end(); ++iter){
|
||||||
|
|
||||||
child = *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);
|
map<string,uint32_t>::iterator i = _port_indices.find(sym);
|
||||||
|
|
||||||
if (i != _port_indices.end()) {
|
if (i != _port_indices.end()) {
|
||||||
port_id = i->second;
|
port_id = i->second;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -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
|
int
|
||||||
MuteMaster::set_state (const XMLNode& node, int /*version*/)
|
MuteMaster::set_state (const XMLNode& node, int /*version*/)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -798,8 +798,11 @@ PluginInsert::set_state(const XMLNode& node, int version)
|
||||||
set_automatable ();
|
set_automatable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle the node list for this Processor (or Insert if an A2 session) */
|
||||||
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
||||||
|
|
||||||
if ((*niter)->name() == plugin->state_node_name()) {
|
if ((*niter)->name() == plugin->state_node_name()) {
|
||||||
|
|
||||||
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
|
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
|
||||||
(*i)->set_state (**niter, version);
|
(*i)->set_state (**niter, version);
|
||||||
}
|
}
|
||||||
|
|
@ -808,6 +811,7 @@ PluginInsert::set_state(const XMLNode& node, int version)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version < 3000) {
|
if (version < 3000) {
|
||||||
|
|
||||||
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
||||||
if ((*niter)->name() == "Redirect") {
|
if ((*niter)->name() == "Redirect") {
|
||||||
/* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
|
/* 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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
set_parameter_state_2X (node, version);
|
set_parameter_state_2X (node, version);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Processor::set_state (node, version);
|
Processor::set_state (node, version);
|
||||||
set_parameter_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");
|
cnodes = (*niter)->children ("port");
|
||||||
|
|
||||||
for(iter = cnodes.begin(); iter != cnodes.end(); ++iter){
|
for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
|
||||||
|
|
||||||
child = *iter;
|
child = *iter;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1214,6 +1214,14 @@ Region::_set_state (const XMLNode& node, int version, PropertyChange& what_chang
|
||||||
cerr << endl;
|
cerr << endl;
|
||||||
send_change (what_changed);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2037,11 +2037,6 @@ Route::_set_state_2X (const XMLNode& node, int version)
|
||||||
|
|
||||||
/* 2X things which still remain to be handled:
|
/* 2X things which still remain to be handled:
|
||||||
* default-type
|
* default-type
|
||||||
* muted
|
|
||||||
* mute-affects-pre-fader
|
|
||||||
* mute-affects-post-fader
|
|
||||||
* mute-affects-control-outs
|
|
||||||
* mute-affects-main-outs
|
|
||||||
* automation
|
* automation
|
||||||
* controlouts
|
* controlouts
|
||||||
*/
|
*/
|
||||||
|
|
@ -2056,58 +2051,7 @@ Route::_set_state_2X (const XMLNode& node, int version)
|
||||||
} else {
|
} else {
|
||||||
_flags = Flag (0);
|
_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) {
|
if ((prop = node.property (X_("phase-invert"))) != 0) {
|
||||||
set_phase_invert (string_is_affirmative (prop->value()));
|
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);
|
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) {
|
if ((prop = node.property (X_("meter-point"))) != 0) {
|
||||||
_meter_point = MeterPoint (string_2_enum (prop->value (), _meter_point));
|
_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;
|
XMLNodeList redirect_nodes;
|
||||||
|
|
||||||
for (niter = nlist.begin(); niter != nlist.end(); ++niter){
|
for (niter = nlist.begin(); niter != nlist.end(); ++niter){
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue