jedioutcast/CODEmp/client/snd_local.h
2013-04-04 09:52:42 -05:00

205 lines
5.5 KiB
C

// snd_local.h -- private sound definations
#ifndef SND_LOCAL_H
#define SND_LOCAL_H
#include "../game/q_shared.h"
#include "../qcommon/qcommon.h"
#include "snd_public.h"
#include "../mp3code/mp3struct.h"
#define PAINTBUFFER_SIZE 4096 // this is in samples
#define SND_CHUNK_SIZE 1024 // samples
#define SND_CHUNK_SIZE_FLOAT (SND_CHUNK_SIZE/2) // floats
#define SND_CHUNK_SIZE_BYTE (SND_CHUNK_SIZE*2) // bytes
#define SND_CACHE_SIZE 6144 // this is in chunks
#define DEFAULT_SOUND_NAME "*defaultsound"
typedef struct {
int left; // the final values will be clamped to +/- 0x00ffff00 and shifted down
int right;
} portable_samplepair_t;
typedef struct sndBuffer_s {
short sndChunk[SND_CHUNK_SIZE];
struct sndBuffer_s *next;
// int size;
} sndBuffer;
// keep this table in-sync with the table "sSoundCompressionMethodStrings" (snd_dma.cpp) -ste
//
typedef enum
{
ct_16 = 0, // 16-bit uncompressed samples (the default)
ct_MP3,
//
ct_NUMBEROF // used only for array sizing
} SoundCompressionMethod_t;
typedef struct sfx_s {
short *pSoundData;
qboolean bDefaultSound; // couldn't be loaded, so use buzz
qboolean bInMemory; // not in Memory, set qtrue when loaded, and qfalse when its buffers are freed up because of being old, so can be reloaded
SoundCompressionMethod_t eSoundCompressionMethod;
MP3STREAM *pMP3StreamHeader; // NULL ptr unless this sfx_t is an MP3. Use Z_Malloc and Z_Free
int iSoundLengthInSamples; // length in samples, always kept as 16bit now so this is #shorts (watch for stereo later for music?)
char sSoundName[MAX_QPATH];
int iLastTimeUsed;
float fVolRange; // used to set the highest volume this sample has at load time - used for lipsynching
int iLastLevelUsedOn; // used for cacheing purposes
struct sfx_s *next; // only used because of hash table when registering
} sfx_t;
typedef struct {
int channels;
int samples; // mono samples in buffer
int submission_chunk; // don't mix less than this #
int samplebits;
int speed;
byte *buffer;
} dma_t;
#define START_SAMPLE_IMMEDIATE 0x7fffffff
typedef struct loopSound_s {
vec3_t origin;
vec3_t velocity;
sfx_t *sfx;
int mergeFrame;
qboolean active;
qboolean kill;
qboolean doppler;
float dopplerScale;
float oldDopplerScale;
int framenum;
} loopSound_t;
typedef struct
{
int allocTime;
int startSample; // START_SAMPLE_IMMEDIATE = set immediately on next mix
int entnum; // to allow overriding a specific sound
int entchannel; // to allow overriding a specific sound
int leftvol; // 0-255 volume after spatialization
int rightvol; // 0-255 volume after spatialization
int master_vol; // 0-255 volume before spatialization
float dopplerScale;
float oldDopplerScale;
vec3_t origin; // only use if fixed_origin is set
qboolean fixed_origin; // use origin instead of fetching entnum's origin
sfx_t *thesfx; // sfx structure
qboolean doppler;
//
// new stuff for MP3 decoding...
//
MP3STREAM MP3StreamHeader;
byte MP3SlidingDecodeBuffer[50000/*12000*/]; // typical back-request = -3072, so roughly double is 6000 (safety), then doubled again so the 6K pos is in the middle of the buffer)
int iMP3SlidingDecodeWritePos;
int iMP3SlidingDecodeWindowPos;
} channel_t;
#define WAV_FORMAT_PCM 1
#define WAV_FORMAT_ADPCM 2 // not actually implemented, but is the value that you get in a WAV header
#define WAV_FORMAT_MP3 3 // not actually used this way, but just ensures we don't match one of the legit formats
typedef struct {
int format;
int rate;
int width;
int channels;
int samples;
int dataofs; // chunk starts this many bytes from file start
} wavinfo_t;
/*
====================================================================
SYSTEM SPECIFIC FUNCTIONS
====================================================================
*/
// initializes cycling through a DMA buffer and returns information on it
qboolean SNDDMA_Init(void);
// gets the current DMA position
int SNDDMA_GetDMAPos(void);
// shutdown the DMA xfer.
void SNDDMA_Shutdown(void);
void SNDDMA_BeginPainting (void);
void SNDDMA_Submit(void);
//====================================================================
#define MAX_CHANNELS 96
extern channel_t s_channels[MAX_CHANNELS];
extern channel_t loop_channels[MAX_CHANNELS];
extern int numLoopChannels;
extern int s_paintedtime;
extern int s_rawend;
extern vec3_t listener_forward;
extern vec3_t listener_right;
extern vec3_t listener_up;
extern dma_t dma;
#define MAX_RAW_SAMPLES 16384
extern portable_samplepair_t s_rawsamples[MAX_RAW_SAMPLES];
extern cvar_t *s_volume;
extern cvar_t *s_nosound;
extern cvar_t *s_khz;
extern cvar_t *s_show;
extern cvar_t *s_mixahead;
extern cvar_t *s_testsound;
extern cvar_t *s_separation;
qboolean S_LoadSound( sfx_t *sfx );
void S_PaintChannels(int endtime);
portable_samplepair_t *S_GetRawSamplePointer();
// spatializes a channel
void S_Spatialize(channel_t *ch);
void S_FreeAllSFXMem(void);
#define NXStream byte
//////////////// sound code changes...
//
byte *SND_malloc(int iSize, sfx_t *sfx);
void SND_setup();
int SND_FreeOldestSound();
void SND_TouchSFX(sfx_t *sfx);
void S_DisplayFreeMemory(void);
void S_memoryLoad(sfx_t *sfx);
//
////////////////
extern short *sfxScratchBuffer;
extern sfx_t *sfxScratchPointer;
extern int sfxScratchIndex;
#endif // #ifndef SND_LOCAL_H