diff options
author | rubidium42 <rubidium42@users.noreply.github.com> | 2021-05-03 17:40:19 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-03 16:40:19 +0100 |
commit | 6bd7f8816dfee1a5e697d18e30aad4b5ef7e320f (patch) | |
tree | e7891744d42e49cf1c0305c036c863a042af0195 | |
parent | 08781d96ed385158a5b452be1779260a92204e4e (diff) | |
download | openttd-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.cpp | 13 |
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); |