Skip to content

Commit 834c717

Browse files
Fix stream available bug. (#32)
1 parent ba57061 commit 834c717

File tree

1 file changed

+26
-41
lines changed

1 file changed

+26
-41
lines changed

src/ESP32_VS1053_Stream.cpp

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -286,8 +286,7 @@ bool ESP32_VS1053_Stream::connecttohost(const char *url, const char *username,
286286
stopSong();
287287
return false;
288288
}
289-
const auto BYTES_TO_READ =
290-
min(stream->available(), VS1053_MAX_PLAYLIST_READ);
289+
const auto BYTES_TO_READ = min(stream->available(), VS1053_MAX_PLAYLIST_READ);
291290
if (!BYTES_TO_READ)
292291
{
293292
log_e("playlist contains no data");
@@ -396,10 +395,10 @@ void ESP32_VS1053_Stream::_playFromRingBuffer()
396395
_ringbuffer_filled = true;
397396
}
398397

399-
const unsigned long start = millis();
400-
const auto MAX_TIME_MS = 15;
398+
const auto START_TIME_MS = millis();
399+
const auto MAX_TIME_MS = 10;
401400
size_t bytesToDecoder = 0;
402-
while (_remainingBytes && _vs1053->data_request() && millis() - start < MAX_TIME_MS)
401+
while (_remainingBytes && _vs1053->data_request() && millis() - START_TIME_MS < MAX_TIME_MS)
403402
{
404403
size_t size = 0;
405404
uint8_t *data = (uint8_t *)xRingbufferReceiveUpTo(_ringbuffer_handle, &size, pdMS_TO_TICKS(0), VS1053_PLAYBUFFER_SIZE);
@@ -428,35 +427,32 @@ void ESP32_VS1053_Stream::_playFromRingBuffer()
428427
bytesToDecoder += size;
429428
_remainingBytes -= _remainingBytes > 0 ? size : 0;
430429
}
431-
log_d("spend %lu ms stuffing %i bytes in decoder", millis() - start, bytesToDecoder);
430+
log_d("spend %lu ms stuffing %i bytes in decoder", millis() - START_TIME_MS, bytesToDecoder);
432431
}
433432

434433
void ESP32_VS1053_Stream::_streamToRingBuffer(WiFiClient *const stream)
435434
{
435+
const auto START_TIME_MS = millis();
436436
const auto MAX_TIME_MS = 10;
437-
const auto start = millis();
438437
size_t bytesToRingBuffer = 0;
439-
while (stream && stream->available() && _musicDataPosition < _metaDataStart && millis() - start < MAX_TIME_MS)
438+
while (stream && stream->available() && _musicDataPosition < _metaDataStart && millis() - START_TIME_MS < MAX_TIME_MS)
440439
{
441440
const size_t BYTES_AVAILABLE = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available();
442441
const size_t BYTES_TO_READ = min(BYTES_AVAILABLE, sizeof(_localbuffer));
443-
444-
if (xRingbufferGetCurFreeSize(_ringbuffer_handle) < BYTES_TO_READ || stream->available() < BYTES_TO_READ)
445-
break;
446-
447-
const int BYTES_IN_BUFFER = stream->readBytes(_localbuffer, BYTES_TO_READ);
442+
const size_t BYTES_SAFE_TO_MOVE = min(BYTES_TO_READ, xRingbufferGetCurFreeSize(_ringbuffer_handle));
443+
const size_t BYTES_IN_BUFFER = stream->readBytes(_localbuffer, min((size_t)stream->available(), BYTES_SAFE_TO_MOVE));
448444
const BaseType_t result = xRingbufferSend(_ringbuffer_handle, _localbuffer, BYTES_IN_BUFFER, pdMS_TO_TICKS(0));
449445
if (result == pdFALSE)
450446
{
451-
log_e("ringbuffer failed to receive %i bytes. Closing stream.");
447+
log_e("ringbuffer failed to receive %i bytes. Closing stream.", BYTES_IN_BUFFER);
452448
_remainingBytes = 0;
453449
return;
454450
}
455451

456452
bytesToRingBuffer += BYTES_IN_BUFFER;
457453
_musicDataPosition += _metaDataStart ? BYTES_IN_BUFFER : 0;
458454
}
459-
log_d("spend %lu ms stuffing %i bytes in ringbuffer", millis() - start, bytesToRingBuffer);
455+
log_d("spend %lu ms stuffing %i bytes in ringbuffer", millis() - START_TIME_MS, bytesToRingBuffer);
460456
}
461457

462458
void ESP32_VS1053_Stream::_handleStream(WiFiClient *const stream)
@@ -477,25 +473,21 @@ void ESP32_VS1053_Stream::_handleStream(WiFiClient *const stream)
477473
}
478474
else
479475
{
480-
const auto MAX_TIME_MS = 15;
481-
const auto start = millis();
476+
const auto START_TIME_MS = millis();
477+
const auto MAX_TIME_MS = 10;
482478
size_t bytesToDecoder = 0;
483479
while (stream && stream->available() && _vs1053->data_request() && _remainingBytes &&
484-
_musicDataPosition < _metaDataStart && millis() - start < MAX_TIME_MS)
480+
_musicDataPosition < _metaDataStart && millis() - START_TIME_MS < MAX_TIME_MS)
485481
{
486482
const size_t BYTES_AVAILABLE = _metaDataStart ? _metaDataStart - _musicDataPosition : stream->available();
487483
const size_t BYTES_TO_READ = min(BYTES_AVAILABLE, VS1053_PLAYBUFFER_SIZE);
488-
489-
if (stream->available() < BYTES_TO_READ)
490-
break;
491-
492-
const int BYTES_IN_BUFFER = stream->readBytes(_vs1053Buffer, BYTES_TO_READ);
484+
const size_t BYTES_IN_BUFFER = stream->readBytes(_vs1053Buffer, min((size_t)stream->available(), BYTES_TO_READ));
493485
_vs1053->playChunk(_vs1053Buffer, BYTES_IN_BUFFER);
494486
_remainingBytes -= _remainingBytes > 0 ? BYTES_IN_BUFFER : 0;
495487
_musicDataPosition += _metaDataStart ? BYTES_IN_BUFFER : 0;
496488
bytesToDecoder += BYTES_IN_BUFFER;
497489
}
498-
log_d("spend %lu ms stuffing %i bytes in decoder", millis() - start, bytesToDecoder);
490+
log_d("spend %lu ms stuffing %i bytes in decoder", millis() - START_TIME_MS, bytesToDecoder);
499491
}
500492

