mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-01-18 23:21:41 +00:00
- started separating the sound engine code from game dependent parts.
First step: Split the header. Todo: Abstract listener and sound source specifics out of the sound engine.
This commit is contained in:
parent
844b203971
commit
22e692e21c
3 changed files with 269 additions and 248 deletions
|
@ -86,15 +86,6 @@
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
||||||
#ifdef NeXT
|
|
||||||
// NeXT doesn't need a binary flag in open call
|
|
||||||
#define O_BINARY 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef O_BINARY
|
|
||||||
#define O_BINARY 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NORM_PITCH 128
|
#define NORM_PITCH 128
|
||||||
#define NORM_PRIORITY 64
|
#define NORM_PRIORITY 64
|
||||||
#define NORM_SEP 0
|
#define NORM_SEP 0
|
||||||
|
|
|
@ -36,178 +36,11 @@ class FScanner;
|
||||||
class FSerializer;
|
class FSerializer;
|
||||||
struct FLevelLocals;
|
struct FLevelLocals;
|
||||||
|
|
||||||
//
|
#include "s_soundinternal.h"
|
||||||
// SoundFX struct.
|
|
||||||
//
|
|
||||||
struct sfxinfo_t
|
|
||||||
{
|
|
||||||
// Next field is for use by the system sound interface.
|
|
||||||
// A non-null data means the sound has been loaded.
|
|
||||||
SoundHandle data;
|
|
||||||
// Also for the sound interface. Used for 3D positional
|
|
||||||
// sounds, may be the same as data.
|
|
||||||
SoundHandle data3d;
|
|
||||||
|
|
||||||
FString name; // [RH] Sound name defined in SNDINFO
|
|
||||||
int lumpnum; // lump number of sfx
|
|
||||||
|
|
||||||
unsigned int next, index; // [RH] For hashing
|
|
||||||
float Volume;
|
|
||||||
|
|
||||||
uint8_t PitchMask;
|
|
||||||
int16_t NearLimit; // 0 means unlimited
|
|
||||||
float LimitRange; // Range for sound limiting (squared for faster computations)
|
|
||||||
|
|
||||||
unsigned bRandomHeader:1;
|
|
||||||
unsigned bPlayerReserve:1;
|
|
||||||
unsigned bLoadRAW:1;
|
|
||||||
unsigned bPlayerCompat:1;
|
|
||||||
unsigned b16bit:1;
|
|
||||||
unsigned bUsed:1;
|
|
||||||
unsigned bSingular:1;
|
|
||||||
unsigned bTentative:1;
|
|
||||||
unsigned bPlayerSilent:1; // This player sound is intentionally silent.
|
|
||||||
|
|
||||||
int RawRate; // Sample rate to use when bLoadRAW is true
|
|
||||||
|
|
||||||
int LoopStart; // -1 means no specific loop defined
|
|
||||||
|
|
||||||
unsigned int link;
|
|
||||||
enum { NO_LINK = 0xffffffff };
|
|
||||||
|
|
||||||
FRolloffInfo Rolloff;
|
|
||||||
float Attenuation; // Multiplies the attenuation passed to S_Sound.
|
|
||||||
|
|
||||||
void MarkUsed(); // Marks this sound as used.
|
|
||||||
};
|
|
||||||
|
|
||||||
// Rolloff types
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
ROLLOFF_Doom, // Linear rolloff with a logarithmic volume scale
|
|
||||||
ROLLOFF_Linear, // Linear rolloff with a linear volume scale
|
|
||||||
ROLLOFF_Log, // Logarithmic rolloff (standard hardware type)
|
|
||||||
ROLLOFF_Custom // Lookup volume from SNDCURVE
|
|
||||||
};
|
|
||||||
|
|
||||||
int S_FindSound (const char *logicalname);
|
|
||||||
|
|
||||||
// the complete set of sound effects
|
|
||||||
extern TArray<sfxinfo_t> S_sfx;
|
|
||||||
|
|
||||||
// An index into the S_sfx[] array.
|
|
||||||
class FSoundID
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FSoundID() = default;
|
|
||||||
|
|
||||||
FSoundID(int id)
|
|
||||||
{
|
|
||||||
ID = id;
|
|
||||||
}
|
|
||||||
FSoundID(const char *name)
|
|
||||||
{
|
|
||||||
ID = S_FindSound(name);
|
|
||||||
}
|
|
||||||
FSoundID(const FString &name)
|
|
||||||
{
|
|
||||||
ID = S_FindSound(name.GetChars());
|
|
||||||
}
|
|
||||||
FSoundID(const FSoundID &other) = default;
|
|
||||||
FSoundID &operator=(const FSoundID &other) = default;
|
|
||||||
FSoundID &operator=(const char *name)
|
|
||||||
{
|
|
||||||
ID = S_FindSound(name);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
FSoundID &operator=(const FString &name)
|
|
||||||
{
|
|
||||||
ID = S_FindSound(name.GetChars());
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
bool operator !=(FSoundID other) const
|
|
||||||
{
|
|
||||||
return ID != other.ID;
|
|
||||||
}
|
|
||||||
bool operator !=(int other) const
|
|
||||||
{
|
|
||||||
return ID != other;
|
|
||||||
}
|
|
||||||
operator int() const
|
|
||||||
{
|
|
||||||
return ID;
|
|
||||||
}
|
|
||||||
operator FString() const
|
|
||||||
{
|
|
||||||
return ID ? S_sfx[ID].name : "";
|
|
||||||
}
|
|
||||||
operator const char *() const
|
|
||||||
{
|
|
||||||
return ID ? S_sfx[ID].name.GetChars() : NULL;
|
|
||||||
}
|
|
||||||
void MarkUsed() const
|
|
||||||
{
|
|
||||||
S_sfx[ID].MarkUsed();
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
int ID;
|
|
||||||
protected:
|
|
||||||
enum EDummy { NoInit };
|
|
||||||
FSoundID(EDummy) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class FSoundIDNoInit : public FSoundID
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FSoundIDNoInit() : FSoundID(NoInit) {}
|
|
||||||
using FSoundID::operator=;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern FRolloffInfo S_Rolloff;
|
|
||||||
extern TArray<uint8_t> S_SoundCurve;
|
|
||||||
|
|
||||||
|
|
||||||
// Information about one playing sound.
|
// Information about one playing sound.
|
||||||
struct sector_t;
|
struct sector_t;
|
||||||
struct FPolyObj;
|
struct FPolyObj;
|
||||||
struct FSoundChan : public FISoundChannel
|
|
||||||
{
|
|
||||||
FSoundChan *NextChan; // Next channel in this list.
|
|
||||||
FSoundChan **PrevChan; // Previous channel in this list.
|
|
||||||
FSoundID SoundID; // Sound ID of playing sound.
|
|
||||||
FSoundID OrgID; // Sound ID of sound used to start this channel.
|
|
||||||
float Volume;
|
|
||||||
int16_t Pitch; // Pitch variation.
|
|
||||||
uint8_t EntChannel; // Actor's sound channel.
|
|
||||||
int8_t Priority;
|
|
||||||
int16_t NearLimit;
|
|
||||||
uint8_t SourceType;
|
|
||||||
float LimitRange;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
AActor *Actor; // Used for position and velocity.
|
|
||||||
const sector_t *Sector; // Sector for area sounds.
|
|
||||||
const FPolyObj *Poly; // Polyobject sound source.
|
|
||||||
float Point[3]; // Sound is not attached to any source.
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
extern FSoundChan *Channels;
|
|
||||||
|
|
||||||
void S_ReturnChannel(FSoundChan *chan);
|
|
||||||
void S_EvictAllChannels();
|
|
||||||
|
|
||||||
void S_StopChannel(FSoundChan *chan);
|
|
||||||
void S_LinkChannel(FSoundChan *chan, FSoundChan **head);
|
|
||||||
void S_UnlinkChannel(FSoundChan *chan);
|
|
||||||
|
|
||||||
// Initializes sound stuff, including volume
|
|
||||||
// Sets channels, SFX and music volume,
|
|
||||||
// allocates channel buffer, sets S_sfx lookup.
|
|
||||||
//
|
|
||||||
void S_Init ();
|
|
||||||
void S_InitData ();
|
|
||||||
void S_Shutdown ();
|
|
||||||
|
|
||||||
// Per level startup code.
|
// Per level startup code.
|
||||||
// Kills playing sounds at start of level and starts new music.
|
// Kills playing sounds at start of level and starts new music.
|
||||||
|
@ -217,9 +50,6 @@ void S_Start ();
|
||||||
// Called after a level is loaded. Ensures that most sounds are loaded.
|
// Called after a level is loaded. Ensures that most sounds are loaded.
|
||||||
void S_PrecacheLevel (FLevelLocals *l);
|
void S_PrecacheLevel (FLevelLocals *l);
|
||||||
|
|
||||||
// Loads a sound, including any random sounds it might reference.
|
|
||||||
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);
|
||||||
|
@ -235,61 +65,10 @@ void S_SoundPitchActor (AActor *ent, int channel, FSoundID sfxid, float volume,
|
||||||
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);
|
||||||
void S_PlaySoundPitch(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local, float pitch);
|
void S_PlaySoundPitch(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local, float pitch);
|
||||||
|
|
||||||
// sound channels
|
|
||||||
// channel 0 never willingly overrides
|
|
||||||
// other channels (1-7) always override a playing sound on that channel
|
|
||||||
//
|
|
||||||
// CHAN_AUTO searches down from channel 7 until it finds a channel not in use
|
|
||||||
// CHAN_WEAPON is for weapons
|
|
||||||
// CHAN_VOICE is for oof, sight, or other voice sounds
|
|
||||||
// CHAN_ITEM is for small things and item pickup
|
|
||||||
// CHAN_BODY is for generic body sounds
|
|
||||||
// CHAN_PICKUP can optionally be set as a local sound only for "compatibility"
|
|
||||||
|
|
||||||
#define CHAN_AUTO 0
|
|
||||||
#define CHAN_WEAPON 1
|
|
||||||
#define CHAN_VOICE 2
|
|
||||||
#define CHAN_ITEM 3
|
|
||||||
#define CHAN_BODY 4
|
|
||||||
|
|
||||||
// Channel alias for sector sounds. These define how listener height is
|
|
||||||
// used when calculating 3D sound volume.
|
|
||||||
#define CHAN_FLOOR 1 // Sound comes from the floor.
|
|
||||||
#define CHAN_CEILING 2 // Sound comes from the ceiling.
|
|
||||||
#define CHAN_FULLHEIGHT 3 // Sound comes entire height of the sector.
|
|
||||||
#define CHAN_INTERIOR 4 // Sound comes height between floor and ceiling.
|
|
||||||
|
|
||||||
// modifier flags
|
|
||||||
#define CHAN_LISTENERZ 8
|
|
||||||
#define CHAN_MAYBE_LOCAL 16
|
|
||||||
#define CHAN_UI 32 // Do not record sound in savegames.
|
|
||||||
#define CHAN_NOPAUSE 64 // Do not pause this sound in menus.
|
|
||||||
#define CHAN_AREA 128 // Sound plays from all around. Only valid with sector sounds.
|
|
||||||
#define CHAN_LOOP 256
|
|
||||||
|
|
||||||
#define CHAN_PICKUP (CHAN_ITEM|CHAN_MAYBE_LOCAL)
|
|
||||||
|
|
||||||
#define CHAN_IS3D 1 // internal: Sound is 3D.
|
|
||||||
#define CHAN_EVICTED 2 // internal: Sound was evicted.
|
|
||||||
#define CHAN_FORGETTABLE 4 // internal: Forget channel data when sound stops.
|
|
||||||
#define CHAN_JUSTSTARTED 512 // internal: Sound has not been updated yet.
|
|
||||||
#define CHAN_ABSTIME 1024// internal: Start time is absolute and does not depend on current time.
|
|
||||||
#define CHAN_VIRTUAL 2048// internal: Channel is currently virtual
|
|
||||||
#define CHAN_NOSTOP 4096// only for A_PlaySound. Does not start if channel is playing something.
|
|
||||||
|
|
||||||
// sound attenuation values
|
|
||||||
#define ATTN_NONE 0.f // full volume the entire level
|
|
||||||
#define ATTN_NORM 1.f
|
|
||||||
#define ATTN_IDLE 1.001f
|
|
||||||
#define ATTN_STATIC 3.f // diminish very rapidly with distance
|
|
||||||
|
|
||||||
struct FSoundLoadBuffer;
|
struct FSoundLoadBuffer;
|
||||||
int S_PickReplacement (int refid);
|
int S_PickReplacement (int refid);
|
||||||
void S_CacheRandomSound (sfxinfo_t *sfx);
|
void S_CacheRandomSound (sfxinfo_t *sfx);
|
||||||
|
|
||||||
// Checks if a copy of this sound is already playing.
|
|
||||||
bool S_CheckSingular (int sound_id);
|
|
||||||
|
|
||||||
// Stops a sound emanating from one of an emitter's channels.
|
// Stops a sound emanating from one of an emitter's channels.
|
||||||
void S_StopSound (AActor *ent, int channel);
|
void S_StopSound (AActor *ent, int channel);
|
||||||
void S_StopSound (const sector_t *sec, int channel);
|
void S_StopSound (const sector_t *sec, int channel);
|
||||||
|
@ -321,11 +100,6 @@ void S_RelinkSound (AActor *from, AActor *to);
|
||||||
// Stores/retrieves playing channel information in an archive.
|
// Stores/retrieves playing channel information in an archive.
|
||||||
void S_SerializeSounds(FSerializer &arc);
|
void S_SerializeSounds(FSerializer &arc);
|
||||||
|
|
||||||
// Stop and resume music, during game PAUSE.
|
|
||||||
void S_PauseSound (bool notmusic, bool notsfx);
|
|
||||||
void S_ResumeSound (bool notsfx);
|
|
||||||
void S_SetSoundPaused (int state);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Updates music & sounds
|
// Updates music & sounds
|
||||||
//
|
//
|
||||||
|
@ -336,8 +110,6 @@ void S_RestoreEvictedChannels();
|
||||||
// [RH] S_sfx "maintenance" routines
|
// [RH] S_sfx "maintenance" routines
|
||||||
void S_ClearSoundData();
|
void S_ClearSoundData();
|
||||||
void S_ParseSndInfo (bool redefine);
|
void S_ParseSndInfo (bool redefine);
|
||||||
void S_ParseReverbDef ();
|
|
||||||
void S_UnloadReverbDef ();
|
|
||||||
|
|
||||||
void S_HashSounds ();
|
void S_HashSounds ();
|
||||||
int S_FindSoundNoHash (const char *logicalname);
|
int S_FindSoundNoHash (const char *logicalname);
|
||||||
|
@ -364,14 +136,4 @@ void A_PlaySound(AActor *self, int soundid, int channel, double volume, int loop
|
||||||
// Modelled after Hexen's noise cheat.
|
// Modelled after Hexen's noise cheat.
|
||||||
void S_NoiseDebug ();
|
void S_NoiseDebug ();
|
||||||
|
|
||||||
extern ReverbContainer *Environments;
|
|
||||||
extern ReverbContainer *DefaultEnvironments[26];
|
|
||||||
|
|
||||||
void S_SetEnvironment (const ReverbContainer *settings);
|
|
||||||
ReverbContainer *S_FindEnvironment (const char *name);
|
|
||||||
ReverbContainer *S_FindEnvironment (int id);
|
|
||||||
void S_AddEnvironment (ReverbContainer *settings);
|
|
||||||
void S_UnloadAllSounds();
|
|
||||||
void S_SoundReset();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
268
src/sound/s_soundinternal.h
Normal file
268
src/sound/s_soundinternal.h
Normal file
|
@ -0,0 +1,268 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "i_soundinternal.h"
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// SoundFX struct.
|
||||||
|
//
|
||||||
|
struct sfxinfo_t
|
||||||
|
{
|
||||||
|
// Next field is for use by the system sound interface.
|
||||||
|
// A non-null data means the sound has been loaded.
|
||||||
|
SoundHandle data;
|
||||||
|
// Also for the sound interface. Used for 3D positional
|
||||||
|
// sounds, may be the same as data.
|
||||||
|
SoundHandle data3d;
|
||||||
|
|
||||||
|
FString name; // [RH] Sound name defined in SNDINFO
|
||||||
|
int lumpnum; // lump number of sfx
|
||||||
|
|
||||||
|
unsigned int next, index; // [RH] For hashing
|
||||||
|
float Volume;
|
||||||
|
|
||||||
|
uint8_t ResourceId; // Resource ID as implemented by Blood. Not used by Doom but added for completeness.
|
||||||
|
uint8_t PitchMask;
|
||||||
|
int16_t NearLimit; // 0 means unlimited
|
||||||
|
float LimitRange; // Range for sound limiting (squared for faster computations)
|
||||||
|
|
||||||
|
unsigned bRandomHeader:1;
|
||||||
|
unsigned bPlayerReserve:1;
|
||||||
|
unsigned bLoadRAW:1;
|
||||||
|
unsigned bPlayerCompat:1;
|
||||||
|
unsigned b16bit:1;
|
||||||
|
unsigned bUsed:1;
|
||||||
|
unsigned bSingular:1;
|
||||||
|
unsigned bTentative:1;
|
||||||
|
unsigned bPlayerSilent:1; // This player sound is intentionally silent.
|
||||||
|
|
||||||
|
int RawRate; // Sample rate to use when bLoadRAW is true
|
||||||
|
|
||||||
|
int LoopStart; // -1 means no specific loop defined
|
||||||
|
|
||||||
|
unsigned int link;
|
||||||
|
enum { NO_LINK = 0xffffffff };
|
||||||
|
|
||||||
|
FRolloffInfo Rolloff;
|
||||||
|
float Attenuation; // Multiplies the attenuation passed to S_Sound.
|
||||||
|
|
||||||
|
void MarkUsed(); // Marks this sound as used.
|
||||||
|
};
|
||||||
|
|
||||||
|
// Rolloff types
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
ROLLOFF_Doom, // Linear rolloff with a logarithmic volume scale
|
||||||
|
ROLLOFF_Linear, // Linear rolloff with a linear volume scale
|
||||||
|
ROLLOFF_Log, // Logarithmic rolloff (standard hardware type)
|
||||||
|
ROLLOFF_Custom // Lookup volume from SNDCURVE
|
||||||
|
};
|
||||||
|
|
||||||
|
int S_FindSound(const char *logicalname);
|
||||||
|
int S_FindSoundByResID(int snd_id);
|
||||||
|
|
||||||
|
// the complete set of sound effects
|
||||||
|
extern TArray<sfxinfo_t> S_sfx;
|
||||||
|
|
||||||
|
// An index into the S_sfx[] array.
|
||||||
|
class FSoundID
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FSoundID() = default;
|
||||||
|
|
||||||
|
static FSoundID byResId(int ndx)
|
||||||
|
{
|
||||||
|
return FSoundID(S_FindSoundByResID(ndx));
|
||||||
|
}
|
||||||
|
FSoundID(int id)
|
||||||
|
{
|
||||||
|
ID = id;
|
||||||
|
}
|
||||||
|
FSoundID(const char *name)
|
||||||
|
{
|
||||||
|
ID = S_FindSound(name);
|
||||||
|
}
|
||||||
|
FSoundID(const FString &name)
|
||||||
|
{
|
||||||
|
ID = S_FindSound(name.GetChars());
|
||||||
|
}
|
||||||
|
FSoundID(const FSoundID &other) = default;
|
||||||
|
FSoundID &operator=(const FSoundID &other) = default;
|
||||||
|
FSoundID &operator=(const char *name)
|
||||||
|
{
|
||||||
|
ID = S_FindSound(name);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
FSoundID &operator=(const FString &name)
|
||||||
|
{
|
||||||
|
ID = S_FindSound(name.GetChars());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
bool operator !=(FSoundID other) const
|
||||||
|
{
|
||||||
|
return ID != other.ID;
|
||||||
|
}
|
||||||
|
bool operator !=(int other) const
|
||||||
|
{
|
||||||
|
return ID != other;
|
||||||
|
}
|
||||||
|
operator int() const
|
||||||
|
{
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
operator FString() const
|
||||||
|
{
|
||||||
|
return ID ? S_sfx[ID].name : "";
|
||||||
|
}
|
||||||
|
operator const char *() const
|
||||||
|
{
|
||||||
|
return ID ? S_sfx[ID].name.GetChars() : NULL;
|
||||||
|
}
|
||||||
|
void MarkUsed() const
|
||||||
|
{
|
||||||
|
S_sfx[ID].MarkUsed();
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
int ID;
|
||||||
|
protected:
|
||||||
|
enum EDummy { NoInit };
|
||||||
|
FSoundID(EDummy) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class FSoundIDNoInit : public FSoundID
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FSoundIDNoInit() : FSoundID(NoInit) {}
|
||||||
|
using FSoundID::operator=;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern FRolloffInfo S_Rolloff;
|
||||||
|
extern TArray<uint8_t> S_SoundCurve;
|
||||||
|
|
||||||
|
|
||||||
|
typedef FVector3(*GetSourceOrigin)(const float *listenerpos, const void *source);
|
||||||
|
|
||||||
|
class AActor;
|
||||||
|
struct sector_t;
|
||||||
|
struct FPolyObj;
|
||||||
|
struct FSoundChan : public FISoundChannel
|
||||||
|
{
|
||||||
|
FSoundChan *NextChan; // Next channel in this list.
|
||||||
|
FSoundChan **PrevChan; // Previous channel in this list.
|
||||||
|
FSoundID SoundID; // Sound ID of playing sound.
|
||||||
|
FSoundID OrgID; // Sound ID of sound used to start this channel.
|
||||||
|
float Volume;
|
||||||
|
int16_t Pitch; // Pitch variation.
|
||||||
|
uint8_t EntChannel; // Actor's sound channel.
|
||||||
|
int8_t Priority;
|
||||||
|
int16_t NearLimit;
|
||||||
|
uint8_t SourceType;
|
||||||
|
float LimitRange;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
AActor *Actor; // Used for position and velocity.
|
||||||
|
const sector_t *Sector; // Sector for area sounds.
|
||||||
|
const FPolyObj *Poly; // Polyobject sound source.
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
void *Source;
|
||||||
|
GetSourceOrigin getOrigin;
|
||||||
|
};
|
||||||
|
float Point[3]; // Sound is not attached to any source.
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extern FSoundChan *Channels;
|
||||||
|
|
||||||
|
void S_ReturnChannel(FSoundChan *chan);
|
||||||
|
void S_EvictAllChannels();
|
||||||
|
|
||||||
|
void S_StopChannel(FSoundChan *chan);
|
||||||
|
void S_LinkChannel(FSoundChan *chan, FSoundChan **head);
|
||||||
|
void S_UnlinkChannel(FSoundChan *chan);
|
||||||
|
|
||||||
|
// Initializes sound stuff, including volume
|
||||||
|
// Sets channels, SFX and music volume,
|
||||||
|
// allocates channel buffer, sets S_sfx lookup.
|
||||||
|
//
|
||||||
|
void S_Init ();
|
||||||
|
void S_InitData ();
|
||||||
|
void S_Shutdown ();
|
||||||
|
|
||||||
|
// Loads a sound, including any random sounds it might reference.
|
||||||
|
void S_CacheSound (sfxinfo_t *sfx);
|
||||||
|
|
||||||
|
// sound channels
|
||||||
|
// channel 0 never willingly overrides
|
||||||
|
// other channels (1-7) always override a playing sound on that channel
|
||||||
|
//
|
||||||
|
// CHAN_AUTO searches down from channel 7 until it finds a channel not in use
|
||||||
|
// CHAN_WEAPON is for weapons
|
||||||
|
// CHAN_VOICE is for oof, sight, or other voice sounds
|
||||||
|
// CHAN_ITEM is for small things and item pickup
|
||||||
|
// CHAN_BODY is for generic body sounds
|
||||||
|
// CHAN_PICKUP can optionally be set as a local sound only for "compatibility"
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
CHAN_AUTO = 0,
|
||||||
|
CHAN_WEAPON = 1,
|
||||||
|
CHAN_VOICE = 2,
|
||||||
|
CHAN_ITEM = 3,
|
||||||
|
CHAN_BODY = 4,
|
||||||
|
CHAN_5 = 5,
|
||||||
|
CHAN_6 = 6,
|
||||||
|
CHAN_7 = 7,
|
||||||
|
|
||||||
|
// Channel alias for sector sounds. These define how listener height is
|
||||||
|
// used when calculating 3D sound volume.
|
||||||
|
CHAN_FLOOR = 1, // Sound comes from the floor.
|
||||||
|
CHAN_CEILING = 2, // Sound comes from the ceiling.
|
||||||
|
CHAN_FULLHEIGHT = 3, // Sound comes entire height of the sector.
|
||||||
|
CHAN_INTERIOR = 4, // Sound comes height between floor and ceiling.
|
||||||
|
|
||||||
|
// modifier flags
|
||||||
|
CHAN_LISTENERZ = 8,
|
||||||
|
CHAN_MAYBE_LOCAL = 16,
|
||||||
|
CHAN_UI = 32, // Do not record sound in savegames.
|
||||||
|
CHAN_NOPAUSE = 64, // Do not pause this sound in menus.
|
||||||
|
CHAN_AREA = 128, // Sound plays from all around. Only valid with sector sounds.
|
||||||
|
CHAN_LOOP = 256,
|
||||||
|
|
||||||
|
CHAN_PICKUP = (CHAN_ITEM|CHAN_MAYBE_LOCAL),
|
||||||
|
|
||||||
|
CHAN_IS3D = 1, // internal: Sound is 3D.
|
||||||
|
CHAN_EVICTED = 2, // internal: Sound was evicted.
|
||||||
|
CHAN_FORGETTABLE = 4, // internal: Forget channel data when sound stops.
|
||||||
|
CHAN_JUSTSTARTED = 512, // internal: Sound has not been updated yet.
|
||||||
|
CHAN_ABSTIME = 1024, // internal: Start time is absolute and does not depend on current time.
|
||||||
|
CHAN_VIRTUAL = 2048, // internal: Channel is currently virtual
|
||||||
|
CHAN_NOSTOP = 4096, // only for A_PlaySound. Does not start if channel is playing something.
|
||||||
|
};
|
||||||
|
|
||||||
|
// sound attenuation values
|
||||||
|
#define ATTN_NONE 0.f // full volume the entire level
|
||||||
|
#define ATTN_NORM 1.f
|
||||||
|
#define ATTN_IDLE 1.001f
|
||||||
|
#define ATTN_STATIC 3.f // diminish very rapidly with distance
|
||||||
|
|
||||||
|
// Checks if a copy of this sound is already playing.
|
||||||
|
bool S_CheckSingular (int sound_id);
|
||||||
|
|
||||||
|
// Stop and resume music, during game PAUSE.
|
||||||
|
void S_PauseSound (bool notmusic, bool notsfx);
|
||||||
|
void S_ResumeSound (bool notsfx);
|
||||||
|
void S_SetSoundPaused (int state);
|
||||||
|
|
||||||
|
extern ReverbContainer *Environments;
|
||||||
|
extern ReverbContainer *DefaultEnvironments[26];
|
||||||
|
|
||||||
|
void S_ParseReverbDef ();
|
||||||
|
void S_UnloadReverbDef ();
|
||||||
|
void S_SetEnvironment (const ReverbContainer *settings);
|
||||||
|
ReverbContainer *S_FindEnvironment (const char *name);
|
||||||
|
ReverbContainer *S_FindEnvironment (int id);
|
||||||
|
void S_AddEnvironment (ReverbContainer *settings);
|
||||||
|
void S_UnloadAllSounds();
|
||||||
|
void S_SoundReset();
|
||||||
|
|
Loading…
Reference in a new issue