TEST (AudioDataTest, DownsamplerInsistsOnMonophonicAudio) { KeyFinder::AudioData a; a.setChannels(2); a.setFrameRate(100); a.addToSampleCount(10); ASSERT_THROW(a.downsample(5), KeyFinder::Exception); a.reduceToMono(); ASSERT_NO_THROW(a.downsample(5)); }
TEST (LowPassFilterTest, InsistsOnMonophonicAudio) { KeyFinder::AudioData a; a.setChannels(2); a.setFrameRate(frameRate); a.addToSampleCount(frameRate); KeyFinder::LowPassFilter* lpf = new KeyFinder::LowPassFilter(filterOrder, frameRate, cornerFrequency, filterFFT); KeyFinder::Workspace w; ASSERT_THROW(lpf->filter(a, w), KeyFinder::Exception); a.reduceToMono(); ASSERT_NO_THROW(lpf->filter(a, w)); delete lpf; }
TEST (AudioDataTest, MakeMono) { KeyFinder::AudioData a; a.setChannels(2); a.addToSampleCount(20); for (int i = 0; i < 10; i++) { a.setSample(i * 2, 100.0); } a.reduceToMono(); ASSERT_EQ(10, a.getSampleCount()); for (int i = 0; i < 10; i++) { ASSERT_FLOAT_EQ(50.0, a.getSample(i)); } }
KeyFinderResultWrapper keyDetectionProcess(const AsyncFileObject& object){ KeyFinderResultWrapper result; result.batchRow = object.batchRow; // initialise stream and decode file into it. KeyFinder::AudioData* audio = NULL; AudioFileDecoder* decoder = NULL; try{ decoder = AudioFileDecoder::getDecoder(); }catch(KeyFinder::Exception& e){ delete decoder; result.errorMessage = QString(e.what().c_str()); return result; } try{ audio = decoder->decodeFile(object.filePath); delete decoder; }catch(KeyFinder::Exception& e){ delete audio; delete decoder; result.errorMessage = QString(e.what().c_str()); return result; } // make audio stream monaural ahead of downsample to reduce load audio->reduceToMono(); // downsample if necessary if(object.prefs.getDFactor() > 1){ Downsampler* ds = Downsampler::getDownsampler(object.prefs.getDFactor(),audio->getFrameRate(),object.prefs.getLastFreq()); try{ audio = ds->downsample(audio,object.prefs.getDFactor()); }catch(KeyFinder::Exception& e){ delete audio; delete ds; result.errorMessage = QString(e.what().c_str()); return result; } delete ds; } KeyFinder::KeyFinder* kf = LibKeyFinderSingleton::getInstance()->getKeyFinder(); result.core = kf->findKey(*audio, object.prefs.core); delete audio; return result; }