- Changed the sound system to ignore sounds not from the primary level.

This is a task for later when other things actually work, but until then, any sound from a sub-level should simply not play at all.
This required giving the positioned S_Sound version a Level argument so that the sound engine can check which level such a sound belongs to.
This commit is contained in:
Christoph Oelckers 2019-01-09 19:53:14 +01:00
parent 00b49282be
commit 45a4bc88a2
5 changed files with 27 additions and 20 deletions

View file

@ -701,7 +701,7 @@ void P_DrawRailTrail(AActor *source, TArray<SPortalHit> &portalhits, int color1,
{ {
if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg; if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg;
} }
S_Sound (DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM); S_Sound (mo->Level, DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM);
} }
} }
} }

View file

@ -6076,7 +6076,7 @@ foundone:
} }
else else
{ {
S_Sound(pos, CHAN_ITEM, smallsplash ? S_Sound(sec->Level, pos, CHAN_ITEM, smallsplash ?
splash->SmallSplashSound : splash->NormalSplashSound, splash->SmallSplashSound : splash->NormalSplashSound,
1, ATTN_IDLE); 1, ATTN_IDLE);
} }
@ -6284,7 +6284,7 @@ void P_PlaySpawnSound(AActor *missile, AActor *spawner)
// If there is no spawner use the spawn position. // If there is no spawner use the spawn position.
// But not in a silenced sector. // But not in a silenced sector.
if (!(missile->Sector->Flags & SECF_SILENT)) if (!(missile->Sector->Flags & SECF_SILENT))
S_Sound (missile->Pos(), CHAN_WEAPON, missile->SeeSound, 1, ATTN_NORM); S_Sound (missile->Level, missile->Pos(), CHAN_WEAPON, missile->SeeSound, 1, ATTN_NORM);
} }
} }
} }

View file

