forked from MoonsideGames/FAudioGMS
null device checks
parent
bf857d4b80
commit
d1a7ddcb9f
|
@ -306,6 +306,9 @@ typedef struct FAudioGMS_Device
|
|||
|
||||
static FAudioGMS_Device* device = NULL;
|
||||
|
||||
/* Game Maker doesn't let us control execution order on clean up so we have this stupid macro to help us not crash on exit */
|
||||
#define RETURN_ON_NULL_DEVICE(x) if (device == NULL) { return x; }
|
||||
|
||||
static inline FAudioGMS_StaticSound* FAudioGMS_INTERNAL_LookupStaticSound(uint32_t id)
|
||||
{
|
||||
if (id >= 0 && id < device->staticSoundCount)
|
||||
|
@ -516,6 +519,7 @@ static void SetPanMatrixCoefficients(FAudioGMS_SoundInstance *instance)
|
|||
|
||||
double FAudioGMS_StaticSound_LoadWAV(char *filePath)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
drwav_uint64 frameCount;
|
||||
|
||||
FAudioGMS_StaticSound *sound = SDL_malloc(sizeof(FAudioGMS_StaticSound));
|
||||
|
@ -670,7 +674,6 @@ static void FAudioGMS_INTERNAL_SoundInstance_SetPitch(FAudioGMS_SoundInstance* i
|
|||
|
||||
static void FAudioGMS_INTERNAL_SoundInstance_SetVolume(FAudioGMS_SoundInstance* instance, float volume)
|
||||
{
|
||||
instance->adjustingVolumeOverTime = 0;
|
||||
instance->volume = volume;
|
||||
FAudioVoice_SetVolume(instance->handle, volume, 0);
|
||||
}
|
||||
|
@ -884,6 +887,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_StreamingUpdate(FAudioGMS_SoundInst
|
|||
|
||||
double FAudioGMS_StreamingSound_LoadOGG(char* filePath)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
int error = 0;
|
||||
stb_vorbis *fileHandle = stb_vorbis_open_filename(filePath, &error, NULL);
|
||||
|
||||
|
@ -999,6 +1003,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Play(FAudioGMS_SoundInstance* insta
|
|||
|
||||
void FAudioGMS_StaticSound_PlayOneOff(double staticSoundID, double pan, double pitch, double volume)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_StaticSound* staticSound = FAudioGMS_INTERNAL_LookupStaticSound((uint32_t)staticSoundID);
|
||||
|
||||
if (staticSound != NULL)
|
||||
|
@ -1016,6 +1021,7 @@ void FAudioGMS_StaticSound_PlayOneOff(double staticSoundID, double pan, double p
|
|||
|
||||
void FAudioGMS_StaticSound_PlayOneOffSpatial(double staticSoundID, double x, double y, double z, double pitch, double volume)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_StaticSound* staticSound = FAudioGMS_INTERNAL_LookupStaticSound((uint32_t)staticSoundID);
|
||||
|
||||
if (staticSound != NULL)
|
||||
|
@ -1034,6 +1040,7 @@ void FAudioGMS_StaticSound_PlayOneOffSpatial(double staticSoundID, double x, dou
|
|||
|
||||
double FAudioGMS_StaticSound_Play(double staticSoundID, double pan, double pitch, double volume, double loop)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
FAudioGMS_StaticSound* staticSound = FAudioGMS_INTERNAL_LookupStaticSound((uint32_t)staticSoundID);
|
||||
|
||||
if (staticSound != NULL)
|
||||
|
@ -1053,6 +1060,7 @@ double FAudioGMS_StaticSound_Play(double staticSoundID, double pan, double pitch
|
|||
|
||||
double FAudioGMS_StaticSound_PlaySpatial(double staticSoundID, double x, double y, double z, double pitch, double volume, double loop)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
FAudioGMS_StaticSound* staticSound = FAudioGMS_INTERNAL_LookupStaticSound((uint32_t)staticSoundID);
|
||||
|
||||
if (staticSound != NULL)
|
||||
|
@ -1073,6 +1081,7 @@ double FAudioGMS_StaticSound_PlaySpatial(double staticSoundID, double x, double
|
|||
|
||||
void FAudioGMS_SoundInstance_Play(double soundInstanceID, double loop)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1084,13 +1093,14 @@ void FAudioGMS_SoundInstance_Play(double soundInstanceID, double loop)
|
|||
|
||||
void FAudioGMS_SoundInstance_Pause(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
{
|
||||
if (instance->soundState == SoundState_Playing)
|
||||
{
|
||||
FAudioSourceVoice_Stop(instance->handle, 0, 0);
|
||||
FAudioSourceVoice_Stop(instance->handle, 0, 0); /* this actually just pauses lol */
|
||||
instance->soundState = SoundState_Paused;
|
||||
}
|
||||
}
|
||||
|
@ -1103,14 +1113,15 @@ void FAudioGMS_SoundInstance_Pause(double soundInstanceID)
|
|||
static void FAudioGMS_INTERNAL_SoundInstance_Stop(FAudioGMS_SoundInstance* instance)
|
||||
{
|
||||
if (instance != NULL)
|
||||
{
|
||||
if (instance->isStatic)
|
||||
{
|
||||
FAudioSourceVoice_ExitLoop(instance->handle, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
FAudioSourceVoice_Stop(instance->handle, 0, 0);
|
||||
FAudioSourceVoice_FlushSourceBuffers(instance->handle);
|
||||
|
||||
if (!instance->isStatic)
|
||||
{
|
||||
FAudioGMS_INTERNAL_SoundInstance_ClearBuffers(instance);
|
||||
stb_vorbis_seek_start(instance->soundData.streamingSound.fileHandle); /* back to the start */
|
||||
FAudioGMS_INTERNAL_SoundInstance_StreamingUpdate(instance); /* preload so we dont stutter on play */
|
||||
}
|
||||
|
||||
instance->soundState = SoundState_Stopped;
|
||||
|
@ -1123,39 +1134,14 @@ static void FAudioGMS_INTERNAL_SoundInstance_Stop(FAudioGMS_SoundInstance* insta
|
|||
|
||||
void FAudioGMS_SoundInstance_Stop(double soundInstanceID)
|
||||
{
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
FAudioGMS_INTERNAL_SoundInstance_Stop(instance);
|
||||
}
|
||||
|
||||
static void FAudioGMS_INTERNAL_SoundInstance_StopImmediate(FAudioGMS_SoundInstance* instance)
|
||||
{
|
||||
if (instance != NULL)
|
||||
{
|
||||
FAudioSourceVoice_Stop(instance->handle, 0, 0);
|
||||
FAudioSourceVoice_FlushSourceBuffers(instance->handle);
|
||||
|
||||
if (!instance->isStatic)
|
||||
{
|
||||
FAudioGMS_INTERNAL_SoundInstance_ClearBuffers(instance);
|
||||
FAudioGMS_INTERNAL_SoundInstance_StreamingUpdate(instance);
|
||||
}
|
||||
|
||||
instance->soundState = SoundState_Stopped;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("SoundInstance_Stop: Invalid sound instance ID! Did you destroy this instance?");
|
||||
}
|
||||
}
|
||||
|
||||
void FAudioGMS_SoundInstance_StopImmediate(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
FAudioGMS_INTERNAL_SoundInstance_StopImmediate(instance);
|
||||
FAudioGMS_INTERNAL_SoundInstance_Stop(instance);
|
||||
}
|
||||
|
||||
void FAudioGMS_SoundInstance_SetPan(double soundInstanceID, double pan)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1166,6 +1152,7 @@ void FAudioGMS_SoundInstance_SetPan(double soundInstanceID, double pan)
|
|||
|
||||
void FAudioGMS_SoundInstance_SetPitch(double soundInstanceID, double pitch)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1176,8 +1163,10 @@ void FAudioGMS_SoundInstance_SetPitch(double soundInstanceID, double pitch)
|
|||
|
||||
void FAudioGMS_SoundInstance_SetVolume(double soundInstanceID, double volume)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
instance->adjustingVolumeOverTime = 0; /* override volume adjustment over time */
|
||||
if (instance != NULL)
|
||||
{
|
||||
FAudioGMS_INTERNAL_SoundInstance_SetVolume(instance, volume);
|
||||
|
@ -1186,6 +1175,7 @@ void FAudioGMS_SoundInstance_SetVolume(double soundInstanceID, double volume)
|
|||
|
||||
void FAudioGMS_SoundInstance_Set3DPosition(double soundInstanceID, double x, double y, double z)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1208,6 +1198,7 @@ void FAudioGMS_SoundInstance_Set3DPosition(double soundInstanceID, double x, dou
|
|||
|
||||
void FAudioGMS_SoundInstance_SetTrackPosition(double soundInstanceID, double trackPositionInSeconds)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1217,7 +1208,7 @@ void FAudioGMS_SoundInstance_SetTrackPosition(double soundInstanceID, double tra
|
|||
FAudioGMS_SoundState currentState = instance->soundState;
|
||||
if (currentState == SoundState_Playing)
|
||||
{
|
||||
FAudioGMS_INTERNAL_SoundInstance_StopImmediate(instance);
|
||||
FAudioGMS_INTERNAL_SoundInstance_Stop(instance);
|
||||
}
|
||||
|
||||
if (instance->isStatic)
|
||||
|
@ -1238,6 +1229,7 @@ void FAudioGMS_SoundInstance_SetTrackPosition(double soundInstanceID, double tra
|
|||
|
||||
void FAudioGMS_SoundInstance_SetVolumeOverTime(double soundInstanceID, double volume, double milliseconds)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);\
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1250,6 +1242,7 @@ void FAudioGMS_SoundInstance_SetVolumeOverTime(double soundInstanceID, double vo
|
|||
|
||||
double FAudioGMS_SoundInstance_GetPitch(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1265,6 +1258,7 @@ double FAudioGMS_SoundInstance_GetPitch(double soundInstanceID)
|
|||
|
||||
double FAudioGMS_SoundInstance_GetVolume(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1280,6 +1274,7 @@ double FAudioGMS_SoundInstance_GetVolume(double soundInstanceID)
|
|||
|
||||
double FAudioGMS_SoundInstance_GetTrackLengthInSeconds(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1302,6 +1297,7 @@ double FAudioGMS_SoundInstance_GetTrackLengthInSeconds(double soundInstanceID)
|
|||
|
||||
void FAudioGMS_SetListenerPosition(double x, double y, double z)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
device->listener.Velocity.x = x - device->listener.Position.x;
|
||||
device->listener.Velocity.y = y - device->listener.Position.y;
|
||||
device->listener.Velocity.z = z - device->listener.Position.z;
|
||||
|
@ -1317,7 +1313,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Destroy(FAudioGMS_SoundInstance* in
|
|||
{
|
||||
device->soundInstances[instance->id] = NULL;
|
||||
IdStack_Push(&device->soundInstanceIndexStack, instance->id);
|
||||
FAudioGMS_INTERNAL_SoundInstance_StopImmediate(instance);
|
||||
FAudioGMS_INTERNAL_SoundInstance_Stop(instance);
|
||||
FAudioVoice_DestroyVoice(instance->handle);
|
||||
if (!instance->isStatic)
|
||||
{
|
||||
|
@ -1335,6 +1331,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Destroy(FAudioGMS_SoundInstance* in
|
|||
|
||||
void FAudioGMS_SoundInstance_Destroy(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1345,6 +1342,7 @@ void FAudioGMS_SoundInstance_Destroy(double soundInstanceID)
|
|||
|
||||
void FAudioGMS_SoundInstance_DestroyWhenFinished(double soundInstanceID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance* instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
|
||||
if (instance != NULL)
|
||||
|
@ -1353,7 +1351,7 @@ void FAudioGMS_SoundInstance_DestroyWhenFinished(double soundInstanceID)
|
|||
}
|
||||
}
|
||||
|
||||
/* FIXME: this will die horribly if a sound is playing */
|
||||
/* NOTE: this will die horribly if a sound is playing */
|
||||
static void FAudioGMS_INTERNAL_StaticSound_Destroy(FAudioGMS_StaticSound* sound)
|
||||
{
|
||||
if (sound != NULL)
|
||||
|
@ -1367,12 +1365,14 @@ static void FAudioGMS_INTERNAL_StaticSound_Destroy(FAudioGMS_StaticSound* sound)
|
|||
|
||||
void FAudioGMS_StaticSound_Destroy(double staticSoundID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_StaticSound *sound = FAudioGMS_INTERNAL_LookupStaticSound((uint32_t)staticSoundID);
|
||||
FAudioGMS_INTERNAL_StaticSound_Destroy(sound);
|
||||
}
|
||||
|
||||
double FAudioGMS_EffectChain_Create()
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE(-1.0)
|
||||
FAudioGMS_EffectChain* effectChain = SDL_malloc(sizeof(FAudioGMS_EffectChain));
|
||||
|
||||
effectChain->fAudioEffectChain.EffectCount = 0;
|
||||
|
@ -1420,6 +1420,7 @@ static void FAudioGMS_INTERNAL_EffectChain_AddReverb(FAudioGMS_EffectChain* effe
|
|||
|
||||
void FAudioGMS_EffectChain_AddDefaultReverb(double effectChainID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_EffectChain *effectChain = FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
|
||||
|
||||
if (effectChain != NULL)
|
||||
|
@ -1471,6 +1472,7 @@ void FAudioGMS_EffectChain_AddReverb(
|
|||
double density,
|
||||
double roomSize
|
||||
) {
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_EffectChain* effectChain = FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
|
||||
|
||||
if (effectChain != NULL)
|
||||
|
@ -1506,6 +1508,7 @@ void FAudioGMS_EffectChain_AddReverb(
|
|||
|
||||
void FAudioGMS_SoundInstance_SetEffectChain(double soundInstanceID, double effectChainID, double effectGain)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_SoundInstance *instance = FAudioGMS_INTERNAL_LookupSoundInstance((uint32_t)soundInstanceID);
|
||||
FAudioGMS_EffectChain *effectChain = FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
|
||||
uint32_t i;
|
||||
|
@ -1612,6 +1615,7 @@ static void FAudioGMS_INTERNAL_EffectChain_Destroy(FAudioGMS_EffectChain *effect
|
|||
|
||||
void FAudioGMS_EffectChain_Destroy(double effectChainID)
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
FAudioGMS_EffectChain *effectChain = FAudioGMS_INTERNAL_LookupEffectChain((uint32_t)effectChainID);
|
||||
|
||||
if (effectChain != NULL)
|
||||
|
@ -1622,6 +1626,7 @@ void FAudioGMS_EffectChain_Destroy(double effectChainID)
|
|||
|
||||
void FAudioGMS_Update()
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < device->soundInstanceCount; i += 1)
|
||||
|
@ -1684,16 +1689,18 @@ void FAudioGMS_Update()
|
|||
|
||||
void FAudioGMS_StopAll()
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < device->soundInstanceCount; i += 1)
|
||||
{
|
||||
FAudioGMS_INTERNAL_SoundInstance_StopImmediate(device->soundInstances[i]);
|
||||
FAudioGMS_INTERNAL_SoundInstance_Stop(device->soundInstances[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void FAudioGMS_Destroy()
|
||||
{
|
||||
RETURN_ON_NULL_DEVICE()
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < device->soundInstanceCount; i += 1)
|
||||
|
|
|
@ -53,7 +53,6 @@ FAUDIOGMSAPI double FAudioGMS_StreamingSound_LoadOGG(char* filepath); /* returns
|
|||
FAUDIOGMSAPI void FAudioGMS_SoundInstance_Play(double soundInstanceID, double loop);
|
||||
FAUDIOGMSAPI void FAudioGMS_SoundInstance_Pause(double soundInstanceID);
|
||||
FAUDIOGMSAPI void FAudioGMS_SoundInstance_Stop(double soundInstanceID);
|
||||
FAUDIOGMSAPI void FAudioGMS_SoundInstance_StopImmediate(double soundInstanceID);
|
||||
|
||||
FAUDIOGMSAPI void FAudioGMS_SoundInstance_SetPan(double soundInstanceID, double pan);
|
||||
FAUDIOGMSAPI void FAudioGMS_SoundInstance_SetPitch(double soundInstanceID, double pitch);
|
||||
|
|
Loading…
Reference in New Issue