- {
- Glib::Mutex::Lock em (_session.engine().process_lock());
- Glib::Mutex::Lock lm (io_lock);
-
- Port* port;
-
- if (_noutputs == nout) {
- need_pan_reset = false;
- } else {
- need_pan_reset = true;
- }
-
- /* remove unused ports */
-
- while (_ninputs > nin) {
- _session.engine().unregister_port (_inputs.back());
- _inputs.pop_back();
- _ninputs--;
- in_reduced = true;
- in_changed = true;
- }
-
- while (_noutputs > nout) {
- _session.engine().unregister_port (_outputs.back());
- _outputs.pop_back();
- _noutputs--;
- out_reduced = true;
- out_changed = true;
- }
-
- /* create any necessary new ports (of the default type) */
-
- while (_ninputs < nin) {
-
- char buf[64];
-
- /* Create a new input port */
-
- if (_input_maximum == 1) {
- snprintf (buf, sizeof (buf), _("%s/in"), _name.c_str());
- }
- else {
- snprintf (buf, sizeof (buf), _("%s/in %u"), _name.c_str(), find_input_port_hole());
- }
-
- try {
- if ((port = _session.engine().register_input_port (_default_type, buf)) == 0) {
- error << string_compose(_("IO: cannot register input port %1"), buf) << endmsg;
- return -1;
- }
- }
-
- catch (AudioEngine::PortRegistrationFailure& err) {
- setup_peak_meters ();
- reset_panner ();
- /* pass it on */
- throw err;
- }
-
- _inputs.push_back (port);
- ++_ninputs;
- in_changed = true;
- }
-
- /* create any necessary new ports */
-
- while (_noutputs < nout) {
-
- char buf[64];
-
- /* Create a new output port */
-
- if (_output_maximum == 1) {
- snprintf (buf, sizeof (buf), _("%s/out"), _name.c_str());
- } else {
- snprintf (buf, sizeof (buf), _("%s/out %u"), _name.c_str(), find_output_port_hole());
- }
-
- try {
- if ((port = _session.engine().register_output_port (_default_type, buf)) == 0) {
- error << string_compose(_("IO: cannot register output port %1"), buf) << endmsg;
- return -1;
- }
- }
-
- catch (AudioEngine::PortRegistrationFailure& err) {
- setup_peak_meters ();
- reset_panner ();
- /* pass it on */
- throw err;
- }
-
- _outputs.push_back (port);
- ++_noutputs;
- out_changed = true;
- }
-
- if (clear) {
-
- /* disconnect all existing ports so that we get a fresh start */
-
- for (vector<Port *>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
- _session.engine().disconnect (*i);
- }
-
- for (vector<Port *>::iterator i = _outputs.begin(); i != _outputs.end(); ++i) {
- _session.engine().disconnect (*i);
- }
- }
-
- if (in_changed || out_changed) {
- setup_peak_meters ();
- reset_panner ();
- }