Music and Sound working on PC platforms. More features to add.

This commit is contained in:
Scott Duensing 2022-09-14 18:02:39 -05:00
parent 541bd824b2
commit ce2d13ba0d
5 changed files with 395 additions and 160 deletions

View file

@ -100,7 +100,7 @@ void jlSoundMusicStop(void) {
} }
void jlSoundPlay(jlSoundT *sound) { void jlSoundPlay(jlSoundT *sound, jlSoundChannelE channel, jbyte volume) {
(void)sound; (void)sound;
} }
@ -109,8 +109,8 @@ void jlUtilIdle(void) {
} }
bool jlUtilMustExit(void) { jbool jlUtilMustExit(void) {
return false; return jfalse;
} }

View file

@ -32,6 +32,31 @@
#include "jPixBuf.h" #include "jPixBuf.h"
#define AUDIO_FORMAT AUDIO_F32
#define AUDIO_FREQUENCY 44100
#define AUDIO_CHANNELS 2
typedef struct {
uint8_t *data;
uint32_t len;
} jlPlatformSoundT;
typedef struct jlSoundPlayingS {
jlPlatformSoundT *sound;
jlSoundChannelE channel; // Corresponds to IIgs 4soniq channel definitions.
jbyte volume; // 0 = silent, 255 = loud.
uint8_t *buffer;
uint32_t len;
struct jlSoundPlayingS *next;
} jlSoundPlayingT;
typedef struct {
char *data;
size_t size;
} jlPlatformModT;
static SDL_Window *_jlWindow = NULL; static SDL_Window *_jlWindow = NULL;
static SDL_Renderer *_jlRenderer = NULL; static SDL_Renderer *_jlRenderer = NULL;
static SDL_Texture *_jlTexture = NULL; // Video card representation in ARGB static SDL_Texture *_jlTexture = NULL; // Video card representation in ARGB
@ -46,12 +71,12 @@ static SDL_TimerID _jlTimerId = 0;
static pocketmod_context _jlModContext; static pocketmod_context _jlModContext;
static SDL_AudioSpec _jlAudioFormat; static SDL_AudioSpec _jlAudioFormat;
static SDL_AudioDeviceID _jlAudioDevice; static SDL_AudioDeviceID _jlAudioDevice;
static char *_jlModData = NULL;
static size_t _jlModSize = 0;
static jbool _jlModPlaying = jfalse; static jbool _jlModPlaying = jfalse;
static jlPlatformModT *_jlModCurrent = NULL;
static jlSoundPlayingT *_jlSoundList = NULL;
Uint32 _jlUtilTimer(Uint32 interval, void *param); static Uint32 _jlUtilTimer(Uint32 interval, void *param);
static void _jlAudioCallback(void *userdata, Uint8 *buffer, int bytes); static void _jlAudioCallback(void *userdata, Uint8 *buffer, int bytes);
@ -130,15 +155,46 @@ void _jlPutPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) {
static void _jlAudioCallback(void *userdata, Uint8 *buffer, int bytes) { static void _jlAudioCallback(void *userdata, Uint8 *buffer, int bytes) {
int i = 0; int i = 0;
jlSoundPlayingT *sound = NULL;
jlSoundPlayingT *prev = NULL;
jlSoundPlayingT *temp = NULL;
uint32_t length;
// Silence buffer. // Silence buffer.
memset(buffer, 0, bytes); memset(buffer, 0, bytes);
// Load in music.
if (_jlModPlaying) { if (_jlModPlaying) {
while (i < bytes) { while (i < bytes) {
//***TODO*** No MOD volume control.
i += pocketmod_render(userdata, buffer + i, bytes - i); i += pocketmod_render(userdata, buffer + i, bytes - i);
} }
} }
// Mix in sounds.
if (_jlSoundList) {
sound = _jlSoundList;
while (sound) {
length = ((uint32_t)bytes > sound->len) ? sound->len : bytes;
SDL_MixAudioFormat(buffer, sound->buffer, AUDIO_FORMAT, length, sound->volume * 0.5);
sound->buffer += length;
sound->len -= length;
// Are we done with this sound?
if (sound->len == 0) {
if (prev) {
prev->next = sound->next;
} else {
_jlSoundList = sound->next;
}
temp = sound;
sound = sound->next;
jlFree(temp);
} else {
prev = sound;
sound = sound->next;
}
}
}
} }
@ -244,107 +300,223 @@ char jlKeyRead(void) {
} }
void jlSoundFree(jlSoundT *sound) { void jlModContinue(void) {
/* if (_jlModCurrent) _jlModPlaying = jtrue;
if (sound != NULL) {
if (sound->data != NULL) {
Mix_FreeChunk((Mix_Chunk *)sound->data);
}
jlFree(sound);
}
*/
} }
jbool jlSoundIsPlaying(jlSoundT *sound) { void jlModFree(jlModT *mod) {
//return (Mix_Playing(sound->channel) > 0); jlPlatformModT *m = (jlPlatformModT *)mod;
// Is this the current mod?
if (m == _jlModCurrent) {
// Is it playing?
if (_jlModPlaying) {
// Lock and wait for current mod to stop playing.
SDL_LockAudioDevice(_jlAudioDevice);
jlModStop();
SDL_UnlockAudioDevice(_jlAudioDevice);
}
_jlModCurrent = NULL;
}
// Free loaded song.
if (m->data) {
jlFree(m->data);
jlFree(m);
}
} }
jbool _jlSoundLoad(jlSoundT **sound, char *filename) { jbool jlModIsPlaying(void) {
jbool result = jfalse;
/*
Mix_Chunk *sample;
sample = Mix_LoadWAV(jlUtilMakePathname(filename, "ogg"));
if (sample) {
if (*sound != NULL) {
jlSoundFree(*sound);
}
jlSoundT *t = (jlSoundT *)jlMalloc(sizeof(jlSoundT));
if (t != NULL) {
t->data = (void *)sample;
*sound = t;
result = jtrue;
}
}
*/
return result;
}
void jlSoundModContinue(void) {
if (_jlModData) _jlModPlaying = jtrue;
}
jbool jlSoundModIsPlaying(void) {
return _jlModPlaying; return _jlModPlaying;
} }
void jlSoundModPause(void) { jbool _jlModLoad(jlModT **mod, char *filename) {
if (_jlModData) _jlModPlaying = jfalse;
}
void jlSoundModPlay(char *name) {
FILE *in = NULL; FILE *in = NULL;
jlPlatformModT *m = NULL;
jbool result = jfalse;
// Stop and free any existing MOD. // New MOD.
if (_jlModPlaying) jlSoundModStop(); m = (jlPlatformModT *)jlMalloc(sizeof(jlPlatformModT));
if (m) {
// Load MOD. // Load MOD.
in = fopen(jlUtilMakePathname(name, "mod"), "rb"); in = fopen(jlUtilMakePathname(filename, "mod"), "rb");
if (in) { if (in) {
fseek(in, 0, SEEK_END); fseek(in, 0, SEEK_END);
_jlModSize = ftell(in); m->size = ftell(in);
rewind(in); rewind(in);
_jlModData = (char *)jlMalloc(_jlModSize); m->data = (char *)jlMalloc(m->size);
if (_jlModData) { if (m->data) {
fread(_jlModData, _jlModSize, 1, in); fread(m->data, m->size, 1, in);
} else { *mod = m;
_jlModSize = 0; result = jtrue;
} }
fclose(in); fclose(in);
} else {
jlFree(m);
} }
}
return result;
}
void jlModPause(void) {
if (_jlModCurrent) _jlModPlaying = jfalse;
}
void jlModPlay(jlModT *mod) {
jlPlatformModT *m = (jlPlatformModT *)mod;
// Stop any currently playing MOD.
if (_jlModPlaying) jlModStop();
// Start playback. // Start playback.
if (!pocketmod_init(&_jlModContext, _jlModData, _jlModSize, _jlAudioFormat.freq)) { if (pocketmod_init(&_jlModContext, m->data, m->size, _jlAudioFormat.freq)) {
// Invalid MOD.
jlFree(_jlModData);
_jlModSize = 0;
} else {
_jlModPlaying = jtrue; _jlModPlaying = jtrue;
} _jlModCurrent = m;
} } else {
void jlSoundModStop(void) {
// We lock here because it's important that it really stops.
SDL_LockAudioDevice(_jlAudioDevice);
_jlModPlaying = jfalse; _jlModPlaying = jfalse;
SDL_UnlockAudioDevice(_jlAudioDevice); _jlModCurrent = NULL;
// Free loaded song.
if (_jlModData) {
jlFree(_jlModData);
_jlModSize = 0;
} }
} }
void jlSoundPlay(jlSoundT *sound) { void jlModStop(void) {
//sound->channel = (jint16)Mix_PlayChannel(-1, (Mix_Chunk *)sound->data, 0); _jlModPlaying = jfalse;
_jlModCurrent = NULL;
}
void jlSoundFree(jlSoundT *sound) {
jlPlatformSoundT *s = (jlPlatformSoundT *)sound;
if (s != NULL) {
// Stop playing this sound.
jlSoundStop(s);
// Free it.
if (s->data != NULL) jlFree(s->data);
jlFree(s);
}
}
jbool jlSoundIsPlaying(jlSoundT *sound) {
jlPlatformSoundT *s = (jlPlatformSoundT *)sound;
jlSoundPlayingT *cur = _jlSoundList;
// Are we being played?
SDL_LockAudioDevice(_jlAudioDevice);
while (cur) {
if (cur->sound == s) {
// Yep
SDL_UnlockAudioDevice(_jlAudioDevice);
return jtrue;
}
cur = cur->next;
}
SDL_UnlockAudioDevice(_jlAudioDevice);
return jfalse;
}
jbool _jlSoundLoad(jlSoundT **sound, char *filename) {
SDL_AudioSpec wave;
SDL_AudioCVT cvt;
uint8_t *data;
uint32_t len;
jlPlatformSoundT *soundPlatform = NULL;
jbool result = jfalse;
soundPlatform = (jlPlatformSoundT *)jlMalloc(sizeof(jlPlatformSoundT));
if (soundPlatform) {
*sound = soundPlatform;
if (SDL_LoadWAV(jlUtilMakePathname(filename, "wav"), &wave, &data, &len)) {
// Do we need to convert to our internal format?
SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq, AUDIO_FORMAT, AUDIO_CHANNELS, AUDIO_FREQUENCY);
if (cvt.needed) {
// Yes! Convert audio.
cvt.buf = (jbyte *)jlMalloc(len * cvt.len_mult);
if (cvt.buf) {
memcpy(cvt.buf, data, len);
cvt.len = len;
SDL_ConvertAudio(&cvt);
SDL_FreeWAV(data);
soundPlatform->len = cvt.len_cvt;
soundPlatform->data = (jbyte *)jlMalloc(soundPlatform->len);
if (soundPlatform->data) {
memcpy(soundPlatform->data, cvt.buf, soundPlatform->len);
result = jtrue;
}
jlFree(cvt.buf);
}
} else {
// No. Use as-is.
soundPlatform->len = len;
soundPlatform->data = (jbyte *)jlMalloc(soundPlatform->len);
if (soundPlatform->data) {
memcpy(&soundPlatform->data, data, soundPlatform->len);
result = jtrue;
}
SDL_FreeWAV(data);
}
}
}
if (!result) {
if (soundPlatform) jlFree(soundPlatform);
}
return result;
}
void jlSoundPlay(jlSoundT *sound, jlSoundChannelE channel, jbyte volume) {
jlSoundPlayingT *sp = NULL;
sp = (jlSoundPlayingT *)jlMalloc(sizeof(jlSoundPlayingT));
if (sp) {
SDL_LockAudioDevice(_jlAudioDevice);
sp->sound = sound;
sp->channel = channel;
sp->volume = volume;
sp->buffer = sp->sound->data;
sp->len = sp->sound->len;
sp->next = _jlSoundList;
_jlSoundList = sp;
SDL_UnlockAudioDevice(_jlAudioDevice);
}
}
void jlSoundStop(jlSoundT *sound) {
jlPlatformSoundT *s = (jlPlatformSoundT *)sound;
jlSoundPlayingT *prev = NULL;
jlSoundPlayingT *temp = NULL;
jlSoundPlayingT *cur = _jlSoundList;
// Are we being played?
SDL_LockAudioDevice(_jlAudioDevice);
while (cur) {
if (cur->sound == s) {
if (prev) {
prev->next = cur->next;
} else {
_jlSoundList = cur->next;
}
temp = cur;
cur = cur->next;
jlFree(temp);
} else {
prev = cur;
cur = cur->next;
}
}
SDL_UnlockAudioDevice(_jlAudioDevice);
} }
@ -439,7 +611,7 @@ jbool jlUtilMustExit(void) {
} }
Uint32 _jlUtilTimer(Uint32 interval, void *param) { static Uint32 _jlUtilTimer(Uint32 interval, void *param) {
(void)param; (void)param;
_jlTimerValue++; _jlTimerValue++;
return(interval); return(interval);
@ -479,16 +651,16 @@ int main(int argc, char *argv[]) {
} }
// Create a window and renderer using SDL // Create a window and renderer using SDL
_jlWindow = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 400, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); _jlWindow = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 400, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
_jlRenderer = SDL_CreateRenderer(_jlWindow, -1, SDL_RENDERER_SOFTWARE); _jlRenderer = SDL_CreateRenderer(_jlWindow, -1, SDL_RENDERER_SOFTWARE);
_jlTexture = SDL_CreateTexture(_jlRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 320, 200); _jlTexture = SDL_CreateTexture(_jlRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 320, 200);
_jlPixelFormat = SDL_AllocFormat(SDL_GetWindowPixelFormat(_jlWindow)); _jlPixelFormat = SDL_AllocFormat(SDL_GetWindowPixelFormat(_jlWindow));
// Set up audio device // Set up audio device
_jlAudioFormat.freq = 44100; _jlAudioFormat.freq = AUDIO_FREQUENCY;
_jlAudioFormat.format = AUDIO_F32; _jlAudioFormat.format = AUDIO_FORMAT;
_jlAudioFormat.channels = 2; _jlAudioFormat.channels = 2;
_jlAudioFormat.samples = 4096; _jlAudioFormat.samples = AUDIO_CHANNELS;
_jlAudioFormat.callback = _jlAudioCallback; _jlAudioFormat.callback = _jlAudioCallback;
_jlAudioFormat.userdata = &_jlModContext; _jlAudioFormat.userdata = &_jlModContext;
_jlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &_jlAudioFormat, &_jlAudioFormat, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); _jlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &_jlAudioFormat, &_jlAudioFormat, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE);
@ -512,9 +684,10 @@ int main(int argc, char *argv[]) {
} }
_jlControllerCount = 0; _jlControllerCount = 0;
jlFree(_jlControllers); jlFree(_jlControllers);
//***TODO*** Sound effects stop?
jlSoundModStop();
SDL_PauseAudioDevice(_jlAudioDevice, 1); SDL_PauseAudioDevice(_jlAudioDevice, 1);
SDL_CloseAudioDevice(_jlAudioDevice);
while (_jlSoundList) jlSoundStop(_jlSoundList);
jlModStop();
SDL_FreeFormat(_jlPixelFormat); SDL_FreeFormat(_jlPixelFormat);
SDL_DestroyTexture(_jlTexture); SDL_DestroyTexture(_jlTexture);
SDL_DestroyRenderer(_jlRenderer); SDL_DestroyRenderer(_jlRenderer);

