diff options
author | Carl Hetherington <carl@carlh.net> | 2012-06-10 13:07:39 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2012-06-10 13:07:39 +0000 |
commit | 0f039ad5a914b029a28631d939397791d1a9c91a (patch) | |
tree | 3796992cc70afaa5f7d2dfebb89105331fe2f527 /libs/ardour/test/combine_regions_test.cc | |
parent | 2022a05c00372f7ef50aa47d70a82b48ecfe30a9 (diff) |
Add test for compound regions with the layering
reversed.
git-svn-id: svn://localhost/ardour2/branches/3.0@12644 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/test/combine_regions_test.cc')
-rw-r--r-- | libs/ardour/test/combine_regions_test.cc | 143 |
1 files changed, 130 insertions, 13 deletions
diff --git a/libs/ardour/test/combine_regions_test.cc b/libs/ardour/test/combine_regions_test.cc index 4a465d08af..87554734c1 100644 --- a/libs/ardour/test/combine_regions_test.cc +++ b/libs/ardour/test/combine_regions_test.cc @@ -29,7 +29,7 @@ using namespace std; using namespace ARDOUR; void -CombineRegionsTest::check_crossfade () +CombineRegionsTest::check_crossfade1 () { ARDOUR::Sample buf[512]; ARDOUR::Sample mbuf[512]; @@ -38,26 +38,26 @@ CombineRegionsTest::check_crossfade () /* Read from the playlist */ _audio_playlist->read (buf, mbuf, gbuf, 0, 256 * 2 - 128, 0); - /* region[0]'s fade in */ + /* _r[0]'s fade in */ for (int i = 0; i < 64; ++i) { float const fade = i / (double) 63; float const r0 = i * fade; CPPUNIT_ASSERT_DOUBLES_EQUAL (r0, buf[i], 1e-16); } - /* Some more of region[0] */ + /* Some more of _r[0] */ for (int i = 64; i < 128; ++i) { CPPUNIT_ASSERT_DOUBLES_EQUAL (i, buf[i], 1e-16); } float fade_in[128]; float fade_out[128]; - + _ar[1]->fade_in()->curve().get_vector (0, 128, fade_in, 128); _ar[1]->inverse_fade_in()->curve().get_vector (0, 128, fade_out, 128); - /* Crossfading region[0] to region[1] using region[1]'s fade in and inverse fade in. - region[0] also has a standard region fade out to add to the fun. + /* Crossfading _r[0] to _r[1] using _r[1]'s fade in and inverse fade in. + _r[0] also has a standard region fade out to add to the fun. */ for (int i = 128; i < 256; ++i) { @@ -76,23 +76,28 @@ CombineRegionsTest::check_crossfade () r0 *= fade_out[i - 128]; float const r1 = (i - 128) * fade_in[i - 128]; + cout << setprecision(12); + cout << "\t\ti=" << i << " fade_out=" << fade_out[i - 128] << " r1=" << r1 << " r0=" << r0 << "\n"; CPPUNIT_ASSERT_DOUBLES_EQUAL (r0 + r1, buf[i], 1e-16); } - /* Rest of region[1] */ + /* Rest of _r[1] */ for (int i = 256; i < (384 - 64); ++i) { CPPUNIT_ASSERT_DOUBLES_EQUAL (i - 128, buf[i], 1e-16); } - /* And region[1]'s fade out */ + /* And _r[1]'s fade out */ for (int i = (384 - 64); i < 384; ++i) { float const fade_out = (((double) 1 - 0.0000001) / 63) * (383 - i) + 0.0000001; CPPUNIT_ASSERT_DOUBLES_EQUAL ((i - 128) * fade_out, buf[i], 1e-16); } } +/** Test combining two cross-faded regions, with the earlier region + * on the lower layer. + */ void -CombineRegionsTest::crossfadeTest () +CombineRegionsTest::crossfadeTest1 () { /* Two regions, both 256 frames in length, overlapping by 128 frames in the middle */ @@ -106,16 +111,18 @@ CombineRegionsTest::crossfadeTest () _playlist->add_region (_r[1], 128); _r[1]->set_length (256); - /* Check that the right fades have been set up */ + /* Check layering */ + CPPUNIT_ASSERT_EQUAL (layer_t (0), _r[0]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (1), _r[1]->layer ()); + /* Check that the right fades have been set up */ CPPUNIT_ASSERT_EQUAL (false, _ar[0]->fade_in_is_xfade ()); CPPUNIT_ASSERT_EQUAL (false, _ar[0]->fade_out_is_xfade ()); CPPUNIT_ASSERT_EQUAL (true, _ar[1]->fade_in_is_xfade ()); CPPUNIT_ASSERT_EQUAL (false, _ar[1]->fade_out_is_xfade ()); /* Check that the read comes back correctly */ - - check_crossfade (); + check_crossfade1 (); /* Combine the two regions */ @@ -128,7 +135,117 @@ CombineRegionsTest::crossfadeTest () CPPUNIT_ASSERT_EQUAL ((uint32_t) 1, _playlist->n_regions ()); /* And reading should give the same thing */ + check_crossfade1 (); +} + +void +CombineRegionsTest::check_crossfade2 () +{ + ARDOUR::Sample buf[512]; + ARDOUR::Sample mbuf[512]; + float gbuf[512]; + + /* Read from the playlist */ + _audio_playlist->read (buf, mbuf, gbuf, 0, 256 * 2 - 128, 0); + + /* _r[0]'s fade in */ + for (int i = 0; i < 64; ++i) { + float const fade = i / (double) 63; + float const r0 = i * fade; + CPPUNIT_ASSERT_DOUBLES_EQUAL (r0, buf[i], 1e-16); + } + + /* Some more of _r[0] */ + for (int i = 64; i < 128; ++i) { + CPPUNIT_ASSERT_DOUBLES_EQUAL (i, buf[i], 1e-16); + } + + float fade_in[128]; + float fade_out[128]; + + _ar[0]->inverse_fade_out()->curve().get_vector (0, 128, fade_in, 128); + _ar[0]->fade_out()->curve().get_vector (0, 128, fade_out, 128); + + /* Crossfading _r[0] to _r[1] using _r[0]'s fade out and inverse fade out. + _r[1] also has a standard region fade in to add to the fun. + */ + for (int i = 128; i < 256; ++i) { + + float region_fade_in = 1; + if (i < (128 + 64)) { + region_fade_in = (i - 128) / ((double) 63); + } + + float r0 = i * fade_out[i - 128]; + float r1 = (i - 128) * region_fade_in; + r1 *= fade_in[i - 128]; + + cout << setprecision(12); + cout << "\t\ti=" << i << " fade_out=" << fade_out[i - 128] << " r1=" << r1 << " r0=" << r0 << "\n"; + CPPUNIT_ASSERT_DOUBLES_EQUAL (r0 + r1, buf[i], 1e-16); + } + + /* Rest of _r[1] */ + for (int i = 256; i < (384 - 64); ++i) { + CPPUNIT_ASSERT_DOUBLES_EQUAL (i - 128, buf[i], 1e-16); + } - check_crossfade (); + /* And _r[1]'s fade out */ + for (int i = (384 - 64); i < 384; ++i) { + float const fade_out = (((double) 1 - 0.0000001) / 63) * (383 - i) + 0.0000001; + CPPUNIT_ASSERT_DOUBLES_EQUAL ((i - 128) * fade_out, buf[i], 1e-16); + } +} + +/** As per crossfadeTest1, except that the earlier region is on the + * higher layer. + */ +void +CombineRegionsTest::crossfadeTest2 () +{ + cout << "\n\n\nCOMBINE\n"; + + /* Two regions, both 256 frames in length, overlapping by 128 frames in the middle */ + + _ar[0]->set_default_fade_in (); + _ar[0]->set_default_fade_out (); + _ar[1]->set_default_fade_out (); + + _playlist->add_region (_r[0], 0); + _r[0]->set_length (256); + + _playlist->add_region (_r[1], 128); + _r[1]->set_length (256); + + _r[1]->lower_to_bottom (); + + /* Check layering */ + CPPUNIT_ASSERT_EQUAL (layer_t (1), _r[0]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (0), _r[1]->layer ()); + + /* Check that the right fades have been set up */ + + CPPUNIT_ASSERT_EQUAL (false, _ar[0]->fade_in_is_xfade ()); + CPPUNIT_ASSERT_EQUAL (true, _ar[0]->fade_out_is_xfade ()); + CPPUNIT_ASSERT_EQUAL (false, _ar[1]->fade_in_is_xfade ()); + CPPUNIT_ASSERT_EQUAL (false, _ar[1]->fade_out_is_xfade ()); + + /* Check that the read comes back correctly */ + cout << "\n\n\nFIRST READ\n"; + check_crossfade2 (); + + /* Combine the two regions */ + + RegionList rl; + rl.push_back (_r[0]); + rl.push_back (_r[1]); + _playlist->combine (rl); + + /* ...so we just have the one region... */ + CPPUNIT_ASSERT_EQUAL ((uint32_t) 1, _playlist->n_regions ()); + + /* And reading should give the same thing */ + cout << "\n\n\SECOND READ\n"; + check_crossfade2 (); } |