diff --git a/src/sound/s_sound.cpp b/src/sound/s_sound.cpp index 08417277f..b5bb73234 100644 --- a/src/sound/s_sound.cpp +++ b/src/sound/s_sound.cpp @@ -86,15 +86,6 @@ // 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_PRIORITY 64 #define NORM_SEP 0 diff --git a/src/sound/s_sound.h b/src/sound/s_sound.h index a4ef2a335..cf7b52900 100644 --- a/src/sound/s_sound.h +++ b/src/sound/s_sound.h @@ -36,178 +36,11 @@ class FScanner; class FSerializer; struct FLevelLocals; -// -// 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 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 S_SoundCurve; - +#include "s_soundinternal.h" // Information about one playing sound. 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. - 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. // 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. 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 void S_Sound (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_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; int S_PickReplacement (int refid); 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. void S_StopSound (AActor *ent, 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. 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 // @@ -336,8 +110,6 @@ void S_RestoreEvictedChannels(); // [RH] S_sfx "maintenance" routines void S_ClearSoundData(); void S_ParseSndInfo (bool redefine); -void S_ParseReverbDef (); -void S_UnloadReverbDef (); void S_HashSounds (); 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. 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 diff --git a/src/sound/s_soundinternal.h b/src/sound/s_soundinternal.h new file mode 100644 index 000000000..0c2dd6801 --- /dev/null +++ b/src/sound/s_soundinternal.h @@ -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 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 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(); +