diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2017-07-25 12:57:07 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2017-09-18 11:40:53 -0400 |
commit | 8f4d432d73901700f6f4fc661305e7e5f37e42c2 (patch) | |
tree | f8f494f6d07839d85d83f45f7a0ea3274aa4bc7d /libs/ardour/disk_io.cc | |
parent | ece52d3278935a8943936696ef09003f81998ef2 (diff) |
channel config changes during ::configure_io() must be scoped to ensure they are complete before signals are sent
Diffstat (limited to 'libs/ardour/disk_io.cc')
-rw-r--r-- | libs/ardour/disk_io.cc | 25 |
1 files 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<ChannelList> writer (channels); - boost::shared_ptr<ChannelList> 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<ChannelList> writer (channels); + boost::shared_ptr<ChannelList> 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) { |