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* 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; int idebug = 0;
@@ -241,8 +242,8 @@ void PlaybackEngine::musicFeedThread() {
// (is it like double-buffering implemented in 'stretcher'?) // (is it like double-buffering implemented in 'stretcher'?)
if (num_samples == 0) { if (num_samples == 0) {
//LOGD("waiting for getSamplesRequired()"); LOGD("waiting %d us for getSamplesRequired()", loop_delay_us);
std::this_thread::sleep_for(std::chrono::milliseconds(loop_delay_ms)); std::this_thread::sleep_for(std::chrono::microseconds(loop_delay_us));
continue; continue;
} }
@@ -252,6 +253,7 @@ void PlaybackEngine::musicFeedThread() {
} }
if (!haveMusicFile.load()) { if (!haveMusicFile.load()) {
loop_delay_us = 1000000 * num_samples / playbackRate.load();
if(idebug++ < 10) { if(idebug++ < 10) {
LOGI("feed %d silence samples", num_samples); LOGI("feed %d silence samples", num_samples);
// 1024, 512, 512 // 1024, 512, 512
@@ -263,6 +265,7 @@ void PlaybackEngine::musicFeedThread() {
} }
if(idebug++ < 10) { if(idebug++ < 10) {
loop_delay_us = 1000000 * num_samples / musicFile->rate;
LOGI("feed %d music samples", num_samples); LOGI("feed %d music samples", num_samples);
// feed 1024 music samples // feed 1024 music samples
// => stretcher is asking for 1024 = getSamplesRequired() // => stretcher is asking for 1024 = getSamplesRequired()
@@ -275,14 +278,17 @@ void PlaybackEngine::musicFeedThread() {
musicFile->offset = 0; // unused here musicFile->offset = 0; // unused here
if (err != MPG123_OK && err != MPG123_DONE) { if (err != MPG123_OK && err != MPG123_DONE) {
// error! // 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 // next iteration will play silence
closeMusicFile(); closeMusicFile();
stretcher.setTimeRatio(1.0); // buffer size for playing silence is computed from 'playbackRate', so reset timeRatio
continue; continue;
} }
if(err == MPG123_DONE) { if(err == MPG123_DONE) {
// next iteration will play silence // next iteration will play silence
LOGI("finished reading mp3 file (MPG123_DONE)");
closeMusicFile(); closeMusicFile();
stretcher.setTimeRatio(1.0); // buffer size for playing silence is computed from 'playbackRate', so reset timeRatio
continue; continue;
} }