diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-01-19 08:32:44 +0100 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2016-01-20 13:33:45 +0100 | 
| commit | 7788892bfb8aaceaa67fccad1ea4aff325a5ac32 (patch) | |
| tree | f86a2892629760037b1221cc1306ba6b703a2e70 /test | |
| parent | 189cce0e23dddaaaf4ab6e1cac387c9c954f22fa (diff) | |
Split CacheManager into several AudioCache classes and refactored the lot of them. Unit tests added.
Diffstat (limited to 'test')
| -rw-r--r-- | test/Makefile.am | 56 | ||||
| -rw-r--r-- | test/audiocacheeventhandlertest.cc | 58 | ||||
| -rw-r--r-- | test/audiocachefiletest.cc | 189 | ||||
| -rw-r--r-- | test/audiocacheidmanagertest.cc | 98 | ||||
| -rw-r--r-- | test/audiocachetest.cc | 177 | ||||
| -rw-r--r-- | test/cachemanagertest.cc | 149 | 
6 files changed, 572 insertions, 155 deletions
| diff --git a/test/Makefile.am b/test/Makefile.am index 7dcf0ce..6f3dae6 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,7 +1,8 @@  # Rules for the test code (use `make check` to execute)  include $(top_srcdir)/src/Makefile.am.drumgizmo -TESTS = resource engine gui resampler lv2 cachemanager configfile +TESTS = resource engine gui resampler lv2 configfile audiocache \ +	audiocachefile audiocacheidmanager audiocacheeventhandler  check_PROGRAMS = $(TESTS) @@ -15,19 +16,62 @@ resource_SOURCES = \  	test.cc \  	resource_test.cc -cachemanager_CXXFLAGS = -DOUTPUT=\"cachemanager\" $(CPPUNIT_CFLAGS) \ +audiocache_CXXFLAGS = -DOUTPUT=\"audiocache\" $(CPPUNIT_CFLAGS) \ +t of them. Unit tests added.  	-I$(top_srcdir)/src -I$(top_srcdir)/include \  	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(PTHREAD_CFLAGS) $(SNDFILE_CFLAGS) -cachemanager_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS) -cachemanager_SOURCES = \ -	$(top_srcdir)/src/cachemanager.cc \ +audiocache_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS) +audiocache_SOURCES = \ +	$(top_srcdir)/src/audiocache.cc \ +	$(top_srcdir)/src/audiocacheeventhandler.cc \ +	$(top_srcdir)/src/audiocachefile.cc \ +	$(top_srcdir)/src/audiocacheidmanager.cc \  	$(top_srcdir)/src/thread.cc \  	$(top_srcdir)/src/mutex.cc \  	$(top_srcdir)/src/semaphore.cc \  	$(top_srcdir)/src/configuration.cc \  	$(top_srcdir)/src/audiofile.cc \  	test.cc \ -	cachemanagertest.cc +	audiocachetest.cc + +audiocachefile_CXXFLAGS = -DOUTPUT=\"audiocachefile\" $(CPPUNIT_CFLAGS) \ +	-I$(top_srcdir)/src -I$(top_srcdir)/include \ +	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(PTHREAD_CFLAGS) $(SNDFILE_CFLAGS) +audiocachefile_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS) +audiocachefile_SOURCES = \ +	$(top_srcdir)/src/audiocachefile.cc \ +	$(top_srcdir)/src/thread.cc \ +	$(top_srcdir)/src/mutex.cc \ +	$(top_srcdir)/src/semaphore.cc \ +	$(top_srcdir)/src/configuration.cc \ +	$(top_srcdir)/src/audiofile.cc \ +	test.cc \ +	audiocachefiletest.cc + +audiocacheidmanager_CXXFLAGS = -DOUTPUT=\"audiocacheidmanager\" \ +	$(CPPUNIT_CFLAGS) \ +	-I$(top_srcdir)/src -I$(top_srcdir)/include \ +	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(SNDFILE_CFLAGS) +audiocacheidmanager_LDFLAGS = $(CPPUNIT_LIBS) $(SNDFILE_LIBS) +audiocacheidmanager_SOURCES = \ +	$(top_srcdir)/src/audiocacheidmanager.cc \ +	test.cc \ +	audiocacheidmanagertest.cc + +audiocacheeventhandler_CXXFLAGS = -DOUTPUT=\"audiocacheeventhandler\" \ +	$(CPPUNIT_CFLAGS) \ +	-I$(top_srcdir)/src -I$(top_srcdir)/include \ +	-I$(top_srcdir)/hugin -DDISABLE_HUGIN $(PTHREAD_CFLAGS) $(SNDFILE_CFLAGS) +audiocacheeventhandler_LDFLAGS = $(PTHREAD_LIBS) $(CPPUNIT_LIBS) $(SNDFILE_LIBS) +audiocacheeventhandler_SOURCES = \ +	$(top_srcdir)/src/audiocacheeventhandler.cc \ +	$(top_srcdir)/src/audiocacheidmanager.cc \ +	$(top_srcdir)/src/audiocachefile.cc \ +	$(top_srcdir)/src/mutex.cc \ +	$(top_srcdir)/src/thread.cc \ +	$(top_srcdir)/src/semaphore.cc \ +	test.cc \ +	audiocacheeventhandlertest.cc  engine_CXXFLAGS = -DOUTPUT=\"engine\" $(CPPUNIT_CFLAGS) \  	-I$(top_srcdir)/src -I$(top_srcdir)/include \ diff --git a/test/audiocacheeventhandlertest.cc b/test/audiocacheeventhandlertest.cc new file mode 100644 index 0000000..a8c3777 --- /dev/null +++ b/test/audiocacheeventhandlertest.cc @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            audiocacheeventhandlertest.cc + * + *  Thu Jan  7 15:44:14 CET 2016 + *  Copyright 2016 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 <audiocacheeventhandler.h> + +class TestableAudioCacheEventHandler +	: public AudioCacheEventHandler +{ +public: +	 +}; + +class AudioCacheEventHandlerTest : public CppUnit::TestFixture +{ +	CPPUNIT_TEST_SUITE(AudioCacheEventHandlerTest); +	CPPUNIT_TEST(threadedTest); +	CPPUNIT_TEST_SUITE_END(); + +public: +	void setUp() {} +	void tearDown() {} + +	void threadedTest() +	{ +		AudioCacheIDManager idManager; +		idManager.init(10); + +		AudioCacheEventHandler eventHandler(idManager); +	} +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheEventHandlerTest); diff --git a/test/audiocachefiletest.cc b/test/audiocachefiletest.cc new file mode 100644 index 0000000..a70091c --- /dev/null +++ b/test/audiocachefiletest.cc @@ -0,0 +1,189 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            audiocachefiletest.cc + * + *  Thu Jan  7 15:43:12 CET 2016 + *  Copyright 2016 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 <cstring> + +#include <audiocachefile.h> +#include <audiofile.h> + +class TestableAudioCacheFiles : public AudioCacheFiles +{ +public: +	//CacheAudioFile& getAudioFile(const std::string& filename); +	//void release(const std::string& filename); +	int getRef(const std::string& filename) +	{ +		if(audiofiles.find(filename) == audiofiles.end()) +		{ +			return -1; +		} + +		return audiofiles[filename]->ref; +	} +}; + +class AudioCacheFileTest : public CppUnit::TestFixture +{ +	CPPUNIT_TEST_SUITE(AudioCacheFileTest); +	CPPUNIT_TEST(refTest); +	CPPUNIT_TEST(readTest); +	CPPUNIT_TEST_SUITE_END(); + +public: +	void setUp() {} +	void tearDown() {} + +	void refTest() +	{ +		TestableAudioCacheFiles audiofiles; +		std::string filename = "kit/ride-single-channel.wav"; +		CPPUNIT_ASSERT_EQUAL(-1, audiofiles.getRef(filename)); + +		audiofiles.getFile(filename); +		CPPUNIT_ASSERT_EQUAL(1, audiofiles.getRef(filename)); + +		audiofiles.getFile(filename); +		CPPUNIT_ASSERT_EQUAL(2, audiofiles.getRef(filename)); + +		audiofiles.releaseFile(filename); +		CPPUNIT_ASSERT_EQUAL(1, audiofiles.getRef(filename)); + +		audiofiles.releaseFile(filename); +		CPPUNIT_ASSERT_EQUAL(-1, audiofiles.getRef(filename)); +	} + +	void readTestHelper(size_t bufferSize) +	{ +		printf("Test buffer size: %d samples\n", bufferSize); + +		std::string filename = "kit/ride-multi-channel.wav"; +		AudioFile* refFile[13]; +		for(size_t c = 0; c < 13; ++c) +		{ +			refFile[c] = new AudioFile(filename, c); +			refFile[c]->load(); +		} + +		AudioCacheFile file(filename); +		CPPUNIT_ASSERT_EQUAL(filename, file.getFilename()); +		CPPUNIT_ASSERT_EQUAL(13, (int)file.getChannelCount()); // Sanity check + +		CacheChannels channels; + +		sample_t samples[13][bufferSize]; +		volatile bool ready[13]; +		for(size_t c = 0; c < 13; ++c) +		{ +			for(int c = 0; c < 13; ++c) +			{ +				for(int i = 0; i < bufferSize; ++i) +				{ +					samples[c][i] = 42; +				} +			} + +			channels.push_back( +				{ +					c, // channel +					samples[c], // samples +					bufferSize, // max_num_samples +					&ready[c] // ready +				} +			); +		} + +		for(size_t offset = 0; offset < file.getSize(); offset += bufferSize) +		{ +			for(size_t c = 0; c < 13; ++c) +			{ +				ready[c] = false; +			} + +			size_t readSize = file.getSize() - offset; +			if(readSize > bufferSize) +			{ +				readSize = bufferSize; +			} +			else +			{ +				printf("Last read: %d samples\n", readSize); +			} + +			file.readChunk(channels, offset, readSize); + +			for(size_t c = 0; c < 13; ++c) +			{ +				CPPUNIT_ASSERT_EQUAL(true, ready[c]?true:false); +			} + +			sample_t diff[13] = {0.0}; +			for(int c = 0; c < 13; ++c) +			{ +				for(int i = 0; i < readSize; ++i) +				{ +					diff[c] += abs(refFile[c]->data[i + offset] - samples[c][i]); +				} +			} + +			for(int c = 0; c < 13; ++c) +			{ +				CPPUNIT_ASSERT_EQUAL((sample_t)0.0, diff[c]); +			} +		} + +		for(size_t c = 0; c < 13; ++c) +		{ +			delete refFile[c]; +		} +	} + +	void readTest() +	{ +		// Exhaustive test for 1...64 +		for(size_t bufferSize = 1; bufferSize < 64; ++bufferSize) +		{ +			readTestHelper(bufferSize); +		} + +		// Binary test for 64 .. 4096 +		for(size_t bufferSize = 64; bufferSize < 4096; bufferSize *= 2) +		{ +			readTestHelper(bufferSize); +		} + +		// And some sporadic tests for some "wierd" sizes. +		for(size_t bufferSize = 65; bufferSize < 4096; bufferSize *= 1.1) +		{ +			readTestHelper(bufferSize); +		} +	} + +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheFileTest); diff --git a/test/audiocacheidmanagertest.cc b/test/audiocacheidmanagertest.cc new file mode 100644 index 0000000..58bff4e --- /dev/null +++ b/test/audiocacheidmanagertest.cc @@ -0,0 +1,98 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            audiocacheidmanagertest.cc + * + *  Thu Jan  7 15:42:31 CET 2016 + *  Copyright 2016 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 <audiocacheidmanager.h> + +class TestableAudioCacheIDManager : public AudioCacheIDManager { +public: +	int getAvailableIds() +	{ +		return availableids.size(); +	} +}; + +class AudioCacheIDManagerTest : public CppUnit::TestFixture +{ +	CPPUNIT_TEST_SUITE(AudioCacheIDManagerTest); +	CPPUNIT_TEST(registerReleaseTest); +	CPPUNIT_TEST_SUITE_END(); + +public: +	void setUp() {} +	void tearDown() {} + +	void registerReleaseTest() +	{ +		TestableAudioCacheIDManager manager; +		manager.init(2); + +		cache_t c1; c1.afile = (AudioCacheFile*)1; +		auto id1 = manager.registerId(c1); +		CPPUNIT_ASSERT(id1 != CACHE_DUMMYID); +		CPPUNIT_ASSERT(id1 != CACHE_NOID); +		CPPUNIT_ASSERT_EQUAL(1, manager.getAvailableIds()); + +		cache_t c2; c2.afile = (AudioCacheFile*)2; +		auto id2 = manager.registerId(c2); +		CPPUNIT_ASSERT(id2 != CACHE_DUMMYID); +		CPPUNIT_ASSERT(id2 != CACHE_NOID); +		CPPUNIT_ASSERT_EQUAL(0, manager.getAvailableIds()); + +		cache_t c3; c3.afile = (AudioCacheFile*)3; +		auto id3 = manager.registerId(c3); +		CPPUNIT_ASSERT(id3 == CACHE_DUMMYID); +		CPPUNIT_ASSERT_EQUAL(0, manager.getAvailableIds()); + +		cache_t& tc1 = manager.getCache(id1); +		CPPUNIT_ASSERT_EQUAL(c1.afile, tc1.afile); + +		cache_t& tc2 = manager.getCache(id2); +		CPPUNIT_ASSERT_EQUAL(c2.afile, tc2.afile); + +		manager.releaseId(id1); +		CPPUNIT_ASSERT_EQUAL(1, manager.getAvailableIds()); + +		cache_t c4; c4.afile = (AudioCacheFile*)4; +		auto id4 = manager.registerId(c4); +		CPPUNIT_ASSERT(id4 != CACHE_DUMMYID); +		CPPUNIT_ASSERT(id4 != CACHE_NOID); +		CPPUNIT_ASSERT_EQUAL(0, manager.getAvailableIds()); + +		cache_t& tc4 = manager.getCache(id4); +		CPPUNIT_ASSERT_EQUAL(c4.afile, tc4.afile); + +		manager.releaseId(id2); +		CPPUNIT_ASSERT_EQUAL(1, manager.getAvailableIds()); + +		manager.releaseId(id4); +		CPPUNIT_ASSERT_EQUAL(2, manager.getAvailableIds()); +	} +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheIDManagerTest); diff --git a/test/audiocachetest.cc b/test/audiocachetest.cc new file mode 100644 index 0000000..0296490 --- /dev/null +++ b/test/audiocachetest.cc @@ -0,0 +1,177 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            cachemanagertest.cc + * + *  Sun Apr 19 10:15:59 CEST 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 <audiofile.h> +#include <audiocache.h> +#include <unistd.h> + +#define FRAMESIZE 64//1024 + +class AudioCacheTest : public CppUnit::TestFixture +{ +	CPPUNIT_TEST_SUITE(AudioCacheTest); +	CPPUNIT_TEST(singleChannelNonThreaded); +	CPPUNIT_TEST(singleChannelThreaded); +	CPPUNIT_TEST(multiChannelNonThreaded); +	CPPUNIT_TEST(multiChannelThreaded); +	CPPUNIT_TEST_SUITE_END(); + +public: +	void setUp() {} +	void tearDown() {} + +	//! Test runner. +	//! \param filename The name of the file to read. +	//! \param channel The channel number to do comparison on. +	//! \param thread Control if this test is running in threaded mode or not. +	//! \param framesize The initial framesize to use. +	void testHelper(const char* filename, int channel, bool threaded, +	                int framesize) +	{ +		// Reference file: +		AudioFile audioFileRef(filename, channel); +		printf("audioFileRef.load\n"); +		audioFileRef.load(ALL_SAMPLES); + +		// Input file: +		AudioFile audioFile(filename, channel); +		printf("audioFile.load\n"); +		audioFile.load(4096); + +		AudioCache audioCache; +		printf("audioCache.init\n"); +		audioCache.init(100); +		audioCache.setAsyncMode(threaded); + +		// Set initial (upper limit) framesize +		audioCache.setFrameSize(framesize); + +		cacheid_t id; + +		for(size_t initial_samples_needed = 0; +		    initial_samples_needed < (framesize - 1); ++initial_samples_needed) +		{ + +			printf("open: initial_samples_needed: %d\n", initial_samples_needed); +			sample_t *samples = +				audioCache.open(&audioFile, initial_samples_needed, channel, id); +			size_t size = initial_samples_needed; +			size_t offset = 0; + +			// Test pre cache: +			for(size_t i = 0; i < size; ++i) +			{ +				CPPUNIT_ASSERT_EQUAL(audioFileRef.data[offset], samples[i]); +				++offset; +			} + +			// Test the rest +			while(offset < audioFileRef.size) +			{ +				if(threaded) +				{ +					// Wait until we are finished reading +					int timeout = 1000; +					while(!audioCache.isReady(id)) +					{ +						usleep(1000); +						if(--timeout == 0) +						{ +							CPPUNIT_ASSERT(false); // timeout +						} +					} +				} + +				samples = audioCache.next(id, size); + +				CPPUNIT_ASSERT_EQUAL(0, (int)audioCache.getNumberOfUnderruns()); + +				for(size_t i = 0; (i < size) && (offset < audioFileRef.size); ++i) +				{ +					if(audioFileRef.data[offset] != samples[i]) +					{ +						printf("-----> offset: %d, size: %d, diff: %d," +						       " i: %d, size: %d, block-diff: %d\n", +						       offset, audioFileRef.size, audioFileRef.size - offset, +						       i, size, size - i); +					} +					CPPUNIT_ASSERT_EQUAL(audioFileRef.data[offset], samples[i]); +					++offset; +				} +			} + +			audioCache.close(id); +		} + +		printf("done\n"); +	} + +	void singleChannelNonThreaded() +	{ +		printf("\nsinglechannel_nonthreaded()\n"); +		const char filename[] = "kit/ride-single-channel.wav"; +		int channel = 0; +		bool threaded = false; +		testHelper(filename, channel, threaded, FRAMESIZE); +	} + +	void singleChannelThreaded() +	{ +		printf("\nsinglechannel_threaded()\n"); +		const char filename[] = "kit/ride-single-channel.wav"; +		int channel = 0; +		bool threaded = true; +		testHelper(filename, channel, threaded, FRAMESIZE); +	} + +	void multiChannelNonThreaded() +	{ +		printf("\nmultichannel_nonthreaded()\n"); +		const char filename[] = "kit/ride-multi-channel.wav"; +		int channel = 0; +		bool threaded = false; +		testHelper(filename, channel, threaded, FRAMESIZE); +		++channel; +		testHelper(filename, channel, threaded, FRAMESIZE); +	} + +	void multiChannelThreaded() +	{ +		printf("\nmultichannel_threaded()\n"); +		const char filename[] = "kit/ride-multi-channel.wav"; +		int channel = 0; +		bool threaded = true; +		testHelper(filename, channel, threaded, FRAMESIZE); +		++channel; +		testHelper(filename, channel, threaded, FRAMESIZE); +	} + +}; + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(AudioCacheTest); diff --git a/test/cachemanagertest.cc b/test/cachemanagertest.cc deleted file mode 100644 index d521f83..0000000 --- a/test/cachemanagertest.cc +++ /dev/null @@ -1,149 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - *            cachemanagertest.cc - * - *  Sun Apr 19 10:15:59 CEST 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 <cachemanager.h> -#include <unistd.h> - -#define FRAMESIZE 1024 - -class test_cachemanager : public CppUnit::TestFixture -{ -  CPPUNIT_TEST_SUITE(test_cachemanager); -  CPPUNIT_TEST(singlechannel_nonthreaded); -  CPPUNIT_TEST(singlechannel_threaded); -  CPPUNIT_TEST(multichannel_nonthreaded); -  CPPUNIT_TEST(multichannel_threaded); -	CPPUNIT_TEST_SUITE_END(); - -public: -	void setUp() {} -	void tearDown() {} - -  void testit(const char *filename, int channel, bool threaded) -  { - -    // Reference file: -    AudioFile afref(filename, channel); -    printf("afref.load\n"); -    afref.load(ALL_SAMPLES); - -    // Input file: -    AudioFile af(filename, channel); -    printf("af.load\n"); -    //af.load(ALL_SAMPLES); -    af.load(4096); - -    CacheManager cm; -    printf("cm.init\n"); -    cm.init(100, threaded); - -    cm.setFrameSize(FRAMESIZE); - -    cacheid_t id; -    // TODO: test 0 ... FRAMESIZE - 1 -    size_t initial_samples_needed = (FRAMESIZE - 1) / 2; - -    printf("open: initial_samples_needed: %d\n", initial_samples_needed); -    sample_t *s = cm.open(&af, initial_samples_needed, channel, id); -    size_t size = initial_samples_needed; -    size_t offset = 0; - -    // Test pre cache: -    for(size_t i = 0; i < size; i++) { -      CPPUNIT_ASSERT_EQUAL(afref.data[offset], s[i]); -      offset++; -    } - -    // Test the rest -    while(offset < afref.size) { - -      if(threaded) { -        usleep(1000000.0 / 44100.0 * FRAMESIZE); -        //sleep(1); // sleep 1 second -      } - -      //printf("offset: %d\t", offset); -      s = cm.next(id, size); -      //printf("next -> size: %d\n", size); -      for(size_t i = 0; (i < size) && (offset < afref.size); i++) { -        /* -        if(afref.data[offset] != s[i]) { -          printf("offset: %d, size: %d, diff: %d\n", offset, afref.size, afref.size - offset); -        } -        */ -        CPPUNIT_ASSERT_EQUAL(afref.data[offset], s[i]); -        offset++; -      } -    } - -    printf("done\n"); -	} - -  void singlechannel_nonthreaded() -  { -    printf("\nsinglechannel_nonthreaded()\n"); -    const char filename[] = "kit/ride-single-channel.wav"; -    int channel = 0; -    bool threaded = false; -    testit(filename, channel, threaded); -  } - -  void singlechannel_threaded() -  { -    printf("\nsinglechannel_threaded()\n"); -    const char filename[] = "kit/ride-single-channel.wav"; -    int channel = 0; -    bool threaded = true; -    testit(filename, channel, threaded); -  } - -  void multichannel_nonthreaded() -  { -    printf("\nmultichannel_nonthreaded()\n"); -    const char filename[] = "kit/ride-multi-channel.wav"; -    int channel = 0; -    bool threaded = false; -    testit(filename, channel, threaded); -  } - -  void multichannel_threaded() -  { -    printf("\nmultichannel_threaded()\n"); -    const char filename[] = "kit/ride-multi-channel.wav"; -    int channel = 0; -    bool threaded = true; -    testit(filename, channel, threaded); -  } - -}; - -// Registers the fixture into the 'registry' -CPPUNIT_TEST_SUITE_REGISTRATION(test_cachemanager); - - - | 
