Attempt to stabilize ODE. Now using constant step (sys_ticrate set steptime) - on...
[divverent/darkplaces.git] / sound.h
diff --git a/sound.h b/sound.h
index ebc0a84..37e53b0 100644 (file)
--- a/sound.h
+++ b/sound.h
@@ -17,165 +17,82 @@ along with this program; if not, write to the Free Software
 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
+// ====================================================================
+
+#define DEFAULT_SOUND_PACKET_VOLUME 255
+#define DEFAULT_SOUND_PACKET_ATTENUATION 1.0
 
-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);
+// Channel flags
+#define CHANNELFLAG_NONE               0
+#define CHANNELFLAG_FORCELOOP  (1 << 0) // force looping even if the sound is not looped
+#define CHANNELFLAG_LOCALSOUND (1 << 1) // INTERNAL USE. Not settable by S_SetChannelFlag
+#define CHANNELFLAG_PAUSED             (1 << 2)
+#define CHANNELFLAG_FULLVOLUME (1 << 3) // isn't affected by the general volume
 
-// picks a channel based on priorities, empty slots, number of channels
-channel_t *SND_PickChannel(int entnum, int entchannel);
 
-// 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);
+
+void S_Update(const matrix4x4_t *listenermatrix);
+void S_ExtraUpdate (void);
 
-extern int snd_blocked;
+sfx_t *S_PrecacheSound (const char *sample, qboolean complain, qboolean serversound);
+float S_SoundLength(const char *name);
+void S_ClearUsed (void);
+void S_PurgeUnused (void);
+qboolean S_IsSoundPrecached (const sfx_t *sfx);
 
-void S_LocalSound (char *s);
-sfxcache_t *S_LoadSound (sfx_t *s, int complain);
+// 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 (int entnum, int entchannel, sfx_t *sfx, vec3_t origin, float fvol, float attenuation, float startposition);
+qboolean S_LocalSound (const char *s);
 
-wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength);
+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);
 
-void SND_InitScaletable (void);
-void SNDDMA_Submit(void);
+void S_StopChannel (unsigned int channel_ind, qboolean lockmutex);
+qboolean S_SetChannelFlag (unsigned int ch_ind, unsigned int flag, qboolean value);
+void S_SetChannelVolume (unsigned int ch_ind, float fvol);
+float S_GetChannelPosition (unsigned int ch_ind);
+float S_GetEntChannelPosition(int entnum, int entchannel);
 
-void S_AmbientOff (void);
-void S_AmbientOn (void);
+void S_BlockSound (void);
+void S_UnblockSound (void);
 
-#endif
+int S_GetSoundRate (void);
+int S_GetSoundChannels (void);
 
+#endif