debug/fix: try sanitizing loop_delay_us to avoid endless musicFeedThread hangs
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user