summaryrefslogtreecommitdiff
path: root/libs/ardour/test/playlist_layering_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/test/playlist_layering_test.cc')
-rw-r--r--libs/ardour/test/playlist_layering_test.cc379
1 files changed, 80 insertions, 299 deletions
diff --git a/libs/ardour/test/playlist_layering_test.cc b/libs/ardour/test/playlist_layering_test.cc
index 23b22f9d90..fd0b6bc09c 100644
--- a/libs/ardour/test/playlist_layering_test.cc
+++ b/libs/ardour/test/playlist_layering_test.cc
@@ -1,14 +1,13 @@
-#include "pbd/compose.h"
#include "midi++/manager.h"
+#include "pbd/textreceiver.h"
+#include "pbd/compose.h"
+#include "ardour/session.h"
+#include "ardour/audioengine.h"
#include "ardour/playlist_factory.h"
#include "ardour/source_factory.h"
#include "ardour/region.h"
#include "ardour/region_factory.h"
-#include "ardour/session.h"
-#include "ardour/audiosource.h"
-#include "ardour/audioengine.h"
#include "playlist_layering_test.h"
-#include "test_receiver.h"
CPPUNIT_TEST_SUITE_REGISTRATION (PlaylistLayeringTest);
@@ -16,28 +15,68 @@ using namespace std;
using namespace ARDOUR;
using namespace PBD;
-int const PlaylistLayeringTest::num_regions = 6;
+class TestReceiver : public Receiver
+{
+protected:
+ void receive (Transmitter::Channel chn, const char * str) {
+ const char *prefix = "";
+
+ switch (chn) {
+ case Transmitter::Error:
+ prefix = ": [ERROR]: ";
+ break;
+ case Transmitter::Info:
+ /* ignore */
+ return;
+ case Transmitter::Warning:
+ prefix = ": [WARNING]: ";
+ break;
+ case Transmitter::Fatal:
+ prefix = ": [FATAL]: ";
+ break;
+ case Transmitter::Throw:
+ /* this isn't supposed to happen */
+ abort ();
+ }
+
+ /* note: iostreams are already thread-safe: no external
+ lock required.
+ */
+
+ cout << prefix << str << endl;
+
+ if (chn == Transmitter::Fatal) {
+ exit (9);
+ }
+ }
+};
+
+TestReceiver test_receiver;
void
PlaylistLayeringTest::setUp ()
{
- TestNeedingSession::setUp ();
- string const test_wav_path = "libs/ardour/test/test.wav";
+ string const test_session_path = "libs/ardour/test/playlist_layering_test";
+ string const test_wav_path = "libs/ardour/test/playlist_layering_test/playlist_layering_test.wav";
+ system (string_compose ("rm -rf %1", test_session_path).c_str());
- _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
- _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, 44100);
+ init (false, true);
+ SessionEvent::create_per_thread_pool ("test", 512);
- system ("pwd");
-
- /* Must write some data to our source, otherwise regions which use it will
- be limited in whether they can be trimmed or not.
- */
- boost::shared_ptr<AudioSource> a = boost::dynamic_pointer_cast<AudioSource> (_source);
- Sample silence[512];
- memset (silence, 0, 512 * sizeof (Sample));
- a->write (silence, 512);
+ test_receiver.listen_to (error);
+ test_receiver.listen_to (info);
+ test_receiver.listen_to (fatal);
+ test_receiver.listen_to (warning);
+
+ AudioEngine* engine = new AudioEngine ("test", "");
+ MIDI::Manager::create (engine->jack ());
+ CPPUNIT_ASSERT (engine->start () == 0);
- _region = new boost::shared_ptr<Region>[num_regions];
+ _session = new Session (*engine, test_session_path, "playlist_layering_test");
+ engine->set_session (_session);
+
+ _playlist = PlaylistFactory::create (DataType::AUDIO, *_session, "test");
+ _source = SourceFactory::createWritable (DataType::AUDIO, *_session, test_wav_path, "", false, 44100);
}
void
@@ -45,303 +84,45 @@ PlaylistLayeringTest::tearDown ()
{
_playlist.reset ();
_source.reset ();
- for (int i = 0; i < num_regions; ++i) {
+ for (int i = 0; i < 16; ++i) {
_region[i].reset ();
}
- delete[] _region;
-
- TestNeedingSession::tearDown ();
+ AudioEngine::instance()->remove_session ();
+ delete _session;
+ EnumWriter::destroy ();
+ MIDI::Manager::destroy ();
+ AudioEngine::destroy ();
}
void
-PlaylistLayeringTest::create_short_regions ()
+PlaylistLayeringTest::create_three_short_regions ()
{
PropertyList plist;
plist.add (Properties::start, 0);
plist.add (Properties::length, 100);
- for (int i = 0; i < num_regions; ++i) {
+ for (int i = 0; i < 3; ++i) {
_region[i] = RegionFactory::create (_source, plist);
- _region[i]->set_name (string_compose ("%1", char (int ('A') + i)));
}
}
void
-PlaylistLayeringTest::laterHigher_relayerOnAll_Test ()
-{
- _session->config.set_layer_model (LaterHigher);
- _session->config.set_relayer_on_all_edits (true);
-
- create_short_regions ();
-
- /* three overlapping regions */
- _playlist->add_region (_region[A], 0);
- _playlist->add_region (_region[B], 10);
- _playlist->add_region (_region[C], 20);
- /* and another non-overlapping one */
- _playlist->add_region (_region[D], 200);
-
- /* LaterHigher means that they should be arranged thus */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- _region[A]->set_position (5);
-
- /* Region move should have no effect in LaterHigher mode */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> bottom should give C A B, not touching D */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> top should go back to A B C, not touching D */
- _region[C]->raise_to_top ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-}
-
-void
-PlaylistLayeringTest::addHigher_relayerOnAll_Test ()
-{
- _session->config.set_layer_model (AddHigher);
- _session->config.set_relayer_on_all_edits (true);
-
- create_short_regions ();
-
- /* three overlapping regions */
- _playlist->add_region (_region[A], 0);
- _playlist->add_region (_region[B], 10);
- _playlist->add_region (_region[C], 20);
- /* and another non-overlapping one */
- _playlist->add_region (_region[D], 200);
-
- /* AddHigher means that they should be arranged thus */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- _region[A]->set_position (5);
-
- /* region move should have no effect in AddHigher mode */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> bottom should give C A B, not touching D */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> top should go back to A B C, not touching D */
- _region[C]->raise_to_top ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-}
-
-void
-PlaylistLayeringTest::addOrBoundsHigher_relayerOnAll_Test ()
+PlaylistLayeringTest::basicsTest ()
{
- _session->config.set_layer_model (AddOrBoundsChangeHigher);
- _session->config.set_relayer_on_all_edits (true);
-
- create_short_regions ();
-
- /* three overlapping regions */
- _playlist->add_region (_region[A], 0);
- _playlist->add_region (_region[B], 10);
- _playlist->add_region (_region[C], 20);
- /* and another non-overlapping one */
- _playlist->add_region (_region[D], 200);
-
- /* AddOrBoundsHigher means that they should be arranged thus */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* region move should put A on top for B C A, not touching D */
- _region[A]->set_position (5);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> bottom should give C B A, not touching D */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> top should go back to B A C, not touching D */
- _region[C]->raise_to_top ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Put C on the bottom */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Now move it slightly, and it should go back to the top again */
- _region[C]->set_position (21);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Put C back on the bottom */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Trim it slightly, and it should go back to the top again */
- _region[C]->trim_front (23);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Same with the end */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- _region[C]->trim_end (118);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-}
-
-void
-PlaylistLayeringTest::addOrBoundsHigher_relayerWhenNecessary_Test ()
-{
- _session->config.set_layer_model (AddOrBoundsChangeHigher);
- _session->config.set_relayer_on_all_edits (false);
-
- create_short_regions ();
-
- /* three overlapping regions */
- _playlist->add_region (_region[A], 0);
- _playlist->add_region (_region[B], 10);
- _playlist->add_region (_region[C], 20);
- /* and another non-overlapping one */
- _playlist->add_region (_region[D], 200);
-
- /* AddOrBoundsHigher means that they should be arranged thus */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- _region[A]->set_position (5);
-
- /* region move should not have changed anything, since in
- this mode we only relayer when there is a new overlap
- */
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> bottom should give C A B, not touching D */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* C -> top should go back to A B C, not touching D */
- _region[C]->raise_to_top ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Put C on the bottom */
- _region[C]->lower_to_bottom ();
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-
- /* Now move it slightly, and it should stay where it is */
- _region[C]->set_position (21);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
-}
-
-void
-PlaylistLayeringTest::lastLayerOpTest ()
-{
- create_short_regions ();
-
- _playlist->add_region (_region[A], 0);
- CPPUNIT_ASSERT_EQUAL (_playlist->layer_op_counter, _region[A]->last_layer_op (LayerOpAdd));
- uint64_t const last_add = _region[A]->last_layer_op (LayerOpAdd);
-
- _region[A]->set_position (42);
- CPPUNIT_ASSERT_EQUAL (_playlist->layer_op_counter, _region[A]->last_layer_op (LayerOpBoundsChange));
- CPPUNIT_ASSERT_EQUAL (last_add, _region[A]->last_layer_op (LayerOpAdd));
-
- _region[A]->trim_front (46);
- CPPUNIT_ASSERT_EQUAL (_playlist->layer_op_counter, _region[A]->last_layer_op (LayerOpBoundsChange));
- CPPUNIT_ASSERT_EQUAL (last_add, _region[A]->last_layer_op (LayerOpAdd));
-
- _region[A]->trim_end (102);
- CPPUNIT_ASSERT_EQUAL (_playlist->layer_op_counter, _region[A]->last_layer_op (LayerOpBoundsChange));
- CPPUNIT_ASSERT_EQUAL (last_add, _region[A]->last_layer_op (LayerOpAdd));
-}
-
-void
-PlaylistLayeringTest::recursiveRelayerTest ()
-{
- _session->config.set_layer_model (AddOrBoundsChangeHigher);
- _session->config.set_relayer_on_all_edits (false);
-
- create_short_regions ();
+ create_three_short_regions ();
- _playlist->add_region (_region[A], 100);
- _playlist->add_region (_region[B], 125);
- _playlist->add_region (_region[C], 50);
- _playlist->add_region (_region[D], 250);
+ _playlist->add_region (_region[0], 0);
+ _playlist->add_region (_region[1], 10);
+ _playlist->add_region (_region[2], 20);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[C]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
+ CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[0]->layer ());
+ CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[1]->layer ());
+ CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[2]->layer ());
- _region[A]->set_position (200);
+ _region[0]->set_position (5);
- CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[D]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[A]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[B]->layer ());
- CPPUNIT_ASSERT_EQUAL (layer_t (3), _region[C]->layer ());
+ /* region move should have no effect */
+ CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[0]->layer ());
+ CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[1]->layer ());
+ CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[2]->layer ());
}