Apply volume to sounds with origin too

Previously sounds with an origin would always start at max volume. This is
because the distance calculation adjusts the volume, and that volume needs to
be updated every tic as distance changes. Storing the original volume works.
This commit is contained in:
James R 2020-09-08 22:40:42 -07:00
parent b0f89a5dba
commit 22177753d2

View file

@ -162,6 +162,9 @@ typedef struct
// origin of sound // origin of sound
const void *origin; const void *origin;
// initial volume of sound, which is applied after distance and direction
INT32 volume;
// handle of the sound being played // handle of the sound being played
INT32 handle; INT32 handle;
@ -432,6 +435,7 @@ void S_StopSoundByNum(sfxenum_t sfxnum)
void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume)
{ {
const INT32 initial_volume = volume;
INT32 sep, pitch, priority, cnum; INT32 sep, pitch, priority, cnum;
sfxinfo_t *sfx; sfxinfo_t *sfx;
const boolean reverse = (stereoreverse.value ^ encoremode); const boolean reverse = (stereoreverse.value ^ encoremode);
@ -789,6 +793,7 @@ dontplay4:
// Assigns the handle to one of the channels in the // Assigns the handle to one of the channels in the
// mix/output buffer. // mix/output buffer.
channels[cnum].volume = initial_volume;
channels[cnum].handle = I_StartSound(sfx_id, volume, sep, pitch, priority, cnum); channels[cnum].handle = I_StartSound(sfx_id, volume, sep, pitch, priority, cnum);
} }
@ -1054,7 +1059,7 @@ void S_UpdateSounds(void)
if (I_SoundIsPlaying(c->handle)) if (I_SoundIsPlaying(c->handle))
{ {
// initialize parameters // initialize parameters
volume = 255; // 8 bits internal volume precision volume = c->volume; // 8 bits internal volume precision
pitch = NORM_PITCH; pitch = NORM_PITCH;
sep = NORM_SEP; sep = NORM_SEP;
@ -1361,15 +1366,12 @@ INT32 S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 *v
} }
// volume calculation // volume calculation
if (approx_dist < S_CLOSE_DIST) /* not sure if it should be > (no =), but this matches the old behavior */
{ if (approx_dist >= S_CLOSE_DIST)
// SfxVolume is now hardware volume
*vol = 255; // not snd_SfxVolume
}
else
{ {
// distance effect // distance effect
*vol = (15 * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS)) / S_ATTENUATOR; INT32 n = (15 * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS));
*vol = FixedMul(*vol * FRACUNIT / 255, n) / S_ATTENUATOR;
} }
if (splitscreen) if (splitscreen)