View file

@ -746,6 +746,57 @@ void jlKeyWaitForAny(void) {
#endif #endif
#ifndef JL_HAS_MODCONTINUE
void jlModContinue(void) {
}
#endif
#ifndef JL_HAS_MODFREE
void jlModFree(jlModT *mod) {
(void)mod;
}
#endif
#ifndef JL_HAS_MODISPLAYING
jbool jlModIsPlaying(void) {
return jfalse;
}
#endif
#ifndef JL_HAS_MODLOAD
jbool _jlModLoad(jlModT **mod, char *filename) {
(void)mod;
(void)filename;
return jfalse;
}
#endif
#ifndef JL_HAS_MODPAUSE
void jlModPause(void) {
}
#endif
#ifndef JL_HAS_MODPLAY
void jlModPlay(jlModT *mod) {
(void)mod;
}
#endif
#ifndef JL_HAS_MODSTOP
void jlModStop(void) {
}
#endif
#ifndef JL_HAS_PALETTEDEFAULT #ifndef JL_HAS_PALETTEDEFAULT
void jlPaletteDefault(void) { void jlPaletteDefault(void) {
jbyte i; jbyte i;
@ -815,43 +866,17 @@ jbool _jlSoundLoad(jlSoundT **sound, char *filename) {
#endif #endif
#ifndef JL_HAS_SOUNDMODCONTINUE
void jlSoundModContinue(void) {
}
#endif
#ifndef JL_HAS_SOUNDMODISPLAYING
jbool jlSoundModIsPlaying(void) {
return jfalse;
}
#endif
#ifndef JL_HAS_SOUNDMODPAUSE
void jlSoundModPause(void) {
}
#endif
#ifndef JL_HAS_SOUNDMODPLAY
void jlSoundModPlay(char *name) {
(void)name;
}
#endif
#ifndef JL_HAS_SOUNDMODSTOP
void jlSoundModStop(void) {
}
#endif
#ifndef JL_HAS_SOUNDPLAY #ifndef JL_HAS_SOUNDPLAY
void jlSoundPlay(jlSoundT *sound) { void jlSoundPlay(jlSoundT *sound, jlSoundChannelE channel, jbyte volume) {
(void)sound;
(void)channel;
(void)volume;
}
#endif
#ifndef JL_HAS_SOUNDSTOP
void jlSoundStop(jlSoundT *sound) {
(void)sound; (void)sound;
} }
#endif #endif

View file

@ -91,17 +91,20 @@ typedef unsigned int juint32;
#define JL_HAS_IMGDISPLAY #define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED #define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD #define JL_HAS_KEYREAD
#define JL_HAS_MODCONTINUE
#define JL_HAS_MODFREE
#define JL_HAS_MODISPLAYING
#define JL_HAS_MODLOAD
#define JL_HAS_MODPAUSE
#define JL_HAS_MODPLAY
#define JL_HAS_MODSTOP
#define JL_HAS_PALETTESET #define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG #define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDFREE #define JL_HAS_SOUNDFREE
#define JL_HAS_SOUNDISPLAYING #define JL_HAS_SOUNDISPLAYING
#define JL_HAS_SOUNDLOAD #define JL_HAS_SOUNDLOAD
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_SOUNDPLAY #define JL_HAS_SOUNDPLAY
#define JL_HAS_SOUNDSTOP
#define JL_HAS_UTILIDLE #define JL_HAS_UTILIDLE
#define JL_HAS_UTILMUSTEXIT #define JL_HAS_UTILMUSTEXIT
#define JL_HAS_UTILTIMER #define JL_HAS_UTILTIMER
@ -132,17 +135,20 @@ typedef unsigned int juint32;
#define JL_HAS_IMGDISPLAY #define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED #define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD #define JL_HAS_KEYREAD
#define JL_HAS_MODCONTINUE
#define JL_HAS_MODFREE
#define JL_HAS_MODISPLAYING
#define JL_HAS_MODLOAD
#define JL_HAS_MODPAUSE
#define JL_HAS_MODPLAY
#define JL_HAS_MODSTOP
#define JL_HAS_PALETTESET #define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG #define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDFREE #define JL_HAS_SOUNDFREE
#define JL_HAS_SOUNDISPLAYING #define JL_HAS_SOUNDISPLAYING
#define JL_HAS_SOUNDLOAD #define JL_HAS_SOUNDLOAD
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_SOUNDPLAY #define JL_HAS_SOUNDPLAY
#define JL_HAS_SOUNDSTOP
#define JL_HAS_UTILIDLE #define JL_HAS_UTILIDLE
#define JL_HAS_UTILMUSTEXIT #define JL_HAS_UTILMUSTEXIT
#define JL_HAS_UTILTIMER #define JL_HAS_UTILTIMER
@ -173,17 +179,20 @@ typedef unsigned int juint32;
#define JL_HAS_IMGDISPLAY #define JL_HAS_IMGDISPLAY
#define JL_HAS_KEYPRESSED #define JL_HAS_KEYPRESSED
#define JL_HAS_KEYREAD #define JL_HAS_KEYREAD
#define JL_HAS_MODCONTINUE
#define JL_HAS_MODFREE
#define JL_HAS_MODISPLAYING
#define JL_HAS_MODLOAD
#define JL_HAS_MODPAUSE
#define JL_HAS_MODPLAY
#define JL_HAS_MODSTOP
#define JL_HAS_PALETTESET #define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG #define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDFREE #define JL_HAS_SOUNDFREE
#define JL_HAS_SOUNDISPLAYING #define JL_HAS_SOUNDISPLAYING
#define JL_HAS_SOUNDLOAD #define JL_HAS_SOUNDLOAD
#define JL_HAS_SOUNDMODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING
#define JL_HAS_SOUNDMODPAUSE
#define JL_HAS_SOUNDMODPLAY
#define JL_HAS_SOUNDMODSTOP
#define JL_HAS_SOUNDPLAY #define JL_HAS_SOUNDPLAY
#define JL_HAS_SOUNDSTOP
#define JL_HAS_UTILIDLE #define JL_HAS_UTILIDLE
#define JL_HAS_UTILMUSTEXIT #define JL_HAS_UTILMUSTEXIT
#define JL_HAS_UTILTIMER #define JL_HAS_UTILTIMER
@ -225,11 +234,11 @@ typedef unsigned long juint32;
#define JL_HAS_KEYREAD #define JL_HAS_KEYREAD
#define JL_HAS_PALETTESET #define JL_HAS_PALETTESET
#define JL_HAS_PALETTESETFROMIMG #define JL_HAS_PALETTESETFROMIMG
#define JL_HAS_SOUNDMODCONTINUE #define JL_HAS_MODCONTINUE
#define JL_HAS_SOUNDMODISPLAYING #define JL_HAS_MODISPLAYING
#define JL_HAS_SOUNDMODPAUSE #define JL_HAS_MODPAUSE
#define JL_HAS_SOUNDMODPLAY #define JL_HAS_MODPLAY
#define JL_HAS_SOUNDMODSTOP #define JL_HAS_MODSTOP
#define JL_HAS_UTILNIBBLESWAP #define JL_HAS_UTILNIBBLESWAP
#define JL_HAS_UTILTIMER #define JL_HAS_UTILTIMER
@ -258,6 +267,7 @@ typedef unsigned long juint32;
#endif #endif
// Provide vastly improved memory debugging on PC platforms.
#ifdef JOEY_DEBUG #ifdef JOEY_DEBUG
#ifdef JOEY_PC #ifdef JOEY_PC
#define MEMWATCH #define MEMWATCH
@ -278,6 +288,18 @@ extern char _jlTempString[1024];
extern jmp_buf _jlJumpBuffer; extern jmp_buf _jlJumpBuffer;
enum _jlSoundChannelE {
CHANNEL_FRONT_LEFT = 0,
CHANNEL_FRONT_RIGHT = 1,
CHANNEL_SURROUND_LEFT = 2,
CHANNEL_SURROUND_RIGHT = 3,
CHANNEL_FRONT_HIGH_LEFT = 4,
CHANNEL_FRONT_HIGH_RIGHT = 5,
CHANNEL_SURROUND_BACK_LEFT = 6,
CHANNEL_SURROUND_BACK_RIGHT = 7
};
typedef enum _jlSoundChannelE jlSoundChannelE;
enum _jlBorderColorsE { enum _jlBorderColorsE {
BORDER_BLACK = 0, BORDER_BLACK = 0,
BORDER_DEEP_RED = 1, BORDER_DEEP_RED = 1,
@ -310,10 +332,9 @@ typedef struct {
jbyte r : 4; jbyte r : 4;
} jlPixelPairT; } jlPixelPairT;
typedef struct { typedef void jlSoundT;
void *data;
jint16 channel; typedef void jlModT;
} jlSoundT;
typedef struct { typedef struct {
char id[3]; char id[3];
@ -341,7 +362,7 @@ typedef struct {
} jlVecT; } jlVecT;
// Memory Management // Memory Management - provides basic memory debugging on target platform.
#ifdef JOEY_DEBUG #ifdef JOEY_DEBUG
#define JOEY_MEM_BLOCKS 128 #define JOEY_MEM_BLOCKS 128
@ -353,7 +374,7 @@ typedef struct {
jint16 line; jint16 line;
} jlMemoryBlockT; } jlMemoryBlockT;
#define jlFree(p) _jlFree((void **)&(p)); p = 0 #define jlFree(p) {_jlFree((void **)&(p)); p = 0;}
void _jlFree(void **pointer); void _jlFree(void **pointer);
#define jlMalloc(s) _jlMalloc(s, __LINE__, (char *)__FILE__) #define jlMalloc(s) _jlMalloc(s, __LINE__, (char *)__FILE__)
@ -411,6 +432,15 @@ jbool jlKeyPressed(void);
char jlKeyRead(void); char jlKeyRead(void);
void jlKeyWaitForAny(void); void jlKeyWaitForAny(void);
void jlModContinue(void);
void jlModFree(jlModT *mod);
jbool jlModIsPlaying(void);
#define jlModLoad(mod, filename) _jlModLoad((jlModT **)&(mod), filename) // Syntatic Sugar
jbool _jlModLoad(jlModT **mod, char *filename);
void jlModPause(void);
void jlModPlay(jlModT *mod);
void jlModStop(void);
void jlPaletteDefault(void); //***TODO*** Treat palettes like we do "surfaces" - allow changing STAs or display void jlPaletteDefault(void); //***TODO*** Treat palettes like we do "surfaces" - allow changing STAs or display
void jlPaletteSet(jbyte index, jbyte r, jbyte g, jbyte b); //***TODO*** Really need a matching "get" void jlPaletteSet(jbyte index, jbyte r, jbyte g, jbyte b); //***TODO*** Really need a matching "get"
void jlPaletteSetFromImg(jlImgT *img); void jlPaletteSetFromImg(jlImgT *img);
@ -419,13 +449,8 @@ void jlSoundFree(jlSoundT *sound);
jbool jlSoundIsPlaying(jlSoundT *sound); jbool jlSoundIsPlaying(jlSoundT *sound);
#define jlSoundLoad(sound, filename) _jlSoundLoad((jlSoundT **)&(sound), filename) // Syntatic Sugar #define jlSoundLoad(sound, filename) _jlSoundLoad((jlSoundT **)&(sound), filename) // Syntatic Sugar
jbool _jlSoundLoad(jlSoundT **sound, char *filename); jbool _jlSoundLoad(jlSoundT **sound, char *filename);
void jlSoundPlay(jlSoundT *sound, jlSoundChannelE channel, jbyte volume);
void jlSoundModContinue(void); void jlSoundStop(jlSoundT *sound);
jbool jlSoundModIsPlaying(void);
void jlSoundModPause(void);
void jlSoundModPlay(char *name);
void jlSoundModStop(void);
void jlSoundPlay(jlSoundT *sound);
void jlStnFree(jlStnT *stn); void jlStnFree(jlStnT *stn);
#define jlStnLoad(stn, filename) _jlStnLoad((jlStnT **)&(stn), filename, __LINE__, (char *)__FILE__) // Syntatic Sugar #define jlStnLoad(stn, filename) _jlStnLoad((jlStnT **)&(stn), filename, __LINE__, (char *)__FILE__) // Syntatic Sugar

View file

@ -287,14 +287,23 @@ void lineTest(void) {
void musicTest(void) { void musicTest(void) {
jlImgT *kanga = NULL; jlImgT *kanga = NULL;
jlImgT *font = NULL; jlImgT *font = NULL;
jlModT *music = NULL;
jlSoundT *sound1 = NULL;
jlSoundT *sound2 = NULL;
if (!jlImgLoad(kanga, "kanga")) jlUtilDie("Unable to load kanga.img!"); if (!jlImgLoad(kanga, "kanga")) jlUtilDie("Unable to load kanga.img!");
if (!jlImgLoad(font, "font")) jlUtilDie("Unable to load font.img!"); if (!jlImgLoad(font, "font")) jlUtilDie("Unable to load font.img!");
if (!jlModLoad(music, "music")) jlUtilDie("Unable to load music!");
if (!jlSoundLoad(sound1, "applause")) jlUtilDie("Unable to load applause!");
if (!jlSoundLoad(sound2, "kongas")) jlUtilDie("Unable to load kongas!");
jlImgDisplay(kanga); jlImgDisplay(kanga);
jlDisplayPresent(); jlDisplayPresent();
jlSoundModPlay("music"); jlModPlay(music);
jlSoundPlay(sound2, CHANNEL_FRONT_RIGHT, 255);
jlSoundPlay(sound1, CHANNEL_FRONT_LEFT, 255);
while (!jlKeyPressed()) { while (!jlKeyPressed()) {
fontPrint(font, NULL, 1, 1, "%dx%d %d %d ", jlGameGetAxis(0), jlGameGetAxis(1), jlGameGetButton(0), jlGameGetButton(1)); fontPrint(font, NULL, 1, 1, "%dx%d %d %d ", jlGameGetAxis(0), jlGameGetAxis(1), jlGameGetButton(0), jlGameGetButton(1));
@ -302,8 +311,11 @@ void musicTest(void) {
} }
jlKeyRead(); jlKeyRead();
jlSoundModStop(); jlModStop();
jlSoundFree(sound2);
jlSoundFree(sound1);
jlModFree(music);
jlImgFree(font); jlImgFree(font);
jlImgFree(kanga); jlImgFree(kanga);
} }