|
|
@ -114,7 +114,9 @@ void S_Shutdown(void) |
|
|
{ |
|
|
{ |
|
|
Con_DPrintf("[FMOD] Shutdown\n"); |
|
|
Con_DPrintf("[FMOD] Shutdown\n"); |
|
|
|
|
|
|
|
|
// Destroy any SFX channels still in use |
|
|
|
|
|
|
|
|
S_StopAllSounds(true); |
|
|
|
|
|
|
|
|
|
|
|
// TODO: destroy all FMOD_SOUNDs that are attached to sfx_t's |
|
|
|
|
|
|
|
|
// If we created the FMOD System (and consequently own it), destroy it here |
|
|
// If we created the FMOD System (and consequently own it), destroy it here |
|
|
if (fmod_ownership) |
|
|
if (fmod_ownership) |
|
|
@ -243,20 +245,10 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f |
|
|
if (!sfx->sound) |
|
|
if (!sfx->sound) |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
// Find channel group for entity number (or create) => note entnum can also be some random hash value |
|
|
|
|
|
// ChannelControl::setMode => set to 3D |
|
|
|
|
|
// Can use channel group per entity to store entity-specific userdata, with maybe 8-16 fixed channel slots |
|
|
|
|
|
// Note: entnum <0 is used by temporary entities, means there's no tie to any entity info at all: just play on any free channel |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Choose a slot to play the sound on, and stop any conflicting sound on the same entchannel |
|
|
|
|
|
// Do this before playing the new sound, so that any previous sound will be stopped in time |
|
|
userdata = SND_PickSoundSlot(entnum, entchannel); |
|
|
userdata = SND_PickSoundSlot(entnum, entchannel); |
|
|
|
|
|
|
|
|
// Pre-define channels for each entity (could be an array of ints, probably array of entchannel_t structs) |
|
|
|
|
|
// For entchannel 0, dynamically select a free channel (or just play without doing anything, let FMOD handle it) |
|
|
|
|
|
// If channel at index entchannel >0 is already playing: stop |
|
|
|
|
|
// Set userdata pointer to entchannel_t so we can check if the FMOD channel still belongs to this entity & entchannel, before checking if it's already playing |
|
|
|
|
|
// Special case entchannel -1 => just play locally on listener, no 3D (also override any sound already playing on entity) |
|
|
|
|
|
|
|
|
|
|
|
// System::playSound with paused = true |
|
|
|
|
|
result = FMOD_System_PlaySound(fmod_system, sfx->sound, sfx_channelGroup, 1, &channel); |
|
|
result = FMOD_System_PlaySound(fmod_system, sfx->sound, sfx_channelGroup, 1, &channel); |
|
|
if (result != FMOD_OK) |
|
|
if (result != FMOD_OK) |
|
|
{ |
|
|
{ |
|
|
@ -282,7 +274,7 @@ void S_StartSound(int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float f |
|
|
FMOD_Channel_SetPriority(channel, 64); // Ensure local sounds always get priority over other entities |
|
|
FMOD_Channel_SetPriority(channel, 64); // Ensure local sounds always get priority over other entities |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Use ChannelControl::setDelay and ChannelControl::getDSPClock to add a delay to move sounds out of phase if necessary |
|
|
|
|
|
|
|
|
// TODO: Use ChannelControl::setDelay and ChannelControl::getDSPClock to add a delay to move sounds out of phase if necessary |
|
|
|
|
|
|
|
|
FMOD_Channel_SetPaused(channel, 0); |
|
|
FMOD_Channel_SetPaused(channel, 0); |
|
|
} |
|
|
} |
|
|
@ -355,8 +347,7 @@ void S_StopAllSounds(qboolean clear) |
|
|
if (!fmod_system) |
|
|
if (!fmod_system) |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
// TODO Use this to remove per-entity channel group and clear all userdata? => should already be handled by Stop (but double check!) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Stopping all sounds also ensures that any associated zone memory is freed |
|
|
FMOD_ChannelGroup_Stop(sfx_channelGroup); |
|
|
FMOD_ChannelGroup_Stop(sfx_channelGroup); |
|
|
|
|
|
|
|
|
if (clear) |
|
|
if (clear) |
|
|
@ -399,6 +390,9 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up) |
|
|
|
|
|
|
|
|
void S_ExtraUpdate(void) |
|
|
void S_ExtraUpdate(void) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if (!fmod_system) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
FMOD_System_Update(fmod_system); |
|
|
FMOD_System_Update(fmod_system); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|