i++;
}
- sfx = S_PrecacheSound (name, true, false);
+ sfx = S_PrecacheSound (name, true, true);
if (sfx)
{
ch_ind = S_StartSound (-1, 0, sfx, listener_origin, fvol, attenuation);
/*
==================
-S_ServerSounds
+S_ClearUsed
==================
*/
-void S_ServerSounds (char serversound [][MAX_QPATH], unsigned int numsounds)
+void S_ClearUsed (void)
{
sfx_t *sfx;
// sfx_t *sfxnext;
S_UnlockSfx (sfx);
sfx->flags &= ~SFXFLAG_SERVERSOUND;
}
-
- // Add 1 lock and the SFXFLAG_SERVERSOUND flag to each sfx in "serversound"
- for (i = 1; i < numsounds; i++)
- {
- sfx = S_FindName (serversound[i]);
- if (sfx != NULL)
- {
- // clear the FILEMISSING flag so that S_LoadSound will try again on a
- // previously missing file
- sfx->flags &= ~ SFXFLAG_FILEMISSING;
- S_LockSfx (sfx);
- sfx->flags |= SFXFLAG_SERVERSOUND;
- }
- }
}
/*
S_PrecacheSound
==================
*/
-sfx_t *S_PrecacheSound (const char *name, qboolean complain, qboolean lock)
+sfx_t *S_PrecacheSound (const char *name, qboolean complain, qboolean serversound)
{
sfx_t *sfx;
// previously missing file
sfx->flags &= ~ SFXFLAG_FILEMISSING;
- if (lock)
+ if (serversound && !(sfx->flags & SFXFLAG_SERVERSOUND))
+ {
S_LockSfx (sfx);
+ sfx->flags |= SFXFLAG_SERVERSOUND;
+ }
if (!nosound.integer && snd_precache.integer)
S_LoadSound(sfx, complain);
{
// no sound on this channel
first_to_die = ch_idx;
- break;
+ goto emptychan_found;
}
// don't let monster sounds override player sounds
if (first_to_die == -1)
return NULL;
+
+ S_StopChannel (first_to_die, true);
+emptychan_found:
return &channels[first_to_die];
}
void S_PlaySfxOnChannel (sfx_t *sfx, channel_t *target_chan, unsigned int flags, vec3_t origin, float fvol, float attenuation, qboolean isstatic)
{
+ if (!sfx)
+ {
+ Con_Printf("S_PlaySfxOnChannel called with NULL??\n");
+ return;
+ }
// Initialize the channel
+ // a crash was reported on an in-use channel, so check here...
+ if (target_chan->sfx)
+ {
+ int channelindex = (int)(target_chan - channels);
+ Con_Printf("S_PlaySfxOnChannel(%s): channel %i already in use?? Clearing.\n", sfx->name, channelindex);
+ S_StopChannel (channelindex, true);
+ }
// We MUST set sfx LAST because otherwise we could crash a threaded mixer
// (otherwise we'd have to call SndSys_LockRenderBuffer here)
memset (target_chan, 0, sizeof (*target_chan));
channels[ch_ind].master_vol = (int)(fvol * 255.0f);
}
+float S_GetChannelPosition (unsigned int ch_ind)
+{
+ // note: this is NOT accurate yet
+ int s;
+ channel_t *ch = &channels[ch_ind];
+ sfx_t *sfx = ch->sfx;
+
+ s = ch->pos;
+ /*
+ if(!snd_usethreadedmixing)
+ s += _snd_mixahead.value * S_GetSoundRate();
+ */
+ return (s % sfx->total_length) / (float) S_GetSoundRate();
+}
+
+
/*
=================