From e8afb10f483a34f3679da1bbd015a9220364a6c7 Mon Sep 17 00:00:00 2001 From: David Madl Date: Sun, 22 Mar 2026 15:16:54 +0100 Subject: [PATCH] bug: tweak loop delay to fit music rate --- app/src/main/cpp/PlaybackEngine.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/cpp/PlaybackEngine.cpp b/app/src/main/cpp/PlaybackEngine.cpp index f22a607..3be2455 100644 --- a/app/src/main/cpp/PlaybackEngine.cpp +++ b/app/src/main/cpp/PlaybackEngine.cpp @@ -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; }