@ -303,7 +303,7 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, uint8_t special, bool *q
} }
if (playsound) if (playsound)
{ {
S_Sound (DVector3(pt, 0), CHAN_VOICE|CHAN_LISTENERZ, sound, 1, ATTN_STATIC); S_Sound (side->sector->Level, DVector3(pt, 0), CHAN_VOICE|CHAN_LISTENERZ, sound, 1, ATTN_STATIC);
} }
if (quest != NULL) if (quest != NULL)
{ {
@ -412,7 +412,7 @@ void DActiveButton::Tick ()
if (def != NULL) if (def != NULL)
{ {
m_Frame = -1; m_Frame = -1;
S_Sound (DVector3(m_Pos, 0), CHAN_VOICE|CHAN_LISTENERZ, S_Sound (Level, DVector3(m_Pos, 0), CHAN_VOICE|CHAN_LISTENERZ,
def->Sound != 0 ? FSoundID(def->Sound) : FSoundID("switches/normbutn"), def->Sound != 0 ? FSoundID(def->Sound) : FSoundID("switches/normbutn"),
1, ATTN_STATIC); 1, ATTN_STATIC);
bFlippable = false; bFlippable = false;

View file

@ -130,12 +130,13 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, co
const float pt[3], int channel, int chanflags, FVector3 *pos, FVector3 *vel); const float pt[3], int channel, int chanflags, FVector3 *pos, FVector3 *vel);
static void CalcSectorSoundOrg(const DVector3 &listenpos, const sector_t *sec, int channum, FVector3 &res); static void CalcSectorSoundOrg(const DVector3 &listenpos, const sector_t *sec, int channum, FVector3 &res);
static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly, FVector3 &res); static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly, FVector3 &res);
static FSoundChan *S_StartSound(AActor *mover, const sector_t *sec, const FPolyObj *poly, static FSoundChan *S_StartSound(FLevelLocals *Level, AActor *mover, const sector_t *sec, const FPolyObj *poly,
const FVector3 *pt, int channel, FSoundID sound_id, float volume, float attenuation, FRolloffInfo *rolloff); 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 ------------------------------------------------
static FLevelLocals *SoundMainLevel; // this is the level for which sound should be played.
static bool SoundPaused; // whether sound is paused static bool SoundPaused; // whether sound is paused
static bool MusicPaused; // whether music is paused static bool MusicPaused; // whether music is paused
MusPlayingInfo mus_playing; // music currently being played MusPlayingInfo mus_playing; // music currently being played
@ -394,6 +395,7 @@ void S_Start (FLevelLocals *Level)
{ {
if (GSnd) if (GSnd)
{ {
SoundMainLevel = Level;
// kill all playing sounds at start of level (trust me - a good idea) // kill all playing sounds at start of level (trust me - a good idea)
S_StopAllChannels(); S_StopAllChannels();
@ -691,14 +693,13 @@ static void CalcPosVel( int type, const AActor *actor, const sector_t *sector,
DVector3 listenpos; DVector3 listenpos;
int pgroup; int pgroup;
AActor *listener = players[consoleplayer].camera; AActor *listener = players[consoleplayer].camera;
FLevelLocals *Level; FLevelLocals *Level = SoundMainLevel;
if (listener != nullptr) if (listener != nullptr)
{ {
listenpos = listener->Pos(); listenpos = listener->Pos();
*pos = listener->SoundPos(); *pos = listener->SoundPos();
pgroup = listener->Sector->PortalGroup; pgroup = listener->Sector->PortalGroup;
Level = listener->Level;
} }
else else
{ {
@ -706,14 +707,13 @@ static void CalcPosVel( int type, const AActor *actor, const sector_t *sector,
pos->Zero(); pos->Zero();
pgroup = 0; pgroup = 0;
type = SOURCE_None; // No level means that no level sound placement should be performed. type = SOURCE_None; // No level means that no level sound placement should be performed.
Level = nullptr;
} }
// [BL] Moved this case out of the switch statement to make code easier // [BL] Moved this case out of the switch statement to make code easier
// on static analysis. // on static analysis.
if(type == SOURCE_Unattached) if(type == SOURCE_Unattached)
{ {
assert(Level != nullptr); assert(Level != NULL);
sector_t *sec = P_PointInSector(pt[0], pt[2]); sector_t *sec = P_PointInSector(pt[0], pt[2]);
DVector2 disp = Level->Displacements.getOffset(pgroup, sec->PortalGroup); DVector2 disp = Level->Displacements.getOffset(pgroup, sec->PortalGroup);
pos->X = pt[0] - (float)disp.X; pos->X = pt[0] - (float)disp.X;
@ -766,7 +766,8 @@ static void CalcPosVel( int type, const AActor *actor, const sector_t *sector,
assert(poly != NULL); assert(poly != NULL);
if (poly != NULL) if (poly != NULL)
{ {
assert(Level != nullptr); assert(Level != NULL);
// Todo: Level offsetting
DVector2 disp = Level->Displacements.getOffset(pgroup, poly->CenterSubsector->sector->PortalGroup); DVector2 disp = Level->Displacements.getOffset(pgroup, poly->CenterSubsector->sector->PortalGroup);
CalcPolyobjSoundOrg(listenpos + disp, poly, *pos); CalcPolyobjSoundOrg(listenpos + disp, poly, *pos);
pos->X -= (float)disp.X; pos->X -= (float)disp.X;
@ -934,7 +935,7 @@ static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly,
// //
//========================================================================== //==========================================================================
static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyObj *poly, static FSoundChan *S_StartSound(FLevelLocals *Level, 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) FRolloffInfo *forcedrolloff=NULL)
{ {
@ -951,6 +952,12 @@ static FSoundChan *S_StartSound(AActor *actor, const sector_t *sec, const FPolyO
if (sound_id <= 0 || volume <= 0 || nosfx || nosound ) if (sound_id <= 0 || volume <= 0 || nosfx || nosound )
return NULL; return NULL;
// Playing sounds from other than the primary level is a job for later. For now, just do not play them.
if (Level && Level != SoundMainLevel)
{
return nullptr;
}
int type; int type;
if (actor != NULL) if (actor != NULL)
@ -1327,7 +1334,7 @@ void S_RestartSound(FSoundChan *chan)
void S_Sound (int channel, FSoundID sound_id, float volume, float attenuation) void S_Sound (int channel, FSoundID sound_id, float volume, float attenuation)
{ {
S_StartSound (NULL, NULL, NULL, NULL, channel, sound_id, volume, attenuation); S_StartSound (NULL, NULL, NULL, NULL, NULL, channel, sound_id, volume, attenuation);
} }
DEFINE_ACTION_FUNCTION(DObject, S_Sound) DEFINE_ACTION_FUNCTION(DObject, S_Sound)
@ -1351,7 +1358,7 @@ void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float a
{ {
if (ent == NULL || ent->Sector->Flags & SECF_SILENT) if (ent == NULL || ent->Sector->Flags & SECF_SILENT)
return; return;
S_StartSound (ent, NULL, NULL, NULL, channel, sound_id, volume, attenuation); S_StartSound (ent->Level, ent, NULL, NULL, NULL, channel, sound_id, volume, attenuation);
} }
//========================================================================== //==========================================================================
@ -1372,7 +1379,7 @@ void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume
rolloff.RolloffType = ROLLOFF_Linear; rolloff.RolloffType = ROLLOFF_Linear;
rolloff.MinDistance = mindist; rolloff.MinDistance = mindist;
rolloff.MaxDistance = maxdist; rolloff.MaxDistance = maxdist;
S_StartSound(ent, NULL, NULL, NULL, channel, sound_id, volume, 1, &rolloff); S_StartSound(ent->Level, ent, NULL, NULL, NULL, channel, sound_id, volume, 1, &rolloff);
} }
//========================================================================== //==========================================================================
@ -1383,7 +1390,7 @@ void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume
void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume, float attenuation) void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume, float attenuation)
{ {
S_StartSound (NULL, NULL, poly, NULL, channel, sound_id, volume, attenuation); S_StartSound (poly->GetLevel(), NULL, NULL, poly, NULL, channel, sound_id, volume, attenuation);
} }
//========================================================================== //==========================================================================
@ -1392,11 +1399,11 @@ void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume
// //
//========================================================================== //==========================================================================
void S_Sound(const DVector3 &pos, int channel, FSoundID sound_id, float volume, float attenuation) void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sound_id, float volume, float attenuation)
{ {
// The sound system switches Y and Z around. // The sound system switches Y and Z around.
FVector3 p((float)pos.X, (float)pos.Z, (float)pos.Y); FVector3 p((float)pos.X, (float)pos.Z, (float)pos.Y);
S_StartSound (NULL, NULL, NULL, &p, channel, sound_id, volume, attenuation); S_StartSound (Level, NULL, NULL, NULL, &p, channel, sound_id, volume, attenuation);
} }
//========================================================================== //==========================================================================
@ -1407,7 +1414,7 @@ void S_Sound(const DVector3 &pos, int channel, FSoundID sound_id, float volume,
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)
{ {
S_StartSound (NULL, sec, NULL, NULL, channel, sfxid, volume, attenuation); S_StartSound (sec->Level, NULL, sec, NULL, NULL, channel, sfxid, volume, attenuation);
} }
//========================================================================== //==========================================================================

View file

@ -229,7 +229,7 @@ void S_Sound (AActor *ent, int channel, FSoundID sfxid, float volume, float atte
void S_SoundMinMaxDist (AActor *ent, int channel, FSoundID sfxid, float volume, float mindist, float maxdist); 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(const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation); void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation);
// [Nash] Used by ACS and DECORATE // [Nash] Used by ACS and DECORATE
void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local); void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local);