#ifndef AUDIOGRAPHER_TESTS_UTILS_H #define AUDIOGRAPHER_TESTS_UTILS_H // Includes we want almost always #include #include // includes used in this file #include "audiographer/sink.h" #include "audiographer/exception.h" #include #include #include #include #include using AudioGrapher::samplecnt_t; struct TestUtils { template static bool array_equals (T const * a, T const * b, samplecnt_t samples) { for (samplecnt_t i = 0; i < samples; ++i) { if (a[i] != b[i]) { return false; } } return true; } template static bool array_filled (T const * array, samplecnt_t samples) { for (samplecnt_t i = 0; i < samples; ++i) { if (array[i] == static_cast (0.0)) { return false; } } return true; } /// Generate random data, all samples guaranteed not to be 0.0, 1.0 or -1.0 static float * init_random_data (samplecnt_t samples, float range = 1.0) { unsigned int const granularity = 4096; float * data = new float[samples]; srand (std::time (NULL)); for (samplecnt_t i = 0; i < samples; ++i) { do { int biased_int = (rand() % granularity) - (granularity / 2); data[i] = (range * biased_int) / granularity; } while (data[i] == 0.0 || data[i] == 1.0 || data[i] == -1.0); } return data; } }; template class VectorSink : public AudioGrapher::Sink { public: virtual void process (AudioGrapher::ProcessContext const & c) { data.resize (c.samples()); memcpy (&data[0], c.data(), c.samples() * sizeof(T)); } void process (AudioGrapher::ProcessContext & c) { AudioGrapher::Sink::process (c); } using AudioGrapher::Sink::process; std::vector const & get_data() const { return data; } T const * get_array() const { return &data[0]; } void reset() { data.clear(); } protected: std::vector data; }; template class AppendingVectorSink : public VectorSink { public: AppendingVectorSink() { reset (); } void process (AudioGrapher::ProcessContext const & c) { std::vector & data (VectorSink::data); data.resize (total_samples + c.samples()); memcpy (&data[total_samples], c.data(), c.samples() * sizeof(T)); total_samples += c.samples(); } using AudioGrapher::Sink::process; void reset () { total_samples = 0; VectorSink::reset(); } private: samplecnt_t total_samples; }; template class ThrowingSink : public AudioGrapher::Sink { public: void process (AudioGrapher::ProcessContext const &) { throw AudioGrapher::Exception(*this, "ThrowingSink threw!"); } using AudioGrapher::Sink::process; }; template class ProcessContextGrabber : public AudioGrapher::Sink { public: void process (AudioGrapher::ProcessContext const & c) { contexts.push_back (c); } using AudioGrapher::Sink::process; typedef std::list > ContextList; ContextList contexts; }; #endif // AUDIOGRAPHER_TESTS_UTILS_H