Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-// sound.h -- client sound i/o functions
-#ifndef __SOUND__
-#define __SOUND__
+#ifndef SOUND_H
+#define SOUND_H
-#define DEFAULT_SOUND_PACKET_VOLUME 255
-#define DEFAULT_SOUND_PACKET_ATTENUATION 1.0
+#include "matrixlib.h"
-typedef struct
-{
- int left;
- int right;
-} portable_samplepair_t;
-
-typedef struct
-{
- int length;
- int loopstart;
- int speed;
- int width;
- int stereo;
- qbyte data[1]; // variable sized
-} sfxcache_t;
-
-typedef struct sfx_s
-{
- char name[MAX_QPATH];
- mempool_t *mempool;
- sfxcache_t *sfxcache;
-} sfx_t;
-
-typedef struct
-{
- qboolean gamealive;
- qboolean soundalive;
- qboolean splitbuffer;
- int channels;
- int samples; // mono samples in buffer
- int submission_chunk; // don't mix less than this #
- int samplepos; // in mono samples
- int samplebits;
- int speed;
- unsigned char *buffer;
-} dma_t;
-
-typedef struct
-{
- sfx_t *sfx; // sfx number
- int leftvol; // 0-255 volume
- int rightvol; // 0-255 volume
- int end; // end time in global paintsamples
- int pos; // sample position in sfx
- int looping; // where to loop, -1 = no looping
- int entnum; // to allow overriding a specific sound
- int entchannel; //
- vec3_t origin; // origin of sound effect
- vec_t dist_mult; // distance multiplier (attenuation/clipK)
- int master_vol; // 0-255 master volume
-} channel_t;
-
-typedef struct
-{
- int rate;
- int width;
- int channels;
- int loopstart;
- int samples;
- int dataofs; // chunk starts this many bytes from file start
-} wavinfo_t;
-void S_Init (void);
-void S_Startup (void);
-void S_Shutdown (void);
-void S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation);
-void S_StaticSound (sfx_t *sfx, vec3_t origin, float vol, float attenuation);
-void S_StopSound (int entnum, int entchannel);
-void S_StopAllSounds(qboolean clear);
-void S_ClearBuffer (void);
-void S_Update (vec3_t origin, vec3_t v_forward, vec3_t v_right, vec3_t v_up);
-void S_ExtraUpdate (void);
+// ====================================================================
+// Constants
+// ====================================================================
-sfx_t *S_PrecacheSound (char *sample, int complain);
-void S_TouchSound (char *sample);
-void S_ClearPrecache (void);
-void S_BeginPrecaching (void);
-void S_EndPrecaching (void);
-void S_PaintChannels(int endtime);
-void S_InitPaintChannels (void);
+#define DEFAULT_SOUND_PACKET_VOLUME 255
+#define DEFAULT_SOUND_PACKET_ATTENUATION 1.0
-// picks a channel based on priorities, empty slots, number of channels
-channel_t *SND_PickChannel(int entnum, int entchannel);
+// Channel flags
+// These channel flags can be used for sound() builtins, with SOUNDFLAG_* names
+#define CHANNELFLAG_NONE 0
+#define CHANNELFLAG_RELIABLE (1 << 0) // send as reliable message (only used on server)
+#define CHANNELFLAG_FORCELOOP (1 << 1) // force looping even if the sound is not looped
+#define CHANNELFLAG_LOCALSOUND (1 << 2) // INTERNAL USE. Not settable by S_SetChannelFlag
+#define CHANNELFLAG_PAUSED (1 << 3) // pause status
+#define CHANNELFLAG_FULLVOLUME (1 << 4) // isn't affected by the general volume
-// spatializes a channel
-void SND_Spatialize(channel_t *ch);
+// ====================================================================
+// Types and variables
+// ====================================================================
-// initializes cycling through a DMA buffer and returns information on it
-qboolean SNDDMA_Init(void);
+typedef struct sfx_s sfx_t;
-// gets the current DMA position
-int SNDDMA_GetDMAPos(void);
+extern cvar_t mastervolume;
+extern cvar_t bgmvolume;
+extern cvar_t volume;
+extern cvar_t snd_initialized;
+extern cvar_t snd_staticvolume;
+extern cvar_t snd_mutewhenidle;
-// shutdown the DMA xfer.
-void SNDDMA_Shutdown(void);
// ====================================================================
-// User-setable variables
+// Functions
// ====================================================================
-// LordHavoc: increased from 128 to 516 (4 for NUM_AMBIENTS)
-#define MAX_CHANNELS 516
-// LordHavoc: increased maximum sound channels from 8 to 128
-#define MAX_DYNAMIC_CHANNELS 128
-
-
-extern channel_t channels[MAX_CHANNELS];
-// 0 to MAX_DYNAMIC_CHANNELS-1 = normal entity sounds
-// MAX_DYNAMIC_CHANNELS to MAX_DYNAMIC_CHANNELS + NUM_AMBIENTS -1 = water, etc
-// MAX_DYNAMIC_CHANNELS + NUM_AMBIENTS to total_channels = static sounds
-
-extern int total_channels;
-
-//
-// Fake dma is a synchronous faking of the DMA progress used for
-// isolating performance in the renderer. The fakedma_updates is
-// number of times S_Update() is called per second.
-//
-
-extern qboolean fakedma;
-extern int fakedma_updates;
-extern int paintedtime;
-extern int soundtime;
-extern vec3_t listener_origin;
-extern vec3_t listener_forward;
-extern vec3_t listener_right;
-extern vec3_t listener_up;
-extern volatile dma_t *shm;
-extern volatile dma_t sn;
-extern vec_t sound_nominal_clip_dist;
-
-extern cvar_t loadas8bit;
-extern cvar_t bgmvolume;
-extern cvar_t volume;
-extern cvar_t snd_swapstereo;
+void S_Init (void);
+void S_Terminate (void);
-extern qboolean cdaudioinitialized;
-extern qboolean snd_initialized;
+void S_Startup (void);
+void S_Shutdown (void);
+void S_UnloadAllSounds_f (void);
-extern int snd_blocked;
+void S_Update(const matrix4x4_t *listenermatrix);
+void S_ExtraUpdate (void);
-void S_LocalSound (char *s);
-sfxcache_t *S_LoadSound (sfx_t *s, int complain);
+sfx_t *S_PrecacheSound (const char *sample, qboolean complain, qboolean levelsound);
+float S_SoundLength(const char *name);
+void S_ClearUsed (void);
+void S_PurgeUnused (void);
+qboolean S_IsSoundPrecached (const sfx_t *sfx);
+sfx_t *S_FindName(const char *name);
+
+// these define the "engine" channel namespace
+#define CHAN_MIN_AUTO -128
+#define CHAN_MAX_AUTO 0
+#define CHAN_MIN_SINGLE 1
+#define CHAN_MAX_SINGLE 127
+#define IS_CHAN_AUTO(n) ((n) >= CHAN_MIN_AUTO && (n) <= CHAN_MAX_AUTO)
+#define IS_CHAN_SINGLE(n) ((n) >= CHAN_MIN_SINGLE && (n) <= CHAN_MAX_SINGLE)
+#define IS_CHAN(n) (IS_CHAN_AUTO(n) || IS_CHAN_SINGLE(n))
+
+// engine channel == network channel
+#define CHAN_ENGINE2NET(c) (c)
+#define CHAN_NET2ENGINE(c) (c)
+
+// engine view of channel encodes the auto flag into the channel number (see CHAN_ constants below)
+// user view uses the flags bitmask for it
+#define CHAN_USER2ENGINE(c) (c)
+#define CHAN_ENGINE2USER(c) (c)
+#define CHAN_ENGINE2CVAR(c) (abs(c))
+
+// S_StartSound returns the channel index, or -1 if an error occurred
+int S_StartSound (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation);
+int S_StartSound_StartPosition_Flags (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation, float startposition, int flags, float fspeed);
+qboolean S_LocalSound (const char *s);
+
+void S_StaticSound (sfx_t *sfx, vec3_t origin, float fvol, float attenuation);
+void S_StopSound (int entnum, int entchannel);
+void S_StopAllSounds (void);
+void S_PauseGameSounds (qboolean toggle);
-wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength);
+void S_StopChannel (unsigned int channel_ind, qboolean lockmutex, qboolean freesfx);
+qboolean S_SetChannelFlag (unsigned int ch_ind, unsigned int flag, qboolean value);
+void S_SetChannelVolume (unsigned int ch_ind, float fvol);
+void S_SetChannelSpeed (unsigned int ch_ind, float fspeed);
+float S_GetChannelPosition (unsigned int ch_ind);
+float S_GetEntChannelPosition(int entnum, int entchannel);
-void SND_InitScaletable (void);
-void SNDDMA_Submit(void);
+void S_BlockSound (void);
+void S_UnblockSound (void);
-void S_AmbientOff (void);
-void S_AmbientOn (void);
+int S_GetSoundRate (void);
+int S_GetSoundChannels (void);
#endif
-