diff --git a/module-audio/Audio/decoder/decoder.cpp b/module-audio/Audio/decoder/decoder.cpp index af739520a..f76eec7fb 100644 --- a/module-audio/Audio/decoder/decoder.cpp +++ b/module-audio/Audio/decoder/decoder.cpp @@ -7,7 +7,7 @@ * @details */ -#include "decoder.h" +#include "decoder.hpp" #include "decoderMP3.hpp" #include "decoderFLAC.hpp" @@ -20,19 +20,21 @@ namespace decoder { : filePath(fileName), workerBuffer(std::make_unique(workerBufferSize)) { - fd = core::vfs::fopen(fileName, "r"); + fd = vfs.fopen(fileName, "r"); if (fd == NULL) { return; } - core::vfs::fseek(fd,0,SEEK_END); - fileSize = core::vfs::ftell(fd); - core::vfs::rewind(fd); + vfs.fseek(fd,0,SEEK_END); + fileSize = vfs.ftell(fd); + vfs.rewind(fd); } decoder::~decoder() { - core::vfs::fclose(fd); + if(fd){ + vfs.fclose(fd); + } } std::unique_ptr decoder::Create(const char *file) { diff --git a/module-audio/Audio/decoder/decoder.h b/module-audio/Audio/decoder/decoder.hpp similarity index 97% rename from module-audio/Audio/decoder/decoder.h rename to module-audio/Audio/decoder/decoder.hpp index 0cf6b6559..177ef4fcc 100644 --- a/module-audio/Audio/decoder/decoder.h +++ b/module-audio/Audio/decoder/decoder.hpp @@ -15,7 +15,7 @@ #include #include -#include "vfs/vfs.hpp" +#include "vfs.hpp" namespace decoder { @@ -106,12 +106,13 @@ namespace decoder { uint32_t sampleRate = 0; uint32_t chanNumber = 0; float position = 0; - core::FILE *fd = nullptr; + vfs::FILE *fd = nullptr; uint32_t fileSize = 0; std::string filePath; // Worker buffer used for converting mono stream to stereo std::unique_ptr workerBuffer; + }; } diff --git a/module-audio/Audio/decoder/decoderFLAC.cpp b/module-audio/Audio/decoder/decoderFLAC.cpp index 0715d1e07..c25c1a718 100644 --- a/module-audio/Audio/decoder/decoderFLAC.cpp +++ b/module-audio/Audio/decoder/decoderFLAC.cpp @@ -42,7 +42,7 @@ namespace decoder { if (pos == std::string::npos) { tags->title.append(filePath); } else { - tags->title.append(&filePath[pos]); + tags->title.append(&filePath[pos+1]); } } return std::make_unique(*tags); @@ -96,13 +96,13 @@ namespace decoder { size_t decoderFLAC::drflac_read(void *pUserData, void *pBufferOut, size_t bytesToRead) { decoderFLAC *userdata = (decoderFLAC *) pUserData; - return core::vfs::fread(pBufferOut, 1, bytesToRead, userdata->fd); + return vfs.fread(pBufferOut, 1, bytesToRead, userdata->fd); } drflac_bool32 decoderFLAC::drflac_seek(void *pUserData, int offset, drflac_seek_origin origin) { decoderFLAC *userdata = (decoderFLAC *) pUserData; - return !core::vfs::fseek(userdata->fd, offset, origin == drflac_seek_origin_start ? SEEK_SET : SEEK_CUR); + return !vfs.fseek(userdata->fd, offset, origin == drflac_seek_origin_start ? SEEK_SET : SEEK_CUR); } diff --git a/module-audio/Audio/decoder/decoderFLAC.hpp b/module-audio/Audio/decoder/decoderFLAC.hpp index 028328504..beb77a275 100644 --- a/module-audio/Audio/decoder/decoderFLAC.hpp +++ b/module-audio/Audio/decoder/decoderFLAC.hpp @@ -10,7 +10,7 @@ #ifndef UNTITLED1_DECODERFLAC_HPP #define UNTITLED1_DECODERFLAC_HPP -#include "decoder.h" +#include "decoder.hpp" #include "dr_flac.h" diff --git a/module-audio/Audio/decoder/decoderMP3.cpp b/module-audio/Audio/decoder/decoderMP3.cpp index 4bd32e92a..9c280ed3f 100644 --- a/module-audio/Audio/decoder/decoderMP3.cpp +++ b/module-audio/Audio/decoder/decoderMP3.cpp @@ -43,7 +43,7 @@ namespace decoder { void decoderMP3::setPosition(float pos){ decoderNotFirstRun = false; - core::vfs::fseek(fd,(pos*fileSize)+firstValidFrameFileOffset,SEEK_SET); + vfs.fseek(fd,(pos*fileSize)+firstValidFrameFileOffset,SEEK_SET); //TODO: M.P Currently calculating MP3 position is unsupported, in general seeking is supported though. //position += (float) ((float) (samplesToReadChann / chanNumber) / (float) sampleRate); @@ -51,10 +51,10 @@ namespace decoder { std::unique_ptr decoderMP3::fetchTags() { - core::vfs::fseek(fd, firstValidFrameFileOffset + 4, SEEK_SET); + vfs.fseek(fd, firstValidFrameFileOffset + 4, SEEK_SET); auto buff = std::make_unique(firstValidFrameByteSize); - core::vfs::fread(buff.get(), 1, firstValidFrameByteSize, fd); + vfs.fread(buff.get(), 1, firstValidFrameByteSize, fd); xing_info_t xinfo = {}; if (parseXingHeader(buff.get(),firstValidFrameByteSize, &xinfo)) { @@ -74,13 +74,13 @@ namespace decoder { tag->duration_hour = tag->duration_min / 60; tag->duration_sec = tag->total_duration_s % 60; - core::vfs::rewind(fd); + vfs.rewind(fd); // Parse ID3 tags // Allocate buffer for fetching initial part of MP3, 1Mbyte should be sufficient to fetch all necessary tags auto source = std::make_unique>(); - core::vfs::fread(&(*source)[0], 1, source->size(), fd); + vfs.fread(&(*source)[0], 1, source->size(), fd); if (atag::id3v2::is_tagged(*source)) { @@ -99,11 +99,11 @@ namespace decoder { if (pos == std::string::npos) { tag->title.append(filePath); } else { - tag->title.append(&filePath[pos]); + tag->title.append(&filePath[pos+1]); } } - core::vfs::rewind(fd); + vfs.rewind(fd); return std::make_unique(*tag); } @@ -118,9 +118,9 @@ namespace decoder { auto decBuffer = std::make_unique(DECODER_BUFFER_SIZE); - core::vfs::rewind(fd); + vfs.rewind(fd); - if (core::vfs::fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) { + if (vfs.fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) { return false; } @@ -129,7 +129,7 @@ namespace decoder { //refill buffer if necessary(only if over 87,5% of bytes are consumed) if (bufferIndex > (DECODER_BUFFER_SIZE - (DECODER_BUFFER_SIZE / 8))) { memcpy(&decBuffer[0], &decBuffer[bufferIndex], bytesAvailable); - uint32_t bytesRead = core::vfs::fread(&decBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd); + uint32_t bytesRead = vfs.fread(&decBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd); if (bytesRead == 0) { return false; @@ -153,9 +153,9 @@ namespace decoder { sampleRate = info.hz; chanNumber = info.channels; firstValidFrameByteSize = (144 * info.bitrate_kbps * 1000 / info.hz); - firstValidFrameFileOffset = core::vfs::ftell(fd) - bytesAvailable - firstValidFrameByteSize; + firstValidFrameFileOffset = vfs.ftell(fd) - bytesAvailable - firstValidFrameByteSize; - core::vfs::rewind(fd); + vfs.rewind(fd); return true; } @@ -183,10 +183,10 @@ namespace decoder { auto decBuffer = std::make_unique(DECODER_BUFFER_SIZE); // Jump to the file beginning - core::vfs::rewind(fd); + vfs.rewind(fd); /* Fill decBuffer */ - if (core::vfs::fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) { + if (vfs.fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) { return 0; } @@ -195,7 +195,7 @@ namespace decoder { //refill buffer if necessary(only if over 87,5% of bytes are consumed) if (bufferIndex > (DECODER_BUFFER_SIZE - (DECODER_BUFFER_SIZE / 8))) { memcpy(&decBuffer[0], &decBuffer[bufferIndex], bytesAvailable); - uint32_t bytesRead = core::vfs::fread(decBuffer.get() + bytesAvailable, 1, DECODER_BUFFER_SIZE - bytesAvailable, fd); + uint32_t bytesRead = vfs.fread(decBuffer.get() + bytesAvailable, 1, DECODER_BUFFER_SIZE - bytesAvailable, fd); if (bytesRead != (DECODER_BUFFER_SIZE - bytesAvailable)) { last_refill = true; @@ -242,7 +242,7 @@ namespace decoder { pcmsamplesbuffer = std::make_unique(pcmsamplesbuffer_size); // Fill decoderBuffer - uint32_t bytesRead = core::vfs::fread(decoderBuffer.get(), 1, DECODER_BUFFER_SIZE, fd); + uint32_t bytesRead = vfs.fread(decoderBuffer.get(), 1, DECODER_BUFFER_SIZE, fd); if (bytesRead == 0) { return 0; @@ -264,7 +264,7 @@ namespace decoder { //refill buffer if necessary(only if over 87,5% of bytes consumed) if ( !lastRefill && (decoderBufferIdx > (DECODER_BUFFER_SIZE - (DECODER_BUFFER_SIZE / 8)))) { memcpy(&decoderBuffer[0], &decoderBuffer[decoderBufferIdx], bytesAvailable); - uint32_t bytesRead = core::vfs::fread(&decoderBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd); + uint32_t bytesRead = vfs.fread(&decoderBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd); if (bytesRead != (DECODER_BUFFER_SIZE - bytesAvailable)) { lastRefill = true; diff --git a/module-audio/Audio/decoder/decoderMP3.hpp b/module-audio/Audio/decoder/decoderMP3.hpp index cd77161c9..1b4a5b6ad 100644 --- a/module-audio/Audio/decoder/decoderMP3.hpp +++ b/module-audio/Audio/decoder/decoderMP3.hpp @@ -15,7 +15,7 @@ #include #include -#include "decoder.h" +#include "decoder.hpp" diff --git a/module-audio/Audio/decoder/decoderWAV.cpp b/module-audio/Audio/decoder/decoderWAV.cpp index 0cfee4026..d55d11503 100644 --- a/module-audio/Audio/decoder/decoderWAV.cpp +++ b/module-audio/Audio/decoder/decoderWAV.cpp @@ -16,8 +16,12 @@ namespace decoder { decoder(fileName), tag(std::make_unique()) { - if (core::vfs::fread(&waveHeader, 1, sizeof(waveHeader), fd) != sizeof(WAVE_FormatTypeDef)) { - //error + if(fd == NULL){ + return; + } + + if (vfs.fread(&waveHeader, 1, sizeof(waveHeader), fd) != sizeof(WAVE_FormatTypeDef)) { + return; } tag->total_duration_s = (fileSize - sizeof(WAVE_FormatTypeDef)) / waveHeader.ByteRate; @@ -39,7 +43,7 @@ namespace decoder { if (pos == std::string::npos) { tag->title.append(filePath); } else { - tag->title.append(&filePath[pos]); + tag->title.append(&filePath[pos+1]); } return std::make_unique(*tag); @@ -51,7 +55,7 @@ namespace decoder { // mono if (chanNumber == 1) { - samples_read = core::vfs::fread(pcmData, sizeof(int16_t), samplesToReadChann, fd); + samples_read = vfs.fread(pcmData, sizeof(int16_t), samplesToReadChann, fd); if (samples_read == 0) { return samples_read; } @@ -63,7 +67,7 @@ namespace decoder { } //stereo else { - samples_read = core::vfs::fread(pcmData, sizeof(int16_t), samplesToReadChann, fd); + samples_read = vfs.fread(pcmData, sizeof(int16_t), samplesToReadChann, fd); } if (samples_read) { @@ -76,9 +80,9 @@ namespace decoder { void decoderWAV::setPosition(float pos){ - core::vfs::fseek(fd,(fileSize*pos)+ sizeof(WAVE_FormatTypeDef),SEEK_SET); + vfs.fseek(fd,(fileSize*pos)+ sizeof(WAVE_FormatTypeDef),SEEK_SET); // Calculate new position - position = (float) ((float) (core::vfs::ftell(fd)/sizeof(int16_t) / chanNumber) / (float) (sampleRate)); + position = (float) ((float) (vfs.ftell(fd)/sizeof(int16_t) / chanNumber) / (float) (sampleRate)); } diff --git a/module-audio/Audio/decoder/decoderWAV.hpp b/module-audio/Audio/decoder/decoderWAV.hpp index a8087f66b..0b8e618b6 100644 --- a/module-audio/Audio/decoder/decoderWAV.hpp +++ b/module-audio/Audio/decoder/decoderWAV.hpp @@ -10,7 +10,7 @@ #ifndef UNTITLED1_DECODERWAV_HPP #define UNTITLED1_DECODERWAV_HPP -#include "decoder.h" +#include "decoder.hpp" namespace decoder { @@ -51,7 +51,6 @@ namespace decoder { WAVE_FormatTypeDef waveHeader; uint32_t bitsPerSample; std::unique_ptr tag = nullptr; - }; } diff --git a/module-audio/Audio/decoder/xing_header.c b/module-audio/Audio/decoder/xing_header.c index 0d78efcff..af738c41e 100644 --- a/module-audio/Audio/decoder/xing_header.c +++ b/module-audio/Audio/decoder/xing_header.c @@ -7,7 +7,7 @@ * @details */ - +#define _GNU_SOURCE #include "xing_header.h" #include diff --git a/module-audio/tests/main_tests.cpp b/module-audio/tests/main_tests.cpp index ebdc35814..6ab67cc76 100644 --- a/module-audio/tests/main_tests.cpp +++ b/module-audio/tests/main_tests.cpp @@ -16,8 +16,102 @@ #include "catch.hpp" +#include "Audio/decoder/decoder.hpp" + + +TEST_CASE( "Decoder tests" ) { + + auto cwd = vfs.getcurrdir(); + cwd = cwd.substr(0,cwd.find_last_of("/\\")); + cwd = cwd.append("/module-audio/tests/samples"); + + SECTION("Sample1.wav 16bit 44100Hz stereo") + { + + auto dec = decoder::decoder::Create((cwd + "/sample1.wav").c_str()); + REQUIRE(dec != nullptr); + auto tag = dec->fetchTags(); + + SECTION( "Init values:" ) { + REQUIRE( tag->total_duration_s == 5 ); + REQUIRE( tag->artist == "" ); + REQUIRE( tag->album == "" ); + REQUIRE( tag->title == "sample1.wav" ); + REQUIRE( tag->sample_rate == 44100 ); + REQUIRE( tag->num_channel == 2 ); + } + + /* SECTION( "Set positions:" ) { + dec->setPosition(0.5); + REQUIRE( dec->getCurrentPosition() == 336/2 ); + dec->setPosition(0); + REQUIRE( dec->getCurrentPosition() == 0 ); + dec->setPosition(1); + REQUIRE( dec->getCurrentPosition() == 336 ); + dec->setPosition(0.25); + REQUIRE( dec->getCurrentPosition() == 336/4 ); + }*/ + + } + + SECTION("Sample1.mp3-> CBR 320Kb stereo") + { + + auto dec = decoder::decoder::Create((cwd + "/sample1.mp3").c_str()); + REQUIRE(dec != nullptr); + auto tag = dec->fetchTags(); + + SECTION( "Init values:" ) { + REQUIRE( tag->total_duration_s == 5 ); + REQUIRE( tag->artist == "" ); + REQUIRE( tag->album == "" ); + REQUIRE( tag->title == "sample1.mp3" ); + REQUIRE( tag->sample_rate == 44100 ); + REQUIRE( tag->num_channel == 2 ); + } + + /* SECTION( "Set positions:" ) { + dec->setPosition(0.5); + REQUIRE( dec->getCurrentPosition() == 336/2 ); + dec->setPosition(0); + REQUIRE( dec->getCurrentPosition() == 0 ); + dec->setPosition(1); + REQUIRE( dec->getCurrentPosition() == 336 ); + dec->setPosition(0.25); + REQUIRE( dec->getCurrentPosition() == 336/4 ); + }*/ + + } + + SECTION("Sample1.flac-> stereo") + { + + auto dec = decoder::decoder::Create((cwd + "/sample1.flac").c_str()); + REQUIRE(dec != nullptr); + auto tag = dec->fetchTags(); + + SECTION( "Init values:" ) { + REQUIRE( tag->total_duration_s == 5 ); + REQUIRE( tag->artist == "" ); + REQUIRE( tag->album == "" ); + REQUIRE( tag->title == "sample1.flac" ); + REQUIRE( tag->sample_rate == 44100 ); + REQUIRE( tag->num_channel == 2 ); + } + + /* SECTION( "Set positions:" ) { + dec->setPosition(0.5); + REQUIRE( dec->getCurrentPosition() == 336/2 ); + dec->setPosition(0); + REQUIRE( dec->getCurrentPosition() == 0 ); + dec->setPosition(1); + REQUIRE( dec->getCurrentPosition() == 336 ); + dec->setPosition(0.25); + REQUIRE( dec->getCurrentPosition() == 336/4 ); + }*/ + + } + -TEST_CASE("Tokenizer tests") -{ } diff --git a/module-audio/tests/samples/sample1.flac b/module-audio/tests/samples/sample1.flac new file mode 100644 index 000000000..7f54acd98 Binary files /dev/null and b/module-audio/tests/samples/sample1.flac differ diff --git a/module-audio/tests/samples/sample1.mp3 b/module-audio/tests/samples/sample1.mp3 new file mode 100644 index 000000000..cf52db2eb Binary files /dev/null and b/module-audio/tests/samples/sample1.mp3 differ diff --git a/module-audio/tests/samples/sample1.wav b/module-audio/tests/samples/sample1.wav new file mode 100644 index 000000000..82072c527 Binary files /dev/null and b/module-audio/tests/samples/sample1.wav differ