Bug#1034555: unblock: fluidsynth/2.3.1-2
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: fluidsynth@packages.debian.org, fluidsynth@packages.debian.org
Control: affects -1 + src:fluidsynth
Please unblock package fluidsynth
[ Reason ]
This revision fixes a regression that was introduced upstream between
the 2.3.0 and 2.3.1 releases and has been fixed in the 2.3.2 release.
[ Impact ]
The regression introduced a multi-second gap between looping MIDI
tracks. Since fluidsynth is the default renderer for MIDI music in
SDL2, this will affect *a lot* of games in Debian.
[ Tests ]
n/a
[ Risks ]
None, I'd say. The fix has been backported from the upstream GIT
repository and is in the 2.3.2 version, which has already been
released. The output of `git show -w c0e2ef` on the commit in question
has three lines of code changes, the rest is indentation:
--- a/src/midi/fluid_midi.c
+++ b/src/midi/fluid_midi.c
@@ -2179,6 +2179,8 @@ fluid_player_callback(void *data, unsigned int msec)
fluid_atomic_int_set(&player->seek_ticks, -1); /* clear seek_ticks */
}
+ if(fluid_list_next(player->currentfile) == NULL && player->loop == 0)
+ {
/* Once we've run out of MIDI events, keep playing until no voices are active */
if(status == FLUID_PLAYER_DONE && fluid_synth_get_active_voice_count(player->synth) > 0)
{
@@ -2207,6 +2209,7 @@ fluid_player_callback(void *data, unsigned int msec)
{
status = FLUID_PLAYER_PLAYING;
}
+ }
/* Once there's no reason to keep playing, we're actually done */
if(status == FLUID_PLAYER_DONE)
[ Checklist ]
[X] all changes are documented in the d/changelog
[X] I reviewed all changes and I approve them
[X] attach debdiff against the package in testing
[ Other info ]
n/a
unblock fluidsynth/2.3.1-2
diff -Nru fluidsynth-2.3.1/debian/changelog fluidsynth-2.3.1/debian/changelog
--- fluidsynth-2.3.1/debian/changelog 2022-12-30 16:10:11.000000000 +0100
+++ fluidsynth-2.3.1/debian/changelog 2023-04-18 07:48:30.000000000 +0200
@@ -1,3 +1,11 @@
+fluidsynth (2.3.1-2) unstable; urgency=medium
+
+ * Team upload.
+ * Apply patch from upstream to fix seamless looping between MIDI
+ files.
+
+ -- Fabian Greffrath <fabian@debian.org> Tue, 18 Apr 2023 07:48:30 +0200
+
fluidsynth (2.3.1-1) unstable; urgency=medium
* New upstream version 2.3.1
diff -Nru fluidsynth-2.3.1/debian/patches/0046-Fix-seamless-looping-between-MIDI-files.patch fluidsynth-2.3.1/debian/patches/0046-Fix-seamless-looping-between-MIDI-files.patch
--- fluidsynth-2.3.1/debian/patches/0046-Fix-seamless-looping-between-MIDI-files.patch 1970-01-01 01:00:00.000000000 +0100
+++ fluidsynth-2.3.1/debian/patches/0046-Fix-seamless-looping-between-MIDI-files.patch 2023-04-18 07:47:25.000000000 +0200
@@ -0,0 +1,76 @@
+From c0e2ef4243b83f29620b2078fc0f1198bafd7d90 Mon Sep 17 00:00:00 2001
+From: derselbst <tom.mbrt@googlemail.com>
+Date: Sun, 2 Apr 2023 17:31:24 +0200
+Subject: [PATCH 46/49] Fix seamless looping between MIDI files
+
+Fixes #1227
+---
+ src/midi/fluid_midi.c | 45 +++++++++++++++++++++++--------------------
+ 1 file changed, 24 insertions(+), 21 deletions(-)
+
+diff --git a/src/midi/fluid_midi.c b/src/midi/fluid_midi.c
+index 0676c452..b72c3914 100644
+--- a/src/midi/fluid_midi.c
++++ b/src/midi/fluid_midi.c
+@@ -2178,34 +2178,37 @@ fluid_player_callback(void *data, unsigned int msec)
+ player->start_msec = msec; /* should be the (synth)-time of the last tempo change */
+ fluid_atomic_int_set(&player->seek_ticks, -1); /* clear seek_ticks */
+ }
+-
+- /* Once we've run out of MIDI events, keep playing until no voices are active */
+- if(status == FLUID_PLAYER_DONE && fluid_synth_get_active_voice_count(player->synth) > 0)
++
++ if(fluid_list_next(player->currentfile) == NULL && player->loop == 0)
+ {
+- /* The first time we notice we've run out of MIDI events but there are still active voices, disable all hold pedals */
+- if(!player->end_pedals_disabled)
++ /* Once we've run out of MIDI events, keep playing until no voices are active */
++ if(status == FLUID_PLAYER_DONE && fluid_synth_get_active_voice_count(player->synth) > 0)
+ {
+- for(i = 0; i < synth->midi_channels; i++)
++ /* The first time we notice we've run out of MIDI events but there are still active voices, disable all hold pedals */
++ if(!player->end_pedals_disabled)
+ {
+- fluid_synth_cc(player->synth, i, SUSTAIN_SWITCH, 0);
+- fluid_synth_cc(player->synth, i, SOSTENUTO_SWITCH, 0);
++ for(i = 0; i < synth->midi_channels; i++)
++ {
++ fluid_synth_cc(player->synth, i, SUSTAIN_SWITCH, 0);
++ fluid_synth_cc(player->synth, i, SOSTENUTO_SWITCH, 0);
++ }
++
++ player->end_pedals_disabled = 1;
+ }
+
+- player->end_pedals_disabled = 1;
++ status = FLUID_PLAYER_PLAYING;
+ }
+
+- status = FLUID_PLAYER_PLAYING;
+- }
+-
+- /* Once no voices are active, if end_msec hasn't been scheduled, schedule it so we wait for reverb, etc to finish */
+- if(status == FLUID_PLAYER_DONE && player->end_msec < 0)
+- {
+- player->end_msec = msec + FLUID_PLAYER_STOP_GRACE_MS;
+- }
+- /* If end_msec has been scheduled and is in the future, keep playing */
+- if (player->end_msec >= 0 && msec < (unsigned int) player->end_msec)
+- {
+- status = FLUID_PLAYER_PLAYING;
++ /* Once no voices are active, if end_msec hasn't been scheduled, schedule it so we wait for reverb, etc to finish */
++ if(status == FLUID_PLAYER_DONE && player->end_msec < 0)
++ {
++ player->end_msec = msec + FLUID_PLAYER_STOP_GRACE_MS;
++ }
++ /* If end_msec has been scheduled and is in the future, keep playing */
++ if (player->end_msec >= 0 && msec < (unsigned int) player->end_msec)
++ {
++ status = FLUID_PLAYER_PLAYING;
++ }
+ }
+
+ /* Once there's no reason to keep playing, we're actually done */
+--
+2.39.2
+
diff -Nru fluidsynth-2.3.1/debian/patches/series fluidsynth-2.3.1/debian/patches/series
--- fluidsynth-2.3.1/debian/patches/series 1970-01-01 01:00:00.000000000 +0100
+++ fluidsynth-2.3.1/debian/patches/series 2023-04-18 07:47:25.000000000 +0200
@@ -0,0 +1 @@
+0046-Fix-seamless-looping-between-MIDI-files.patch
Reply to: