- adapted Duke's and Exhumed's sound code to directly work with actors.

This was already wrapped so all that needed to be done was removing the wrapper.
This commit is contained in:
Christoph Oelckers 2021-11-28 10:31:15 +01:00
parent 97b19a5cb1
commit 221d9fe28e
2 changed files with 10 additions and 22 deletions

View file

@ -54,18 +54,6 @@ CVAR(Bool, wt_commentary, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
BEGIN_DUKE_NS BEGIN_DUKE_NS
// These are needed until real objects can be used for actors.
inline void* sndActor(DDukeActor* actor)
{
return actor ? actor->s : nullptr;
}
inline DDukeActor* getSndActor(const void* source)
{
// transitional conversation voodoo
return source ? &hittype[((spritetype*)source) - sprite] : nullptr;
}
static FSoundID currentCommentarySound; static FSoundID currentCommentarySound;
static DDukeActor* currentCommentarySprite; // todo: GC this once actors become objects static DDukeActor* currentCommentarySprite; // todo: GC this once actors become objects
@ -368,7 +356,7 @@ void DukeSoundEngine::CalcPosVel(int type, const void* source, const float pt[3]
} }
else if (type == SOURCE_Actor) else if (type == SOURCE_Actor)
{ {
auto aactor = getSndActor(source); auto aactor = (DDukeActor*)source;
auto aspr = aactor ? aactor->s : nullptr; auto aspr = aactor ? aactor->s : nullptr;
assert(aspr != nullptr); assert(aspr != nullptr);
if (aspr != nullptr) if (aspr != nullptr)
@ -525,7 +513,7 @@ int S_PlaySound3D(int sndnum, DDukeActor* actor, const vec3_t* pos, int channel,
if (userflags & SF_LOOP) flags |= CHANF_LOOP; if (userflags & SF_LOOP) flags |= CHANF_LOOP;
float vol = attenuation == ATTN_NONE ? 0.8f : 1.f; float vol = attenuation == ATTN_NONE ? 0.8f : 1.f;
if (currentCommentarySound != 0) vol *= 0.25f; if (currentCommentarySound != 0) vol *= 0.25f;
auto chan = soundEngine->StartSound(SOURCE_Actor, sndActor(actor), &sndpos, CHAN_AUTO, flags, sndnum+1, vol, attenuation, nullptr, S_ConvertPitch(pitch)); auto chan = soundEngine->StartSound(SOURCE_Actor, actor, &sndpos, CHAN_AUTO, flags, sndnum+1, vol, attenuation, nullptr, S_ConvertPitch(pitch));
if (chan) chan->UserData = (currentCommentarySound != 0); if (chan) chan->UserData = (currentCommentarySound != 0);
return chan ? 0 : -1; return chan ? 0 : -1;
} }
@ -570,7 +558,7 @@ int S_PlayActorSound(int soundNum, DDukeActor* actor, int channel, EChanFlags fl
void S_RelinkActorSound(DDukeActor* from, DDukeActor* to) void S_RelinkActorSound(DDukeActor* from, DDukeActor* to)
{ {
FVector3 pos = GetSoundPos(&from->s->pos); FVector3 pos = GetSoundPos(&from->s->pos);
soundEngine->RelinkSound(SOURCE_Actor, sndActor(from), sndActor(to), &pos); soundEngine->RelinkSound(SOURCE_Actor, from, to, &pos);
} }
void S_StopSound(int sndNum, DDukeActor* actor, int channel) void S_StopSound(int sndNum, DDukeActor* actor, int channel)
@ -580,7 +568,7 @@ void S_StopSound(int sndNum, DDukeActor* actor, int channel)
if (!actor) soundEngine->StopSoundID(sndNum+1); if (!actor) soundEngine->StopSoundID(sndNum+1);
else else
{ {
if (channel == -1) soundEngine->StopSound(SOURCE_Actor, sndActor(actor), -1, sndNum + 1); if (channel == -1) soundEngine->StopSound(SOURCE_Actor, actor, -1, sndNum + 1);
else soundEngine->StopSound(SOURCE_Actor, actor, channel, -1); else soundEngine->StopSound(SOURCE_Actor, actor, channel, -1);
// StopSound kills the actor reference so this cannot be delayed until ChannelEnded gets called. At that point the actor may also not be valid anymore. // StopSound kills the actor reference so this cannot be delayed until ChannelEnded gets called. At that point the actor may also not be valid anymore.
@ -600,7 +588,7 @@ void S_ChangeSoundPitch(int soundNum, DDukeActor* actor, int pitchoffset)
} }
else else
{ {
soundEngine->ChangeSoundPitch(SOURCE_Actor, sndActor(actor), CHAN_AUTO, expitch, soundNum+1); soundEngine->ChangeSoundPitch(SOURCE_Actor, actor, CHAN_AUTO, expitch, soundNum+1);
} }
} }
@ -615,14 +603,14 @@ int S_CheckActorSoundPlaying(DDukeActor* actor, int soundNum, int channel)
soundNum = GetReplacementSound(soundNum); soundNum = GetReplacementSound(soundNum);
if (actor == nullptr) return soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, soundNum+1); if (actor == nullptr) return soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, soundNum+1);
return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, sndActor(actor), channel, soundNum+1); return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, actor, channel, soundNum+1);
} }
// Check if actor <i> is playing any sound. // Check if actor <i> is playing any sound.
int S_CheckAnyActorSoundPlaying(DDukeActor* actor) int S_CheckAnyActorSoundPlaying(DDukeActor* actor)
{ {
if (!actor) return false; if (!actor) return false;
return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, sndActor(actor), CHAN_AUTO, 0); return soundEngine->IsSourcePlayingSomething(SOURCE_Actor, actor, CHAN_AUTO, 0);
} }
int S_CheckSoundPlaying(int soundNum) int S_CheckSoundPlaying(int soundNum)

View file

@ -474,11 +474,11 @@ void EXSoundEngine::CalcPosVel(int type, const void* source, const float pt[3],
} }
else if (type == SOURCE_Actor) else if (type == SOURCE_Actor)
{ {
auto actor = (spritetype*)source; auto actor = (DExhumedActor*)source;
assert(actor != nullptr); assert(actor != nullptr);
if (actor != nullptr) if (actor != nullptr)
{ {
*pos = GetSoundPos(&actor->pos); *pos = GetSoundPos(&actor->s().pos);
} }
} }
if ((chanflags & CHANF_LISTENERZ) && type != SOURCE_None) if ((chanflags & CHANF_LISTENERZ) && type != SOURCE_None)
@ -631,7 +631,7 @@ void PlayFX2(unsigned int nSound, DExhumedActor* pActor, int sectf, EChanFlags c
FSoundChan* chan = nullptr; FSoundChan* chan = nullptr;
if (pActor != nullptr) if (pActor != nullptr)
{ {
chan = soundEngine->StartSound(SOURCE_Actor, &pActor->s(), nullptr, CHAN_BODY, chanflags| CHANF_OVERLAP, nSound+1, nVolume / 255.f,fullvol? 0.5f : ATTN_NORM, nullptr, (11025 + nPitch) / 11025.f); chan = soundEngine->StartSound(SOURCE_Actor, pActor, nullptr, CHAN_BODY, chanflags| CHANF_OVERLAP, nSound+1, nVolume / 255.f,fullvol? 0.5f : ATTN_NORM, nullptr, (11025 + nPitch) / 11025.f);
} }
else else
{ {