Music and Sound working on PC platforms. More features to add.
This commit is contained in:
parent
541bd824b2
commit
ce2d13ba0d
5 changed files with 395 additions and 160 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue