~aleteoryx/muditaos

70126e07acf51ca04c936c4c57d6b430001c5fe9 — jimmorrisson 5 years ago 0a0366b
[EGD-4439] New filesystem handling - module audio. (#1037)

[EGD-4439] Taglib revision update
M module-audio/Audio/decoder/decoder.cpp => module-audio/Audio/decoder/decoder.cpp +10 -9
@@ 1,6 1,7 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <cstdio>
#include <Utils.hpp>
#include "decoder.hpp"
#include "decoderMP3.hpp"


@@ 18,28 19,28 @@ namespace audio
        : filePath(fileName), workerBuffer(std::make_unique<int16_t[]>(workerBufferSize)), tag(std::make_unique<Tags>())
    {

        fd = vfs.fopen(fileName, "r");
        fd = std::fopen(fileName, "r");
        if (fd == NULL) {
            return;
        }

        vfs.fseek(fd, 0, SEEK_END);
        fileSize = vfs.ftell(fd);
        vfs.rewind(fd);
        std::fseek(fd, 0, SEEK_END);
        fileSize = std::ftell(fd);
        std::rewind(fd);
    }

    decoder::~decoder()
    {
        if (fd) {
            vfs.fclose(fd);
            std::fclose(fd);
        }
    }

    std::unique_ptr<Tags> decoder::fetchTags()
    {
        if (fd) {
            auto inPos = vfs.ftell(fd);
            vfs.rewind(fd);
            auto inPos = std::ftell(fd);
            std::rewind(fd);
            TagLib::FileStream fileStream(fd);
            TagLib::FileRef tagReader(&fileStream);
            if (!tagReader.isNull() && tagReader.tag()) {


@@ 60,9 61,9 @@ namespace audio
                tag->num_channel      = properties->channels();
                tag->bitrate          = properties->bitrate();
            }
            vfs.rewind(fd);
            std::rewind(fd);
            fetchTagsSpecific();
            vfs.fseek(fd, inPos, SEEK_SET);
            std::fseek(fd, inPos, SEEK_SET);
        }

        tag->filePath.append(filePath);

M module-audio/Audio/decoder/decoder.hpp => module-audio/Audio/decoder/decoder.hpp +1 -2
@@ 9,7 9,6 @@
#include <optional>
#include <cstring>

#include <vfs.hpp>

namespace audio
{


@@ 104,7 103,7 @@ namespace audio
        uint32_t sampleRate = 0;
        uint32_t chanNumber = 0;
        float position      = 0;
        vfs::FILE *fd       = nullptr;
        std::FILE *fd       = nullptr;
        uint32_t fileSize   = 0;
        std::string filePath;


M module-audio/Audio/decoder/decoderFLAC.cpp => module-audio/Audio/decoder/decoderFLAC.cpp +2 -2
@@ 72,13 72,13 @@ namespace audio
    size_t decoderFLAC::drflac_read(void *pUserData, void *pBufferOut, size_t bytesToRead)
    {
        decoderFLAC *userdata = (decoderFLAC *)pUserData;
        return vfs.fread(pBufferOut, 1, bytesToRead, userdata->fd);
        return std::fread(pBufferOut, 1, bytesToRead, userdata->fd);
    }

    drflac_bool32 decoderFLAC::drflac_seek(void *pUserData, int offset, drflac_seek_origin origin)
    {
        decoderFLAC *userdata = (decoderFLAC *)pUserData;
        return !vfs.fseek(userdata->fd, offset, origin == drflac_seek_origin_start ? SEEK_SET : SEEK_CUR);
        return !std::fseek(userdata->fd, offset, origin == drflac_seek_origin_start ? SEEK_SET : SEEK_CUR);
    }

    void decoderFLAC::drflac_meta(void *pUserData, drflac_metadata *pMetadata)

M module-audio/Audio/decoder/decoderMP3.cpp => module-audio/Audio/decoder/decoderMP3.cpp +17 -14
@@ 8,6 8,7 @@
#include "decoderMP3.hpp"

#include <array>
#include <cstdio>

namespace audio
{


@@ 34,7 35,7 @@ namespace audio
    {
        decoderNotFirstRun = false;

        vfs.fseek(fd, (pos * fileSize) + firstValidFrameFileOffset, SEEK_SET);
        std::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);


@@ 43,10 44,10 @@ namespace audio
    void decoderMP3::fetchTagsSpecific()
    {

        vfs.fseek(fd, firstValidFrameFileOffset + 4, SEEK_SET);
        std::fseek(fd, firstValidFrameFileOffset + 4, SEEK_SET);
        auto buff = std::make_unique<uint8_t[]>(firstValidFrameByteSize);

        vfs.fread(buff.get(), 1, firstValidFrameByteSize, fd);
        std::fread(buff.get(), 1, firstValidFrameByteSize, fd);

        xing_info_t xinfo = {};
        if (parseXingHeader(buff.get(), firstValidFrameByteSize, &xinfo)) {


@@ 59,7 60,7 @@ namespace audio
            tag->total_duration_s = frames_count * (samplesPerFrame) / sampleRate;
        }

        vfs.rewind(fd);
        std::rewind(fd);
    }

    bool decoderMP3::find_first_valid_frame()


@@ 72,9 73,9 @@ namespace audio

        auto decBuffer = std::make_unique<uint8_t[]>(DECODER_BUFFER_SIZE);

        vfs.rewind(fd);
        std::rewind(fd);

        if (vfs.fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) {
        if (std::fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) {
            return false;
        }



@@ 82,7 83,8 @@ namespace audio
            // 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 = vfs.fread(&decBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd);
                uint32_t bytesRead =
                    std::fread(&decBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd);

                if (bytesRead == 0) {
                    return false;


@@ 106,9 108,9 @@ namespace audio
                    sampleRate                = info.hz;
                    chanNumber                = info.channels;
                    firstValidFrameByteSize   = (144 * info.bitrate_kbps * 1000 / info.hz);
                    firstValidFrameFileOffset = vfs.ftell(fd) - bytesAvailable - firstValidFrameByteSize;
                    firstValidFrameFileOffset = std::ftell(fd) - bytesAvailable - firstValidFrameByteSize;

                    vfs.rewind(fd);
                    std::rewind(fd);

                    return true;
                }


@@ 135,10 137,10 @@ namespace audio
        auto decBuffer       = std::make_unique<uint8_t[]>(DECODER_BUFFER_SIZE);

        // Jump to the file beginning
        vfs.rewind(fd);
        std::rewind(fd);

        /* Fill decBuffer */
        if (vfs.fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) {
        if (std::fread(decBuffer.get(), 1, DECODER_BUFFER_SIZE, fd) == 0) {
            return 0;
        }



@@ 148,7 150,7 @@ namespace audio
        if (bufferIndex > (DECODER_BUFFER_SIZE - (DECODER_BUFFER_SIZE / 8))) {
            memcpy(&decBuffer[0], &decBuffer[bufferIndex], bytesAvailable);
            uint32_t bytesRead =
                vfs.fread(decBuffer.get() + bytesAvailable, 1, DECODER_BUFFER_SIZE - bytesAvailable, fd);
                std::fread(decBuffer.get() + bytesAvailable, 1, DECODER_BUFFER_SIZE - bytesAvailable, fd);

            if (bytesRead != (DECODER_BUFFER_SIZE - bytesAvailable)) {
                last_refill = true;


@@ 195,7 197,7 @@ namespace audio
            pcmsamplesbuffer = std::make_unique<uint16_t[]>(pcmsamplesbuffer_size);

            // Fill decoderBuffer
            uint32_t bytesRead = vfs.fread(decoderBuffer.get(), 1, DECODER_BUFFER_SIZE, fd);
            uint32_t bytesRead = std::fread(decoderBuffer.get(), 1, DECODER_BUFFER_SIZE, fd);

            if (bytesRead == 0) {
                return 0;


@@ 217,7 219,8 @@ namespace audio
        // 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 = vfs.fread(&decoderBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd);
            uint32_t bytesRead =
                std::fread(&decoderBuffer[bytesAvailable], 1, DECODER_BUFFER_SIZE - bytesAvailable, fd);

            if (bytesRead != (DECODER_BUFFER_SIZE - bytesAvailable)) {
                lastRefill = true;

M module-audio/Audio/decoder/decoderWAV.cpp => module-audio/Audio/decoder/decoderWAV.cpp +4 -4
@@ 17,7 17,7 @@ namespace audio
            return;
        }

        if (vfs.fread(&waveHeader, 1, sizeof(waveHeader), fd) != sizeof(WAVE_FormatTypeDef)) {
        if (std::fread(&waveHeader, 1, sizeof(waveHeader), fd) != sizeof(WAVE_FormatTypeDef)) {
            return;
        }



@@ 46,7 46,7 @@ namespace audio
            break;

        case 16:
            samples_read = vfs.fread(pcmData, sizeof(int16_t), samplesToRead, fd);
            samples_read = std::fread(pcmData, sizeof(int16_t), samplesToRead, fd);
            break;

        case 24:


@@ 70,9 70,9 @@ namespace audio
    void decoderWAV::setPosition(float pos)
    {

        vfs.fseek(fd, (fileSize * pos) + sizeof(WAVE_FormatTypeDef), SEEK_SET);
        std::fseek(fd, (fileSize * pos) + sizeof(WAVE_FormatTypeDef), SEEK_SET);
        // Calculate new position
        position = (float)((float)(vfs.ftell(fd) / sizeof(int16_t) / chanNumber) / (float)(sampleRate));
        position = (float)((float)(std::ftell(fd) / sizeof(int16_t) / chanNumber) / (float)(sampleRate));
    }

} // namespace audio

M module-audio/Audio/decoder/decoderWAV.hpp => module-audio/Audio/decoder/decoderWAV.hpp +1 -0
@@ 4,6 4,7 @@
#pragma once

#include "decoder.hpp"
#include <vector>

namespace audio
{

M module-audio/Audio/encoder/Encoder.cpp => module-audio/Audio/encoder/Encoder.cpp +2 -2
@@ 15,7 15,7 @@ namespace audio
    Encoder::Encoder(const char *fileName, const Format &frmt) : format(frmt), filePath(fileName)
    {

        fd = vfs.fopen(fileName, "w");
        fd = std::fopen(fileName, "w");
        if (fd == NULL) {
            return;
        }


@@ 25,7 25,7 @@ namespace audio
    Encoder::~Encoder()
    {
        if (fd) {
            vfs.fclose(fd);
            std::fclose(fd);
        }
    }


M module-audio/Audio/encoder/Encoder.hpp => module-audio/Audio/encoder/Encoder.hpp +1 -2
@@ 4,7 4,6 @@
#pragma once

#include <memory>
#include <vfs.hpp>

namespace audio
{


@@ 40,7 39,7 @@ namespace audio

      protected:
        float position    = 0;
        vfs::FILE *fd     = nullptr;
        std::FILE *fd     = nullptr;
        uint32_t fileSize = 0;
        std::string filePath;


M module-audio/Audio/encoder/EncoderWAV.cpp => module-audio/Audio/encoder/EncoderWAV.cpp +3 -3
@@ 27,10 27,10 @@ namespace audio

    EncoderWAV::~EncoderWAV()
    {
        vfs.rewind(fd);
        std::rewind(fd);
        /* Update the wav file header save it into wav file */
        HeaderUpdate();
        if (vfs.fwrite(pHeaderBuff, 1, sizeof(WAVE_FormatTypeDef), fd) != sizeof(WAVE_FormatTypeDef)) {
        if (std::fwrite(pHeaderBuff, 1, sizeof(WAVE_FormatTypeDef), fd) != sizeof(WAVE_FormatTypeDef)) {
            LOG_ERROR("Updating WAV header failed");
        }
    }


@@ 40,7 40,7 @@ namespace audio
        /*
         * Write int16_t PCM samples to file.
         */
        auto byteswritten = vfs.fwrite(pcmData, sizeof(int16_t), samplesToWrite, fd);
        auto byteswritten = std::fwrite(pcmData, sizeof(int16_t), samplesToWrite, fd);
        if (byteswritten != samplesToWrite) {
            return 0;
        }

M module-audio/Audio/test/CMakeLists.txt => module-audio/Audio/test/CMakeLists.txt +1 -1
@@ 7,7 7,7 @@ add_catch2_executable(
    SRCS
        unittest_audio.cpp
    LIBS
        module-vfs module-audio
        module-audio
)

file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/testfiles" DESTINATION "${CMAKE_BINARY_DIR}")

M module-audio/Audio/test/unittest_audio.cpp => module-audio/Audio/test/unittest_audio.cpp +0 -9
@@ 17,15 17,6 @@
#include "Audio/Audio.hpp"
#include "Audio/Operation/Operation.hpp"

class vfs vfs;

struct vfs_initializer
{
    vfs_initializer()
    {
        vfs.Init();
    }
} vfs_init;

TEST_CASE("Test audio tags")
{

M module-audio/CMakeLists.txt => module-audio/CMakeLists.txt +0 -1
@@ 73,7 73,6 @@ target_link_libraries(${PROJECT_NAME}
    module-bsp
    module-os
    module-utils
    module-vfs
    module-sys
    tag
)

M module-utils/taglib => module-utils/taglib +1 -1
@@ 1,1 1,1 @@
Subproject commit b2a6e50aedf0cfe1f808eb23dc9f572a848ddffe
Subproject commit 96d449e4163de4f5d7b448bdb2aee303a746d89f