Skip to content

Commit

Permalink
multiple mikmod player fixes from default (2.0) branch
Browse files Browse the repository at this point in the history
  • Loading branch information
sezero committed Oct 6, 2018
1 parent a8f83bc commit a3e5ff8
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 8 deletions.
4 changes: 4 additions & 0 deletions 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)
Expand Down
17 changes: 15 additions & 2 deletions dynamic_mod.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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;
Expand Down
12 changes: 10 additions & 2 deletions dynamic_mod.h
Expand Up @@ -23,18 +23,26 @@

#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;

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);
Expand Down
15 changes: 11 additions & 4 deletions music_mod.c
Expand Up @@ -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();

Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit a3e5ff8

Please sign in to comment.