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() {
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user