From a3e5ff8142cf3530cddcb27b58f871f387796ab6 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Sat, 6 Oct 2018 23:20:10 +0300 Subject: [PATCH] multiple mikmod player fixes from default (2.0) branch --- CHANGES | 4 ++++ dynamic_mod.c | 17 +++++++++++++++-- dynamic_mod.h | 12 ++++++++++-- music_mod.c | 15 +++++++++++---- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 9eb53f37..c116b3d4 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +1.2.13: +Paul P Komkoff Jr - Sun Jul 22 16:12:28 PDT 2012 + * Fixed malloc/free mismatch in the MikMod driver + 1.2.12: Sam Lantinga - Sat Jan 14 22:00:29 2012 -0500 * Fixed seek offset with SMPEG (was relative, should be absolute) diff --git a/dynamic_mod.c b/dynamic_mod.c index 7e3cd0af..82168eb5 100644 --- a/dynamic_mod.c +++ b/dynamic_mod.c @@ -59,7 +59,7 @@ int Mix_InitMOD() return -1; } mikmod.MikMod_Init = - (BOOL (*)(CHAR*)) + (int (*)(MIKMOD3_CONST CHAR*)) SDL_LoadFunction(mikmod.handle, "MikMod_Init"); if ( mikmod.MikMod_Init == NULL ) { SDL_UnloadObject(mikmod.handle); @@ -87,12 +87,19 @@ int Mix_InitMOD() return -1; } mikmod.MikMod_strerror = - (char* (*)(int)) + (MIKMOD3_CONST char* (*)(int)) SDL_LoadFunction(mikmod.handle, "MikMod_strerror"); if ( mikmod.MikMod_strerror == NULL ) { SDL_UnloadObject(mikmod.handle); return -1; } + mikmod.MikMod_free = + (void (*)(void*)) + SDL_LoadFunction(mikmod.handle, "MikMod_free"); + if ( mikmod.MikMod_free == NULL ) { + /* libmikmod 3.1 and earlier doesn't have it */ + mikmod.MikMod_free = free; + } mikmod.Player_Active = (BOOL (*)(void)) SDL_LoadFunction(mikmod.handle, "Player_Active"); @@ -239,6 +246,12 @@ int Mix_InitMOD() mikmod.MikMod_RegisterDriver = MikMod_RegisterDriver; mikmod.MikMod_errno = &MikMod_errno; mikmod.MikMod_strerror = MikMod_strerror; +#if (LIBMIKMOD_VERSION < 0x030200) || !defined(DMODE_NOISEREDUCTION) + /* libmikmod 3.2.0-beta2 or older */ + mikmod.MikMod_free = free; +#else + mikmod.MikMod_free = MikMod_free; +#endif mikmod.Player_Active = Player_Active; mikmod.Player_Free = Player_Free; mikmod.Player_LoadGeneric = Player_LoadGeneric; diff --git a/dynamic_mod.h b/dynamic_mod.h index 3561b151..b679cc72 100644 --- a/dynamic_mod.h +++ b/dynamic_mod.h @@ -23,6 +23,13 @@ #include "mikmod.h" +/* libmikmod >= 3.3.2 constified several funcs */ +#if (LIBMIKMOD_VERSION < 0x030302) +#define MIKMOD3_CONST +#else +#define MIKMOD3_CONST const +#endif + typedef struct { int loaded; void *handle; @@ -30,11 +37,12 @@ typedef struct { void (*MikMod_Exit)(void); CHAR* (*MikMod_InfoDriver)(void); CHAR* (*MikMod_InfoLoader)(void); - BOOL (*MikMod_Init)(CHAR*); + int (*MikMod_Init)(MIKMOD3_CONST CHAR*); void (*MikMod_RegisterAllLoaders)(void); void (*MikMod_RegisterDriver)(struct MDRIVER*); int* MikMod_errno; - char* (*MikMod_strerror)(int); + MIKMOD3_CONST char* (*MikMod_strerror)(int); + void (*MikMod_free)(void*); BOOL (*Player_Active)(void); void (*Player_Free)(MODULE*); MODULE* (*Player_LoadGeneric)(MREADER*,int,BOOL); diff --git a/music_mod.c b/music_mod.c index be179022..ecd9d5ee 100644 --- a/music_mod.c +++ b/music_mod.c @@ -109,13 +109,13 @@ int MOD_init(SDL_AudioSpec *mixerfmt) list = mikmod.MikMod_InfoDriver(); if ( list ) - free(list); + mikmod.MikMod_free(list); else mikmod.MikMod_RegisterDriver(mikmod.drv_nos); list = mikmod.MikMod_InfoLoader(); if ( list ) - free(list); + mikmod.MikMod_free(list); else mikmod.MikMod_RegisterAllLoaders(); @@ -144,18 +144,25 @@ void MOD_setvolume(MODULE *music, int volume) typedef struct { MREADER mr; + /* struct MREADER in libmikmod <= 3.2.0-beta2 + * doesn't have iobase members. adding them here + * so that if we compile against 3.2.0-beta2, we + * can still run OK against 3.2.0b3 and newer. */ + long iobase, prev_iobase; long offset; long eof; SDL_RWops *rw; } LMM_MREADER; -BOOL LMM_Seek(struct MREADER *mr,long to,int dir) +int LMM_Seek(struct MREADER *mr,long to,int dir) { LMM_MREADER* lmmmr = (LMM_MREADER*)mr; if ( dir == SEEK_SET ) { to += lmmmr->offset; + if (to < lmmmr->offset) + return -1; } - return (SDL_RWseek(lmmmr->rw, to, dir) < lmmmr->offset); + return (SDL_RWseek(lmmmr->rw, to, dir) < lmmmr->offset)? -1 : 0; } long LMM_Tell(struct MREADER *mr) {