more improvements to the sound offsetting

This commit is contained in:
Bill Currie 2007-03-25 08:12:43 +00:00 committed by Jeff Teunissen
parent 2f7d686a3c
commit 1d1982fddf
3 changed files with 23 additions and 26 deletions

View file

@ -43,6 +43,7 @@ typedef struct sfx_s sfx_t;
struct sfx_s
{
const char *name;
sfx_t *owner;
unsigned int length;
unsigned int loopstart;

View file

@ -546,12 +546,25 @@ SND_SetListener (const vec3_t origin, const vec3_t forward, const vec3_t right,
}
}
static int
snd_check_channels (channel_t *target_chan, const channel_t *check,
const sfx_t *osfx)
{
if (!check || check == target_chan)
return 0;
if (check->sfx->owner == osfx->owner && !check->pos) {
int skip = rand () % (int) (0.01 * snd_shm->speed);
target_chan->pos = -skip;
return 1;
}
return 0;
}
void
SND_StartSound (int entnum, int entchannel, sfx_t *sfx, const vec3_t origin,
float fvol, float attenuation)
{
int vol;
unsigned int skip;
channel_t *target_chan, *check;
sfx_t *osfx;
@ -562,7 +575,7 @@ SND_StartSound (int entnum, int entchannel, sfx_t *sfx, const vec3_t origin,
sfx->loopstart != (unsigned) -1);
if (!target_chan)
return;
Sys_Printf ("SND_StartSound: %s\n", sfx->name);
vol = fvol * 255;
// spatialize
@ -581,32 +594,12 @@ SND_StartSound (int entnum, int entchannel, sfx_t *sfx, const vec3_t origin,
// if an identical sound has also been started this frame, offset the pos
// a bit to keep it from just making the first one louder
for (check = dynamic_channels; check; check = check->next) {
if (!check || check == target_chan)
continue;
if (check->sfx == osfx && !check->pos) {
skip = rand () % (int) (0.01 * snd_shm->speed);
target_chan->pos = -skip;
//if (skip >= target_chan->end)
// skip = target_chan->end - 1;
//target_chan->pos += skip;
//target_chan->end -= skip;
for (check = dynamic_channels; check; check = check->next)
if (snd_check_channels (target_chan, check, osfx))
break;
}
}
for (check = looped_dynamic_channels; check; check = check->next) {
if (!check || check == target_chan)
continue;
if (check->sfx == osfx && !check->pos) {
skip = rand () % (int) (0.01 * snd_shm->speed);
target_chan->pos = -skip;
//if (skip >= target_chan->end)
// skip = target_chan->end - 1;
//target_chan->pos += skip;
//target_chan->end -= skip;
for (check = looped_dynamic_channels; check; check = check->next)
if (snd_check_channels (target_chan, check, osfx))
break;
}
}
if (!osfx->retain (osfx))
return; // couldn't load the sound's data
target_chan->sfx = osfx;

View file

@ -70,6 +70,7 @@ snd_sfx_free (void *_sfx, void *unused)
sfx_t *sfx = (sfx_t *) _sfx;
free ((char *) sfx->name);
sfx->name = 0;
sfx->owner = 0;
}
void
@ -122,6 +123,7 @@ SND_SFX_StreamOpen (sfx_t *sfx, void *file,
sfx_t *new_sfx = calloc (1, sizeof (sfx_t));
new_sfx->name = sfx->name;
new_sfx->owner = sfx;
new_sfx->wavinfo = SND_CacheWavinfo;
new_sfx->touch = new_sfx->retain = SND_StreamRetain;
new_sfx->release = SND_StreamRelease;
@ -175,6 +177,7 @@ SND_LoadSound (const char *name)
sfx = &snd_sfx[snd_num_sfx++];
sfx->name = strdup (name);
sfx->owner = sfx;
SND_Load (sfx);
Hash_Add (snd_sfx_hash, sfx);
return sfx;