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;
}
@ -109,8 +109,8 @@ void jlUtilIdle(void) {
}
bool jlUtilMustExit(void) {
return false;
jbool jlUtilMustExit(void) {
return jfalse;
}

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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);
}