![]() |
Mixxx
|
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 }