Skip to content

Commit ac0b1bf

Browse files
Fixed wav files overfill buffer with metadata (#121)
* Fixed WAV files overfill buffer with metadata * WAV plays stable as a stream - with noise at the eof if metadata is included
1 parent 15907eb commit ac0b1bf

2 files changed

Lines changed: 43 additions & 6 deletions

File tree

src/ESP32_VS1053_Stream.cpp

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
859894
void ESP32_VS1053_Stream::_handleLocalFile()
860895
{
861896
if (!_file)

src/ESP32_VS1053_Stream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ class ESP32_VS1053_Stream
167167
uint8_t _decoderSyncAttempts = 0;
168168
uint32_t _bitrate = 0;
169169

170+
size_t _fileLastWAVByte();
171+
170172
size_t _bufferIndex = 0;
171173
size_t _bufferFill = 0;
172174

0 commit comments

Comments
 (0)