Changeset - r25373:3f8be7def389
[Not reviewed]
master
0 1 0
rubidium42 - 3 years ago 2021-05-03 15:40:19
rubidium42@users.noreply.github.com
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.
1 file changed with 10 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/music/fluidsynth.cpp
Show inline comments
 
@@ -163,14 +163,21 @@ void MusicDriver_FluidSynth::PlaySong(co
 

	
 
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);
0 comments (0 inline, 0 general)