summaryrefslogtreecommitdiff
path: root/src/music/fluidsynth.cpp
diff options
context:
space:
mode:
authorRubidium <rubidium@openttd.org>2021-05-08 13:33:26 +0200
committerrubidium42 <rubidium42@users.noreply.github.com>2021-05-10 16:03:16 +0200
commit79fc094c54801bba83dc8aca2028fd6baf35965f (patch)
tree7efbdb1f1c7f4cc3b24496ec389315dae01192d5 /src/music/fluidsynth.cpp
parentc53d9991eed38177ad9b0e251b1e6f4cfb27191a (diff)
downloadopenttd-79fc094c54801bba83dc8aca2028fd6baf35965f.tar.xz
Cleanup: [Fluidsynth] Remove fluid_player_join
The function fluid_player_join in the library is broken beyond compare for the usecases it was used for (see their #872). It does not wait until it is safe to delete the player, so it is up to the end user to ensure that. For OpenTTD we acquire a lock before fluid_synth_write_s16 and we acquire the same lock in the stop function. So, only one of the functions can be doing its thing, meaning we do not need to wait for the player to be stopped as it cannot be doing anything as we prevent that by the lock.
Diffstat (limited to 'src/music/fluidsynth.cpp')
-rw-r--r--src/music/fluidsynth.cpp17
1 files changed, 4 insertions, 13 deletions
diff --git a/src/music/fluidsynth.cpp b/src/music/fluidsynth.cpp
index 061ade345..1c4b67e12 100644
--- a/src/music/fluidsynth.cpp
+++ b/src/music/fluidsynth.cpp
@@ -163,21 +163,12 @@ void MusicDriver_FluidSynth::PlaySong(const MusicSongInfo &song)
void MusicDriver_FluidSynth::StopSong()
{
- {
- std::lock_guard<std::mutex> lock{ _midi.synth_mutex };
-
- if (_midi.player == nullptr) return;
-
- fluid_player_stop(_midi.player);
- }
+ std::lock_guard<std::mutex> lock{ _midi.synth_mutex };
- /* 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");
- }
+ if (_midi.player == nullptr) return;
- std::lock_guard<std::mutex> lock{ _midi.synth_mutex };
+ fluid_player_stop(_midi.player);
+ /* No fluid_player_join needed */
delete_fluid_player(_midi.player);
fluid_synth_system_reset(_midi.synth);
fluid_synth_all_sounds_off(_midi.synth, -1);