From b8f16a16d0830f9757a7a0ddbd7b4d7ad255d266 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 25 Jul 2017 12:57:07 -0400 Subject: [PATCH] channel config changes during ::configure_io() must be scoped to ensure they are complete before signals are sent --- libs/ardour/disk_io.cc | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/libs/ardour/disk_io.cc b/libs/ardour/disk_io.cc index ff6ad0adf2..58e8790942 100644 --- a/libs/ardour/disk_io.cc +++ b/libs/ardour/disk_io.cc @@ -147,18 +147,23 @@ DiskIOProcessor::configure_io (ChanCount in, ChanCount out) { DEBUG_TRACE (DEBUG::DiskIO, string_compose ("Configuring %1 for in:%2 out:%3\n", name(), in, out)); - RCUWriter writer (channels); - boost::shared_ptr c = writer.get_copy(); - - uint32_t n_audio = in.n_audio(); bool changed = false; - if (n_audio > c->size()) { - add_channel_to (c, n_audio - c->size()); - changed = true; - } else if (n_audio < c->size()) { - remove_channel_from (c, c->size() - n_audio); - changed = true; + { + RCUWriter writer (channels); + boost::shared_ptr c = writer.get_copy(); + + uint32_t n_audio = in.n_audio(); + + if (n_audio > c->size()) { + add_channel_to (c, n_audio - c->size()); + changed = true; + } else if (n_audio < c->size()) { + remove_channel_from (c, c->size() - n_audio); + changed = true; + } + + /* writer leaves scope, actual channel list is updated */ } if (in.n_midi() > 0 && !_midi_buf) {