RingRacers/src/s_sound.h
Eidolon f9d70530ed Add snd_mixingbuffersize cvar
Allows the user to configure the mixing buffer size to reduce
latency at the cost of higher CPU usage, or vice versa.

This also raises the default buffer size from 1024 to 2048, to
address some underrun problems people have with the current buffer
size.
2024-04-30 23:31:24 -05:00

277 lines
6.7 KiB
C

// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
// Copyright (C) 1996 by id Software, Inc.
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file s_sound.h
/// \brief The not so system specific sound interface
#ifndef __S_SOUND__
#define __S_SOUND__
#include "sounds.h"
#include "m_fixed.h"
#include "command.h"
#include "tables.h" // angle_t
#ifdef __cplusplus
extern "C" {
#endif
// mask used to indicate sound origin is player item pickup
#define PICKUP_SOUND 0x8000
//
#define SOUND_VOLUME_RANGE 100
#define MAX_SOUND_VOLUME 100
#define DEFAULT_MUSICDEF_VOLUME 100
extern consvar_t stereoreverse;
extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume;
extern consvar_t surround;
extern consvar_t cv_numChannels;
extern CV_PossibleValue_t soundmixingbuffersize_cons_t[];
extern consvar_t cv_soundmixingbuffersize;
extern consvar_t cv_gamedigimusic;
extern consvar_t cv_gamesounds;
extern consvar_t cv_bgaudio;
extern consvar_t cv_streamersafemusic;
typedef enum
{
SF_TOTALLYSINGLE = 1, // Only play one of these sounds at a time...GLOBALLY
SF_NOMULTIPLESOUND = 2, // Like SF_NOINTERRUPT, but doesnt care what the origin is
SF_OUTSIDESOUND = 4, // Volume is adjusted depending on how far away you are from 'outside'
SF_X4AWAYSOUND = 8, // Hear it from 4x the distance away
SF_X8AWAYSOUND = 16, // Hear it from 8x the distance away
SF_NOINTERRUPT = 32, // Only play this sound if it isn't already playing on the origin
SF_X2AWAYSOUND = 64, // Hear it from 2x the distance away
} soundflags_t;
struct listener_t {
fixed_t x, y, z;
angle_t angle;
};
struct channel_t
{
// sound information (if null, channel avail.)
sfxinfo_t *sfxinfo;
// origin of sound
const void *origin;
// initial volume of sound, which is applied after distance and direction
INT32 volume;
// handle of the sound being played
INT32 handle;
};
struct caption_t {
channel_t *c;
sfxinfo_t *s;
UINT16 t;
UINT8 b;
};
#define NUMCAPTIONS 8
#define MAXCAPTIONTICS (2*TICRATE)
#define CAPTIONFADETICS 20
extern caption_t closedcaptions[NUMCAPTIONS];
void S_StartCaption(sfxenum_t sfx_id, INT32 cnum, UINT16 lifespan);
void S_ResetCaptions(void);
// register sound vars and commands at game startup
void S_RegisterSoundStuff(void);
//
// Initializes sound stuff, including volume
// Sets channels, SFX, allocates channel buffer, sets S_sfx lookup.
//
void S_InitSfxChannels(void);
//
// Per level startup code.
// Kills playing sounds at start of level, determines music if any, changes music.
//
void S_StopSounds(void);
void S_ClearSfx(void);
void S_InitLevelMusic(boolean reset);
//
// Basically a W_GetNumForName that adds "ds" at the beginning of the string. Returns a lumpnum.
//
lumpnum_t S_GetSfxLumpNum(sfxinfo_t *sfx);
//
// Sound Status
//
boolean S_SoundDisabled(void);
//
// Start sound for thing at <origin> using <sound_id> from sounds.h
//
void S_StartSound(const void *origin, sfxenum_t sound_id);
// Will start a sound at a given volume.
void S_StartSoundAtVolume(const void *origin, sfxenum_t sound_id, INT32 volume);
// Will start a sound, but only if VFX reduce is off or the owner isn't a display player.
void S_ReducedVFXSoundAtVolume(const void *origin, sfxenum_t sfx_id, INT32 volume, const player_t *owner);
#define S_ReducedVFXSound(a, b, c) S_ReducedVFXSoundAtVolume(a, b, 255, c)
// Stop sound for thing at <origin>
void S_StopSound(void *origin);
//
// Music Status
//
boolean S_DigMusicDisabled(void);
boolean S_MusicDisabled(void);
boolean S_MusicNotInFocus(void);
#define MAXDEFTRACKS 3
#define ALTREF_REQUIRESBEATEN UINT8_MAX
struct soundtestsequence_t
{
UINT8 id;
UINT16 map;
UINT8 altref;
musicdef_t *next;
size_t shuffleinfo;
musicdef_t *shufflenext;
};
// Music credits
struct musicdef_t
{
char name[MAXDEFTRACKS][7];
UINT32 hash[MAXDEFTRACKS];
boolean basenoloop[MAXDEFTRACKS];
UINT8 numtracks;
char *title;
char *author;
char *source;
char *composers;
int volume;
int debug_volume;
boolean important;
boolean contentidunsafe;
musicdef_t *next;
soundtestsequence_t sequence;
};
// For HUD, doesn't always appear
extern struct cursongcredit
{
char *text;
UINT16 anim;
UINT8 trans;
fixed_t x;
fixed_t old_x;
} cursongcredit;
// For menu, always appears
extern char *g_realsongcredit;
extern struct soundtest
{
UINT8 tune; // Tune used for music system
boolean playing; // Music is playing?
boolean justopened; // Menu visual assist
INT32 menutick; // Menu visual timer
musicdef_t *current; // Current selected music definition
SINT8 currenttrack; // Current selected music track for definition
soundtestsequence_t sequence; // Sequence head
boolean autosequence; // In auto sequence mode?
boolean shuffle; // In shuffle mode;
} soundtest;
void S_PopulateSoundTestSequence(void);
void S_UpdateSoundTestDef(boolean reverse, boolean dotracks, boolean skipnull);
void S_SoundTestPlay(void);
void S_SoundTestStop(void);
void S_SoundTestTogglePause(void);
void S_TickSoundTest(void);
const char *S_SoundTestTune(UINT8 invert);
boolean S_SoundTestCanSequenceFade(void);
extern musicdef_t *musicdefstart;
void S_LoadMusicDefs(UINT16 wadnum);
void S_InitMusicDefs(void);
musicdef_t *S_FindMusicDef(const char *name, UINT8 *i);
void S_LoadMusicCredit(void);
void S_UnloadMusicCredit(void);
void S_ShowMusicCredit(void);
void S_StopMusicCredit(void);
//
// Music Playback
//
// Stop and resume music, during game PAUSE.
void S_PauseAudio(void);
void S_ResumeAudio(void);
// Enable and disable sound effects
void S_EnableSound(void);
void S_DisableSound(void);
// Attempt to restore music based on gamestate.
void S_AttemptToRestoreMusic(void);
//
// Updates music & sounds
//
void S_UpdateSounds(void);
void S_UpdateClosedCaptions(void);
FUNCMATH fixed_t S_CalculateSoundDistance(fixed_t px1, fixed_t py1, fixed_t pz1, fixed_t px2, fixed_t py2, fixed_t pz2);
INT32 S_GetSoundVolume(sfxinfo_t *sfx, INT32 volume);
void S_SetSfxVolume(void);
void S_SetMusicVolume(void);
void S_SetMasterVolume(void);
INT32 S_OriginPlaying(void *origin);
INT32 S_IdPlaying(sfxenum_t id);
INT32 S_SoundPlaying(const void *origin, sfxenum_t id);
void S_StartSoundName(void *mo, const char *soundname);
void S_StopSoundByID(void *origin, sfxenum_t sfx_id);
void S_StopSoundByNum(sfxenum_t sfxnum);
#define S_StartAttackSound S_StartSound
#define S_StartScreamSound S_StartSound
#ifdef __cplusplus
} // extern "C"
#endif
#endif