summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium42 <rubidium42@users.noreply.github.com>2021-05-03 17:40:19 +0200
committerGitHub <noreply@github.com>2021-05-03 16:40:19 +0100
commit6bd7f8816dfee1a5e697d18e30aad4b5ef7e320f (patch)
treee7891744d42e49cf1c0305c036c863a042af0195
parent08781d96ed385158a5b452be1779260a92204e4e (diff)
downloadopenttd-6bd7f8816dfee1a5e697d18e30aad4b5ef7e320f.tar.xz
Fix #9117, 04ce1f07: [Fluidsynth] Infinite wait when stopping song (#9181)
In FluidSynth 2.2.0 an extra state was added to denote stopping. To transition from this state to a stopped state the rendering needs to be running. Since 04ce1f07 locking was added that skipped the rendering when something else held a lock, so the state would never get to stopped and join would never return.
-rw-r--r--src/music/fluidsynth.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp
index 000432e1d..b5cbf46aa 100644
--- a/src/music/fluidsynth.cpp
+++ b/src/music/fluidsynth.cpp
@@ -163,14 +163,21 @@ void MusicDriver_FluidSynth::PlaySong(const MusicSongInfo &song)
void MusicDriver_FluidSynth::StopSong()
{
- std::lock_guard<std::mutex> lock{ _midi.synth_mutex };
+ {
+ std::lock_guard<std::mutex> lock{ _midi.synth_mutex };
+
+ if (!_midi.player) return;
- if (!_midi.player) return;
+ fluid_player_stop(_midi.player);
+ }
- fluid_player_stop(_midi.player);
+ /* The join must be run without lock as the Music rendering needs to be
+ * running so FluidSynth's internals can actually stop the playing. */
if (fluid_player_join(_midi.player) != FLUID_OK) {
DEBUG(driver, 0, "Could not join player");
}
+
+ std::lock_guard<std::mutex> lock{ _midi.synth_mutex };
delete_fluid_player(_midi.player);
fluid_synth_system_reset(_midi.synth);
fluid_synth_all_sounds_off(_midi.synth, -1);