From a7ed400c81c65a11623418d08cd5c953826754bd Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 15 Aug 2023 15:46:19 +0200 Subject: [PATCH] Add Audiobuffers::set_channels(). --- src/lib/audio_buffers.cc | 19 ++++++++++++++++++ src/lib/audio_buffers.h | 2 ++ test/audio_buffers_test.cc | 41 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/lib/audio_buffers.cc b/src/lib/audio_buffers.cc index 119a499b4..4f01146f9 100644 --- a/src/lib/audio_buffers.cc +++ b/src/lib/audio_buffers.cc @@ -335,3 +335,22 @@ AudioBuffers::update_data_pointers () } } + +/** Set a new channel count, either discarding data (if new_channels is less than the current + * channels()), or filling with silence (if new_channels is more than the current channels() + */ +void +AudioBuffers::set_channels(int new_channels) +{ + DCPOMATIC_ASSERT(new_channels > 0); + + ScopeGuard sg = [this]() { update_data_pointers(); }; + + int const old_channels = channels(); + _data.resize(new_channels); + + for (int channel = old_channels; channel < new_channels; ++channel) { + _data[channel].resize(frames()); + } +} + diff --git a/src/lib/audio_buffers.h b/src/lib/audio_buffers.h index 4db0fa255..645348aa0 100644 --- a/src/lib/audio_buffers.h +++ b/src/lib/audio_buffers.h @@ -65,6 +65,8 @@ public: void set_frames (int f); + void set_channels(int new_channels); + void make_silent (); void make_silent (int channel); void make_silent (int from, int frames); diff --git a/test/audio_buffers_test.cc b/test/audio_buffers_test.cc index 0abd73080..76785d8ec 100644 --- a/test/audio_buffers_test.cc +++ b/test/audio_buffers_test.cc @@ -344,3 +344,44 @@ BOOST_AUTO_TEST_CASE (audio_buffers_trim_start) } } + +BOOST_AUTO_TEST_CASE(audio_buffers_set_channels_lower) +{ + AudioBuffers buffers(9, 9933); + srand(4); + random_fill(buffers); + + buffers.set_channels(4); + BOOST_REQUIRE_EQUAL(buffers.channels(), 4U); + + srand(4); + for (int i = 0; i < 9933; ++i) { + for (int c = 0; c < 4; ++c) { + BOOST_CHECK_EQUAL(buffers.data(c)[i], random_float()); + } + for (int c = 4; c < 9; ++c) { + random_float(); + } + } +} + + +BOOST_AUTO_TEST_CASE(audio_buffers_set_channels_higher) +{ + AudioBuffers buffers(9, 9933); + srand(4); + random_fill(buffers); + + buffers.set_channels(13); + BOOST_REQUIRE_EQUAL(buffers.channels(), 13U); + + srand(4); + for (int i = 0; i < 9933; ++i) { + for (int c = 0; c < 9; ++c) { + BOOST_CHECK_EQUAL(buffers.data(c)[i], random_float()); + } + for (int c = 9; c < 13; ++c) { + BOOST_CHECK_EQUAL(buffers.data(c)[i], 0); + } + } +} -- 2.30.2