bug: tweak loop delay to fit music rate

This commit is contained in:
2026-03-22 15:16:54 +01:00
parent cc1a2b5b7a
commit e8afb10f48

View File

@@ -209,7 +209,8 @@ void PlaybackEngine::musicFeedThread() {
int* channel_map = (int*) malloc(num_ch_out * sizeof(int));
int loop_delay_ms = 1000 * buf_size_samples / playbackRate.load();
// initial guess, as long as we do not have a music file (otherwise we should divide by mp3->rate)
size_t loop_delay_us = 1000000 * buf_size_samples / playbackRate.load();
int idebug = 0;
@@ -241,8 +242,8 @@ void PlaybackEngine::musicFeedThread() {
// (is it like double-buffering implemented in 'stretcher'?)
if (num_samples == 0) {
//LOGD("waiting for getSamplesRequired()");
std::this_thread::sleep_for(std::chrono::milliseconds(loop_delay_ms));
LOGD("waiting %d us for getSamplesRequired()", loop_delay_us);
std::this_thread::sleep_for(std::chrono::microseconds(loop_delay_us));
continue;
}
@@ -252,6 +253,7 @@ void PlaybackEngine::musicFeedThread() {
}
if (!haveMusicFile.load()) {
loop_delay_us = 1000000 * num_samples / playbackRate.load();
if(idebug++ < 10) {
LOGI("feed %d silence samples", num_samples);
// 1024, 512, 512
@@ -263,6 +265,7 @@ void PlaybackEngine::musicFeedThread() {
}
if(idebug++ < 10) {
loop_delay_us = 1000000 * num_samples / musicFile->rate;
LOGI("feed %d music samples", num_samples);
// feed 1024 music samples
// => stretcher is asking for 1024 = getSamplesRequired()
@@ -275,14 +278,17 @@ void PlaybackEngine::musicFeedThread() {
musicFile->offset = 0; // unused here
if (err != MPG123_OK && err != MPG123_DONE) {
// error!
LOGE("mpg123_read() err=%d done=%d", err, done);
LOGE("error reading mp3 file: mpg123_read() err=%d done=%d", err, done);
// next iteration will play silence
closeMusicFile();
stretcher.setTimeRatio(1.0); // buffer size for playing silence is computed from 'playbackRate', so reset timeRatio
continue;
}
if(err == MPG123_DONE) {
// next iteration will play silence
LOGI("finished reading mp3 file (MPG123_DONE)");
closeMusicFile();
stretcher.setTimeRatio(1.0); // buffer size for playing silence is computed from 'playbackRate', so reset timeRatio
continue;
}