Skip to content

Commit 5c76a17

Browse files
Fixed ringbuffer issues (#124)
* Fixed wasting a lot of time trying to read from an empty ringbuffer * Send very small packets if stream is radio * Cleanup * Remove unused `VS1053_PSRAM_MAX_MOVE` * Move 2048 bytes on anything with a size()
1 parent 3d42e74 commit 5c76a17

2 files changed

Lines changed: 29 additions & 15 deletions

File tree

src/ESP32_VS1053_Stream.cpp

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ bool ESP32_VS1053_Stream::connectToHost(const char *url, const char *username,
356356

357357
_remainingBytes = _http->getSize(); // -1 when Server sends no Content-Length header (chunked streams)
358358
_chunkedResponse = _http->header(ENCODING).equalsIgnoreCase("chunked") ? true : false;
359+
log_i("stream is %s", _chunkedResponse ? "chunked" : "normal");
359360
_offset = (_remainingBytes == -1) ? 0 : offset;
360361
_metaDataStart = _http->header(ICY_METAINT).toInt();
361362
_musicDataPosition = _metaDataStart ? 0 : -1;
@@ -420,7 +421,11 @@ void ESP32_VS1053_Stream::_playFromRingBuffer()
420421

421422
[[maybe_unused]] const auto startTimeMS = millis();
422423
size_t bytesToDecoder = 0;
423-
while (_remainingBytes && bytesToDecoder < 2048 && _vs1053->data_request())
424+
425+
const size_t MAX_MOVE = size() ? 2048 : 512; // everything without a size is radio so low bitrate
426+
427+
while (_remainingBytes && bytesToDecoder < MAX_MOVE &&
428+
_vs1053->data_request() && xRingbufferGetCurFreeSize(_ringbuffer_handle) < VS1053_PSRAM_BUFFER_SIZE)
424429
{
425430
size_t size = 0;
426431
size_t avail = min(VS1053_PLAYBUFFER_SIZE, (size_t)_remainingBytes);
@@ -459,15 +464,19 @@ void ESP32_VS1053_Stream::_playFromRingBuffer()
459464

460465
void ESP32_VS1053_Stream::_streamToRingBuffer(WiFiClient *stream)
461466
{
462-
[[maybe_unused]] const auto startTimeMS = millis();
463467
size_t bytesToRingBuffer = 0;
464-
while (_musicDataPosition < _metaDataStart && bytesToRingBuffer < 2048 &&
465-
xRingbufferGetCurFreeSize(_ringbuffer_handle) && stream->available())
468+
[[maybe_unused]] const auto startTimeMS = millis();
469+
470+
const size_t MAX_MOVE = size() ? 2048 : 512; // everything without a size is radio so low bitrate
471+
472+
if (_musicDataPosition < _metaDataStart &&
473+
xRingbufferGetCurFreeSize(_ringbuffer_handle) > 1024 && stream->available())
466474
{
467475
const size_t BYTES_AVAILABLE = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available();
468476
const size_t BYTES_READY_TO_MOVE = min(BYTES_AVAILABLE, xRingbufferGetCurFreeSize(_ringbuffer_handle));
469-
const size_t BYTES_SAFE_TO_MOVE = min(sizeof(_localbuffer), BYTES_READY_TO_MOVE);
477+
const size_t BYTES_SAFE_TO_MOVE = min(MAX_MOVE, BYTES_READY_TO_MOVE);
470478
const size_t BYTES_IN_BUFFER = stream->readBytes(_localbuffer, BYTES_SAFE_TO_MOVE);
479+
471480
const BaseType_t result = xRingbufferSend(_ringbuffer_handle, _localbuffer, BYTES_IN_BUFFER, 0);
472481
if (result == pdFALSE)
473482
{
@@ -508,7 +517,10 @@ void ESP32_VS1053_Stream::_handleStream(WiFiClient *stream)
508517

509518
[[maybe_unused]] const auto startTimeMS = millis();
510519
size_t bytesToDecoder = 0;
511-
while (_musicDataPosition < _metaDataStart && bytesToDecoder < 2048 &&
520+
521+
const size_t MAX_MOVE = size() ? 2048 : 512; // everything without a size is radio so low bitrate
522+
523+
while (_musicDataPosition < _metaDataStart && bytesToDecoder < MAX_MOVE &&
512524
stream->available() && _vs1053->data_request())
513525
{
514526
const size_t BYTES_AVAILABLE = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available();
@@ -545,14 +557,17 @@ void ESP32_VS1053_Stream::_chunkedStreamToRingBuffer(WiFiClient *stream)
545557
{
546558
[[maybe_unused]] const auto startTimeMS = millis();
547559
size_t bytesToRingBuffer = 0;
548-
while (_bytesLeftInChunk && _musicDataPosition < _metaDataStart && bytesToRingBuffer < VS1053_PSRAM_MAX_MOVE &&
549-
xRingbufferGetCurFreeSize(_ringbuffer_handle) && stream->available())
560+
561+
const size_t MAX_MOVE = size() ? 2048 : 512; // everything without a size is radio so low bitrate
562+
563+
if (_bytesLeftInChunk && _musicDataPosition < _metaDataStart &&
564+
xRingbufferGetCurFreeSize(_ringbuffer_handle) > 1024 && stream->available())
550565
{
551566
const size_t BYTES_BEFORE_META_DATA = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available();
552567
const size_t BYTES_AVAILABLE = min(_bytesLeftInChunk, BYTES_BEFORE_META_DATA);
553-
const size_t BYTES_TO_READ = min(BYTES_AVAILABLE, VS1053_PSRAM_MAX_MOVE);
568+
const size_t BYTES_TO_READ = min(BYTES_AVAILABLE, MAX_MOVE);
554569
const size_t BYTES_SAFE_TO_MOVE = min(BYTES_TO_READ, xRingbufferGetCurFreeSize(_ringbuffer_handle));
555-
const size_t BYTES_IN_BUFFER = stream->readBytes(_localbuffer, min((size_t)stream->available(), BYTES_SAFE_TO_MOVE));
570+
const size_t BYTES_IN_BUFFER = stream->readBytes(_localbuffer, BYTES_SAFE_TO_MOVE);
556571
const BaseType_t result = xRingbufferSend(_ringbuffer_handle, _localbuffer, BYTES_IN_BUFFER, 0);
557572
if (result == pdFALSE)
558573
{
@@ -593,7 +608,10 @@ void ESP32_VS1053_Stream::_handleChunkedStream(WiFiClient *stream)
593608

594609
[[maybe_unused]] const auto startTimeMS = millis();
595610
size_t bytesToDecoder = 0;
596-
while (_bytesLeftInChunk && _musicDataPosition < _metaDataStart && bytesToDecoder < VS1053_PSRAM_MAX_MOVE &&
611+
612+
const size_t MAX_MOVE = size() ? 2048 : 512; // everything without a size is radio so low bitrate
613+
614+
while (_bytesLeftInChunk && _musicDataPosition < _metaDataStart && bytesToDecoder < MAX_MOVE &&
597615
stream->available() && _vs1053->data_request())
598616
{
599617
const size_t BYTES_BEFORE_META_DATA = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available();

src/ESP32_VS1053_Stream.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
#define VS1053_PSRAM_BUFFER_SIZE 65536
2424

2525
constexpr size_t VS1053_LOCALBUFFER_SIZE = 4096; // need at least 4kB to safely receive ICY metadata
26-
constexpr size_t VS1053_PSRAM_MAX_MOVE = 2048;
2726
constexpr uint8_t VS1053_MAXVOLUME = 100;
2827
constexpr size_t VS1053_PLAYBUFFER_SIZE = 32;
2928

@@ -33,9 +32,6 @@ static_assert(VS1053_LOCALBUFFER_SIZE >= 4096,
3332
static_assert(VS1053_MAX_URL_LENGTH <= VS1053_LOCALBUFFER_SIZE,
3433
"VS1053_MAX_URL_LENGTH must be smaller than or equal to VS1053_LOCALBUFFER_SIZE");
3534

36-
static_assert(VS1053_PSRAM_MAX_MOVE <= VS1053_LOCALBUFFER_SIZE,
37-
"VS1053_PSRAM_MAX_MOVE must be smaller than or equal to VS1053_LOCALBUFFER_SIZE");
38-
3935
typedef void (*station_callback_t)(const char *name);
4036
typedef void (*codec_callback_t)(const char *codec);
4137
typedef void (*bitrate_callback_t)(uint32_t bitrate);

0 commit comments

Comments
 (0)