mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-10 23:01:59 +00:00
- Add more parameters to the ambient sound things:
* Second argument: Volume scalar. 0 and 128 are normal volume. (Where "normal" is whatever it was defined with in SNDINFO.) Other values scale it accordingly. * Third argument: Minimum distance before volume fading starts. * Fourth argument: Maximum distance at which the sound is audible. Setting either of these to 0 will use whatever they were defined with in SNDINFO. SVN r2214 (trunk)
This commit is contained in:
parent
c8b8f40356
commit
c079a3ea5b
3 changed files with 101 additions and 7 deletions
|
@ -1912,6 +1912,12 @@ private:
|
||||||
|
|
||||||
IMPLEMENT_CLASS (AAmbientSound)
|
IMPLEMENT_CLASS (AAmbientSound)
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AmbientSound :: Serialize
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
void AAmbientSound::Serialize (FArchive &arc)
|
void AAmbientSound::Serialize (FArchive &arc)
|
||||||
{
|
{
|
||||||
Super::Serialize (arc);
|
Super::Serialize (arc);
|
||||||
|
@ -1948,6 +1954,11 @@ void AAmbientSound::Serialize (FArchive &arc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AmbientSound :: Tick
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
void AAmbientSound::Tick ()
|
void AAmbientSound::Tick ()
|
||||||
{
|
{
|
||||||
|
@ -1966,7 +1977,24 @@ void AAmbientSound::Tick ()
|
||||||
|
|
||||||
if (ambient->sound[0])
|
if (ambient->sound[0])
|
||||||
{
|
{
|
||||||
S_Sound(this, CHAN_BODY | loop, ambient->sound, ambient->volume, ambient->attenuation);
|
// The second argumens scales the ambient sound's volume.
|
||||||
|
// 0 and 128 are normal volume. The maximum volume level
|
||||||
|
// possible is always 1.
|
||||||
|
float volscale = args[1] == 0 ? 1 : args[1] / 128.f;
|
||||||
|
float usevol = clamp(ambient->volume * volscale, 0.f, 1.f);
|
||||||
|
|
||||||
|
// The third argument is the minimum distance for audible fading, and
|
||||||
|
// the fourth argument is the maximum distance for audibility. Setting
|
||||||
|
// either of these to 0 or setting min distance > max distance will
|
||||||
|
// use the standard rolloff.
|
||||||
|
if ((args[2] | args[3]) == 0 || args[2] > args[3])
|
||||||
|
{
|
||||||
|
S_Sound(this, CHAN_BODY | loop, ambient->sound, usevol, ambient->attenuation);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
S_SoundMinMaxDist(this, CHAN_BODY | loop, ambient->sound, usevol, float(args[2]), float(args[3]));
|
||||||
|
}
|
||||||
if (!loop)
|
if (!loop)
|
||||||
{
|
{
|
||||||
SetTicker (ambient);
|
SetTicker (ambient);
|
||||||
|
@ -1982,6 +2010,11 @@ void AAmbientSound::Tick ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AmbientSound :: SetTicker
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
void AAmbientSound::SetTicker (struct AmbientSound *ambient)
|
void AAmbientSound::SetTicker (struct AmbientSound *ambient)
|
||||||
{
|
{
|
||||||
|
@ -2001,12 +2034,26 @@ void AAmbientSound::SetTicker (struct AmbientSound *ambient)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AmbientSound :: BeginPlay
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
void AAmbientSound::BeginPlay ()
|
void AAmbientSound::BeginPlay ()
|
||||||
{
|
{
|
||||||
Super::BeginPlay ();
|
Super::BeginPlay ();
|
||||||
Activate (NULL);
|
Activate (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AmbientSound :: Activate
|
||||||
|
//
|
||||||
|
// Starts playing a sound (or does nothing of the sound is already playing).
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
void AAmbientSound::Activate (AActor *activator)
|
void AAmbientSound::Activate (AActor *activator)
|
||||||
{
|
{
|
||||||
Super::Activate (activator);
|
Super::Activate (activator);
|
||||||
|
@ -2040,6 +2087,15 @@ void AAmbientSound::Activate (AActor *activator)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// AmbientSound :: Deactivate
|
||||||
|
//
|
||||||
|
// Stops playing CONTINUOUS sounds immediately. Also prevents further
|
||||||
|
// occurrences of repeated sounds.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
void AAmbientSound::Deactivate (AActor *activator)
|
void AAmbientSound::Deactivate (AActor *activator)
|
||||||
{
|
{
|
||||||
Super::Deactivate (activator);
|
Super::Deactivate (activator);
|
||||||
|
|
|
@ -108,7 +108,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, co
|
||||||
static void CalcSectorSoundOrg(const sector_t *sec, int channum, fixed_t *x, fixed_t *y, fixed_t *z);
|
static void CalcSectorSoundOrg(const sector_t *sec, int channum, fixed_t *x, fixed_t *y, fixed_t *z);
|
||||||
static void CalcPolyobjSoundOrg(const FPolyObj *poly, fixed_t *x, fixed_t *y, fixed_t *z);
|
static void CalcPolyobjSoundOrg(const FPolyObj *poly, fixed_t *x, fixed_t *y, fixed_t *z);
|
||||||
static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly,
|
static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly,
|
||||||
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation);
|
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation, FRolloffInfo *rolloff);
|
||||||
static void S_SetListener(SoundListener &listener, AActor *listenactor);
|
static void S_SetListener(SoundListener &listener, AActor *listenactor);
|
||||||
|
|
||||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||||
|
@ -808,7 +808,8 @@ static void CalcPolyobjSoundOrg(const FPolyObj *poly, fixed_t *x, fixed_t *y, fi
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyObj *poly,
|
static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyObj *poly,
|
||||||
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation)
|
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation,
|
||||||
|
FRolloffInfo *forcedrolloff=NULL)
|
||||||
{
|
{
|
||||||
sfxinfo_t *sfx;
|
sfxinfo_t *sfx;
|
||||||
int chanflags;
|
int chanflags;
|
||||||
|
@ -894,7 +895,10 @@ static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyO
|
||||||
near_limit = S_sfx[sound_id].NearLimit;
|
near_limit = S_sfx[sound_id].NearLimit;
|
||||||
limit_range = S_sfx[sound_id].LimitRange;
|
limit_range = S_sfx[sound_id].LimitRange;
|
||||||
}
|
}
|
||||||
if (rolloff->MinDistance == 0) rolloff = &S_sfx[sound_id].Rolloff;
|
if (rolloff->MinDistance == 0)
|
||||||
|
{
|
||||||
|
rolloff = &S_sfx[sound_id].Rolloff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -904,13 +908,25 @@ static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyO
|
||||||
near_limit = S_sfx[sound_id].NearLimit;
|
near_limit = S_sfx[sound_id].NearLimit;
|
||||||
limit_range = S_sfx[sound_id].LimitRange;
|
limit_range = S_sfx[sound_id].LimitRange;
|
||||||
}
|
}
|
||||||
if (rolloff->MinDistance == 0) rolloff = &S_sfx[sound_id].Rolloff;
|
if (rolloff->MinDistance == 0)
|
||||||
|
{
|
||||||
|
rolloff = &S_sfx[sound_id].Rolloff;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sfx = &S_sfx[sound_id];
|
sfx = &S_sfx[sound_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no valid rolloff was set use the global default
|
// The passed rolloff overrides any sound-specific rolloff.
|
||||||
if (rolloff->MinDistance == 0) rolloff = &S_Rolloff;
|
if (forcedrolloff != NULL && forcedrolloff->MinDistance != 0)
|
||||||
|
{
|
||||||
|
rolloff = forcedrolloff;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no valid rolloff was set, use the global default.
|
||||||
|
if (rolloff->MinDistance == 0)
|
||||||
|
{
|
||||||
|
rolloff = &S_Rolloff;
|
||||||
|
}
|
||||||
|
|
||||||
// If this is a singular sound, don't play it if it's already playing.
|
// If this is a singular sound, don't play it if it's already playing.
|
||||||
if (sfx->bSingular && S_CheckSingular(sound_id))
|
if (sfx->bSingular && S_CheckSingular(sound_id))
|
||||||
|
@ -1180,6 +1196,27 @@ void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float a
|
||||||
S_StartSound (ent, NULL, NULL, NULL, channel, sound_id, volume, attenuation);
|
S_StartSound (ent, NULL, NULL, NULL, channel, sound_id, volume, attenuation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// S_SoundMinMaxDist - An actor is source
|
||||||
|
//
|
||||||
|
// Attenuation is specified as min and max distances, rather than a scalar.
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume, float mindist, float maxdist)
|
||||||
|
{
|
||||||
|
if (ent == NULL || ent->Sector->Flags & SECF_SILENT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FRolloffInfo rolloff;
|
||||||
|
|
||||||
|
rolloff.RolloffType = ROLLOFF_Doom;
|
||||||
|
rolloff.MinDistance = mindist;
|
||||||
|
rolloff.MaxDistance = maxdist;
|
||||||
|
S_StartSound(ent, NULL, NULL, NULL, channel, sound_id, volume, 1, &rolloff);
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// S_Sound - A polyobject is source
|
// S_Sound - A polyobject is source
|
||||||
|
|
|
@ -218,6 +218,7 @@ void S_CacheSound (sfxinfo_t *sfx);
|
||||||
// Start sound for thing at <ent>
|
// Start sound for thing at <ent>
|
||||||
void S_Sound (int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound (int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
void S_Sound (AActor *ent, int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound (AActor *ent, int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
|
void S_SoundMinMaxDist (AActor *ent, int channel, FSoundID sfxid, float volume, float mindist, float maxdist);
|
||||||
void S_Sound (const FPolyObj *poly, int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound (const FPolyObj *poly, int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
void S_Sound (fixed_t x, fixed_t y, fixed_t z, int channel, FSoundID sfxid, float volume, float attenuation);
|
void S_Sound (fixed_t x, fixed_t y, fixed_t z, int channel, FSoundID sfxid, float volume, float attenuation);
|
||||||
|
|
Loading…
Reference in a new issue