diff options
Diffstat (limited to 'test/lv2.cc')
-rw-r--r-- | test/lv2.cc | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/test/lv2.cc b/test/lv2.cc new file mode 100644 index 0000000..bfd2ce5 --- /dev/null +++ b/test/lv2.cc @@ -0,0 +1,332 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * lv2.cc + * + * Thu Feb 12 14:55:41 CET 2015 + * Copyright 2015 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * DrumGizmo is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include <cppunit/extensions/HelperMacros.h> + +#include <unistd.h> +#include <memory.h> +#include <stdio.h> +#include <arpa/inet.h> + +#include "lv2_test_host.h" + +#define DG_URI "http://drumgizmo.org/lv2" + +/** + * Tests that should be performed: + * ------------------------------- + * - Run without port connects (shouldn't crash) + * - Run without output ports connects (shouldn't crash) + * - Run with buffer size 0 + * - Run with VERY LARGE buffer size (>1MB?) + * - Run with buffer size a prime number (and thereby not power of 2) + * - Run with HUGE number of midi events in one buffer (10000) + */ +class test_lv2 : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE(test_lv2); + CPPUNIT_TEST(open_and_verify); + CPPUNIT_TEST(run_no_ports_connected); + CPPUNIT_TEST(run_no_output_ports_connected); + CPPUNIT_TEST(test1); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp() {} + void tearDown() {} + + void open_and_verify() + { + int res; + + LV2TestHost h(LV2_PATH); + + res = h.open(DG_URI); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.verify(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.close(); + CPPUNIT_ASSERT_EQUAL(0, res); + } + + void run_no_ports_connected() + { + int res; + + LV2TestHost h(LV2_PATH); + + res = h.open(DG_URI); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.verify(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.createInstance(); + CPPUNIT_ASSERT_EQUAL(0, res); + + const char config_fmt[] = + "<config>\n" + " <value name=\"drumkitfile\">%s</value>\n" + " <value name=\"midimapfile\">%s</value>\n" + " <value name=\"enable_velocity_modifier\">%s</value>\n" + " <value name=\"velocity_modifier_falloff\">%f</value>\n" + " <value name=\"velocity_modifier_weight\">%f</value>\n" + " <value name=\"enable_velocity_randomiser\">%s</value>\n" + " <value name=\"velocity_randomiser_weight\">%f</value>\n" + " <value name=\"enable_resampling\">%s</value>\n" + "</config>"; + + const char drumkitfile[] = "kit/kit1.xml"; + const char midimapfile[] = "kit/midimap.xml"; + bool enable_velocity_modifier = true; + float velocity_modifier_falloff = 0.5; + float velocity_modifier_weight = 0.25; + bool enable_velocity_randomiser = false; + float velocity_randomiser_weight = 0.1; + bool enable_resampling = false; + + char config[sizeof(config_fmt) * 2]; + sprintf(config, config_fmt, + drumkitfile, + midimapfile, + enable_velocity_modifier?"true":"false", + velocity_modifier_falloff, + velocity_modifier_weight, + enable_velocity_randomiser?"true":"false", + velocity_randomiser_weight, + enable_resampling?"true":"false" + ); + + res = h.loadConfig(config, strlen(config)); + CPPUNIT_ASSERT_EQUAL(0, res); + + // run for 1 samples to trigger kit loading + res = h.run(1); + CPPUNIT_ASSERT_EQUAL(0, res); + sleep(1); // wait for kit to get loaded (async), + + res = h.run(100); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.destroyInstance(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.close(); + CPPUNIT_ASSERT_EQUAL(0, res); + } + + void run_no_output_ports_connected() + { + int res; + + LV2TestHost h(LV2_PATH); + + res = h.open(DG_URI); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.verify(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.createInstance(); + CPPUNIT_ASSERT_EQUAL(0, res); + + const char config_fmt[] = + "<config>\n" + " <value name=\"drumkitfile\">%s</value>\n" + " <value name=\"midimapfile\">%s</value>\n" + " <value name=\"enable_velocity_modifier\">%s</value>\n" + " <value name=\"velocity_modifier_falloff\">%f</value>\n" + " <value name=\"velocity_modifier_weight\">%f</value>\n" + " <value name=\"enable_velocity_randomiser\">%s</value>\n" + " <value name=\"velocity_randomiser_weight\">%f</value>\n" + " <value name=\"enable_resampling\">%s</value>\n" + "</config>"; + + const char drumkitfile[] = "kit/kit1.xml"; + const char midimapfile[] = "kit/midimap.xml"; + bool enable_velocity_modifier = true; + float velocity_modifier_falloff = 0.5; + float velocity_modifier_weight = 0.25; + bool enable_velocity_randomiser = false; + float velocity_randomiser_weight = 0.1; + bool enable_resampling = false; + + char config[sizeof(config_fmt) * 2]; + sprintf(config, config_fmt, + drumkitfile, + midimapfile, + enable_velocity_modifier?"true":"false", + velocity_modifier_falloff, + velocity_modifier_weight, + enable_velocity_randomiser?"true":"false", + velocity_randomiser_weight, + enable_resampling?"true":"false" + ); + + res = h.loadConfig(config, strlen(config)); + CPPUNIT_ASSERT_EQUAL(0, res); + + // Port buffers: + char sequence_buffer[4096]; + + LV2TestHost::Sequence seq(sequence_buffer, sizeof(sequence_buffer)); + res = h.connectPort(0, seq.data()); + CPPUNIT_ASSERT_EQUAL(0, res); + + // run for 1 samples to trigger kit loading + res = h.run(1); + CPPUNIT_ASSERT_EQUAL(0, res); + sleep(1); // wait for kit to get loaded (async), + + seq.addMidiNote(5, 1, 127); + res = h.run(100); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.destroyInstance(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.close(); + CPPUNIT_ASSERT_EQUAL(0, res); + } + + void test1() + { + int res; + + LV2TestHost h(LV2_PATH); + + res = h.open(DG_URI); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.verify(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.createInstance(); + CPPUNIT_ASSERT_EQUAL(0, res); + + const char config_fmt[] = + "<config>\n" + " <value name=\"drumkitfile\">%s</value>\n" + " <value name=\"midimapfile\">%s</value>\n" + " <value name=\"enable_velocity_modifier\">%s</value>\n" + " <value name=\"velocity_modifier_falloff\">%f</value>\n" + " <value name=\"velocity_modifier_weight\">%f</value>\n" + " <value name=\"enable_velocity_randomiser\">%s</value>\n" + " <value name=\"velocity_randomiser_weight\">%f</value>\n" + " <value name=\"enable_resampling\">%s</value>\n" + "</config>"; + + const char drumkitfile[] = "kit/kit1.xml"; + const char midimapfile[] = "kit/midimap.xml"; + bool enable_velocity_modifier = true; + float velocity_modifier_falloff = 0.5; + float velocity_modifier_weight = 0.25; + bool enable_velocity_randomiser = false; + float velocity_randomiser_weight = 0.1; + bool enable_resampling = false; + + char config[sizeof(config_fmt) * 2]; + sprintf(config, config_fmt, + drumkitfile, + midimapfile, + enable_velocity_modifier?"true":"false", + velocity_modifier_falloff, + velocity_modifier_weight, + enable_velocity_randomiser?"true":"false", + velocity_randomiser_weight, + enable_resampling?"true":"false" + ); + + res = h.loadConfig(config, strlen(config)); + CPPUNIT_ASSERT_EQUAL(0, res); + + // Port buffers: + char sequence_buffer[4096]; + float pcm_buffer[16][10]; + + LV2TestHost::Sequence seq(sequence_buffer, sizeof(sequence_buffer)); + res = h.connectPort(0, seq.data()); + CPPUNIT_ASSERT_EQUAL(0, res); + + for(int i = 1; i <= 16; i++) { + memset(pcm_buffer, 1, sizeof(pcm_buffer)); + res += h.connectPort(i, pcm_buffer[i-1]); + } + CPPUNIT_ASSERT_EQUAL(0, res); + + // run for 1 samples to trigger kit loading + res = h.run(1); + CPPUNIT_ASSERT_EQUAL(0, res); + sleep(1); // wait for kit to get loaded (async), + + /* + seq.addMidiNote(5, 1, 127); + for(int i = 0; i < 10; i++) { + res = h.run(10); + CPPUNIT_ASSERT_EQUAL(0, res); + + printf("Iteration:\n"); + for(int k = 0; k < 4; k++) { + printf("#%d ", k); + for(int j = 0; j < 10; j++) printf("[%f]", pcm_buffer[k][j]); + printf("\n"); + } + printf("\n"); + + seq.clear(); + } + */ + + seq.addMidiNote(5, 1, 127); + res = h.run(10); + CPPUNIT_ASSERT_EQUAL(0, res); + + union { + float f; + unsigned int u; + } comp_val; + + comp_val.u = 1040744448; + + for(int k = 0; k < 4; k++) { + for(int j = 0; j < 10; j++) { + CPPUNIT_ASSERT(pcm_buffer[k][j] == ((j==4)?comp_val.f:0)); + } + } + seq.clear(); + + res = h.destroyInstance(); + CPPUNIT_ASSERT_EQUAL(0, res); + + res = h.close(); + CPPUNIT_ASSERT_EQUAL(0, res); + } +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(test_lv2); |