d@0: /* d@0: ============================================================================== d@0: d@0: AudioReader.cpp d@0: Created: 27 Aug 2014 3:17:10pm d@0: Author: david.ronan d@0: d@0: ============================================================================== d@0: */ d@0: d@0: d@0: d@0: d@0: #include "AudioReader.h" d@0: #include "WriteCSV.h" d@0: #include d@0: #include d@0: d@0: #define ENERGYSEARCHTIME 3 d@0: #define SAMPLERATE 22050.0f d@13: #include "XMLWrite.h" d@0: d@0: AudioReader::AudioReader() d@2: { d@1: d@0: }; d@0: d@0: AudioReader::~AudioReader() d@0: { d@0: d@0: }; d@0: d@0: std::vector AudioReader::Read(AudioFileData audioFileData, float poolTimeSecs, int analysisWindowSize) d@0: { d@0: WriteCSV writeCSV = WriteCSV(); d@13: XMLWrite xmlWrite = XMLWrite(); d@0: std::vector featureData = std::vector(); d@0: std::string CSVFileName = "..\\FeatureData" + writeCSV.currentDateTime(); d@1: d@0: vector audioFileNames = audioFileData.GetFileNames(); d@2: vector labels = audioFileData.GetLabels(); d@2: d@1: AudioFormatManager m_formatManager; d@1: m_formatManager.registerBasicFormats(); d@1: m_AudioSourceFeatureExtractor.Initialise(SAMPLERATE); d@0: d@0: for(size_t i=0; i(i) / static_cast(audioFileNames.size()) * 100.0f; d@0: d@0: std::string outputStr = "Extracting features for " + audioFileNames[i] + "\n" + std::to_string(percentcomplete) + "% complete..."; d@0: cout << outputStr; d@9: d@0: //Create file from our audio data d@0: File audioFile(audioFileNames[i].c_str()); d@0: d@9: unique_ptr audioFileReader(m_formatManager.createReaderFor(audioFile)); d@1: d@3: if(audioFileReader != nullptr) d@3: { d@3: float fSampleRate = static_cast(audioFileReader->sampleRate); d@3: int iLengthInSamples = static_cast(audioFileReader->lengthInSamples); d@3: int iNumOfChannels = audioFileReader->numChannels; d@1: d@3: if (fSampleRate != 22050.0f) d@0: { d@0: cout << "\n\n\nERROR: File is not the required 22050 Hz sample rate.!!!\n\n\n"; d@0: } d@1: d@0: //Get loudest 30 secs. of audio d@3: int numOfSamplesToCollect = static_cast(analysisWindowSize * fSampleRate); d@0: d@3: if(iLengthInSamples <= numOfSamplesToCollect) d@0: { d@3: numOfSamplesToCollect = iLengthInSamples; d@0: } d@0: d@0: //Length of the full track in stereo; d@9: int* destSamples[2] = { nullptr }; d@9: unique_ptr L(new int[iLengthInSamples]); d@9: memset(L.get(), 0, iLengthInSamples); d@9: destSamples[0] = L.get(); d@9: destSamples[1] = L.get(); d@1: d@9: d@0: //30 sec clips to check energy levels d@9: std::vector destSamplesFloat = std::vector(static_cast(numOfSamplesToCollect, 0)); d@0: d@1: int timesToLoop = 0; d@0: d@3: if(iLengthInSamples == numOfSamplesToCollect) d@0: { d@0: timesToLoop = 1; d@0: } d@0: else d@0: { d@3: timesToLoop = static_cast((iLengthInSamples - numOfSamplesToCollect) / (ENERGYSEARCHTIME * fSampleRate)); d@0: } d@0: d@0: std::vector thirtySecEnergy = std::vector(); d@0: d@0: //float loudestEnergy = 0.0; d@9: bool dave; d@9: dave = audioFileReader->readSamples(destSamples, iNumOfChannels, 0, 0, iLengthInSamples); d@0: d@0: for(int j=0; j < timesToLoop;j++) d@1: { d@0: float fSum=0.f; d@0: d@0: for(int n=0; n 1) d@0: { d@9: destSamplesFloat.push_back(static_cast((destSamples[0][int(j * ENERGYSEARCHTIME * fSampleRate) + n] + destSamples[1][int( j * ENERGYSEARCHTIME * fSampleRate) + n]) / 2) / (0x7fffffff)); d@0: } d@0: else d@0: { d@9: destSamplesFloat.push_back(static_cast(destSamples[0][int(j * ENERGYSEARCHTIME * fSampleRate) + n]) / (0x7fffffff)); d@0: } d@0: d@0: fSum+=(destSamplesFloat[n] * destSamplesFloat[n]); d@0: } d@0: d@0: //Normalise and push onto the list of 30 sec clips. d@0: fSum /= numOfSamplesToCollect; d@0: d@0: //if (fSum > loudestEnergy) d@0: //{ d@0: // loudestEnergy = fSum; d@0: // destSamplesFloatLoudest = destSamplesFloat; d@0: //} d@0: d@0: thirtySecEnergy.push_back(fSum); d@0: } d@0: d@1: //Find the index of the section with the most energy d@0: int maxIdx = std::distance(thirtySecEnergy.begin(), max_element(thirtySecEnergy.begin(), thirtySecEnergy.end())); d@0: d@0: int* thirtySecSamples[2] = {0}; d@9: unique_ptr L30(new int[iLengthInSamples]{ 0 }); d@9: memset(L30.get(), 0, iLengthInSamples); d@9: thirtySecSamples[0]=L30.get(); //Left channel d@9: thirtySecSamples[1]=L30.get(); //Left right d@0: d@0: //Read the 30 secs. in d@3: audioFileReader->readSamples(thirtySecSamples, iNumOfChannels, 0, int(maxIdx * ENERGYSEARCHTIME * fSampleRate), numOfSamplesToCollect); d@9: d@9: destSamplesFloat = std::vector(static_cast(numOfSamplesToCollect, 0)); d@0: d@0: for(int n=0; n 1) d@0: { d@9: destSamplesFloat.push_back(static_cast((thirtySecSamples[0][n] + thirtySecSamples[1][n]) / 2) / (0x7fffffff)); d@0: } d@0: else d@0: { d@9: destSamplesFloat.push_back(static_cast(thirtySecSamples[0][n]) / (0x7fffffff)); d@0: } d@0: } d@0: d@9: std::vector newObs = m_AudioSourceFeatureExtractor.Process(destSamplesFloat); d@1: d@3: FeatureData newFeature = FeatureData(newObs, labels[i], audioFileNames[i], fSampleRate, FFTSIZE, static_cast(numOfSamplesToCollect), poolTimeSecs); d@1: d@14: //XML from now on. d@0: writeCSV.Write(CSVFileName, newFeature); d@13: xmlWrite.Write(CSVFileName, newFeature); d@1: d@0: //Update the screen information; d@2: d@9: cout << string(outputStr.length(),'\b'); d@3: d@0: } d@0: else d@0: { d@0: cout << "\n\n\nERROR: Could not find file!!!\n\n\n"; d@3: } d@0: } d@0: d@0: m_AudioSourceFeatureExtractor.Finalize(); d@1: d@0: return featureData; d@2: };