debug/fix: try sanitizing loop_delay_us to avoid endless musicFeedThread hangs

This commit is contained in:
2026-06-11 20:06:10 +02:00
parent 21645b9746
commit 6f39cecc25

View File

@@ -159,7 +159,9 @@ void PlaybackEngine::initRubberBand() {
void PlaybackEngine::closeRubberBand() { void PlaybackEngine::closeRubberBand() {
if(musicFeed) { if(musicFeed) {
exitMusicFeedThread.store(true); exitMusicFeedThread.store(true);
LOGI("PlaybackEngine: musicFeed->join() ...");
musicFeed->join(); musicFeed->join();
LOGI("PlaybackEngine: musicFeed->join() done.");
musicFeed = nullptr; musicFeed = nullptr;
} }
closeMusicFile(); closeMusicFile();
@@ -170,7 +172,9 @@ void PlaybackEngine::closeMusicFile() {
musicFile = nullptr; musicFile = nullptr;
if(android_fd) { if(android_fd) {
//close(android_fd); //close(android_fd);
LOGI("onTrackClosed(fd=%d) ...", android_fd);
if(listener) listener->onTrackClosed(android_fd); if(listener) listener->onTrackClosed(android_fd);
LOGI("onTrackClosed(fd=%d) done.", android_fd);
android_fd = 0; android_fd = 0;
} }
isSetMusic.store(false); isSetMusic.store(false);
@@ -231,7 +235,8 @@ void PlaybackEngine::musicFeedThread() {
int* channel_map = (int*) malloc(num_ch_out * sizeof(int)); 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) // 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; int idebug = 0;
@@ -305,7 +310,8 @@ void PlaybackEngine::musicFeedThread() {
} }
if (!haveMusicFile.load() || isPaused.load()) { 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) { if(idebug++ < 10) {
LOGI("feed %d silence samples", num_samples); LOGI("feed %d silence samples", num_samples);
// 1024, 512, 512 // 1024, 512, 512
@@ -320,7 +326,8 @@ void PlaybackEngine::musicFeedThread() {
} }
if(idebug++ < 10) { 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); 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()
@@ -456,7 +463,9 @@ void PlaybackEngine::stop() {
LOGI("PlaybackEngine::stop()"); LOGI("PlaybackEngine::stop()");
closeRubberBand(); closeRubberBand();
if (mPlayer) { if (mPlayer) {
LOGI("PlaybackEngine: mPlayer->stopAudio() ...");
mPlayer->stopAudio(); mPlayer->stopAudio();
LOGI("PlaybackEngine: mPlayer->stopAudio() done.");
delete mPlayer; delete mPlayer;
mPlayer = nullptr; mPlayer = nullptr;
} }