501493
if (stream && stream->available() && _metaDataStart && _musicDataPosition == _metaDataStart)
@@ -518,18 +510,15 @@ void ESP32_VS1053_Stream::_handleStream(WiFiClient *const stream)
518510

519511
void ESP32_VS1053_Stream::_chunkedStreamToRingBuffer(WiFiClient *const stream)
520512
{
513+
const auto START_TIME_MS = millis();
521514
const auto MAX_TIME_MS = 10;
522515
size_t bytesToRingBuffer = 0;
523-
const auto start = millis();
524-
while (stream && stream->available() && _bytesLeftInChunk && _musicDataPosition < _metaDataStart && millis() - start < MAX_TIME_MS)
516+
while (stream && stream->available() && _bytesLeftInChunk && _musicDataPosition < _metaDataStart && millis() - START_TIME_MS < MAX_TIME_MS)
525517
{
526518
const size_t BYTES_AVAILABLE = min(_bytesLeftInChunk, (size_t)_metaDataStart - _musicDataPosition);
527519
const size_t BYTES_TO_READ = min(BYTES_AVAILABLE, sizeof(_localbuffer));
528-
529-
if (xRingbufferGetCurFreeSize(_ringbuffer_handle) < BYTES_TO_READ || stream->available() < BYTES_TO_READ)
530-
break;
531-
532-
const int BYTES_IN_BUFFER = stream->readBytes(_localbuffer, BYTES_TO_READ);
520+
const size_t BYTES_SAFE_TO_MOVE = min(BYTES_TO_READ, xRingbufferGetCurFreeSize(_ringbuffer_handle));
521+
const size_t BYTES_IN_BUFFER = stream->readBytes(_localbuffer, min((size_t)stream->available(), BYTES_SAFE_TO_MOVE));
533522
const BaseType_t result = xRingbufferSend(_ringbuffer_handle, _localbuffer, BYTES_IN_BUFFER, pdMS_TO_TICKS(0));
534523
if (result == pdFALSE)
535524
{
@@ -542,7 +531,7 @@ void ESP32_VS1053_Stream::_chunkedStreamToRingBuffer(WiFiClient *const stream)
542531
bytesToRingBuffer += BYTES_IN_BUFFER;
543532
_musicDataPosition += _metaDataStart ? BYTES_IN_BUFFER : 0;
544533
}
545-
log_d("spend %lu ms stuffing %i bytes in ringbuffer", millis() - start, bytesToRingBuffer);
534+
log_d("spend %lu ms stuffing %i bytes in ringbuffer", millis() - START_TIME_MS, bytesToRingBuffer);
546535
}
547536

548537
void ESP32_VS1053_Stream::_handleChunkedStream(WiFiClient *const stream)
@@ -572,24 +561,20 @@ void ESP32_VS1053_Stream::_handleChunkedStream(WiFiClient *const stream)
572561
}
573562
else
574563
{
575-
const auto MAX_TIME_MS = 20;
576-
const auto start = millis();
564+
const auto START_TIME_MS = millis();
565+
const auto MAX_TIME_MS = 10;
577566
size_t bytesToDecoder = 0;
578-
while (stream && stream->available() && _bytesLeftInChunk && _vs1053->data_request() && _musicDataPosition < _metaDataStart && millis() - start < MAX_TIME_MS)
567+
while (stream && stream->available() && _bytesLeftInChunk && _vs1053->data_request() && _musicDataPosition < _metaDataStart && millis() - START_TIME_MS < MAX_TIME_MS)
579568
{
580569
const size_t BYTES_AVAILABLE = min(_bytesLeftInChunk, (size_t)_metaDataStart - _musicDataPosition);
581570
const size_t BYTES_TO_READ = min(BYTES_AVAILABLE, VS1053_PLAYBUFFER_SIZE);
582-
583-
if (stream->available() < BYTES_TO_READ)
584-
break;
585-
586-
const int BYTES_IN_BUFFER = stream->readBytes(_vs1053Buffer, BYTES_TO_READ);
571+
const size_t BYTES_IN_BUFFER = stream->readBytes(_vs1053Buffer, min((size_t)stream->available(), BYTES_TO_READ));
587572
_vs1053->playChunk(_vs1053Buffer, BYTES_IN_BUFFER);
588573
_bytesLeftInChunk -= BYTES_IN_BUFFER;
589574
_musicDataPosition += _metaDataStart ? BYTES_IN_BUFFER : 0;
590575
bytesToDecoder += BYTES_IN_BUFFER;
591576
}
592-
log_d("spend %lu ms stuffing %i bytes in decoder", millis() - start, bytesToDecoder);
577+
log_d("spend %lu ms stuffing %i bytes in decoder", millis() - START_TIME_MS, bytesToDecoder);
593578
}
594579

595580
if (stream && stream->available() && _metaDataStart && _musicDataPosition == _metaDataStart && _bytesLeftInChunk)

0 commit comments

Comments
 (0)