From 6f39cecc25e1bfd772db3f4ed8c33e7223a2cf3e Mon Sep 17 00:00:00 2001 From: David Madl Date: Thu, 11 Jun 2026 20:06:10 +0200 Subject: [PATCH] debug/fix: try sanitizing loop_delay_us to avoid endless musicFeedThread hangs --- app/src/main/cpp/PlaybackEngine.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/PlaybackEngine.cpp b/app/src/main/cpp/PlaybackEngine.cpp index 5d3b84c..f7a029d 100644 --- a/app/src/main/cpp/PlaybackEngine.cpp +++ b/app/src/main/cpp/PlaybackEngine.cpp @@ -159,7 +159,9 @@ void PlaybackEngine::initRubberBand() { void PlaybackEngine::closeRubberBand() { if(musicFeed) { exitMusicFeedThread.store(true); + LOGI("PlaybackEngine: musicFeed->join() ..."); musicFeed->join(); + LOGI("PlaybackEngine: musicFeed->join() done."); musicFeed = nullptr; } closeMusicFile(); @@ -170,7 +172,9 @@ void PlaybackEngine::closeMusicFile() { musicFile = nullptr; if(android_fd) { //close(android_fd); + LOGI("onTrackClosed(fd=%d) ...", android_fd); if(listener) listener->onTrackClosed(android_fd); + LOGI("onTrackClosed(fd=%d) done.", android_fd); android_fd = 0; } isSetMusic.store(false); @@ -231,7 +235,8 @@ void PlaybackEngine::musicFeedThread() { int* channel_map = (int*) malloc(num_ch_out * sizeof(int)); // 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(); + size_t pr = std::max(1, playbackRate.load()); + size_t loop_delay_us = std::min((size_t) 50000, (size_t) 1000000 * buf_size_samples / pr); int idebug = 0; @@ -305,7 +310,8 @@ void PlaybackEngine::musicFeedThread() { } if (!haveMusicFile.load() || isPaused.load()) { - loop_delay_us = 1000000 * num_samples / playbackRate.load(); + pr = std::max(1, playbackRate.load()); + loop_delay_us = std::min((size_t) 50000, (size_t) 1000000 * num_samples / pr); if(idebug++ < 10) { LOGI("feed %d silence samples", num_samples); // 1024, 512, 512 @@ -320,7 +326,8 @@ void PlaybackEngine::musicFeedThread() { } if(idebug++ < 10) { - loop_delay_us = 1000000 * num_samples / musicFile->rate; + pr = std::max(1L, musicFile->rate); + loop_delay_us = std::min((size_t) 50000, (size_t) 1000000 * num_samples / pr); LOGI("feed %d music samples", num_samples); // feed 1024 music samples // => stretcher is asking for 1024 = getSamplesRequired() @@ -456,7 +463,9 @@ void PlaybackEngine::stop() { LOGI("PlaybackEngine::stop()"); closeRubberBand(); if (mPlayer) { + LOGI("PlaybackEngine: mPlayer->stopAudio() ..."); mPlayer->stopAudio(); + LOGI("PlaybackEngine: mPlayer->stopAudio() done."); delete mPlayer; mPlayer = nullptr; }