mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 23:35:03 +01:00
Add basic test of playlist layering.
git-svn-id: svn://localhost/ardour2/branches/3.0@11011 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
c3d1a8dda5
commit
084cd5ffda
10 changed files with 202 additions and 2 deletions
|
|
@ -254,6 +254,7 @@ _ the regular process() call to session->process() is not made.
|
||||||
bool port_is_mine (const std::string&) const;
|
bool port_is_mine (const std::string&) const;
|
||||||
|
|
||||||
static AudioEngine* instance() { return _instance; }
|
static AudioEngine* instance() { return _instance; }
|
||||||
|
static void destroy();
|
||||||
void died ();
|
void died ();
|
||||||
|
|
||||||
int create_process_thread (boost::function<void()>, pthread_t*, size_t stacksize);
|
int create_process_thread (boost::function<void()>, pthread_t*, size_t stacksize);
|
||||||
|
|
|
||||||
|
|
@ -1513,3 +1513,10 @@ AudioEngine::update_latencies ()
|
||||||
jack_recompute_total_latencies (_priv_jack);
|
jack_recompute_total_latencies (_priv_jack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
AudioEngine::destroy ()
|
||||||
|
{
|
||||||
|
delete _instance;
|
||||||
|
_instance = 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
144
libs/ardour/test/playlist_layering_test.cc
Normal file
144
libs/ardour/test/playlist_layering_test.cc
Normal file
|
|
@ -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 ());
|
||||||
|
}
|
||||||
31
libs/ardour/test/playlist_layering_test.h
Normal file
31
libs/ardour/test/playlist_layering_test.h
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include <cppunit/TestFixture.h>
|
||||||
|
#include <cppunit/extensions/HelperMacros.h>
|
||||||
|
|
||||||
|
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<ARDOUR::Playlist> _playlist;
|
||||||
|
boost::shared_ptr<ARDOUR::Source> _source;
|
||||||
|
boost::shared_ptr<ARDOUR::Region> _region[16];
|
||||||
|
};
|
||||||
|
|
@ -430,6 +430,7 @@ def build(bld):
|
||||||
test/framewalk_to_beats_test.cc
|
test/framewalk_to_beats_test.cc
|
||||||
test/framepos_plus_beats_test.cc
|
test/framepos_plus_beats_test.cc
|
||||||
test/framepos_minus_beats_test.cc
|
test/framepos_minus_beats_test.cc
|
||||||
|
test/playlist_layering_test.cc
|
||||||
test/testrunner.cc
|
test/testrunner.cc
|
||||||
'''.split()
|
'''.split()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -167,3 +167,10 @@ Manager::set_port_states (list<XMLNode*> s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Manager::destroy ()
|
||||||
|
{
|
||||||
|
delete theManager;
|
||||||
|
theManager = 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,7 @@ class Manager {
|
||||||
static Manager *instance () {
|
static Manager *instance () {
|
||||||
return theManager;
|
return theManager;
|
||||||
}
|
}
|
||||||
|
static void destroy ();
|
||||||
|
|
||||||
void reestablish (jack_client_t *);
|
void reestablish (jack_client_t *);
|
||||||
void reconnect ();
|
void reconnect ();
|
||||||
|
|
|
||||||
|
|
@ -113,12 +113,12 @@ Port::~Port ()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_jack_port) {
|
if (_jack_port) {
|
||||||
if (_jack_client && _jack_port) {
|
if (_jack_client) {
|
||||||
jack_port_unregister (_jack_client, _jack_port);
|
jack_port_unregister (_jack_client, _jack_port);
|
||||||
}
|
|
||||||
_jack_port = 0;
|
_jack_port = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Port::parse (framecnt_t timestamp)
|
Port::parse (framecnt_t timestamp)
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,13 @@ EnumWriter::instance()
|
||||||
return *_instance;
|
return *_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
EnumWriter::destroy ()
|
||||||
|
{
|
||||||
|
delete _instance;
|
||||||
|
_instance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
EnumWriter::EnumWriter ()
|
EnumWriter::EnumWriter ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ class unknown_enumeration : public std::exception {
|
||||||
class EnumWriter {
|
class EnumWriter {
|
||||||
public:
|
public:
|
||||||
static EnumWriter& instance();
|
static EnumWriter& instance();
|
||||||
|
static void destroy();
|
||||||
|
|
||||||
void register_distinct (std::string type, std::vector<int>, std::vector<std::string>);
|
void register_distinct (std::string type, std::vector<int>, std::vector<std::string>);
|
||||||
void register_bits (std::string type, std::vector<int>, std::vector<std::string>);
|
void register_bits (std::string type, std::vector<int>, std::vector<std::string>);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue