From 084cd5ffdac48377839dcc4e1435974d57b5ad59 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 15 Dec 2011 14:33:20 +0000 Subject: [PATCH] Add basic test of playlist layering. git-svn-id: svn://localhost/ardour2/branches/3.0@11011 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/audioengine.h | 1 + libs/ardour/audioengine.cc | 7 + libs/ardour/test/playlist_layering_test.cc | 144 +++++++++++++++++++++ libs/ardour/test/playlist_layering_test.h | 31 +++++ libs/ardour/wscript | 1 + libs/midi++2/manager.cc | 7 + libs/midi++2/midi++/manager.h | 1 + libs/midi++2/port.cc | 4 +- libs/pbd/enumwriter.cc | 7 + libs/pbd/pbd/enumwriter.h | 1 + 10 files changed, 202 insertions(+), 2 deletions(-) create mode 100644 libs/ardour/test/playlist_layering_test.cc create mode 100644 libs/ardour/test/playlist_layering_test.h diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index 7d9cb3f28a..ca580419b6 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -254,6 +254,7 @@ _ the regular process() call to session->process() is not made. bool port_is_mine (const std::string&) const; static AudioEngine* instance() { return _instance; } + static void destroy(); void died (); int create_process_thread (boost::function, pthread_t*, size_t stacksize); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 74936fbc34..c6cb20bc4d 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -1513,3 +1513,10 @@ AudioEngine::update_latencies () jack_recompute_total_latencies (_priv_jack); } } + +void +AudioEngine::destroy () +{ + delete _instance; + _instance = 0; +} diff --git a/libs/ardour/test/playlist_layering_test.cc b/libs/ardour/test/playlist_layering_test.cc new file mode 100644 index 0000000000..278fb0ab78 --- /dev/null +++ b/libs/ardour/test/playlist_layering_test.cc @@ -0,0 +1,144 @@ +#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 "playlist_layering_test.h" + +CPPUNIT_TEST_SUITE_REGISTRATION (PlaylistLayeringTest); + +using namespace std; +using namespace ARDOUR; +using namespace PBD; + +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 () +{ + 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()); + + init (false, true); + SessionEvent::create_per_thread_pool ("test", 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); + + _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 +PlaylistLayeringTest::tearDown () +{ + AudioEngine::instance()->remove_session (); + EnumWriter::destroy (); + MIDI::Manager::destroy (); + AudioEngine::destroy (); +} + +void +PlaylistLayeringTest::create_three_short_regions () +{ + PropertyList plist; + plist.add (Properties::start, 0); + plist.add (Properties::length, 100); + for (int i = 0; i < 3; ++i) { + _region[i] = RegionFactory::create (_source, plist); + } +} + +void +PlaylistLayeringTest::addHigherTest () +{ + _session->config.set_layer_model (AddHigher); + create_three_short_regions (); + + _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[0]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[1]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[2]->layer ()); + + _region[0]->set_position (5); + + /* 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 ()); +} + +void +PlaylistLayeringTest::moveAddHigherTest () +{ + _session->config.set_layer_model (MoveAddHigher); + create_three_short_regions (); + + _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[0]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[1]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[2]->layer ()); + + _region[0]->set_position (5); + + /* region move should have put 0 on top */ + CPPUNIT_ASSERT_EQUAL (layer_t (2), _region[0]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (0), _region[1]->layer ()); + CPPUNIT_ASSERT_EQUAL (layer_t (1), _region[2]->layer ()); +} diff --git a/libs/ardour/test/playlist_layering_test.h b/libs/ardour/test/playlist_layering_test.h new file mode 100644 index 0000000000..7757e017c4 --- /dev/null +++ b/libs/ardour/test/playlist_layering_test.h @@ -0,0 +1,31 @@ +#include +#include + +namespace ARDOUR { + class Session; + class Playlist; + class Source; +} + +class PlaylistLayeringTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE (PlaylistLayeringTest); + CPPUNIT_TEST (addHigherTest); + CPPUNIT_TEST (moveAddHigherTest); + CPPUNIT_TEST_SUITE_END (); + +public: + void setUp (); + void tearDown (); + + void addHigherTest (); + void moveAddHigherTest (); + +private: + void create_three_short_regions (); + + ARDOUR::Session* _session; + boost::shared_ptr _playlist; + boost::shared_ptr _source; + boost::shared_ptr _region[16]; +}; diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 1c26a16fd0..42c72784f9 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -430,6 +430,7 @@ def build(bld): test/framewalk_to_beats_test.cc test/framepos_plus_beats_test.cc test/framepos_minus_beats_test.cc + test/playlist_layering_test.cc test/testrunner.cc '''.split() diff --git a/libs/midi++2/manager.cc b/libs/midi++2/manager.cc index 03e418e4b2..61d4c4c363 100644 --- a/libs/midi++2/manager.cc +++ b/libs/midi++2/manager.cc @@ -167,3 +167,10 @@ Manager::set_port_states (list s) } } } + +void +Manager::destroy () +{ + delete theManager; + theManager = 0; +} diff --git a/libs/midi++2/midi++/manager.h b/libs/midi++2/midi++/manager.h index ecfd7a0111..bab4a18dd2 100644 --- a/libs/midi++2/midi++/manager.h +++ b/libs/midi++2/midi++/manager.h @@ -74,6 +74,7 @@ class Manager { static Manager *instance () { return theManager; } + static void destroy (); void reestablish (jack_client_t *); void reconnect (); diff --git a/libs/midi++2/port.cc b/libs/midi++2/port.cc index 59f76041d6..213f55aa19 100644 --- a/libs/midi++2/port.cc +++ b/libs/midi++2/port.cc @@ -113,10 +113,10 @@ Port::~Port () } if (_jack_port) { - if (_jack_client && _jack_port) { + if (_jack_client) { jack_port_unregister (_jack_client, _jack_port); + _jack_port = 0; } - _jack_port = 0; } } diff --git a/libs/pbd/enumwriter.cc b/libs/pbd/enumwriter.cc index 5263a886fb..3ce296c664 100644 --- a/libs/pbd/enumwriter.cc +++ b/libs/pbd/enumwriter.cc @@ -73,6 +73,13 @@ EnumWriter::instance() return *_instance; } +void +EnumWriter::destroy () +{ + delete _instance; + _instance = 0; +} + EnumWriter::EnumWriter () { } diff --git a/libs/pbd/pbd/enumwriter.h b/libs/pbd/pbd/enumwriter.h index a253719c85..600f59bf29 100644 --- a/libs/pbd/pbd/enumwriter.h +++ b/libs/pbd/pbd/enumwriter.h @@ -37,6 +37,7 @@ class unknown_enumeration : public std::exception { class EnumWriter { public: static EnumWriter& instance(); + static void destroy(); void register_distinct (std::string type, std::vector, std::vector); void register_bits (std::string type, std::vector, std::vector); -- 2.30.2