Add Audiobuffers::set_channels().
authorCarl Hetherington <cth@carlh.net>
Tue, 15 Aug 2023 13:46:19 +0000 (15:46 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 15 Aug 2023 16:27:05 +0000 (18:27 +0200)
src/lib/audio_buffers.cc
src/lib/audio_buffers.h
test/audio_buffers_test.cc

index 119a499b49e448d75647681dfef88b45c1a62723..4f01146f9ddc7e66abce2323a8711d6efb572056 100644 (file)
@@ -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());
+       }
+}
+
index 4db0fa255bf07a19af946ab132ccd95345e874bd..645348aa0ef7e557513629c9a628a9df5c544fa4 100644 (file)
@@ -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);
index 0abd730809484a869c4c9b6d65b062fa459020f2..76785d8ecb09adf1d2bd4b24b1cd5cc5340812ab 100644 (file)
@@ -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);
+               }
+       }
+}