mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-12-01 08:31:14 +00:00
- made the sound resolving a virtual method
This way the player sounds can be done in the proper place without infesting the core.
This commit is contained in:
parent
cc7807bb10
commit
165d9951aa
3 changed files with 52 additions and 28 deletions
|
@ -88,6 +88,7 @@ class DoomSoundEngine : public SoundEngine
|
||||||
bool ValidatePosVel(int sourcetype, const void* source, const FVector3& pos, const FVector3& vel);
|
bool ValidatePosVel(int sourcetype, const void* source, const FVector3& pos, const FVector3& vel);
|
||||||
TArray<uint8_t> ReadSound(int lumpnum);
|
TArray<uint8_t> ReadSound(int lumpnum);
|
||||||
int PickReplacement(int refid);
|
int PickReplacement(int refid);
|
||||||
|
int ResolveSound(const void *ent, int type, sfxinfo_t *sfx, float &attenuation);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DoomSoundEngine() = default;
|
DoomSoundEngine() = default;
|
||||||
|
@ -298,6 +299,24 @@ DEFINE_ACTION_FUNCTION(DObject, S_Sound)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
int DoomSoundEngine::ResolveSound(const void * ent, int type, sfxinfo_t *sfx, float &attenuation)
|
||||||
|
{
|
||||||
|
if (isPlayerReserve(sfx->index))
|
||||||
|
{
|
||||||
|
AActor *src;
|
||||||
|
if (type != SOURCE_Actor) src = nullptr;
|
||||||
|
else src = (AActor*)ent;
|
||||||
|
return S_FindSkinnedSound(src, sfx->index);
|
||||||
|
}
|
||||||
|
return SoundEngine::ResolveSound(ent, type, sfx, attenuation);
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// Common checking code for the actor sound functions
|
// Common checking code for the actor sound functions
|
||||||
|
@ -317,12 +336,6 @@ static bool VerifyActorSound(AActor* ent, FSoundID& sound_id, int& channel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (soundEngine->isPlayerReserve(sound_id))
|
|
||||||
{
|
|
||||||
sound_id = FSoundID(S_FindSkinnedSound(ent, sound_id));
|
|
||||||
if (sound_id <= 0) return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (compatflags & COMPATF_MAGICSILENCE)
|
if (compatflags & COMPATF_MAGICSILENCE)
|
||||||
{ // For people who just can't play without a silent BFG.
|
{ // For people who just can't play without a silent BFG.
|
||||||
channel = CHAN_WEAPON;
|
channel = CHAN_WEAPON;
|
||||||
|
|
|
@ -344,6 +344,26 @@ bool SoundEngine::ValidatePosVel(const FSoundChan* const chan, const FVector3& p
|
||||||
return ValidatePosVel(chan->SourceType, chan->Source, pos, vel);
|
return ValidatePosVel(chan->SourceType, chan->Source, pos, vel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
int SoundEngine::ResolveSound(const void *, int, sfxinfo_t *sfx, float &attenuation)
|
||||||
|
{
|
||||||
|
if (sfx->bRandomHeader)
|
||||||
|
{
|
||||||
|
// Random sounds attenuate based on the original (random) sound as well as the chosen one.
|
||||||
|
attenuation *= sfx->Attenuation;
|
||||||
|
return PickReplacement (sfx->index);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return sfx->link;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// S_StartSound
|
// S_StartSound
|
||||||
|
@ -402,35 +422,24 @@ FSoundChan *SoundEngine::StartSound(int type, const void *source,
|
||||||
// Resolve player sounds, random sounds, and aliases
|
// Resolve player sounds, random sounds, and aliases
|
||||||
while (sfx->link != sfxinfo_t::NO_LINK)
|
while (sfx->link != sfxinfo_t::NO_LINK)
|
||||||
{
|
{
|
||||||
if (sfx->bRandomHeader)
|
auto newid = ResolveSound(source, type, sfx, attenuation);
|
||||||
|
if (newid < 0) return nullptr;
|
||||||
|
auto newsfx = &S_sfx[newid];
|
||||||
|
if (newsfx != sfx)
|
||||||
{
|
{
|
||||||
// Random sounds attenuate based on the original (random) sound as well as the chosen one.
|
|
||||||
attenuation *= sfx->Attenuation;
|
|
||||||
sound_id = FSoundID(PickReplacement (sound_id));
|
|
||||||
if (near_limit < 0)
|
if (near_limit < 0)
|
||||||
{
|
{
|
||||||
near_limit = S_sfx[sound_id].NearLimit;
|
near_limit = newsfx->NearLimit;
|
||||||
limit_range = S_sfx[sound_id].LimitRange;
|
limit_range = newsfx->LimitRange;
|
||||||
}
|
}
|
||||||
if (rolloff->MinDistance == 0)
|
if (rolloff->MinDistance == 0)
|
||||||
{
|
{
|
||||||
rolloff = &S_sfx[sound_id].Rolloff;
|
rolloff = &newsfx->Rolloff;
|
||||||
}
|
}
|
||||||
|
sfx = newsfx;
|
||||||
}
|
}
|
||||||
else
|
else return nullptr; // nothing got replaced, prevent an endless loop,
|
||||||
{
|
|
||||||
sound_id = FSoundID(sfx->link);
|
|
||||||
if (near_limit < 0)
|
|
||||||
{
|
|
||||||
near_limit = S_sfx[sound_id].NearLimit;
|
|
||||||
limit_range = S_sfx[sound_id].LimitRange;
|
|
||||||
}
|
|
||||||
if (rolloff->MinDistance == 0)
|
|
||||||
{
|
|
||||||
rolloff = &S_sfx[sound_id].Rolloff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sfx = &S_sfx[sound_id];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attenuate the attenuation based on the sound.
|
// Attenuate the attenuation based on the sound.
|
||||||
|
|
|
@ -263,6 +263,8 @@ private:
|
||||||
bool CheckSingular(int sound_id);
|
bool CheckSingular(int sound_id);
|
||||||
bool CheckSoundLimit(sfxinfo_t* sfx, const FVector3& pos, int near_limit, float limit_range, int sourcetype, const void* actor, int channel);
|
bool CheckSoundLimit(sfxinfo_t* sfx, const FVector3& pos, int near_limit, float limit_range, int sourcetype, const void* actor, int channel);
|
||||||
virtual TArray<uint8_t> ReadSound(int lumpnum) = 0;
|
virtual TArray<uint8_t> ReadSound(int lumpnum) = 0;
|
||||||
|
protected:
|
||||||
|
virtual int ResolveSound(const void *ent, int srctype, sfxinfo_t *sfx, float &attenuation);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~SoundEngine() = default;
|
virtual ~SoundEngine() = default;
|
||||||
|
|
Loading…
Reference in a new issue