summaryrefslogtreecommitdiff
path: root/src/client/sound/sound.h
blob: d4247b5bc0ccfc016748f0615ddf755446aadfcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/*
Copyright (C) 1997-2001 Id Software, Inc.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

// sound.h -- private sound functions

#include "../client.h"

#if USE_SNDDMA
#include "client/sound/dma.h"
#endif

// !!! if this is changed, the asm code must change !!!
typedef struct samplepair_s {
    int         left;
    int         right;
} samplepair_t;

typedef struct sfxcache_s {
    int         length;
    int         loopstart;
    int         width;
#if USE_OPENAL
    int         size;
    int         bufnum;
#endif
    byte        data[1];        // variable sized
} sfxcache_t;

typedef struct sfx_s {
    char        name[MAX_QPATH];
    int         registration_sequence;
    sfxcache_t  *cache;
    char        *truename;
    qerror_t    error;
} sfx_t;

// a playsound_t will be generated by each call to S_StartSound,
// when the mixer reaches playsound->begin, the playsound will
// be assigned to a channel
typedef struct playsound_s {
    struct playsound_s  *prev, *next;
    sfx_t       *sfx;
    float       volume;
    float       attenuation;
    int         entnum;
    int         entchannel;
    qboolean    fixed_origin;   // use origin field instead of entnum's origin
    vec3_t      origin;
    unsigned    begin;          // begin on this sample
} playsound_t;

// !!! if this is changed, the asm code must change !!!
typedef struct channel_s {
    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 OBSOLETE?
    int         entnum;         // to allow overriding a specific sound
    int         entchannel;     //
    vec3_t      origin;         // only use if fixed_origin is set
    vec_t       dist_mult;      // distance multiplier (attenuation/clipK)
    float       master_vol;     // 0.0-1.0 master volume
    qboolean    fixed_origin;   // use origin instead of fetching entnum's origin
    qboolean    autosound;      // from an entity->sound, cleared each frame
#if USE_OPENAL
    int         autoframe;
    int         srcnum;
#endif
} channel_t;

typedef struct {
    char    *name;
    int     rate;
    int     width;
    int     loopstart;
    int     samples;
    byte    *data;
} wavinfo_t;

/*
====================================================================

  SYSTEM SPECIFIC FUNCTIONS

====================================================================
*/

#if USE_SNDDMA
void DMA_SoundInfo(void);
qboolean DMA_Init(void);
void DMA_Shutdown(void);
void DMA_Activate(void);
int DMA_DriftBeginofs(float timeofs);
void DMA_ClearBuffer(void);
void DMA_Update(void);
#endif

#if USE_OPENAL
void AL_SoundInfo(void);
qboolean AL_Init(void);
void AL_Shutdown(void);
sfxcache_t *AL_UploadSfx(sfx_t *s);
void AL_DeleteSfx(sfx_t *s);
void AL_StopChannel(channel_t *ch);
void AL_PlayChannel(channel_t *ch);
void AL_StopAllChannels(void);
void AL_Update(void);
#endif

//====================================================================

// only begin attenuating sound volumes when outside the FULLVOLUME range
#define     SOUND_FULLVOLUME    80

#define     SOUND_LOOPATTENUATE 0.003

typedef enum {
    SS_NOT,
#if USE_SNDDMA
    SS_DMA,
#endif
#if USE_OPENAL
    SS_OAL
#endif
} sndstarted_t;

extern sndstarted_t s_started;
extern qboolean s_active;

#define MAX_CHANNELS            32
extern  channel_t   channels[MAX_CHANNELS];
extern  int         s_numchannels;

extern  int     paintedtime;
extern  playsound_t s_pendingplays;

extern  vec3_t      listener_origin;
extern  vec3_t      listener_forward;
extern  vec3_t      listener_right;
extern  vec3_t      listener_up;
extern  int         listener_entnum;

extern  wavinfo_t   s_info;

extern cvar_t   *s_volume;
#if USE_SNDDMA
extern cvar_t   *s_khz;
extern cvar_t   *s_testsound;
#endif
extern cvar_t   *s_ambient;
extern cvar_t   *s_show;

#define S_Malloc(x)     Z_TagMalloc(x, TAG_SOUND)
#define S_CopyString(x) Z_TagCopyString(x, TAG_SOUND)

sfx_t *S_SfxForHandle(qhandle_t hSfx);
sfxcache_t *S_LoadSound(sfx_t *s);
channel_t *S_PickChannel(int entnum, int entchannel);
void S_IssuePlaysound(playsound_t *ps);
void S_BuildSoundList(int *sounds);
#if USE_SNDDMA
void S_InitScaletable(void);
void S_PaintChannels(int endtime);
#endif