TEST (AudioDataTest, PrependToNew) { KeyFinder::AudioData a; KeyFinder::AudioData b; ASSERT_NO_THROW(a.prepend(b)); ASSERT_EQ(0, a.getChannels()); ASSERT_EQ(0, a.getFrameRate()); b.setChannels(1); b.setFrameRate(1); b.addToFrameCount(1); ASSERT_NO_THROW(a.prepend(b)); ASSERT_EQ(1, a.getChannels()); ASSERT_EQ(1, a.getFrameRate()); ASSERT_EQ(1, a.getFrameCount()); }
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; }
TEST (LowPassFilterTest, DoesntAlterAudioMetadata) { KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(frameRate); KeyFinder::LowPassFilter* lpf = new KeyFinder::LowPassFilter(filterOrder, frameRate, cornerFrequency, filterFFT); KeyFinder::Workspace w; lpf->filter(a, w); delete lpf; ASSERT_EQ(1, a.getChannels()); ASSERT_EQ(frameRate, a.getFrameRate()); ASSERT_EQ(frameRate, a.getSampleCount()); }
TEST (AudioDataTest, DownsamplerResamplesIntegralRelationship) { KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(100); a.addToSampleCount(10); for (unsigned int i = 0; i < 5; i++) a.setSample(i, 100.0); for (unsigned int i = 5; i < 10; i++) a.setSample(i, 500.0); a.downsample(5); ASSERT_EQ(20, a.getFrameRate()); ASSERT_EQ(2, a.getSampleCount()); ASSERT_FLOAT_EQ(100.0, a.getSample(0)); ASSERT_FLOAT_EQ(500.0, a.getSample(1)); }
TEST (AudioDataTest, DownsamplerResamplesSineWave) { unsigned int frameRate = 10000; unsigned int frames = frameRate * 4; float freq = 20; float magnitude = 32768.0; unsigned int factor = 5; KeyFinder::AudioData a; a.setChannels(1); a.setFrameRate(frameRate); a.addToSampleCount(frames); for (unsigned int i = 0; i < frames; i++) a.setSample(i, sine_wave(i, freq, frameRate, magnitude)); a.downsample(factor); unsigned int newFrameRate = frameRate / factor; unsigned int newFrames = frames / factor; ASSERT_EQ(newFrameRate, a.getFrameRate()); ASSERT_EQ(newFrames, a.getSampleCount()); for (unsigned int i = 0; i < newFrames; i++) ASSERT_NEAR(sine_wave(i, freq, newFrameRate, magnitude), a.getSample(i), magnitude * 0.05); }
TEST (AudioDataTest, FrameRate) { KeyFinder::AudioData a; a.setFrameRate(44100); ASSERT_EQ(44100, a.getFrameRate()); ASSERT_THROW(a.setFrameRate(0), KeyFinder::Exception); }
TEST (AudioDataTest, ConstructorWorks) { KeyFinder::AudioData a; ASSERT_EQ(0, a.getChannels()); ASSERT_EQ(0, a.getFrameRate()); ASSERT_EQ(0, a.getSampleCount()); }