2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/Sound/Sound.h $
15 * <insert description of file here>
18 * Revision 1.4 2002/06/09 04:41:15 relnev
19 * added copyright header
21 * Revision 1.3 2002/05/31 07:24:28 relnev
24 * Revision 1.2 2002/05/07 03:16:43 theoddone33
25 * The Great Newline Fix
27 * Revision 1.1.1.1 2002/05/03 03:28:12 root
31 * 6 9/08/99 3:22p Dave
32 * Updated builtin mission list.
34 * 5 8/27/99 6:38p Alanl
35 * crush the blasted repeating messages bug
37 * 4 6/18/99 5:16p Dave
38 * Added real beam weapon lighting. Fixed beam weapon sounds. Added MOTD
39 * dialog to PXO screen.
41 * 3 5/23/99 8:11p Alanl
42 * Added support for EAX
44 * 2 10/07/98 10:54a Dave
47 * 1 10/07/98 10:51a Dave
49 * 30 5/12/98 5:39p Lawrance
50 * Increase MAX_SOUNDS to 175.. to account for missions with lots of voice
52 * 29 5/12/98 2:43p Lawrance
53 * Make snd_time_remaining() work for arbitrary format
55 * 28 4/13/98 5:04p Lawrance
56 * Write functions to determine how many milliseconds are left in a sound
58 * 27 3/29/98 12:56a Lawrance
59 * preload the warp in and explosions sounds before a mission.
61 * 26 3/25/98 6:10p Lawrance
62 * Work on DirectSound3D
64 * 25 3/23/98 10:34a Lawrance
65 * fix parameter in snd_size()
67 * 24 3/23/98 10:32a Lawrance
68 * Add functions for extracting raw sound data
70 * 23 3/21/98 3:34p Lawrance
71 * Allow 3d sounds to have their ranges modified dynamically
73 * 22 3/19/98 5:36p Lawrance
74 * Add some sound debug functions to see how many sounds are playing, and
75 * to start/stop random looping sounds.
77 * 21 3/17/98 5:55p Lawrance
78 * Support object-linked sounds for asteroids.
80 * 20 2/20/98 8:32p Lawrance
81 * Add radius parm to sound_play_3d()
83 * 19 1/07/98 11:08a Lawrance
84 * pass priority to snd_play_raw()
86 * 18 12/05/97 5:19p Lawrance
87 * re-do sound priorities to make more general and extensible
89 * 17 11/20/97 5:36p Dave
90 * Hooked in a bunch of main hall changes (including sound). Made it
91 * possible to reposition (rewind/ffwd)
92 * sound buffer pointers. Fixed animation direction change framerate
95 * 16 11/20/97 1:06a Lawrance
96 * Add Master_voice_volume, make voices play back at correctly scaled
99 * 15 10/14/97 11:33p Lawrance
100 * get RSX implemented
102 * 14 10/13/97 7:41p Lawrance
103 * store duration of sound
105 * 13 10/01/97 5:55p Lawrance
106 * change call to snd_play_3d() to allow for arbitrary listening position
108 * 12 7/15/97 11:15a Lawrance
109 * limit the max instances of simultaneous sound effects, implement
110 * priorities to force critical sounds
112 * 11 6/12/97 5:16p Lawrance
113 * allow snd_play_looping to take just one parm
115 * 10 6/09/97 11:50p Lawrance
116 * integrating DirectSound3D
118 * 9 6/05/97 11:25a Lawrance
119 * use sound signatures to ensure correct sound is loaded
121 * 8 6/05/97 1:36a Lawrance
122 * using a new interface to play sounds
124 * 7 6/05/97 1:08a Lawrance
125 * new sound play interface
127 * 6 6/02/97 1:45p Lawrance
128 * implementing hardware mixing
130 * 5 5/29/97 3:32p Lawrance
131 * added call to snd_do_frame()
133 * 4 5/29/97 12:04p Lawrance
134 * split off acm, direct sound, and direct sound 3d portions to separate
137 * 3 5/26/97 10:25a Lawrance
138 * extern ds_convert_volume()
140 * 2 5/06/97 9:36a Lawrance
141 * added support for min and max distances for 3d sounds
143 * 1 4/28/97 4:45p John
144 * Initial version of ripping sound & movie out of OsAPI.
146 * 18 4/24/97 4:14p Lawrance
147 * make ds_initialized extern
149 * 17 4/21/97 8:58a Lawrance
150 * keep track of how much mem is used for sounds
152 * 16 4/20/97 11:19a Lawrance
153 * sndman_ interface obsolete. Using snd_ functions to load, play, and
154 * manage static sound fx
156 * 15 4/18/97 2:54p Lawrance
157 * sounds now have a default volume, when playing, pass a scaling factor
158 * not the actual volume
160 * 14 4/09/97 4:34p Lawrance
161 * allow looped sounds to be cut off after they complete the full sample
164 * 13 4/03/97 4:27p Lawrance
165 * expanding functionality to support event driven music
167 * 12 3/25/97 10:49a Lawrance
168 * ADPCM -> PCM conversion working
170 * 11 3/24/97 5:50p Lawrance
171 * added code to convert from ADPCM -> PCM using Audio Compression Manager
173 * 10 3/19/97 11:48a Lawrance
174 * make each sound effect have a DirectSound secondary buffer
176 * 9 3/10/97 4:16p Allender
177 * new messaging system. builtin5 fixed to support it. made new sound
178 * function to determine if sound is still playing.
180 * 8 2/25/97 11:13a Lawrance
181 * added Master_sound_volume to scale volume passed to snd_play()
183 * 7 1/10/97 10:44a John
184 * added functions to dynamically set volume/pan
186 * 6 12/03/96 3:50p John
187 * Added some initial support for looping sounds.
189 * 5 11/05/96 11:02a Mike
190 * Add sound toggle to Delete-D menu.
191 * Make some global variables look global - ie, capitalize them.
192 * Fix bug in collision code to make ship:ship collision detection work.
193 * Fix setting of parent_obj in obj_create().
195 * 4 11/04/96 3:16p John
196 * First rev of working sound.
198 * 3 11/04/96 10:37a John
199 * Closed the DirectSound object on program termination.
201 * 2 10/30/96 5:27p John
202 * some hacked in sound stuff so i can experiment with directsound.
204 * 1 10/28/96 11:36a John
212 #define MAX_SOUNDS 256
214 // Used for keeping track which low-level sound library is being used
215 #define SOUND_LIB_DIRECTSOUND 0
216 #define SOUND_LIB_RSX 1
218 #define GAME_SND_USE_DS3D (1<<1)
219 #define GAME_SND_VOICE (1<<2)
221 // Priorities that can be passed to snd_play() functions to limit how many concurrent sounds of a
222 // given type are played.
223 #define SND_PRIORITY_MUST_PLAY 0
224 #define SND_PRIORITY_SINGLE_INSTANCE 1
225 #define SND_PRIORITY_DOUBLE_INSTANCE 2
226 #define SND_PRIORITY_TRIPLE_INSTANCE 3
228 typedef struct game_snd
230 int sig; // number of sound in sounds.tbl (not used)
231 char filename[MAX_FILENAME_LEN];
232 float default_volume; // range: 0.0 -> 1.0
233 int min, max; // min: distance at which sound will stop getting louder max: distance at which sound is inaudible
234 int preload; // preload sound (ie read from disk before mission starts)
235 int id; // index into Sounds[], where sound data is stored
236 int id_sig; // signature of Sounds[] element
240 typedef struct sound_env
248 extern int Sound_enabled;
249 extern float Master_sound_volume; // 0 -> 1.0
250 extern float Master_voice_volume; // 0 -> 1.0
251 extern int Snd_sram; // System memory consumed by sound data
252 extern int Snd_hram; // Soundcard memory consumed by sound data
254 //int snd_load( char *filename, int hardware=0, int three_d=0, int *sig=NULL );
255 int snd_load( game_snd *gs, int allow_hardware_load = 0);
257 int snd_unload( int sndnum );
258 void snd_unload_all();
260 // Plays a sound with volume between 0 and 1.0, where 0 is the
261 // inaudible and 1.0 is the loudest sound in the game.
262 // Pan goes from -1.0 all the way left to 0.0 in center to 1.0 all the way right.
263 int snd_play( game_snd *gs, float pan=0.0f, float vol_scale=1.0f, int priority = SND_PRIORITY_SINGLE_INSTANCE, bool voice_message = false );
265 // Play a sound directly from index returned from snd_load(). Bypasses
266 // the sound management process of using game_snd.
267 int snd_play_raw( int soundnum, float pan, float vol_scale=1.0f, int priority = SND_PRIORITY_MUST_PLAY );
269 // Plays a sound with volume between 0 and 1.0, where 0 is the
270 // inaudible and 1.0 is the loudest sound in the game. It scales
271 // the pan and volume relative to the current viewer's location.
272 int snd_play_3d(game_snd *gs, vector *source_pos, vector *listen_pos, float radius=0.0f, vector *vel = NULL, int looping = 0, float vol_scale=1.0f, int priority = SND_PRIORITY_SINGLE_INSTANCE, vector *sound_fvec = NULL, float range_factor = 1.0f, int force = 0 );
274 // update the given 3d sound with a new position
275 void snd_update_3d_pos(int soudnnum, game_snd *gs, vector *new_pos);
277 // Use these for looping sounds.
278 // Returns the handle of the sound. -1 if failed.
279 // If startloop or stoploop are not -1, then then are used.
280 int snd_play_looping( game_snd *gs, float pan=0.0f, int start_loop=-1, int stop_loop=-1, float vol_scale=1.0f, int priority = SND_PRIORITY_MUST_PLAY, int force = 0 );
282 void snd_stop( int snd_handle );
284 // Sets the volume of a sound that is already playing.
285 // The volume is between 0 and 1.0, where 0 is the
286 // inaudible and 1.0 is the loudest sound in the game.
287 void snd_set_volume( int snd_handle, float volume );
289 // Sets the panning location of a sound that is already playing.
290 // Pan goes from -1.0 all the way left to 0.0 in center to 1.0 all the way right.
291 void snd_set_pan( int snd_handle, float pan );
293 // Sets the pitch (frequency) of a sound that is already playing
294 // Valid values for pitch are between 100 and 100000
295 void snd_set_pitch( int snd_handle, int pitch );
296 int snd_get_pitch( int snd_handle );
298 // Stops all sounds from playing, even looping ones.
301 // determines if the sound handle is still palying
302 int snd_is_playing( int snd_handle );
304 // change the looping status of a sound that is playing
305 void snd_chg_loop_status(int snd_handle, int loop);
307 // return the time in ms for the duration of the sound
308 int snd_get_duration(int snd_id);
310 // get a 3D vol and pan for a particular sound
311 int snd_get_3d_vol_and_pan(game_snd *gs, vector *pos, float* vol, float *pan, float radius=0.0f);
313 int snd_init(int use_a3d, int use_eax);
316 // Return 1 or 0 to show that sound system is inited ok
319 // Returns a pointer to the direct sound object
322 void snd_update_listener(vector *pos, vector *vel, matrix *orient);
324 void snd_use_lib(int lib_id);
326 int snd_num_playing();
328 int snd_get_data(int handle, char *data);
329 int snd_size(int handle, int *size);
332 // repositioning of the sound buffer pointer
333 void snd_rewind(int snd_handle, game_snd *sg, float seconds); // rewind N seconds from the current position
334 void snd_ffwd(int snd_handle, game_snd *sg, float seconds); // fast forward N seconds from the current position
335 void snd_set_pos(int snd_handle, game_snd *sg, float val,int as_pct); // set the position val as either a percentage (if as_pct) or as a # of seconds into the sound
337 void snd_get_format(int handle, int *bits_per_sample, int *frequency);
338 int snd_time_remaining(int handle, int bits_per_sample=8, int frequency=11025);
355 SND_ENV_CARPETEDHALLWAY,
357 SND_ENV_STONECORRIDOR,
372 int sound_env_set(sound_env *se);
373 int sound_env_get(sound_env *se);
374 int sound_env_disable();
375 int sound_env_supported();