84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
/**
|
|
* @file mp3-BufferRTOS.ino
|
|
* @author Phil Schatzmann
|
|
* @brief Performance test for mp3 decoding form SD on core 1 and pass the data
|
|
* to core 0;
|
|
* @version 0.1
|
|
* @date 2022-12-06
|
|
*
|
|
* @copyright Copyright (c) 2022
|
|
*
|
|
*/
|
|
#include "AudioTools.h"
|
|
#include "AudioTools/AudioCodecs/CodecMP3Helix.h"
|
|
#include "AudioTools/AudioLibs/AudioBoardStream.h"
|
|
#include "AudioTools/AudioLibs/Concurrency.h"
|
|
#include "AudioTools/Disk/AudioSourceSDFAT.h"
|
|
|
|
const int buffer_count = 30;
|
|
const int buffer_size = 512;
|
|
const char *startFilePath = "/";
|
|
const char *ext = "mp3";
|
|
AudioSourceSDFAT source(startFilePath, ext, PIN_AUDIO_KIT_SD_CARD_CS);
|
|
MP3DecoderHelix decoder;
|
|
SynchronizedNBuffer buffer(buffer_size, buffer_count, portMAX_DELAY,
|
|
10);
|
|
QueueStream<uint8_t> out(buffer); // convert Buffer to Stream
|
|
AudioPlayer player(source, out, decoder);
|
|
int32_t get_data(uint8_t *data, int32_t bytes);
|
|
uint8_t data[buffer_size];
|
|
|
|
// Performance measurement: Receive data on core 0
|
|
Task task("name", 10000, 10, 0);
|
|
|
|
// Provide data to A2DP
|
|
int32_t get_data(uint8_t *data, int32_t bytes) {
|
|
size_t result_bytes = buffer.readArray(data, bytes);
|
|
// LOGI("get_data_channels %d -> %d of (%d)", bytes, result_bytes ,
|
|
// buffer.available());
|
|
return result_bytes;
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
|
|
|
|
// sd_active is setting up SPI with the right SD pins by calling
|
|
SPI.begin(PIN_AUDIO_KIT_SD_CARD_CLK, PIN_AUDIO_KIT_SD_CARD_MISO,
|
|
PIN_AUDIO_KIT_SD_CARD_MOSI, PIN_AUDIO_KIT_SD_CARD_CS);
|
|
|
|
// start QueueStream
|
|
out.begin();
|
|
|
|
// setup player
|
|
player.setDelayIfOutputFull(0);
|
|
player.setVolume(0.1);
|
|
player.begin();
|
|
|
|
// fill buffer with some data
|
|
player.getStreamCopy().copyN(5);
|
|
|
|
// start the task on kernel 0
|
|
task.begin([]() {
|
|
uint64_t start = millis();
|
|
size_t bytes = 0;
|
|
for (int i = 0; i < 100; i++) {
|
|
bytes += get_data(data, buffer_size);
|
|
}
|
|
// yield();
|
|
uint64_t timeMs = millis() - start;
|
|
// prevent div by 0
|
|
if (timeMs == 0) {
|
|
timeMs = 1;
|
|
}
|
|
// calculate samples per second
|
|
size_t samples_per_second = bytes / timeMs * 1000 / 4;
|
|
Serial.print("Samples per second: ");
|
|
Serial.println(samples_per_second);
|
|
});
|
|
}
|
|
|
|
void loop() {
|
|
// decode data to buffer
|
|
player.copy();
|
|
} |