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@0: d@0: AudioReader::AudioReader() d@0: { d@0: m_formatManager.registerBasicFormats(); 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@0: std::vector featureData = std::vector(); d@0: std::string CSVFileName = "..\\FeatureData" + writeCSV.currentDateTime(); d@0: d@0: vector audioFileNames = audioFileData.GetFileNames(); d@0: vector labels = audioFileData.GetLabels(); d@0: d@0: //AudioSourceFeatureExtractor audioSourceFeatureExtractor = AudioSourceFeatureExtractor(); d@0: m_AudioSourceFeatureExtractor.Initialise(SAMPLERATE); d@0: d@0: for(size_t i=0; isampleRate); d@0: m_iLengthInSamples = (int)m_audioFileReader->lengthInSamples; d@0: m_iNumOfChannels = m_audioFileReader->numChannels; d@0: d@0: if (m_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@0: d@0: //Get loudest 30 secs. of audio d@0: int numOfSamplesToCollect = (int)(analysisWindowSize * m_fSampleRate); d@0: d@0: if(m_iLengthInSamples <= numOfSamplesToCollect) d@0: { d@0: numOfSamplesToCollect = m_iLengthInSamples; d@0: } d@0: d@0: //Length of the full track in stereo; d@0: int* destSamples[2] = {0}; d@0: int* L = new int[(size_t)(m_iLengthInSamples)]; d@0: memset(L, 0, (size_t)m_iLengthInSamples*sizeof(float)); d@0: destSamples[0]=L; d@0: destSamples[1]=L; d@0: d@0: //30 sec clips to check energy levels d@0: float* destSamplesFloat = new float[(size_t)numOfSamplesToCollect]; d@0: memset(destSamplesFloat, 0, (size_t)numOfSamplesToCollect*sizeof(float)); d@0: d@0: ////30 sec clips to check energy levels d@0: //float* destSamplesFloatLoudest = new float[(size_t)numOfSamplesToCollect]; d@0: //memset(destSamplesFloatLoudest, 0, (size_t)numOfSamplesToCollect*sizeof(float)); d@0: d@0: int timesToLoop = 0; d@0: d@0: if(m_iLengthInSamples == numOfSamplesToCollect) d@0: { d@0: timesToLoop = 1; d@0: } d@0: else d@0: { d@0: timesToLoop = (int)((m_iLengthInSamples - numOfSamplesToCollect) / (ENERGYSEARCHTIME * m_fSampleRate)); d@0: } d@0: d@0: std::vector thirtySecEnergy = std::vector(); d@0: d@0: //float loudestEnergy = 0.0; d@0: d@0: m_audioFileReader->readSamples(destSamples, 2, 0, 0, m_iLengthInSamples); d@0: d@0: for(int j=0; j < timesToLoop;j++) d@0: { d@0: float fSum=0.f; d@0: d@0: for(int n=0; n 1) d@0: { d@0: destSamplesFloat[n] = ((float)((destSamples[0][int(j * ENERGYSEARCHTIME * m_fSampleRate) + n] + destSamples[1][int( j * ENERGYSEARCHTIME * m_fSampleRate) + n]) / 2) / (0x7fffffff)); d@0: } d@0: else d@0: { d@0: destSamplesFloat[n] = ((float)(destSamples[0][int(j * ENERGYSEARCHTIME * m_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@0: //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@0: int* L30 = new int[(size_t)numOfSamplesToCollect]; d@0: memset(L30, 0, (size_t)numOfSamplesToCollect*sizeof(float)); d@0: thirtySecSamples[0]=L30; //Left channel d@0: thirtySecSamples[1]=L30; //Left right d@0: d@0: //Read the 30 secs. in d@0: m_audioFileReader->readSamples(thirtySecSamples, 2, 0, int(maxIdx * ENERGYSEARCHTIME * m_fSampleRate), numOfSamplesToCollect); d@0: memset(destSamplesFloat, 0, (size_t)numOfSamplesToCollect*sizeof(float)); d@0: d@0: for(int n=0; n 1) d@0: { d@0: destSamplesFloat[n] = ((float)((thirtySecSamples[0][n] + thirtySecSamples[1][n]) / 2) / (0x7fffffff)); d@0: } d@0: else d@0: { d@0: destSamplesFloat[n] = ((float)(thirtySecSamples[0][n]) / (0x7fffffff)); d@0: } d@0: } d@0: d@0: std::vector newObs = m_AudioSourceFeatureExtractor.Process(destSamplesFloat, numOfSamplesToCollect); d@0: d@0: FeatureData newFeature = FeatureData(newObs, labels[i], audioFileNames[i], m_fSampleRate, FFTSIZE, (float)numOfSamplesToCollect, poolTimeSecs); d@0: d@0: writeCSV.Write(CSVFileName, newFeature); d@0: d@0: //Update the screen information; d@0: cout << cout << string(outputStr.length(),'\b'); d@0: d@0: //Cleanup d@0: if(L != NULL) d@0: { d@0: delete[] L; d@0: L = nullptr; d@0: } d@0: d@0: if(destSamplesFloat != NULL) d@0: { d@0: delete[] destSamplesFloat; d@0: destSamplesFloat = nullptr; d@0: //destSamplesFloatLoudest = nullptr; d@0: } d@0: d@0: //if(destSamplesFloatLoudest != NULL) d@0: //{ d@0: // delete[] destSamplesFloatLoudest; d@0: // d@0: //} d@0: } d@0: else d@0: { d@0: cout << "\n\n\nERROR: Could not find file!!!\n\n\n"; d@0: } d@0: d@0: //Cleanup d@0: if(m_audioFileReader != NULL) d@0: { d@0: delete[] m_audioFileReader; d@0: m_audioFileReader = nullptr; d@0: } d@0: } d@0: d@0: m_AudioSourceFeatureExtractor.Finalize(); d@0: d@0: return featureData; d@0: };