Add AudioMapping::take_from().
authorCarl Hetherington <cth@carlh.net>
Wed, 22 Mar 2023 23:24:36 +0000 (00:24 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 22 Mar 2023 23:24:36 +0000 (00:24 +0100)
src/lib/audio_mapping.cc
src/lib/audio_mapping.h
test/audio_mapping_test.cc

index 74b33aa358c5e79ae8cbfc4ebef53def0abd9ca5..b8aa6249f5faf11697331bb15ff6236a1e0b61c9 100644 (file)
@@ -288,3 +288,18 @@ AudioMapping::unmap_all ()
                }
        }
 }
+
+
+void
+AudioMapping::take_from(AudioMapping const& other)
+{
+       auto input = std::min(input_channels(), other.input_channels());
+       auto output = std::min(output_channels(), other.output_channels());
+
+       for (auto i = 0; i < input; ++i) {
+               for (auto o = 0; o < output; ++o) {
+                       set(i, o, other.get(i, o));
+               }
+       }
+}
+
index 0f59cc205ee35937f6ed9727aab40aef4c9d4dcd..fe9a7978939d938db88f9b98db1b11f40d804595 100644 (file)
@@ -76,6 +76,8 @@ public:
        std::list<int> mapped_output_channels () const;
        void unmap_all ();
 
+       void take_from(AudioMapping const& other);
+
 private:
        void setup (int input_channels, int output_channels);
 
index 37f3d24764abed4c5cc34cc9fcdf516a56ead952..22412b26050bae8b9de001e458a26a49b4e595e7 100644 (file)
@@ -104,3 +104,47 @@ BOOST_AUTO_TEST_CASE (audio_mapping_guess_test)
 }
 
 
+BOOST_AUTO_TEST_CASE(audio_mapping_take_from_larger)
+{
+       AudioMapping A(4, 9);
+       AudioMapping B(2, 3);
+
+       A.set(0, 0, 4);
+       A.set(1, 0, 8);
+       A.set(0, 1, 3);
+       A.set(1, 1, 6);
+       A.set(0, 2, 1);
+       A.set(1, 2, 9);
+
+       B.take_from(A);
+
+       BOOST_CHECK_CLOSE(B.get(0, 0), 4, 0.01);
+       BOOST_CHECK_CLOSE(B.get(1, 0), 8, 0.01);
+       BOOST_CHECK_CLOSE(B.get(0, 1), 3, 0.01);
+       BOOST_CHECK_CLOSE(B.get(1, 1), 6, 0.01);
+       BOOST_CHECK_CLOSE(B.get(0, 2), 1, 0.01);
+       BOOST_CHECK_CLOSE(B.get(1, 2), 9, 0.01);
+}
+
+
+BOOST_AUTO_TEST_CASE(audio_mapping_take_from_smaller)
+{
+       AudioMapping A(4, 9);
+       AudioMapping B(2, 3);
+
+       B.set(0, 0, 4);
+       B.set(1, 0, 8);
+       B.set(0, 1, 3);
+       B.set(1, 1, 6);
+       B.set(0, 2, 1);
+       B.set(1, 2, 9);
+
+       A.take_from(B);
+
+       BOOST_CHECK_CLOSE(A.get(0, 0), 4, 0.01);
+       BOOST_CHECK_CLOSE(A.get(1, 0), 8, 0.01);
+       BOOST_CHECK_CLOSE(A.get(0, 1), 3, 0.01);
+       BOOST_CHECK_CLOSE(A.get(1, 1), 6, 0.01);
+       BOOST_CHECK_CLOSE(A.get(0, 2), 1, 0.01);
+       BOOST_CHECK_CLOSE(A.get(1, 2), 9, 0.01);
+}