From 5b85288664f6f45172bb812a739e9b0cc8f1e974 Mon Sep 17 00:00:00 2001
From: Matthias Drochner <M.Drochner@fz-juelich.de>
Date: Wed, 28 Jan 2009 19:13:44 +0100
Subject: [PATCH] mikmod: call MikMod_Exit() only in the finish() method

Hi -
independently of libmikmod's other problems - there seems
to be a problem in mpd's wrapper: MikMod_Exit() is called
after the first file is decoded, which frees some ressources
within the mikmod library. An attempt to play a second file
leads to a crash. The appended patch fixes this for me.
(I don't know what the "dup" entry is good for - someone
who knows should review that too.)
best regards
Matthias

[mk: removed 3 more MikMod_Exit() invocations]
---
 NEWS                        | 1 +
 src/decoder/mikmod_plugin.c | 6 ------
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/NEWS b/NEWS
index d84422ad0..074b1ec17 100644
--- a/NEWS
+++ b/NEWS
@@ -38,6 +38,7 @@ ver 0.14.2 (2009/??/??)
 * decoders:
   - ffmpeg: added support for the tags comment, genre, year
   - wavpack: pass NULL if the .wvc file fails to open
+  - mikmod: call MikMod_Exit() only in the finish() method
 * audio outputs:
   - jack: allocate ring buffers before connecting
   - jack: clear "shutdown" flag on reconnect
diff --git a/src/decoder/mikmod_plugin.c b/src/decoder/mikmod_plugin.c
index 2fce23f7d..ad308dbe4 100644
--- a/src/decoder/mikmod_plugin.c
+++ b/src/decoder/mikmod_plugin.c
@@ -167,7 +167,6 @@ mod_decode(struct decoder *decoder, const char *path)
 
 	if (!(data = mod_open(path))) {
 		g_warning("failed to open mod: %s\n", path);
-		MikMod_Exit();
 		return;
 	}
 
@@ -190,8 +189,6 @@ mod_decode(struct decoder *decoder, const char *path)
 	}
 
 	mod_close(data);
-
-	MikMod_Exit();
 }
 
 static struct tag *modTagDup(const char *file)
@@ -207,7 +204,6 @@ static struct tag *modTagDup(const char *file)
 
 	if (moduleHandle == NULL) {
 		g_debug("modTagDup: Failed to open file: %s\n", file);
-		MikMod_Exit();
 		return NULL;
 
 	}
@@ -223,8 +219,6 @@ static struct tag *modTagDup(const char *file)
 	if (title)
 		tag_add_item(ret, TAG_ITEM_TITLE, title);
 
-	MikMod_Exit();
-
 	return ret;
 }