diff --git a/joeylib/src/jSDL12.c b/joeylib/src/jSDL12.c index e180366..add50d2 100644 --- a/joeylib/src/jSDL12.c +++ b/joeylib/src/jSDL12.c @@ -100,7 +100,7 @@ void jlSoundMusicStop(void) { } -void jlSoundPlay(jlSoundT *sound) { +void jlSoundPlay(jlSoundT *sound, jlSoundChannelE channel, jbyte volume) { (void)sound; } @@ -109,8 +109,8 @@ void jlUtilIdle(void) { } -bool jlUtilMustExit(void) { - return false; +jbool jlUtilMustExit(void) { + return jfalse; } diff --git a/joeylib/src/jSDL2.c b/joeylib/src/jSDL2.c index 7f76ffa..bb8bc3e 100644 --- a/joeylib/src/jSDL2.c +++ b/joeylib/src/jSDL2.c @@ -32,6 +32,31 @@ #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_Renderer *_jlRenderer = NULL; static SDL_Texture *_jlTexture = NULL; // Video card representation in ARGB @@ -46,13 +71,13 @@ static SDL_TimerID _jlTimerId = 0; static pocketmod_context _jlModContext; static SDL_AudioSpec _jlAudioFormat; static SDL_AudioDeviceID _jlAudioDevice; -static char *_jlModData = NULL; -static size_t _jlModSize = 0; static jbool _jlModPlaying = jfalse; +static jlPlatformModT *_jlModCurrent = NULL; +static jlSoundPlayingT *_jlSoundList = NULL; -Uint32 _jlUtilTimer(Uint32 interval, void *param); -static void _jlAudioCallback(void *userdata, Uint8 *buffer, int bytes); +static Uint32 _jlUtilTimer(Uint32 interval, void *param); +static void _jlAudioCallback(void *userdata, Uint8 *buffer, int bytes); /* @@ -129,16 +154,47 @@ void _jlPutPixel(SDL_Surface *surface, int x, int y, Uint32 pixel) { 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. memset(buffer, 0, bytes); + // Load in music. if (_jlModPlaying) { while (i < bytes) { + //***TODO*** No MOD volume control. 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) { - /* - if (sound != NULL) { - if (sound->data != NULL) { - Mix_FreeChunk((Mix_Chunk *)sound->data); +void jlModContinue(void) { + if (_jlModCurrent) _jlModPlaying = jtrue; +} + + +void jlModFree(jlModT *mod) { + 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); } - jlFree(sound); + _jlModCurrent = NULL; } - */ -} - -jbool jlSoundIsPlaying(jlSoundT *sound) { - //return (Mix_Playing(sound->channel) > 0); -} - - -jbool _jlSoundLoad(jlSoundT **sound, char *filename) { - 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; - } + // Free loaded song. + if (m->data) { + jlFree(m->data); + jlFree(m); } - */ - return result; } -void jlSoundModContinue(void) { - if (_jlModData) _jlModPlaying = jtrue; -} - - -jbool jlSoundModIsPlaying(void) { +jbool jlModIsPlaying(void) { return _jlModPlaying; } -void jlSoundModPause(void) { - if (_jlModData) _jlModPlaying = jfalse; +jbool _jlModLoad(jlModT **mod, char *filename) { + FILE *in = NULL; + jlPlatformModT *m = NULL; + jbool result = jfalse; + + // New MOD. + m = (jlPlatformModT *)jlMalloc(sizeof(jlPlatformModT)); + if (m) { + // Load MOD. + in = fopen(jlUtilMakePathname(filename, "mod"), "rb"); + if (in) { + fseek(in, 0, SEEK_END); + m->size = ftell(in); + rewind(in); + m->data = (char *)jlMalloc(m->size); + if (m->data) { + fread(m->data, m->size, 1, in); + *mod = m; + result = jtrue; + } + fclose(in); + } else { + jlFree(m); + } + } + + return result; } -void jlSoundModPlay(char *name) { +void jlModPause(void) { + if (_jlModCurrent) _jlModPlaying = jfalse; +} - FILE *in = NULL; - // Stop and free any existing MOD. - if (_jlModPlaying) jlSoundModStop(); +void jlModPlay(jlModT *mod) { + jlPlatformModT *m = (jlPlatformModT *)mod; - // Load MOD. - in = fopen(jlUtilMakePathname(name, "mod"), "rb"); - if (in) { - fseek(in, 0, SEEK_END); - _jlModSize = ftell(in); - rewind(in); - _jlModData = (char *)jlMalloc(_jlModSize); - if (_jlModData) { - fread(_jlModData, _jlModSize, 1, in); - } else { - _jlModSize = 0; - } - fclose(in); - } + // Stop any currently playing MOD. + if (_jlModPlaying) jlModStop(); // Start playback. - if (!pocketmod_init(&_jlModContext, _jlModData, _jlModSize, _jlAudioFormat.freq)) { - // Invalid MOD. - jlFree(_jlModData); - _jlModSize = 0; - } else { + if (pocketmod_init(&_jlModContext, m->data, m->size, _jlAudioFormat.freq)) { _jlModPlaying = jtrue; + _jlModCurrent = m; + } else { + _jlModPlaying = jfalse; + _jlModCurrent = NULL; } } -void jlSoundModStop(void) { - // We lock here because it's important that it really stops. - SDL_LockAudioDevice(_jlAudioDevice); +void jlModStop(void) { _jlModPlaying = jfalse; - SDL_UnlockAudioDevice(_jlAudioDevice); - // Free loaded song. - if (_jlModData) { - jlFree(_jlModData); - _jlModSize = 0; + _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); } } -void jlSoundPlay(jlSoundT *sound) { - //sound->channel = (jint16)Mix_PlayChannel(-1, (Mix_Chunk *)sound->data, 0); +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; _jlTimerValue++; return(interval); @@ -479,16 +651,16 @@ int main(int argc, char *argv[]) { } // 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); _jlTexture = SDL_CreateTexture(_jlRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 320, 200); _jlPixelFormat = SDL_AllocFormat(SDL_GetWindowPixelFormat(_jlWindow)); // Set up audio device - _jlAudioFormat.freq = 44100; - _jlAudioFormat.format = AUDIO_F32; + _jlAudioFormat.freq = AUDIO_FREQUENCY; + _jlAudioFormat.format = AUDIO_FORMAT; _jlAudioFormat.channels = 2; - _jlAudioFormat.samples = 4096; + _jlAudioFormat.samples = AUDIO_CHANNELS; _jlAudioFormat.callback = _jlAudioCallback; _jlAudioFormat.userdata = &_jlModContext; _jlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &_jlAudioFormat, &_jlAudioFormat, SDL_AUDIO_ALLOW_FREQUENCY_CHANGE); @@ -512,9 +684,10 @@ int main(int argc, char *argv[]) { } _jlControllerCount = 0; jlFree(_jlControllers); - //***TODO*** Sound effects stop? - jlSoundModStop(); SDL_PauseAudioDevice(_jlAudioDevice, 1); + SDL_CloseAudioDevice(_jlAudioDevice); + while (_jlSoundList) jlSoundStop(_jlSoundList); + jlModStop(); SDL_FreeFormat(_jlPixelFormat); SDL_DestroyTexture(_jlTexture); SDL_DestroyRenderer(_jlRenderer); diff --git a/joeylib/src/joey.c b/joeylib/src/joey.c index 5a5f3cd..4bc22a8 100644 --- a/joeylib/src/joey.c +++ b/joeylib/src/joey.c @@ -746,6 +746,57 @@ void jlKeyWaitForAny(void) { #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 void jlPaletteDefault(void) { jbyte i; @@ -815,43 +866,17 @@ jbool _jlSoundLoad(jlSoundT **sound, char *filename) { #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 -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; } #endif diff --git a/joeylib/src/joey.h b/joeylib/src/joey.h index 3bba79d..9c07c92 100644 --- a/joeylib/src/joey.h +++ b/joeylib/src/joey.h @@ -91,17 +91,20 @@ typedef unsigned int juint32; #define JL_HAS_IMGDISPLAY #define JL_HAS_KEYPRESSED #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_PALETTESETFROMIMG #define JL_HAS_SOUNDFREE #define JL_HAS_SOUNDISPLAYING #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_SOUNDSTOP #define JL_HAS_UTILIDLE #define JL_HAS_UTILMUSTEXIT #define JL_HAS_UTILTIMER @@ -132,17 +135,20 @@ typedef unsigned int juint32; #define JL_HAS_IMGDISPLAY #define JL_HAS_KEYPRESSED #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_PALETTESETFROMIMG #define JL_HAS_SOUNDFREE #define JL_HAS_SOUNDISPLAYING #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_SOUNDSTOP #define JL_HAS_UTILIDLE #define JL_HAS_UTILMUSTEXIT #define JL_HAS_UTILTIMER @@ -173,17 +179,20 @@ typedef unsigned int juint32; #define JL_HAS_IMGDISPLAY #define JL_HAS_KEYPRESSED #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_PALETTESETFROMIMG #define JL_HAS_SOUNDFREE #define JL_HAS_SOUNDISPLAYING #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_SOUNDSTOP #define JL_HAS_UTILIDLE #define JL_HAS_UTILMUSTEXIT #define JL_HAS_UTILTIMER @@ -225,11 +234,11 @@ typedef unsigned long juint32; #define JL_HAS_KEYREAD #define JL_HAS_PALETTESET #define JL_HAS_PALETTESETFROMIMG -#define JL_HAS_SOUNDMODCONTINUE -#define JL_HAS_SOUNDMODISPLAYING -#define JL_HAS_SOUNDMODPAUSE -#define JL_HAS_SOUNDMODPLAY -#define JL_HAS_SOUNDMODSTOP +#define JL_HAS_MODCONTINUE +#define JL_HAS_MODISPLAYING +#define JL_HAS_MODPAUSE +#define JL_HAS_MODPLAY +#define JL_HAS_MODSTOP #define JL_HAS_UTILNIBBLESWAP #define JL_HAS_UTILTIMER @@ -258,6 +267,7 @@ typedef unsigned long juint32; #endif +// Provide vastly improved memory debugging on PC platforms. #ifdef JOEY_DEBUG #ifdef JOEY_PC #define MEMWATCH @@ -278,6 +288,18 @@ extern char _jlTempString[1024]; 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 { BORDER_BLACK = 0, BORDER_DEEP_RED = 1, @@ -310,10 +332,9 @@ typedef struct { jbyte r : 4; } jlPixelPairT; -typedef struct { - void *data; - jint16 channel; -} jlSoundT; +typedef void jlSoundT; + +typedef void jlModT; typedef struct { char id[3]; @@ -341,7 +362,7 @@ typedef struct { } jlVecT; -// Memory Management +// Memory Management - provides basic memory debugging on target platform. #ifdef JOEY_DEBUG #define JOEY_MEM_BLOCKS 128 @@ -353,7 +374,7 @@ typedef struct { jint16 line; } jlMemoryBlockT; -#define jlFree(p) _jlFree((void **)&(p)); p = 0 +#define jlFree(p) {_jlFree((void **)&(p)); p = 0;} void _jlFree(void **pointer); #define jlMalloc(s) _jlMalloc(s, __LINE__, (char *)__FILE__) @@ -411,6 +432,15 @@ jbool jlKeyPressed(void); char jlKeyRead(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 jlPaletteSet(jbyte index, jbyte r, jbyte g, jbyte b); //***TODO*** Really need a matching "get" void jlPaletteSetFromImg(jlImgT *img); @@ -419,13 +449,8 @@ void jlSoundFree(jlSoundT *sound); jbool jlSoundIsPlaying(jlSoundT *sound); #define jlSoundLoad(sound, filename) _jlSoundLoad((jlSoundT **)&(sound), filename) // Syntatic Sugar jbool _jlSoundLoad(jlSoundT **sound, char *filename); - -void jlSoundModContinue(void); -jbool jlSoundModIsPlaying(void); -void jlSoundModPause(void); -void jlSoundModPlay(char *name); -void jlSoundModStop(void); -void jlSoundPlay(jlSoundT *sound); +void jlSoundPlay(jlSoundT *sound, jlSoundChannelE channel, jbyte volume); +void jlSoundStop(jlSoundT *sound); void jlStnFree(jlStnT *stn); #define jlStnLoad(stn, filename) _jlStnLoad((jlStnT **)&(stn), filename, __LINE__, (char *)__FILE__) // Syntatic Sugar diff --git a/joeylib/src/test.c b/joeylib/src/test.c index 492f771..ac3d6f4 100644 --- a/joeylib/src/test.c +++ b/joeylib/src/test.c @@ -285,16 +285,25 @@ void lineTest(void) { void musicTest(void) { - jlImgT *kanga = NULL; - jlImgT *font = NULL; + jlImgT *kanga = 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(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); jlDisplayPresent(); - jlSoundModPlay("music"); + jlModPlay(music); + + jlSoundPlay(sound2, CHANNEL_FRONT_RIGHT, 255); + jlSoundPlay(sound1, CHANNEL_FRONT_LEFT, 255); while (!jlKeyPressed()) { 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(); - jlSoundModStop(); + jlModStop(); + jlSoundFree(sound2); + jlSoundFree(sound1); + jlModFree(music); jlImgFree(font); jlImgFree(kanga); }