diff options
Diffstat (limited to 'libs/canvas/test/wave_view.cc')
-rw-r--r-- | libs/canvas/test/wave_view.cc | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/libs/canvas/test/wave_view.cc b/libs/canvas/test/wave_view.cc new file mode 100644 index 0000000000..9b95930cf1 --- /dev/null +++ b/libs/canvas/test/wave_view.cc @@ -0,0 +1,164 @@ +#include <gtkmm/main.h> +#include "pbd/textreceiver.h" +#include "gtkmm2ext/utils.h" +#include "midi++/manager.h" +#include "ardour/session.h" +#include "ardour/audioengine.h" +#include "ardour/source_factory.h" +#include "ardour/audiosource.h" +#include "ardour/audiofilesource.h" +#include "ardour/region_factory.h" +#include "ardour/audioregion.h" +#include "canvas/wave_view.h" +#include "canvas/canvas.h" +#include "wave_view.h" + +using namespace std; +using namespace PBD; +using namespace ARDOUR; +using namespace ArdourCanvas; + +CPPUNIT_TEST_SUITE_REGISTRATION (WaveViewTest); + +TextReceiver text_receiver ("test"); + +void +WaveViewTest::setUp () +{ + init (false, true); + Gtkmm2ext::init (); + SessionEvent::create_per_thread_pool ("test", 512); + + Gtk::Main kit (); + Gtk::Main::init_gtkmm_internals (); + + text_receiver.listen_to (error); + text_receiver.listen_to (info); + text_receiver.listen_to (fatal); + text_receiver.listen_to (warning); + + AudioFileSource::set_build_peakfiles (true); + AudioFileSource::set_build_missing_peakfiles (true); + + AudioEngine engine ("test", ""); + MIDI::Manager::create (engine.jack ()); + CPPUNIT_ASSERT (engine.start () == 0); + + Session session (engine, "tmp_session", "tmp_session"); + engine.set_session (&session); + + char buf[256]; + getcwd (buf, sizeof (buf)); + string const path = string_compose ("%1/../../libs/canvas/test/sine.wav", buf); + + boost::shared_ptr<Source> source = SourceFactory::createReadable ( + DataType::AUDIO, session, path, 0, (Source::Flag) 0, false, true + ); + + boost::shared_ptr<AudioFileSource> audio_file_source = boost::dynamic_pointer_cast<AudioFileSource> (source); + + audio_file_source->setup_peakfile (); + + PBD::PropertyList properties; + properties.add (Properties::position, 128); + properties.add (Properties::length, audio_file_source->readable_length ()); + _region = RegionFactory::create (source, properties, false); + _audio_region = boost::dynamic_pointer_cast<AudioRegion> (_region); +} + +void +WaveViewTest::make_canvas () +{ + /* this leaks various things, but hey ho */ + + _canvas = new ImageCanvas (Duple (256, 256)); + _wave_view = new WaveView (_canvas->root(), _audio_region); + _wave_view->set_frames_per_pixel ((double) (44100 / 1000) / 64); + _wave_view->set_height (64); +} + +void +WaveViewTest::all () +{ + /* XXX: we run these all from the same method so that the setUp code only + gets called once; there are various singletons etc. in Ardour which don't + like being recreated. + */ + + render_all_at_once (); + render_in_pieces (); + cache (); +} + +void +WaveViewTest::render_all_at_once () +{ + make_canvas (); + + _canvas->render_to_image (Rect (0, 0, 256, 256)); + _canvas->write_to_png ("waveview_1.png"); + + /* XXX: doesn't check the result! */ +} + +void +WaveViewTest::render_in_pieces () +{ + make_canvas (); + + cout << "\n\n--------------> PIECES\n"; + _canvas->render_to_image (Rect (0, 0, 128, 256)); + _canvas->render_to_image (Rect (128, 0, 256, 256)); + _canvas->write_to_png ("waveview_2.png"); + cout << "\n\n<-------------- PIECES\n"; + + /* XXX: doesn't check the result! */ +} + +void +WaveViewTest::cache () +{ + make_canvas (); + + /* Whole of the render area needs caching from scratch */ + + _wave_view->invalidate_whole_cache (); + + Rect whole (0, 0, 256, 256); + _canvas->render_to_image (whole); + + CPPUNIT_ASSERT (_wave_view->_cache.size() == 1); + CPPUNIT_ASSERT (_wave_view->_cache.front()->start() == 0); + CPPUNIT_ASSERT (_wave_view->_cache.front()->end() == 256); + + _wave_view->invalidate_whole_cache (); + + /* Render a bit in the middle */ + + Rect part1 (128, 0, 196, 256); + _canvas->render_to_image (part1); + + CPPUNIT_ASSERT (_wave_view->_cache.size() == 1); + CPPUNIT_ASSERT (_wave_view->_cache.front()->start() == 128); + CPPUNIT_ASSERT (_wave_view->_cache.front()->end() == 196); + + /* Now render the whole thing and check that the cache sorts itself out */ + + _canvas->render_to_image (whole); + + CPPUNIT_ASSERT (_wave_view->_cache.size() == 3); + + list<WaveView::CacheEntry*>::iterator i = _wave_view->_cache.begin (); + + CPPUNIT_ASSERT ((*i)->start() == 0); + CPPUNIT_ASSERT ((*i)->end() == 128); + ++i; + + CPPUNIT_ASSERT ((*i)->start() == 128); + CPPUNIT_ASSERT ((*i)->end() == 196); + ++i; + + CPPUNIT_ASSERT ((*i)->start() == 196); + CPPUNIT_ASSERT ((*i)->end() == 256); + ++i; +} |