@@ -420,7 +420,7 @@ void ESP32_VS1053_Stream::_playFromRingBuffer()
420420
421421 [[maybe_unused]] const auto startTimeMS = millis ();
422422 size_t bytesToDecoder = 0 ;
423- while (_remainingBytes && _vs1053->data_request ())
423+ while (_remainingBytes && bytesToDecoder < 2048 && _vs1053->data_request ())
424424 {
425425 size_t size = 0 ;
426426 size_t avail = min (VS1053_PLAYBUFFER_SIZE, (size_t )_remainingBytes);
@@ -461,13 +461,13 @@ void ESP32_VS1053_Stream::_streamToRingBuffer(WiFiClient *stream)
461461{
462462 [[maybe_unused]] const auto startTimeMS = millis ();
463463 size_t bytesToRingBuffer = 0 ;
464- while (_musicDataPosition < _metaDataStart && bytesToRingBuffer < VS1053_PSRAM_MAX_MOVE &&
464+ while (_musicDataPosition < _metaDataStart && bytesToRingBuffer < 2048 &&
465465 xRingbufferGetCurFreeSize (_ringbuffer_handle) && stream->available ())
466466 {
467467 const size_t BYTES_AVAILABLE = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available ();
468- const size_t BYTES_TO_READ = min (BYTES_AVAILABLE, VS1053_PSRAM_MAX_MOVE );
469- const size_t BYTES_SAFE_TO_MOVE = min (BYTES_TO_READ, xRingbufferGetCurFreeSize (_ringbuffer_handle) );
470- const size_t BYTES_IN_BUFFER = stream->readBytes (_localbuffer, min (( size_t )stream-> available (), BYTES_SAFE_TO_MOVE) );
468+ 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 );
470+ const size_t BYTES_IN_BUFFER = stream->readBytes (_localbuffer, BYTES_SAFE_TO_MOVE);
471471 const BaseType_t result = xRingbufferSend (_ringbuffer_handle, _localbuffer, BYTES_IN_BUFFER, 0 );
472472 if (result == pdFALSE)
473473 {
@@ -839,6 +839,12 @@ bool ESP32_VS1053_Stream::connectToFile(fs::FS &fs, const char *filename, const
839839 return false ;
840840 }
841841
842+ const char *ext = strrchr (filename, ' .' );
843+ if (ext && strcasecmp (ext, " .wav" ) == 0 )
844+ _remainingBytes = _fileLastWAVByte () - offset;
845+ else
846+ _remainingBytes = _file.size () - offset;
847+
842848 _file.seek (offset);
843849 if (strcmp (filename, _url))
844850 {
@@ -847,7 +853,6 @@ bool ESP32_VS1053_Stream::connectToFile(fs::FS &fs, const char *filename, const
847853 _vs1053->startSong ();
848854 }
849855 _playingFile = true ;
850- _remainingBytes = _file.size () - offset;
851856 _bufferIndex = 0 ;
852857 _bufferFill = 0 ;
853858 _bitrateTimer = millis ();
@@ -856,6 +861,36 @@ bool ESP32_VS1053_Stream::connectToFile(fs::FS &fs, const char *filename, const
856861 return true ;
857862}
858863
864+ size_t ESP32_VS1053_Stream::_fileLastWAVByte ()
865+ {
866+ _file.seek (12 ); // skip RIFF header
867+
868+ while (true )
869+ {
870+ char chunkId[4 ];
871+ uint32_t chunkSize;
872+
873+ if (_file.read ((uint8_t *)chunkId, 4 ) != 4 )
874+ break ;
875+
876+ if (_file.read ((uint8_t *)&chunkSize, 4 ) != 4 )
877+ break ;
878+
879+ if (memcmp (chunkId, " data" , 4 ) == 0 )
880+ {
881+ size_t dataStart = _file.position ();
882+ log_d (" last playable byte: %lu" , dataStart + chunkSize);
883+ return dataStart + chunkSize;
884+ }
885+
886+ // skip this chunk
887+ _file.seek (_file.position () + chunkSize);
888+ }
889+
890+ // fallback if not found
891+ return _file.size ();
892+ }
893+
859894void ESP32_VS1053_Stream::_handleLocalFile ()
860895{
861896 if (!_file)
0 commit comments