Mercurial > hg > svcore
comparison data/fileio/test/AudioFileReaderTest.h @ 1314:00cae2d5ee7e 3.0-integration
More faffing with tests, to no great effect
| author | Chris Cannam <cannam@all-day-breakfast.com> | 
|---|---|
| date | Thu, 01 Dec 2016 20:49:55 +0000 | 
| parents | ff9697592bef | 
| children | af0ccbb3e3d7 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 1313:ff9697592bef | 1314:00cae2d5ee7e | 
|---|---|
| 84 maxLimit = 0.1; | 84 maxLimit = 0.1; | 
| 85 rmsLimit = 0.03; | 85 rmsLimit = 0.03; | 
| 86 | 86 | 
| 87 } else if (extension == "m4a" || extension == "aac") { | 87 } else if (extension == "m4a" || extension == "aac") { | 
| 88 | 88 | 
| 89 //!!! to be worked out | 89 // Like ogg but more so, quite far off in signal terms | 
| 90 maxLimit = 1e-10; | 90 // and even worse if normalised | 
| 91 rmsLimit = 1e-10; | 91 maxLimit = 0.1; | 
| 92 rmsLimit = 0.1; | |
| 92 | 93 | 
| 93 } else if (extension == "mp3") { | 94 } else if (extension == "mp3") { | 
| 94 | 95 | 
| 95 if (resampled && !gapless) { | 96 if (resampled && !gapless) { | 
| 96 | 97 | 
| 129 maxLimit = 0.06; | 130 maxLimit = 0.06; | 
| 130 rmsLimit = 0.03; | 131 rmsLimit = 0.03; | 
| 131 | 132 | 
| 132 } else if (extension == "m4a" || extension == "aac") { | 133 } else if (extension == "m4a" || extension == "aac") { | 
| 133 | 134 | 
| 134 //!!! to be worked out | 135 maxLimit = 0.06; | 
| 135 maxLimit = 1e-10; | 136 rmsLimit = 0.03; | 
| 136 rmsLimit = 1e-10; | |
| 137 | 137 | 
| 138 } else if (extension == "mp3") { | 138 } else if (extension == "mp3") { | 
| 139 | 139 | 
| 140 // all mp3 figures are worse when not normalising | 140 // all mp3 figures are worse when not normalising | 
| 141 maxLimit = 0.1; | 141 maxLimit = 0.1; | 
| 299 | 299 | 
| 300 int offset = 0; | 300 int offset = 0; | 
| 301 | 301 | 
| 302 if (perceptual) { | 302 if (perceptual) { | 
| 303 | 303 | 
| 304 // Look for an initial offset. What we're looking for is | 304 // Look for an initial offset. | 
| 305 // the first peak of the sinusoid in the first channel | 305 // | 
| 306 // (since we may have only the one channel). This should | 306 // We know the first channel has a sinusoid in it. It | 
| 307 // appear at 0.4ms (see AudioTestData.h). | 307 // should have a peak at 0.4ms (see AudioTestData.h) but | 
| 308 | 308 // that might have been clipped, which would make it | 
| 309 // imprecise. We can tell if it's clipped, though, as | |
| 310 // there will be samples having exactly identical | |
| 311 // values. So what we look for is the peak if it's not | |
| 312 // clipped and, if it is, the first zero crossing after | |
| 313 // the peak, which should be at 0.8ms. | |
| 314 | |
| 309 int expectedPeak = int(0.0004 * readRate); | 315 int expectedPeak = int(0.0004 * readRate); | 
| 310 for (int i = 1; i < read; ++i) { | 316 int expectedZC = int(0.0008 * readRate); | 
| 311 if (test[i * channels] > 0.8 && | 317 bool foundPeak = false; | 
| 312 test[(i+1) * channels] < test[i * channels]) { | 318 for (int i = 1; i+1 < read; ++i) { | 
| 313 offset = i - expectedPeak - 1; | 319 float prevSample = test[(i-1) * channels]; | 
| 320 float thisSample = test[i * channels]; | |
| 321 float nextSample = test[(i+1) * channels]; | |
| 322 if (thisSample > 0.8 && nextSample < thisSample) { | |
| 323 foundPeak = true; | |
| 324 if (thisSample > prevSample) { | |
| 325 // not clipped | |
| 326 offset = i - expectedPeak - 1; | |
| 327 break; | |
| 328 } | |
| 329 } | |
| 330 if (foundPeak && (thisSample >= 0.0 && nextSample < 0.0)) { | |
| 331 cerr << "thisSample = " << thisSample << ", nextSample = " | |
| 332 << nextSample << endl; | |
| 333 offset = i - expectedZC - 1; | |
| 314 break; | 334 break; | 
| 315 } | 335 } | 
| 316 } | 336 } | 
| 317 | 337 | 
| 338 int fileRateEquivalent = int((offset / readRate) * fileRate); | |
| 339 | |
| 318 std::cerr << "offset = " << offset << std::endl; | 340 std::cerr << "offset = " << offset << std::endl; | 
| 319 std::cerr << "at file rate would be " << (offset / readRate) * fileRate << std::endl; | 341 std::cerr << "at file rate would be " << fileRateEquivalent << std::endl; | 
| 320 | 342 | 
| 321 // Previously our m4a test file had a fixed offset of 1024 | 343 // Previously our m4a test file had a fixed offset of 1024 | 
| 322 // at the file sample rate -- this may be because it was | 344 // at the file sample rate -- this may be because it was | 
| 323 // produced by FAAC which did not write in the delay as | 345 // produced by FAAC which did not write in the delay as | 
| 324 // metadata? We now have an m4a produced by Core Audio | 346 // metadata? We now have an m4a produced by Core Audio | 
| 339 double maxDiff = 0.0; | 361 double maxDiff = 0.0; | 
| 340 double totalDiff = 0.0; | 362 double totalDiff = 0.0; | 
| 341 double totalSqrDiff = 0.0; | 363 double totalSqrDiff = 0.0; | 
| 342 int maxIndex = 0; | 364 int maxIndex = 0; | 
| 343 | 365 | 
| 344 // cerr << "\nchannel " << c << ": "; | |
| 345 | |
| 346 for (int i = 0; i < refFrames; ++i) { | 366 for (int i = 0; i < refFrames; ++i) { | 
| 347 int ix = i + offset; | 367 int ix = i + offset; | 
| 348 if (ix >= read) { | 368 if (ix >= read) { | 
| 349 cerr << "ERROR: audiofile " << audiofile << " reads truncated (read-rate reference frames " << i << " onward, of " << refFrames << ", are lost)" << endl; | 369 cerr << "ERROR: audiofile " << audiofile << " reads truncated (read-rate reference frames " << i << " onward, of " << refFrames << ", are lost)" << endl; | 
| 350 QVERIFY(ix < read); | 370 QVERIFY(ix < read); | 
| 382 } | 402 } | 
| 383 | 403 | 
| 384 double meanDiff = totalDiff / double(refFrames); | 404 double meanDiff = totalDiff / double(refFrames); | 
| 385 double rmsDiff = sqrt(totalSqrDiff / double(refFrames)); | 405 double rmsDiff = sqrt(totalSqrDiff / double(refFrames)); | 
| 386 | 406 | 
| 407 /* | |
| 387 cerr << "channel " << c << ": mean diff " << meanDiff << endl; | 408 cerr << "channel " << c << ": mean diff " << meanDiff << endl; | 
| 388 cerr << "channel " << c << ": rms diff " << rmsDiff << endl; | 409 cerr << "channel " << c << ": rms diff " << rmsDiff << endl; | 
| 389 cerr << "channel " << c << ": max diff " << maxDiff << " at " << maxIndex << endl; | 410 cerr << "channel " << c << ": max diff " << maxDiff << " at " << maxIndex << endl; | 
| 390 | 411 */ | 
| 391 if (rmsDiff >= rmsLimit) { | 412 if (rmsDiff >= rmsLimit) { | 
| 392 cerr << "ERROR: for audiofile " << audiofile << ": RMS diff = " << rmsDiff << " for channel " << c << " (limit = " << rmsLimit << ")" << endl; | 413 cerr << "ERROR: for audiofile " << audiofile << ": RMS diff = " << rmsDiff << " for channel " << c << " (limit = " << rmsLimit << ")" << endl; | 
| 393 QVERIFY(rmsDiff < rmsLimit); | 414 QVERIFY(rmsDiff < rmsLimit); | 
| 394 } | 415 } | 
| 395 if (maxDiff >= maxLimit) { | 416 if (maxDiff >= maxLimit) { | 
