Re-integrate export-optimization branch.
[ardour.git] / libs / audiographer / tests / interleaver_deinterleaver_test.cc
1 #include "utils.h"
2 #include "audiographer/interleaver.h"
3 #include "audiographer/deinterleaver.h"
4
5 using namespace AudioGrapher;
6
7 class InterleaverDeInterleaverTest : public CppUnit::TestFixture
8 {
9   CPPUNIT_TEST_SUITE (InterleaverDeInterleaverTest);
10   CPPUNIT_TEST (testInterleavedInput);
11   CPPUNIT_TEST (testDeInterleavedInput);
12   CPPUNIT_TEST_SUITE_END ();
13
14   public:
15         void setUp()
16         {
17                 channels = 3;
18                 frames_per_channel = 128;
19                 total_frames = channels * frames_per_channel;
20                 
21                 random_data_a = TestUtils::init_random_data (total_frames, 1.0);
22                 random_data_b = TestUtils::init_random_data (frames_per_channel, 1.0);
23                 random_data_c = TestUtils::init_random_data (frames_per_channel, 1.0);
24
25                 deinterleaver.reset (new DeInterleaver<float>());
26                 interleaver.reset (new Interleaver<float>());
27                 
28                 sink_a.reset (new VectorSink<float>());
29                 sink_b.reset (new VectorSink<float>());
30                 sink_c.reset (new VectorSink<float>());
31         }
32
33         void tearDown()
34         {
35                 delete [] random_data_a;
36                 delete [] random_data_b;
37                 delete [] random_data_c;
38         }
39
40         void testInterleavedInput()
41         {
42                 deinterleaver->init (channels, frames_per_channel);
43                 interleaver->init (channels, frames_per_channel);
44                 
45                 deinterleaver->output (0)->add_output (interleaver->input (0));
46                 deinterleaver->output (1)->add_output (interleaver->input (1));
47                 deinterleaver->output (2)->add_output (interleaver->input (2));
48                 
49                 interleaver->add_output (sink_a);
50                 
51                 // Process and assert
52                 ProcessContext<float> c (random_data_a, total_frames, channels);
53                 deinterleaver->process (c);
54                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_a, sink_a->get_array(), total_frames));
55                 
56                 // And a second round...
57                 nframes_t less_frames = (frames_per_channel / 10) * channels;
58                 c.frames() = less_frames;
59                 deinterleaver->process (c);
60                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_a, sink_a->get_array(), less_frames));
61         }
62         
63         void testDeInterleavedInput()
64         {
65                 deinterleaver->init (channels, frames_per_channel);
66                 interleaver->init (channels, frames_per_channel);
67                 
68                 interleaver->add_output (deinterleaver);
69                 
70                 deinterleaver->output (0)->add_output (sink_a);
71                 deinterleaver->output (1)->add_output (sink_b);
72                 deinterleaver->output (2)->add_output (sink_c);
73                 
74                 ProcessContext<float> c_a (random_data_a, frames_per_channel, 1);
75                 ProcessContext<float> c_b (random_data_b, frames_per_channel, 1);
76                 ProcessContext<float> c_c (random_data_c, frames_per_channel, 1);
77                 
78                 // Process and assert
79                 interleaver->input (0)->process (c_a);
80                 interleaver->input (1)->process (c_b);
81                 interleaver->input (2)->process (c_c);
82                 
83                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_a, sink_a->get_array(), frames_per_channel));
84                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_b, sink_b->get_array(), frames_per_channel));
85                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_c, sink_c->get_array(), frames_per_channel));
86                 
87                 // And a second round...
88                 nframes_t less_frames = frames_per_channel / 5;
89                 c_a.frames() = less_frames;
90                 c_b.frames() = less_frames;
91                 c_c.frames() = less_frames;
92                 interleaver->input (0)->process (c_a);
93                 interleaver->input (1)->process (c_b);
94                 interleaver->input (2)->process (c_c);
95                 
96                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_a, sink_a->get_array(), less_frames));
97                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_b, sink_b->get_array(), less_frames));
98                 CPPUNIT_ASSERT (TestUtils::array_equals (random_data_c, sink_c->get_array(), less_frames));
99                 
100         }
101
102   private:
103         boost::shared_ptr<Interleaver<float> > interleaver;
104         boost::shared_ptr<DeInterleaver<float> > deinterleaver;
105         
106         boost::shared_ptr<VectorSink<float> > sink_a;
107         boost::shared_ptr<VectorSink<float> > sink_b;
108         boost::shared_ptr<VectorSink<float> > sink_c;
109
110         float * random_data_a;
111         float * random_data_b;
112         float * random_data_c;
113         
114         nframes_t frames_per_channel;
115         nframes_t total_frames;
116         unsigned int channels;
117 };
118
119 CPPUNIT_TEST_SUITE_REGISTRATION (InterleaverDeInterleaverTest);
120