diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp index 000432e1da..b5cbf46aa1 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 lock{ _midi.synth_mutex }; + { + std::lock_guard 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 lock{ _midi.synth_mutex }; delete_fluid_player(_midi.player); fluid_synth_system_reset(_midi.synth); fluid_synth_all_sounds_off(_midi.synth, -1);