2 #include "pbd/failed_constructor.h"
3 #include "pbd/compose.h"
5 #include "ardour/user_bundle.h"
6 #include "ardour/port_set.h"
8 #include "ardour/session.h"
9 #include "ardour/audioengine.h"
12 ARDOUR::UserBundle::UserBundle (std::string
const & n
)
18 ARDOUR::UserBundle::UserBundle (XMLNode
const & node
, bool i
)
21 if (set_state (node
, Stateful::loading_state_version
)) {
22 throw failed_constructor ();
27 ARDOUR::UserBundle::set_state (XMLNode
const & node
, int /*version*/)
29 XMLProperty
const * name
;
31 if ((name
= node
.property ("name")) == 0) {
32 PBD::error
<< _("Node for Bundle has no \"name\" property") << endmsg
;
36 set_name (name
->value ());
38 XMLNodeList
const channels
= node
.children ();
41 for (XMLNodeConstIterator i
= channels
.begin(); i
!= channels
.end(); ++i
) {
43 if ((*i
)->name() != "Channel") {
44 PBD::error
<< string_compose (_("Unknown node \"%s\" in Bundle"), (*i
)->name()) << endmsg
;
48 if ((name
= (*i
)->property ("name")) == 0) {
49 PBD::error
<< _("Node for Channel has no \"name\" property") << endmsg
;
53 XMLProperty
const * type
;
54 if ((type
= (*i
)->property ("type")) == 0) {
55 PBD::error
<< _("Node for Channel has no \"type\" property") << endmsg
;
59 add_channel (name
->value (), DataType (type
->value()));
61 XMLNodeList
const ports
= (*i
)->children ();
63 for (XMLNodeConstIterator j
= ports
.begin(); j
!= ports
.end(); ++j
) {
64 if ((*j
)->name() != "Port") {
65 PBD::error
<< string_compose (_("Unknown node \"%s\" in Bundle"), (*j
)->name()) << endmsg
;
69 if ((name
= (*j
)->property ("name")) == 0) {
70 PBD::error
<< _("Node for Port has no \"name\" property") << endmsg
;
74 add_port_to_channel (n
, name
->value ());
84 ARDOUR::UserBundle::get_state ()
88 if (ports_are_inputs ()) {
89 node
= new XMLNode ("InputBundle");
91 node
= new XMLNode ("OutputBundle");
94 node
->add_property ("name", name ());
97 Glib::Mutex::Lock
lm (_channel_mutex
);
99 for (std::vector
<Channel
>::iterator i
= _channel
.begin(); i
!= _channel
.end(); ++i
) {
100 XMLNode
* c
= new XMLNode ("Channel");
101 c
->add_property ("name", i
->name
);
102 c
->add_property ("type", i
->type
.to_string());
104 for (PortList::iterator j
= i
->ports
.begin(); j
!= i
->ports
.end(); ++j
) {
105 XMLNode
* p
= new XMLNode ("Port");
106 p
->add_property ("name", *j
);
107 c
->add_child_nocopy (*p
);
110 node
->add_child_nocopy (*c
);