SDL_mixer: timidity.c: fix memory leaks in Timidity_FreeSong() when using soundfonts,

From 617c90053ca3fec9e8effe956f1c4a503b122652 Mon Sep 17 00:00:00 2001
From: sezero <[EMAIL REDACTED]>
Date: Thu, 31 Jul 2025 05:56:10 +0300
Subject: [PATCH] timidity.c: fix memory leaks in Timidity_FreeSong() when
 using soundfonts,

call end_soundfont() in Timidity_Exit().
---
 src/timidity/timidity.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/timidity/timidity.c b/src/timidity/timidity.c
index 21b13559..fcf24c21 100644
--- a/src/timidity/timidity.c
+++ b/src/timidity/timidity.c
@@ -679,13 +679,23 @@ MidiSong *Timidity_LoadSong(SDL_IOStream *io, const SDL_AudioSpec *audio)
 
 void Timidity_FreeSong(MidiSong *song)
 {
-  int i;
+  int i, j;
 
   if (!song) return;
 
   free_instruments(song);
 
   for (i = 0; i < 128; i++) {
+    if (!master_tonebank[i] && song->tonebank[i]) { /* might be alloc'ed by sndfont */
+      for (j = 0; j < 128; j++)
+        SDL_free(song->tonebank[i]->tone[j].name);
+      SDL_free(song->tonebank[i]->tone);
+    }
+    if (!master_drumset[i] && song->drumset[i]) {   /* might be alloc'ed by sndfont */
+      for (j = 0; j < 128; j++)
+        SDL_free(song->drumset[i]->tone[j].name);
+      SDL_free(song->drumset[i]->tone);
+    }
     SDL_free(song->tonebank[i]);
     SDL_free(song->drumset[i]);
   }
@@ -726,6 +736,7 @@ void Timidity_Exit(void)
     }
   }
 
+  end_soundfont();
   SDL_free(sf_file);
   sf_file = NULL;
   sf_order = 0;