From fa2b59df4b4dd0b480b3ee8d71d810e207cd806b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 15 May 2017 22:25:39 +0200 Subject: [PATCH] Main: cap buffer_before_play at 80% to prevent deadlock Closes #34 --- NEWS | 1 + src/Main.cxx | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/NEWS b/NEWS index f81782417..b04e8cae9 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ ver 0.20.7 (not yet released) * database - simple: fix false positive directory loop detection with NFS * enforce a reasonable minimum audio_buffer_size setting +* cap buffer_before_play at 80% to prevent deadlock * fix random crashes when compiled with clang ver 0.20.6 (2017/03/10) diff --git a/src/Main.cxx b/src/Main.cxx index 5e7610880..a431aa4ec 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -340,6 +340,19 @@ initialize_decoder_and_player(const ReplayGainConfig &replay_gain_config) "than 100 percent, line %i", param->value.c_str(), param->line); } + + if (perc > 80) { + /* this upper limit should avoid deadlocks + which can occur because the DecoderThread + cannot ever fill the music buffer to + exactly 100%; a few chunks always need to + be available to generate silence in + Player::SendSilence() */ + FormatError(config_domain, + "buffer_before_play is too large (%f%%), capping at 80%%; please fix your configuration", + perc); + perc = 80; + } } else perc = DEFAULT_BUFFER_BEFORE_PLAY;