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;
|
||||
}
|
||||
|
||||
|
@ -109,8 +109,8 @@ void jlUtilIdle(void) {
|
|||
}
|
||||
|
||||
|
||||
bool jlUtilMustExit(void) {
|
||||
return false;
|
||||
jbool jlUtilMustExit(void) {
|
||||
return jfalse;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue