Skip to content

Commit

Permalink
Matt - Wed, 12 Apr 2000 15:36:13 -0700
Browse files Browse the repository at this point in the history
 * Added SDL_RWops support for mikmod loading (not hooked into music.c yet)
  • Loading branch information
Sam Lantinga committed May 8, 2000
1 parent 25cd1ba commit 27fd8af
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGES
@@ -1,4 +1,8 @@

1.0.6:
Matt - Wed, 12 Apr 2000 15:36:13 -0700
* Added SDL_RWops support for mikmod loading (not hooked into music.c yet)

1.0.5:
Paul Furber - Fri Mar 3 14:58:50 PST 2000
* Fixed MP3 detection with compilers that use signed char datatypes
Expand Down
6 changes: 6 additions & 0 deletions SDL_mixer.h
Expand Up @@ -85,6 +85,12 @@ extern DECLSPEC Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc);
#define Mix_LoadWAV(file) Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1)
extern DECLSPEC Mix_Music *Mix_LoadMUS(const char *file);

#if 0 /* This hasn't been hooked into music.c yet */
/* Load a music file from an SDL_RWop object (MikMod-specific currently)
Matt Campbell (matt@campbellhome.dhs.org) April 2000 */
extern DECLSPEC Mix_Music *Mix_LoadMUS_RW(SDL_RWops *rw);
#endif

/* Load a wave file of the mixer format from a memory buffer */
extern DECLSPEC Mix_Chunk *Mix_QuickLoad_WAV(Uint8 *mem);

Expand Down
4 changes: 4 additions & 0 deletions configure.in
Expand Up @@ -64,6 +64,10 @@ AM_PATH_SDL($SDL_VERSION,
CFLAGS="$CFLAGS $SDL_CFLAGS"
LIBS="$LIBS $SDL_LIBS"

dnl Flag for using SDL_RWops
dnl Matt Campbell (matt@campbellhome.dhs.org)
CFLAGS="$CFLAGS -DUSE_RWOPS"

dnl Check command-line options
AC_ARG_ENABLE(music-cmd,
[ --enable-music-cmd support an external music player [default=yes]],
Expand Down
6 changes: 6 additions & 0 deletions mikmod/mikmod.h
Expand Up @@ -519,6 +519,12 @@ MIKMODAPI extern struct MLOADER load_xm; /* FastTracker 2 (by Triton) */
* ========== Module player
*/

/* SDL_RWops compatability */
#ifdef USE_RWOPS
#include "SDL_rwops.h"
MIKMODAPI extern MODULE* Player_LoadRW(SDL_RWops*,int,BOOL);
#endif /* USE_RWOPS */
/* End SDL_RWops compatability */
MIKMODAPI extern MODULE* Player_Load(CHAR*,int,BOOL);
MIKMODAPI extern MODULE* Player_LoadFP(FILE*,int,BOOL);
MIKMODAPI extern MODULE* Player_LoadGeneric(MREADER*,int,BOOL);
Expand Down
7 changes: 7 additions & 0 deletions mikmod/mikmod_internals.h
Expand Up @@ -133,6 +133,13 @@ DECLARE_MUTEX(vars);

/*========== Portable file I/O */

/* SDL_RWops compatability */
#ifdef USE_RWOPS
extern MREADER *_mm_new_rwops_reader(SDL_RWops * rw);
extern void _mm_delete_rwops_reader (MREADER*);
#endif /* USE_RWOPS */
/* End SDL_RWops compatability */

extern MREADER* _mm_new_file_reader(FILE* fp);
extern void _mm_delete_file_reader(MREADER*);

Expand Down
20 changes: 20 additions & 0 deletions mikmod/mloader.c
Expand Up @@ -525,4 +525,24 @@ MODULE* Player_Load(CHAR* filename,int maxchan,BOOL curious)
return mf;
}

/* SDL_RWops compatability */
#ifdef USE_RWOPS

/* Open a module via an SDL_rwop. The loader will initialize the specified
song-player 'player'. */
MODULE* Player_LoadRW(SDL_RWops *rw,int maxchan,BOOL curious)
{
MODULE* result=NULL;
struct MREADER* reader=_mm_new_rwops_reader (rw);

if (reader) {
result=Player_LoadGeneric(reader,maxchan,curious);
_mm_delete_rwops_reader(reader);
}
return result;
}

#endif /* USE_RWOPS */
/* End SDL_RWops compatability */

/* ex:set ts=4: */
81 changes: 81 additions & 0 deletions mikmod/mmio.c
Expand Up @@ -65,6 +65,87 @@

static long _mm_iobase=0,temp_iobase=0;


/*
This section is added to use SDL_rwops for IO
-Matt Campbell (matt@campbellhome.dhs.org) April 2000
*/

#ifdef USE_RWOPS

typedef struct MRWOPSREADER {
MREADER core;
SDL_RWops* rw;
int end;
} MRWOPSREADER;

static BOOL _mm_RWopsReader_Eof(MREADER* reader)
{
if ( ((MRWOPSREADER*)reader)->end ==
SDL_RWtell(((MRWOPSREADER*)reader)->rw) ) return 1;
else return 0;
}

static BOOL _mm_RWopsReader_Read(MREADER* reader,void* ptr,size_t size)
{
return SDL_RWread(((MRWOPSREADER*)reader)->rw, ptr, size, 1);
}

static int _mm_RWopsReader_Get(MREADER* reader)
{
char buf;
if ( SDL_RWread(((MRWOPSREADER*)reader)->rw, &buf, 1, 1) != 1 ) return EOF;
else return (int)buf;
}

static BOOL _mm_RWopsReader_Seek(MREADER* reader,long offset,int whence)
{
return SDL_RWseek(((MRWOPSREADER*)reader)->rw,
(whence==SEEK_SET)?offset+_mm_iobase:offset,whence);
}

static long _mm_RWopsReader_Tell(MREADER* reader)
{
return SDL_RWtell(((MRWOPSREADER*)reader)->rw) - _mm_iobase;
}

MREADER *_mm_new_rwops_reader(SDL_RWops * rw)
{
int here;
MRWOPSREADER* reader=(MRWOPSREADER*)_mm_malloc(sizeof(MRWOPSREADER));
if (reader) {
reader->core.Eof =&_mm_RWopsReader_Eof;
reader->core.Read=&_mm_RWopsReader_Read;
reader->core.Get =&_mm_RWopsReader_Get;
reader->core.Seek=&_mm_RWopsReader_Seek;
reader->core.Tell=&_mm_RWopsReader_Tell;
reader->rw=rw;

/* RWops does not explicitly support an eof check, so we shall find
the end manually - this requires seek support for the RWop */
here = SDL_RWtell(rw);
reader->end = SDL_RWseek(rw, 0, SEEK_END);
SDL_RWseek(rw, here, SEEK_SET); /* Move back */
}
return (MREADER*)reader;
}

void _mm_delete_rwops_reader (MREADER* reader)
{
if(reader) free(reader);
}

#endif /* USE_RWOPS */

/*
End SDL_rwops section
*/

FILE* _mm_fopen(CHAR* fname,CHAR* attrib)
{
FILE *fp;
Expand Down

0 comments on commit 27fd8af

Please sign in to comment.