@@ -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
460465void 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 ();
0 commit comments