/* * @file decoder.cpp * @author Mateusz Piesta (mateusz.piesta@mudita.com) * @date 04.04.19 * @brief * @copyright Copyright (C) 2019 mudita.com * @details */ #include "decoder.h" #include "decoderMP3.hpp" #include "decoderFLAC.hpp" #include "decoderWAV.hpp" namespace decoder { decoder::decoder(const char *fileName) : filePath(fileName), workerBuffer(std::make_unique(workerBufferSize)) { fd = core::vfs::fopen(fileName, "r"); if (fd == NULL) { return; } core::vfs::fseek(fd,0,SEEK_END); fileSize = core::vfs::ftell(fd); core::vfs::rewind(fd); } decoder::~decoder() { core::vfs::fclose(fd); } std::unique_ptr decoder::Create(const char *file) { std::unique_ptr dec; if ((strstr(file, ".wav") != NULL) || (strstr(file, ".WAV") != NULL)) { dec = std::make_unique(file); } else if ((strstr(file, ".mp3") != NULL) || (strstr(file, ".MP3") != NULL)) { dec = std::make_unique(file); } else if ((strstr(file, ".flac") != NULL) || (strstr(file, ".FLAC") != NULL)) { dec = std::make_unique(file); } if(dec->fileSize == 0){ //error return nullptr; } else{ return dec; } } void decoder::convertmono2stereo(int16_t *pcm, uint32_t samplecount) { uint32_t i = 0, j = 0; memset(workerBuffer.get(), 0, workerBufferSize*sizeof(int16_t)); for (; j < samplecount; j++) { workerBuffer[i++] = pcm[j]; workerBuffer[i++] = pcm[j]; } memcpy(pcm, &workerBuffer[0], samplecount * 2 * sizeof(int16_t)); } }