mirror of
https://github.com/parasyte/alt64
synced 2024-11-11 11:45:03 -05:00
109 lines
2.0 KiB
C
109 lines
2.0 KiB
C
|
#include <mikmod.h>
|
||
|
#include <libdragon.h> //needed for audio_get_frequency()
|
||
|
#include "hashtable.h"
|
||
|
|
||
|
MODULE *moduleBGM = NULL;
|
||
|
|
||
|
/* sound effects */
|
||
|
hashtable* samples = NULL;
|
||
|
|
||
|
/* voices */
|
||
|
SBYTE voiceSFX;
|
||
|
|
||
|
void sndInit(void)
|
||
|
{
|
||
|
samples = hashtable_create();
|
||
|
|
||
|
/* register all the drivers */
|
||
|
MikMod_RegisterAllDrivers();
|
||
|
MikMod_RegisterAllLoaders();
|
||
|
|
||
|
/* initialize the library */
|
||
|
md_mode = 0;
|
||
|
md_mode |= DMODE_16BITS;
|
||
|
md_mode |= DMODE_SOFT_MUSIC;
|
||
|
md_mode |= DMODE_SOFT_SNDFX;
|
||
|
md_mode |= DMODE_INTERP;
|
||
|
|
||
|
md_mixfreq = audio_get_frequency();
|
||
|
|
||
|
MikMod_Init("");
|
||
|
|
||
|
/* reserve 2 voices for sound effects */
|
||
|
MikMod_SetNumVoices(-1, 2);
|
||
|
|
||
|
/* get ready to play */
|
||
|
MikMod_EnableOutput();
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
void sndPlayBGM(char* filename)
|
||
|
{
|
||
|
if (Player_Active())
|
||
|
{
|
||
|
Player_Stop();
|
||
|
}
|
||
|
Player_Free(moduleBGM);
|
||
|
moduleBGM = NULL;
|
||
|
|
||
|
moduleBGM = Player_Load(filename, 64, 0);
|
||
|
|
||
|
if (moduleBGM)
|
||
|
{
|
||
|
Player_Start(moduleBGM);
|
||
|
Player_SetVolume(20);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void sndStopAll(void)
|
||
|
{
|
||
|
Voice_Stop(voiceSFX);
|
||
|
Player_Stop();
|
||
|
MikMod_DisableOutput();
|
||
|
|
||
|
int index = 0;
|
||
|
while (index < samples->capacity) {
|
||
|
Sample_Free(samples->body[index].value);
|
||
|
index = index + 1;
|
||
|
}
|
||
|
|
||
|
hashtable_destroy(samples);
|
||
|
|
||
|
Player_Free(moduleBGM);
|
||
|
moduleBGM = NULL;
|
||
|
|
||
|
samples = hashtable_create();
|
||
|
//MikMod_Exit(); //I dont think we should ever exit as that would mean reinitialising?!
|
||
|
}
|
||
|
|
||
|
void sndPlaySFX(char* filename)
|
||
|
{
|
||
|
if (!Voice_Stopped(voiceSFX))
|
||
|
{
|
||
|
Voice_Stop(voiceSFX);
|
||
|
}
|
||
|
|
||
|
|
||
|
if (hashtable_get(samples, filename) == NULL)
|
||
|
{
|
||
|
hashtable_set(samples, filename, Sample_Load(filename));
|
||
|
}
|
||
|
|
||
|
//audio_write_silence();
|
||
|
Voice_SetVolume(voiceSFX, 200);
|
||
|
voiceSFX = Sample_Play(hashtable_get(samples, filename), 0, 0);
|
||
|
|
||
|
MikMod_Update(); //force an update so that the voice is registered as playing!
|
||
|
|
||
|
}
|
||
|
|
||
|
void sndUpdate(void)
|
||
|
{
|
||
|
if (!Voice_Stopped(voiceSFX) || Player_Active())
|
||
|
{
|
||
|
MikMod_Update();
|
||
|
|
||
|
}
|
||
|
}
|