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.
This commit is contained in:
rubidium42 2021-05-03 17:40:19 +02:00 committed by GitHub
parent 08781d96ed
commit 6bd7f8816d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 3 deletions

View File

@ -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);