Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/test/sampleutiltest.cpp

Go to the documentation of this file.
00001 #include <gtest/gtest.h>
00002 #include <QtDebug>
00003 #include <QList>
00004 #include <QPair>
00005 
00006 #include "sampleutil.h"
00007 
00008 namespace {
00009 
00010 class SampleUtilTest : public testing::Test {
00011   protected:
00012     virtual void SetUp() {
00013         SampleUtil::setOptimizations(false);
00014 #ifdef __SSE__
00015         sseAvailable = 1;
00016 #else
00017         sseAvailable = 0;
00018 #endif
00019         sizes.append(1024);
00020         sizes.append(1025);
00021         sizes.append(1026);
00022         sizes.append(1027);
00023         sizes.append(1028);
00024 
00025         for (int i = 0; i < sizes.size(); ++i) {
00026             int size = sizes[i];
00027             CSAMPLE* buffer = new CSAMPLE[size];
00028             ClearBuffer(buffer, size);
00029             buffers.append(buffer);
00030             if (size % 2 == 0)
00031                 evenBuffers.append(i);
00032         }
00033     }
00034     virtual void TearDown() {
00035         for (int i = 0; i < buffers.size(); ++i) {
00036             delete buffers[i];
00037         }
00038         buffers.clear();
00039         evenBuffers.clear();
00040         sizes.clear();
00041     }
00042 
00043     void ClearBuffer(CSAMPLE* pBuffer, int length) {
00044         memset(pBuffer, 0, sizeof(pBuffer[0])*length);
00045     }
00046 
00047     void FillBuffer(CSAMPLE* pBuffer, CSAMPLE value, int length) {
00048         for (int i = 0; i < length; ++i) {
00049             pBuffer[i] = value;
00050         }
00051     }
00052 
00053     void AssertWholeBufferEquals(CSAMPLE* pBuffer, CSAMPLE value, int iBufferLen) {
00054         for (int i = 0; i < iBufferLen; ++i) {
00055             EXPECT_FLOAT_EQ(pBuffer[i], value);
00056         }
00057     }
00058 
00059     QList<int> sizes;
00060     QList<CSAMPLE*> buffers;
00061     QList<int> evenBuffers;
00062 
00063     int sseAvailable;
00064 };
00065 
00066 TEST_F(SampleUtilTest, applyGain1DoesNothing) {
00067     while (sseAvailable-- >= 0) {
00068         for (int i = 0; i < buffers.size(); ++i) {
00069             CSAMPLE* buffer = buffers[i];
00070             int size = sizes[i];
00071             FillBuffer(buffer, 1.0f, size);
00072             SampleUtil::applyGain(buffer, 1.0, size);
00073             AssertWholeBufferEquals(buffer, 1.0, size);
00074         }
00075 
00076         SampleUtil::setOptimizations(true);
00077     }
00078 
00079 }
00080 
00081 TEST_F(SampleUtilTest, applyGain0ClearsBuffer) {
00082     while (sseAvailable-- >= 0) {
00083         for (int i = 0; i < buffers.size(); ++i) {
00084             CSAMPLE* buffer = buffers[i];
00085             int size = sizes[i];
00086             FillBuffer(buffer, 1.0f, size);
00087             SampleUtil::applyGain(buffer, 0.0, size);
00088             AssertWholeBufferEquals(buffer, 0.0, size);
00089         }
00090         SampleUtil::setOptimizations(true);
00091     }
00092 }
00093 
00094 TEST_F(SampleUtilTest, applyGain) {
00095     while (sseAvailable-- >= 0) {
00096         for (int i = 0; i < buffers.size(); ++i) {
00097             CSAMPLE* buffer = buffers[i];
00098             int size = sizes[i];
00099             FillBuffer(buffer, 1.0f, size);
00100             SampleUtil::applyGain(buffer, 0.5, size);
00101             AssertWholeBufferEquals(buffer, 0.5, size);
00102         }
00103         SampleUtil::setOptimizations(true);
00104     }
00105 }
00106 
00107 TEST_F(SampleUtilTest, applyAlternatingGain) {
00108     while (sseAvailable-- >= 0) {
00109         for (int i = 0; i < evenBuffers.size(); ++i) {
00110             int j = evenBuffers[i];
00111             CSAMPLE* buffer = buffers[j];
00112             int size = sizes[j];
00113             FillBuffer(buffer, 1.0f, size);
00114             SampleUtil::applyAlternatingGain(buffer, 0.5, -0.5, size);
00115             for (int s = 0; s < size; s += 2) {
00116                 EXPECT_FLOAT_EQ(buffer[s], 0.5);
00117                 EXPECT_FLOAT_EQ(buffer[s+1], -0.5);
00118             }
00119         }
00120         SampleUtil::setOptimizations(true);
00121     }
00122 }
00123 
00124 TEST_F(SampleUtilTest, addWithGain) {
00125     while (sseAvailable-- >= 0) {
00126         for (int i = 0; i < buffers.size(); ++i) {
00127             CSAMPLE* buffer = buffers[i];
00128             int size = sizes[i];
00129             FillBuffer(buffer, 1.0f, size);
00130             CSAMPLE* buffer2 = new CSAMPLE[size];
00131             FillBuffer(buffer2, 1.0f, size);
00132             SampleUtil::addWithGain(buffer, buffer2, 1.0, size);
00133             AssertWholeBufferEquals(buffer, 2.0f, size);
00134             SampleUtil::addWithGain(buffer, buffer2, 2.0, size);
00135             AssertWholeBufferEquals(buffer, 4.0f, size);
00136             delete buffer2;
00137         }
00138         SampleUtil::setOptimizations(true);
00139     }
00140 }
00141 
00142 
00143 TEST_F(SampleUtilTest, add2WithGain) {
00144     while (sseAvailable-- >= 0) {
00145         for (int i = 0; i < buffers.size(); ++i) {
00146             CSAMPLE* buffer = buffers[i];
00147             int size = sizes[i];
00148             FillBuffer(buffer, 1.0f, size);
00149             CSAMPLE* buffer2 = new CSAMPLE[size];
00150             FillBuffer(buffer2, 1.0f, size);
00151             CSAMPLE* buffer3 = new CSAMPLE[size];
00152             FillBuffer(buffer3, 1.0f, size);
00153             SampleUtil::add2WithGain(buffer,
00154                                      buffer2, 1.0,
00155                                      buffer3, 1.0,
00156                                      size);
00157             AssertWholeBufferEquals(buffer, 3.0f, size);
00158             SampleUtil::add2WithGain(buffer,
00159                                      buffer2, 2.0,
00160                                      buffer3, 3.0,
00161                                      size);
00162             AssertWholeBufferEquals(buffer, 8.0f, size);
00163             delete buffer2;
00164             delete buffer3;
00165         }
00166         SampleUtil::setOptimizations(true);
00167     }
00168 }
00169 
00170 TEST_F(SampleUtilTest, add3WithGain) {
00171     while (sseAvailable-- >= 0) {
00172         for (int i = 0; i < buffers.size(); ++i) {
00173             CSAMPLE* buffer = buffers[i];
00174             int size = sizes[i];
00175             FillBuffer(buffer, 1.0f, size);
00176             CSAMPLE* buffer2 = new CSAMPLE[size];
00177             FillBuffer(buffer2, 1.0f, size);
00178             CSAMPLE* buffer3 = new CSAMPLE[size];
00179             FillBuffer(buffer3, 1.0f, size);
00180             CSAMPLE* buffer4 = new CSAMPLE[size];
00181             FillBuffer(buffer4, 1.0f, size);
00182             SampleUtil::add3WithGain(buffer,
00183                                      buffer2, 1.0,
00184                                      buffer3, 1.0,
00185                                      buffer4, 1.0,
00186                                      size);
00187             AssertWholeBufferEquals(buffer, 4.0f, size);
00188             SampleUtil::add3WithGain(buffer,
00189                                      buffer2, 2.0,
00190                                      buffer3, 3.0,
00191                                      buffer4, 4.0,
00192                                      size);
00193             AssertWholeBufferEquals(buffer, 13.0f, size);
00194             delete buffer2;
00195             delete buffer3;
00196             delete buffer4;
00197         }
00198         SampleUtil::setOptimizations(true);
00199     }
00200 }
00201 
00202 TEST_F(SampleUtilTest, copyWithGain) {
00203     while (sseAvailable-- >= 0) {
00204         for (int i = 0; i < buffers.size(); ++i) {
00205             CSAMPLE* buffer = buffers[i];
00206             int size = sizes[i];
00207             FillBuffer(buffer, 1.0f, size);
00208             CSAMPLE* buffer2 = new CSAMPLE[size];
00209             FillBuffer(buffer2, 1.0f, size);
00210             SampleUtil::copyWithGain(buffer, buffer2, 1.0, size);
00211             AssertWholeBufferEquals(buffer, 1.0f, size);
00212             SampleUtil::copyWithGain(buffer, buffer2, 2.0, size);
00213             AssertWholeBufferEquals(buffer, 2.0f, size);
00214             delete buffer2;
00215         }
00216         SampleUtil::setOptimizations(true);
00217     }
00218 }
00219 
00220 TEST_F(SampleUtilTest, copyWithGainAliased) {
00221     while (sseAvailable-- >= 0) {
00222         for (int i = 0; i < buffers.size(); ++i) {
00223             CSAMPLE* buffer = buffers[i];
00224             int size = sizes[i];
00225             FillBuffer(buffer, 1.0f, size);
00226             SampleUtil::copyWithGain(buffer, buffer, 2.0, size);
00227             AssertWholeBufferEquals(buffer, 2.0f, size);
00228         }
00229         SampleUtil::setOptimizations(true);
00230     }
00231 }
00232 
00233 TEST_F(SampleUtilTest, copy2WithGain) {
00234     while (sseAvailable-- >= 0) {
00235         for (int i = 0; i < buffers.size(); ++i) {
00236             CSAMPLE* buffer = buffers[i];
00237             int size = sizes[i];
00238             FillBuffer(buffer, 1.0f, size);
00239             CSAMPLE* buffer2 = new CSAMPLE[size];
00240             FillBuffer(buffer2, 1.0f, size);
00241             CSAMPLE* buffer3 = new CSAMPLE[size];
00242             FillBuffer(buffer3, 1.0f, size);
00243             SampleUtil::copy2WithGain(buffer,
00244                                       buffer2, 1.0,
00245                                       buffer3, 1.0,
00246                                       size);
00247             AssertWholeBufferEquals(buffer, 2.0f, size);
00248             SampleUtil::copy2WithGain(buffer,
00249                                       buffer2, 2.0,
00250                                       buffer3, 3.0,
00251                                       size);
00252             AssertWholeBufferEquals(buffer, 5.0f, size);
00253             delete buffer2;
00254             delete buffer3;
00255         }
00256         SampleUtil::setOptimizations(true);
00257     }
00258 }
00259 
00260 TEST_F(SampleUtilTest, copy2WithGainAliased) {
00261     while (sseAvailable-- >= 0) {
00262         for (int i = 0; i < buffers.size(); ++i) {
00263             CSAMPLE* buffer = buffers[i];
00264             int size = sizes[i];
00265             FillBuffer(buffer, 1.0f, size);
00266             SampleUtil::copy2WithGain(buffer,
00267                                       buffer, 1.0,
00268                                       buffer, 1.0,
00269                                       size);
00270             AssertWholeBufferEquals(buffer, 2.0f, size);
00271             SampleUtil::copy2WithGain(buffer,
00272                                       buffer, 2.0,
00273                                       buffer, 3.0,
00274                                       size);
00275             AssertWholeBufferEquals(buffer, 10.0f, size);
00276         }
00277         SampleUtil::setOptimizations(true);
00278     }
00279 }
00280 
00281 
00282 TEST_F(SampleUtilTest, copy3WithGain) {
00283     while (sseAvailable-- >= 0) {
00284         for (int i = 0; i < buffers.size(); ++i) {
00285             CSAMPLE* buffer = buffers[i];
00286             int size = sizes[i];
00287             FillBuffer(buffer, 1.0f, size);
00288             CSAMPLE* buffer2 = new CSAMPLE[size];
00289             FillBuffer(buffer2, 1.0f, size);
00290             CSAMPLE* buffer3 = new CSAMPLE[size];
00291             FillBuffer(buffer3, 1.0f, size);
00292             CSAMPLE* buffer4 = new CSAMPLE[size];
00293             FillBuffer(buffer4, 1.0f, size);
00294             SampleUtil::copy3WithGain(buffer,
00295                                       buffer2, 1.0,
00296                                       buffer3, 1.0,
00297                                       buffer4, 1.0,
00298                                       size);
00299             AssertWholeBufferEquals(buffer, 3.0f, size);
00300             SampleUtil::copy3WithGain(buffer,
00301                                       buffer2, 2.0,
00302                                       buffer3, 3.0,
00303                                       buffer4, 4.0,
00304                                       size);
00305             AssertWholeBufferEquals(buffer, 9.0f, size);
00306             delete buffer2;
00307             delete buffer3;
00308             delete buffer4;
00309         }
00310         SampleUtil::setOptimizations(true);
00311     }
00312 }
00313 
00314 TEST_F(SampleUtilTest, copy3WithGainAliased) {
00315     while (sseAvailable-- >= 0) {
00316         for (int i = 0; i < buffers.size(); ++i) {
00317             CSAMPLE* buffer = buffers[i];
00318             int size = sizes[i];
00319             FillBuffer(buffer, 1.0f, size);
00320             SampleUtil::copy3WithGain(buffer,
00321                                       buffer, 1.0,
00322                                       buffer, 1.0,
00323                                       buffer, 1.0,
00324                                       size);
00325             AssertWholeBufferEquals(buffer, 3.0f, size);
00326             SampleUtil::copy3WithGain(buffer,
00327                                       buffer, 2.0,
00328                                       buffer, 3.0,
00329                                       buffer, 4.0,
00330                                       size);
00331             AssertWholeBufferEquals(buffer, 27.0f, size);
00332         }
00333         SampleUtil::setOptimizations(true);
00334     }
00335 }
00336 
00337 TEST_F(SampleUtilTest, convert) {
00338     while (sseAvailable-- >= 0) {
00339         for (int i = 0; i < buffers.size(); ++i) {
00340             CSAMPLE* buffer = buffers[i];
00341             int size = sizes[i];
00342             FillBuffer(buffer, 1.0f, size);
00343             SAMPLE* s16 = new SAMPLE[size];
00344             for (int j = 0; j < size; ++j) {
00345                 s16[j] = j;
00346             }
00347             SampleUtil::convert(buffer, s16, size);
00348             for (int j = 0; j < size; ++j) {
00349                 EXPECT_FLOAT_EQ(buffer[j], j);
00350             }
00351         }
00352         SampleUtil::setOptimizations(true);
00353     }
00354 }
00355 
00356 TEST_F(SampleUtilTest, sumAbsPerChannel) {
00357     while (sseAvailable-- >= 0) {
00358         for (int i = 0; i < evenBuffers.size(); ++i) {
00359             int j = evenBuffers[i];
00360             CSAMPLE* buffer = buffers[j];
00361             int size = sizes[j];
00362             FillBuffer(buffer, 1.0f, size);
00363             CSAMPLE fSumL = 0, fSumR = 0;
00364             SampleUtil::applyAlternatingGain(buffer, 1.0, 2.0, size);
00365             SampleUtil::sumAbsPerChannel(&fSumL, &fSumR, buffer, size);
00366             EXPECT_FLOAT_EQ(fSumL, size/2);
00367             EXPECT_FLOAT_EQ(fSumR, size);
00368         }
00369         SampleUtil::setOptimizations(true);
00370     }
00371 }
00372 
00373 TEST_F(SampleUtilTest, interleaveBuffer) {
00374     while (sseAvailable-- >= 0) {
00375         for (int i = 0; i < buffers.size(); ++i) {
00376             CSAMPLE* buffer = buffers[i];
00377             int size = sizes[i];
00378             FillBuffer(buffer, 0.0f, size);
00379             CSAMPLE* buffer2 = new CSAMPLE[size];
00380             FillBuffer(buffer2, 0.0f, size);
00381             for (int j = 0; j < size; j++) {
00382                 buffer[j] = j;
00383                 buffer2[j] = -j;
00384             }
00385             CSAMPLE* buffer3 = new CSAMPLE[size*2];
00386             FillBuffer(buffer3, 0.0f, size*2);
00387             SampleUtil::interleaveBuffer(buffer3, buffer, buffer2, size);
00388 
00389             for (int j = 0; j < size; j++) {
00390                 EXPECT_FLOAT_EQ(buffer3[j*2], j);
00391                 EXPECT_FLOAT_EQ(buffer3[j*2+1], -j);
00392             }
00393         }
00394         SampleUtil::setOptimizations(true);
00395     }
00396 }
00397 
00398 TEST_F(SampleUtilTest, deinterleaveBuffer) {
00399     while (sseAvailable-- >= 0) {
00400         for (int i = 0; i < buffers.size(); ++i) {
00401             CSAMPLE* buffer = buffers[i];
00402             int size = sizes[i];
00403             FillBuffer(buffer, 0.0f, size);
00404             CSAMPLE* buffer2 = new CSAMPLE[size];
00405             FillBuffer(buffer2, 0.0f, size);
00406             CSAMPLE* buffer3 = new CSAMPLE[size*2];
00407             FillBuffer(buffer3, 1.0f, size*2);
00408             for (int j = 0; j < size; j++) {
00409                 buffer3[j*2] = j;
00410                 buffer3[j*2+1] = -j;
00411             }
00412             SampleUtil::deinterleaveBuffer(buffer, buffer2, buffer3, size);
00413 
00414             for (int j = 0; j < size; j++) {
00415                 EXPECT_FLOAT_EQ(buffer[j], j);
00416                 EXPECT_FLOAT_EQ(buffer2[j], -j);
00417             }
00418 
00419             delete buffer2;
00420             delete buffer3;
00421         }
00422         SampleUtil::setOptimizations(true);
00423     }
00424 }
00425 
00426 TEST_F(SampleUtilTest, testBitwiseFabs) {
00427     // Test -10k to 10k
00428     for (int i = -10000; i < 10000; ++i) {
00429         float val = i;
00430         int iv = ((int&)val & 0x7FFFFFFF);
00431         val = (float&)iv;
00432         EXPECT_FLOAT_EQ(val, fabs(i));
00433     }
00434     // Test -1 to 1
00435     for (int i = -10000; i < 10000; ++i) {
00436         float val = float(i)/10000.0;
00437         int iv = ((int&)val & 0x7FFFFFFF);
00438         val = (float&)iv;
00439         EXPECT_FLOAT_EQ(val, fabs(float(i)/10000.0));
00440     }
00441 }
00442 
00443 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines