void S_SoundList(void);
void S_Update_();
-void S_ClearBuffer (void);
-
// =======================================================================
// Internal sound data & structures
// Functions
// ====================================================================
+void S_FreeSfx (sfx_t *sfx, qboolean force);
+
+
void S_SoundInfo_f(void)
{
if (!sound_started)
sound_started = true;
Con_DPrintf("Sound sampling rate: %i\n", shm->format.speed);
-
- S_StopAllSounds ();
}
void S_Shutdown(void)
}
+/*
+================
+S_Terminate
+
+Shutdown and free all resources
+================
+*/
+void S_Terminate (void)
+{
+ S_Shutdown ();
+ OGG_CloseLibrary ();
+
+ // Free all SFXs
+ while (known_sfx != NULL)
+ S_FreeSfx (known_sfx, true);
+
+ Cvar_SetValueQuick (&snd_initialized, false);
+ Mem_FreePool (&snd_mempool);
+}
+
+
// =======================================================================
// Load a sound
// =======================================================================
if (!snd_initialized.integer)
return NULL;
- // Add the default sound directory to the path
if (strlen (name) >= sizeof (sfx->name))
- Host_Error ("S_FindName: sound name too long (%s)", name);
+ {
+ Con_Printf ("S_FindName: sound name too long (%s)", name);
+ return NULL;
+ }
// Look for this sound in the list of known sfx
for (sfx = known_sfx; sfx != NULL; sfx = sfx->next)
==================
*/
-void S_FreeSfx (sfx_t *sfx)
+void S_FreeSfx (sfx_t *sfx, qboolean force)
{
- // Never free a locked sfx
- if (sfx->locks > 0 || (sfx->flags & SFXFLAG_PERMANENTLOCK))
+ // Never free a locked sfx unless forced
+ if (!force && (sfx->locks > 0 || (sfx->flags & SFXFLAG_PERMANENTLOCK)))
return;
Con_DPrintf ("S_FreeSfx: freeing %s\n", sfx->name);
break;
}
if (prev_sfx == NULL)
- Sys_Error ("S_FreeSfx: Can't find SFX %s in the list!\n", sfx->name);
+ {
+ Con_Printf ("S_FreeSfx: Can't find SFX %s in the list!\n", sfx->name);
+ return;
+ }
}
// Free it
void S_ServerSounds (char serversound [][MAX_QPATH], unsigned int numsounds)
{
sfx_t *sfx;
+ sfx_t *sfxnext;
unsigned int i;
// Start the ambient sounds and make them loop
}
// Free all unlocked sfx
- sfx = known_sfx;
- while (sfx != NULL)
+ for (sfx = known_sfx;sfx;sfx = sfxnext)
{
- sfx_t* crtsfx;
-
- // We may lose the "next" pointer after S_FreeSfx
- crtsfx = sfx;
- sfx = sfx->next;
-
- S_FreeSfx (crtsfx);
+ sfxnext = sfx->next;
+ S_FreeSfx (sfx, false);
}
}
else
{
// update sound origin if we know about the entity
- if (ch->entnum > 0 && cls.state == ca_connected && cl_entities[ch->entnum].state_current.active)
+ if (ch->entnum > 0 && cls.state == ca_connected && cl_entities[ch->entnum].render.model)
{
- //Con_Printf("-- entnum %i origin %f %f %f neworigin %f %f %f\n", ch->entnum, ch->origin[0], ch->origin[1], ch->origin[2], cl_entities[ch->entnum].state_current.origin[0], cl_entities[ch->entnum].state_current.origin[1], cl_entities[ch->entnum].state_current.origin[2]);
- VectorCopy(cl_entities[ch->entnum].state_current.origin, ch->origin);
- if (cl_entities[ch->entnum].state_current.modelindex && cl.model_precache[cl_entities[ch->entnum].state_current.modelindex] && cl.model_precache[cl_entities[ch->entnum].state_current.modelindex]->soundfromcenter)
- VectorMAMAM(1.0f, ch->origin, 0.5f, cl.model_precache[cl_entities[ch->entnum].state_current.modelindex]->normalmins, 0.5f, cl.model_precache[cl_entities[ch->entnum].state_current.modelindex]->normalmaxs, ch->origin);
+ //Con_Printf("-- entnum %i origin %f %f %f neworigin %f %f %f\n", ch->entnum, ch->origin[0], ch->origin[1], ch->origin[2], cl_entities[ch->entnum].persistent.trail_origin[0], cl_entities[ch->entnum].persistent.trail_origin[1], cl_entities[ch->entnum].persistent.trail_origin[2]);
+ VectorCopy(cl_entities[ch->entnum].persistent.trail_origin, ch->origin);
}
// calculate stereo seperation and distance attenuation
// calculate the volumes
ch->leftvol = (int) (scale + pan);
ch->rightvol = (int) (scale - pan);
+ //Con_Printf("%f %f %f:%f %f %f:%f %f:%d %d\n", ch->origin[0], ch->origin[1], ch->origin[2], source_vec[0], source_vec[1], source_vec[2], scale, pan, ch->leftvol, ch->rightvol);
}
// Adjust volume of static sounds
{
channel_t *target_chan, *check;
int ch_idx;
- size_t skip;
+ int skip;
if (!sound_started || !sfx || nosound.integer)
return -1;
return -1;
}
+ if (entnum && entnum >= cl_max_entities)
+ CL_ExpandEntities(entnum);
+
// Pick a channel to play on
target_chan = SND_PickChannel(entnum, entchannel);
if (!target_chan)
if (check->sfx == sfx && !check->pos)
{
skip = 0.1 * sfx->format.speed;
- if (skip > sfx->total_length)
- skip = sfx->total_length;
+ if (skip > (int)sfx->total_length)
+ skip = (int)sfx->total_length;
if (skip > 0)
skip = rand() % skip;
target_chan->pos += skip;
// Free the sfx if the file didn't exist
if (ch_ind < 0)
- S_FreeSfx (sfx);
+ S_FreeSfx (sfx, false);
else
channels[ch_ind].flags |= CHANNELFLAG_LOCALSOUND;
}
{
if (sfx->fetcher != NULL)
{
- size = sfx->mempool->totalsize;
+ size = (int)sfx->mempool->totalsize;
total += size;
Con_Printf ("%c%c%c%c(%2db, %6s) %8i : %s\n",
(sfx->loopstart >= 0) ? 'L' : ' ',
// Local sounds must not be freed
sfx->flags |= SFXFLAG_PERMANENTLOCK;
- ch_ind = S_StartSound (cl.viewentity, 0, sfx, vec3_origin, 1, 1);
+ ch_ind = S_StartSound (cl.viewentity, 0, sfx, vec3_origin, 1, 0);
if (ch_ind < 0)
return false;