diff options
-rw-r--r-- | gtk2_ardour/io_selector.cc | 8 | ||||
-rw-r--r-- | libs/ardour/ardour/io.h | 8 | ||||
-rw-r--r-- | libs/ardour/io.cc | 55 |
3 files changed, 48 insertions, 23 deletions
diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc index 0738758931..de5f9efa1b 100644 --- a/gtk2_ardour/io_selector.cc +++ b/gtk2_ardour/io_selector.cc @@ -194,14 +194,14 @@ IOSelector::IOSelector (Session& sess, boost::shared_ptr<IO> ior, bool input) const ARDOUR::DataType t = io->default_type(); if (for_input) { - if (io->input_maximum().get(t) < 0 || io->input_maximum().get(t) > (size_t) io->n_inputs().get(t)) { + if (io->input_maximum().get(t) > (uint32_t) io->n_inputs().get(t)) { add_port_button.set_sensitive (true); } else { add_port_button.set_sensitive (false); } } else { - if (io->output_maximum().get(t) < 0 || io->output_maximum().get(t) > (size_t) io->n_outputs().get(t)) { + if (io->output_maximum().get(t) > (uint32_t) io->n_outputs().get(t)) { add_port_button.set_sensitive (true); } else { add_port_button.set_sensitive (false); @@ -212,14 +212,14 @@ IOSelector::IOSelector (Session& sess, boost::shared_ptr<IO> ior, bool input) port_button_box.pack_start (remove_port_button, false, false); if (for_input) { - if (io->input_minimum().get(t) < 0 || io->input_minimum().get(t) < (size_t) io->n_inputs().get(t)) { + if (io->input_minimum().get(t) < (uint32_t) io->n_inputs().get(t)) { remove_port_button.set_sensitive (true); } else { remove_port_button.set_sensitive (false); } } else { - if (io->output_minimum().get(t) < 0 || io->output_minimum().get(t) < (size_t) io->n_outputs().get(t)) { + if (io->output_minimum().get(t) < (uint32_t) io->n_outputs().get(t)) { remove_port_button.set_sensitive (true); } else { remove_port_button.set_sensitive (false); diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 2b0b0f7781..a0b9df3c04 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -324,10 +324,10 @@ class IO : public Automatable, public Latent sigc::connection port_legal_c; sigc::connection panner_legal_c; - ChanCount _input_minimum; - ChanCount _input_maximum; - ChanCount _output_minimum; - ChanCount _output_maximum; + ChanCount _input_minimum; ///< minimum number of input channels (0 for no minimum) + ChanCount _input_maximum; ///< maximum number of input channels (ChanCount::INFINITE for no maximum) + ChanCount _output_minimum; ///< minimum number of output channels (0 for no minimum) + ChanCount _output_maximum; ///< maximum number of output channels (ChanCount::INFINITE for no maximum) boost::shared_ptr<Bundle> _bundle_for_inputs; boost::shared_ptr<Bundle> _bundle_for_outputs; diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 0c1ba32c74..c1aac7ab94 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -1296,13 +1296,14 @@ IO::state (bool full_state) snprintf (buf, sizeof(buf), "%2.12f", gain()); node->add_property ("gain", buf); - // FIXME: this is NOT sufficient! - const int in_min = (_input_minimum == ChanCount::ZERO) ? -1 : _input_minimum.get(_default_type); - const int in_max = (_input_maximum == ChanCount::INFINITE) ? -1 : _input_maximum.get(_default_type); - const int out_min = (_output_minimum == ChanCount::ZERO) ? -1 : _output_minimum.get(_default_type); - const int out_max = (_output_maximum == ChanCount::INFINITE) ? -1 : _output_maximum.get(_default_type); + /* To make backwards compatibility a bit easier, write ChanCount::INFINITE to the session file + as -1. + */ + + int const in_max = _input_maximum == ChanCount::INFINITE ? -1 : _input_maximum.get(_default_type); + int const out_max = _output_maximum == ChanCount::INFINITE ? -1 : _output_maximum.get(_default_type); - snprintf (buf, sizeof(buf)-1, "%d,%d,%d,%d", in_min, in_max, out_min, out_max); + snprintf (buf, sizeof(buf)-1, "%zd,%d,%zd,%d", _input_minimum.get(_default_type), in_max, _output_minimum.get(_default_type), out_max); node->add_property ("iolimits", buf); @@ -1339,18 +1340,42 @@ IO::set_state (const XMLNode& node) _id = prop->value (); } - size_t in_min = -1; - size_t in_max = -1; - size_t out_min = -1; - size_t out_max = -1; + int in_min = -1; + int in_max = -1; + int out_min = -1; + int out_max = -1; if ((prop = node.property ("iolimits")) != 0) { - sscanf (prop->value().c_str(), "%zd,%zd,%zd,%zd", + sscanf (prop->value().c_str(), "%d,%d,%d,%d", &in_min, &in_max, &out_min, &out_max); - _input_minimum = ChanCount(_default_type, in_min); - _input_maximum = ChanCount(_default_type, in_max); - _output_minimum = ChanCount(_default_type, out_min); - _output_maximum = ChanCount(_default_type, out_max); + + /* Correct for the difference between the way we write things to session files and the + way things are described by ChanCount; see comments in io.h about what the different + ChanCount values mean. */ + + if (in_min < 0) { + _input_minimum = ChanCount::ZERO; + } else { + _input_minimum = ChanCount (_default_type, in_min); + } + + if (in_max < 0) { + _input_maximum = ChanCount::INFINITE; + } else { + _input_maximum = ChanCount (_default_type, in_max); + } + + if (out_min < 0) { + _output_minimum = ChanCount::ZERO; + } else { + _output_minimum = ChanCount (_default_type, out_min); + } + + if (out_max < 0) { + _output_maximum = ChanCount::INFINITE; + } else { + _output_maximum = ChanCount (_default_type, out_max); + } } if ((prop = node.property ("gain")) != 0) { |