- list<shared_ptr<cxml::Node> > const c = node->node_children ("Map");
- for (list<shared_ptr<cxml::Node> >::const_iterator i = c.begin(); i != c.end(); ++i) {
- add ((*i)->number_child<int> ("ContentIndex"), static_cast<libdcp::Channel> ((*i)->number_child<int> ("DCP")));
+ if (state_version < 32) {
+ setup (node->number_child<int> ("ContentChannels"), MAX_DCP_AUDIO_CHANNELS);
+ } else {
+ setup (node->number_child<int> ("InputChannels"), node->number_child<int> ("OutputChannels"));
+ }
+
+ if (state_version <= 5) {
+ /* Old-style: on/off mapping */
+ list<cxml::NodePtr> const c = node->node_children ("Map");
+ for (list<cxml::NodePtr>::const_iterator i = c.begin(); i != c.end(); ++i) {
+ set ((*i)->number_child<int> ("ContentIndex"), static_cast<dcp::Channel> ((*i)->number_child<int> ("DCP")), 1);
+ }
+ } else {
+ list<cxml::NodePtr> const c = node->node_children ("Gain");
+ for (list<cxml::NodePtr>::const_iterator i = c.begin(); i != c.end(); ++i) {
+ if (state_version < 32) {
+ set (
+ (*i)->number_attribute<int> ("Content"),
+ static_cast<dcp::Channel> ((*i)->number_attribute<int> ("DCP")),
+ raw_convert<float> ((*i)->content ())
+ );
+ } else {
+ set (
+ (*i)->number_attribute<int> ("Input"),
+ (*i)->number_attribute<int> ("Output"),
+ raw_convert<float> ((*i)->content ())
+ );
+ }
+ }