From 655fe5fd06515b1fb4166cb8b7376acffec2138a Mon Sep 17 00:00:00 2001 From: Mateusz Date: Thu, 1 Aug 2019 15:43:32 +0200 Subject: [PATCH] WiP: mp3 decoder optimization --- module-audio/Audio/Audio.cpp | 4 +- module-audio/Audio/decoder/decoderMP3.cpp | 9 +- .../board/rt1051/audio/rt1051_audiocodec.cpp | 97 ++++++------------- module-bsp/bsp/audio/bsp_audio.hpp | 3 +- .../service-audio/ServiceAudio.cpp | 2 +- source/main.cpp | 11 ++- 6 files changed, 46 insertions(+), 80 deletions(-) diff --git a/module-audio/Audio/Audio.cpp b/module-audio/Audio/Audio.cpp index f3e04311d..4aa4f895a 100644 --- a/module-audio/Audio/Audio.cpp +++ b/module-audio/Audio/Audio.cpp @@ -44,7 +44,7 @@ namespace audio { } int32_t Audio::SetOutputVolume(Volume vol) { - float volSet = 0; + float volSet = vol; if (vol > 1) { volSet = 1; } @@ -55,7 +55,7 @@ namespace audio { } int32_t Audio::SetInputGain(Gain gain) { - float gainToSet = 0; + float gainToSet = gain; if (gain > 10) { gainToSet = 10.0; } diff --git a/module-audio/Audio/decoder/decoderMP3.cpp b/module-audio/Audio/decoder/decoderMP3.cpp index 5cef87a5f..61471db55 100644 --- a/module-audio/Audio/decoder/decoderMP3.cpp +++ b/module-audio/Audio/decoder/decoderMP3.cpp @@ -77,10 +77,15 @@ namespace audio { vfs.rewind(fd); // Parse ID3 tags - // Allocate buffer for fetching initial part of MP3, 1Mbyte should be sufficient to fetch all necessary tags + // Allocate buffer for fetching two parts of MP3: init and last, 1Mbyte should be sufficient to fetch all necessary tags auto source = std::make_unique>(); - vfs.fread(&(*source)[0], 1, source->size(), fd); + // Read beginning of MP3(512kbytes) + vfs.fread(&(*source)[0], 1, source->size()/2, fd); + + // Read last section of MP3(512kbytes) + vfs.fseek(fd,-(source->size()/2),SEEK_END); + vfs.fread(&(*source)[source->size()/2], 1, source->size()/2, fd); if (atag::id3v2::is_tagged(*source)) { diff --git a/module-bsp/board/rt1051/audio/rt1051_audiocodec.cpp b/module-bsp/board/rt1051/audio/rt1051_audiocodec.cpp index bb8aea924..98ce6bf56 100644 --- a/module-bsp/board/rt1051/audio/rt1051_audiocodec.cpp +++ b/module-bsp/board/rt1051/audio/rt1051_audiocodec.cpp @@ -26,7 +26,9 @@ namespace bsp { int16_t RT1051Audiocodec::inBuffer[CODEC_CHANNEL_PCM_BUFFER_SIZE * 2] = {}; int16_t RT1051Audiocodec::outBuffer[CODEC_CHANNEL_PCM_BUFFER_SIZE * 2] = {}; - RT1051Audiocodec::RT1051Audiocodec(bsp::AudioDevice::audioCallback_t callback) : AudioDevice(callback), config{} { + RT1051Audiocodec::RT1051Audiocodec(bsp::AudioDevice::audioCallback_t callback) : AudioDevice(callback), + saiInFormat{}, saiOutFormat{}, + config{}, codecParams{}, codec{} { isInitialized = true; Init(); } @@ -38,9 +40,6 @@ namespace bsp { int32_t RT1051Audiocodec::Start(const bsp::AudioDevice::Format &format) { - uint32_t outChan = 0; - uint32_t inChan = 0; - saiInFormat.bitWidth = format.bitWidth; saiInFormat.sampleRate_Hz = format.sampleRate_Hz; @@ -49,57 +48,22 @@ namespace bsp { if (format.flags & static_cast(AudioDevice::Flags::InputLeft)) { - inChan++; - } - - if (format.flags & static_cast(AudioDevice::Flags::InputRight)) { - inChan++; + saiInFormat.stereo = kSAI_MonoLeft; + InStart(); + } else if (format.flags & static_cast(AudioDevice::Flags::InputRight)) { + saiInFormat.stereo = kSAI_MonoRight; + InStart(); + } else if (format.flags & static_cast(AudioDevice::Flags::InputStereo)) { + saiInFormat.stereo = kSAI_Stereo; + InStart(); } if (format.flags & static_cast(AudioDevice::Flags::OutputMono)) { - outChan++; - } - - if (format.flags & static_cast(AudioDevice::Flags::OutPutStereo)) { - outChan = 2; - } - - //Full duplex mono - if (inChan == 1 && outChan == 1) { - saiInFormat.stereo = kSAI_MonoLeft; - saiOutFormat.stereo = kSAI_MonoLeft; - InStart(); - OutStart(); - } - //Full duplex stereo - else if (inChan == 2 && outChan == 2) { - saiInFormat.stereo = kSAI_Stereo; - saiOutFormat.stereo = kSAI_Stereo; - InStart(); - OutStart(); - } - // Half duplex stereo out - else if (outChan == 2 && inChan == 0) { - saiOutFormat.stereo = kSAI_Stereo; - OutStart(); - } - // Half duplex stereo in - else if (inChan == 2 && outChan == 0) { - saiInFormat.stereo = kSAI_Stereo; - InStart(); - } - // Half duplex mono out - else if (outChan == 1 && inChan == 0) { saiOutFormat.stereo = kSAI_MonoLeft; OutStart(); - } - // Half duplex mono in - else if (inChan == 1 && outChan == 0) { - saiInFormat.stereo = kSAI_MonoRight; - InStart(); - } else { - //Not supported - LOG_ERROR("Format configuration not supported"); + } else if (format.flags & static_cast(AudioDevice::Flags::OutPutStereo)) { + saiOutFormat.stereo = kSAI_Stereo; + OutStart(); } codecParams.sampleRate = CodecParamsMAX98090::ValToSampleRate(format.sampleRate_Hz); @@ -107,23 +71,6 @@ namespace bsp { LOG_ERROR("Unsupported sample rate"); } - if (outChan) { - - if (xTaskCreate(outWorkerTask, "outaudiocodec", 1024, this, 0, &outWorkerThread) != pdPASS) { - LOG_ERROR("Error during creating output audiocodec task"); - } - - //Fill out buffer with data - GetAudioCallback()(nullptr, outBuffer, - RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE * 2); - } - - if (inChan) { - if (xTaskCreate(inWorkerTask, "inaudiocodec", 1024, this, 0, &inWorkerThread) != pdPASS) { - LOG_ERROR("Error during creating input audiocodec task"); - } - } - codecParams.inputPath = static_cast(format.inputPath); // TODO:M.P fix me codecParams.outputPath = static_cast(format.outputPath); // TODO:M.P fix me codecParams.outVolume = format.outputVolume; @@ -317,6 +264,10 @@ namespace bsp { xfer.data = saiInFormat.data; xfer.dataSize = saiInFormat.dataSize; SAI_TransferReceiveEDMA(BOARD_AUDIOCODEC_SAIx, &rxHandle, &xfer); + + if (xTaskCreate(inWorkerTask, "inaudiocodec", 1024, this, 0, &inWorkerThread) != pdPASS) { + LOG_ERROR("Error during creating input audiocodec task"); + } } void RT1051Audiocodec::OutStart() { @@ -351,6 +302,14 @@ namespace bsp { xfer.data = saiOutFormat.data; xfer.dataSize = saiOutFormat.dataSize; SAI_TransferSendEDMA(BOARD_AUDIOCODEC_SAIx, &txHandle, &xfer); + + if (xTaskCreate(outWorkerTask, "outaudiocodec", 7 * 1024, this, 0, &outWorkerThread) != pdPASS) { + LOG_ERROR("Error during creating output audiocodec task"); + } + + //Fill out buffer with data + GetAudioCallback()(nullptr, outBuffer, + RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE * 2); } void RT1051Audiocodec::OutStop() { @@ -383,7 +342,7 @@ namespace bsp { if (ulNotificationValue & static_cast(RT1051Audiocodec::irq_state_t::IRQStateHalfTransfer)) { auto framesFetched = inst->GetAudioCallback()(inst->inBuffer, nullptr, - RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE); + RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE); if (framesFetched == 0) { goto cleanup; } else if (framesFetched < RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE) { @@ -395,7 +354,7 @@ namespace bsp { if (ulNotificationValue & static_cast(RT1051Audiocodec::irq_state_t::IRQStateFullTransfer)) { auto framesFetched = inst->GetAudioCallback()( &inst->inBuffer[RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE], nullptr, - RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE); + RT1051Audiocodec::CODEC_CHANNEL_PCM_BUFFER_SIZE); if (framesFetched == 0) { goto cleanup; diff --git a/module-bsp/bsp/audio/bsp_audio.hpp b/module-bsp/bsp/audio/bsp_audio.hpp index 769e0253c..a6ac55cbc 100644 --- a/module-bsp/bsp/audio/bsp_audio.hpp +++ b/module-bsp/bsp/audio/bsp_audio.hpp @@ -47,7 +47,8 @@ namespace bsp { OutputMono = 1 << 0, OutPutStereo = 1 << 1, InputLeft = 1 << 2, - InputRight = 1 << 3 + InputRight = 1 << 3, + InputStereo = 1<< 4 }; using Format = struct { diff --git a/module-services/service-audio/ServiceAudio.cpp b/module-services/service-audio/ServiceAudio.cpp index 1a6e72e0c..54e3f747b 100644 --- a/module-services/service-audio/ServiceAudio.cpp +++ b/module-services/service-audio/ServiceAudio.cpp @@ -18,7 +18,7 @@ const char *ServiceAudio::serviceName = "ServiceAudio"; using namespace audio; -ServiceAudio::ServiceAudio() : sys::Service(serviceName, 4096, sys::ServicePriority::Idle), +ServiceAudio::ServiceAudio() : sys::Service(serviceName, 4096*2, sys::ServicePriority::Idle), audio([this](AudioEvents event) -> int32_t { switch (event) { case AudioEvents::EndOfFile: { diff --git a/source/main.cpp b/source/main.cpp index cb1fd0f5b..a8e81c7d6 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -58,11 +58,12 @@ public: // Invoked upon receiving data message sys::Message_t DataReceivedHandler(sys::DataMessage *msgl) override { - // auto ret = AudioServiceAPI::PlaybackStart(this,"/home/mateusz/Music/shortsample.mp3"); - //auto ret = AudioServiceAPI::PlaybackStart(this,"sys/audio/sample3.wav"); - auto ret = AudioServiceAPI::RecordingStart(this,"sys/audio/rec1mono.wav"); - vTaskDelay(3000); - ret = AudioServiceAPI::Stop(this); + //auto ret = AudioServiceAPI::PlaybackStart(this,"/home/mateusz/Music/limowreck.mp3"); + auto ret = AudioServiceAPI::PlaybackStart(this,"sys/audio/limowreck.mp3"); + AudioServiceAPI::SetOutputVolume(this,0.6); + //auto ret = AudioServiceAPI::RecordingStart(this,"sys/audio/rec1mono.wav"); + //vTaskDelay(3000); + //ret = AudioServiceAPI::Stop(this); return std::make_shared(); }