Descent3/lib/hlsoundlib.h
2024-04-16 12:56:40 -06:00

390 lines
11 KiB
C++

/*
* $Logfile: /DescentIII/Main/lib/hlsoundlib.h $
* $Revision: 47 $
* $Date: 3/20/00 12:26p $
* $Author: Matt $
*
* Descent III Device-independant sound library
*
* $Log: /DescentIII/Main/lib/hlsoundlib.h $
*
* 47 3/20/00 12:26p Matt
* Merge of Duane's post-1.3 changes.
* Lower MAX_SOUND_OBJECTS for Mac (Mac only)
*
* 46 10/21/99 9:27p Jeff
* B.A. Macintosh code merge
*
* 45 5/10/99 10:53p Ardussi
* changes to compile on Mac
*
* 44 4/27/99 2:10p Samir
* added code to set the desired sound card given the descriptive name of
* a sound card.
*
* 43 4/12/99 7:14p Samir
* prioritization code added.
*
* 42 4/11/99 2:17p Chris
* Made max sounds 3000 DAMN!
*
* 41 4/10/99 5:09p Samir
* beginning to add prioritization of sounds code. currently non
* functional, but allows me to change all calls to Play3dSound so that I
* can test later.
*
* 40 4/01/99 6:37p Chris
*
* 39 4/01/99 6:37p Chris
* Increased max sound objects
*
* 38 4/01/99 4:28p Samir
* hardware geometry integration if it's available.
*
* 37 2/21/99 5:48p Matt
* Added SetVolumeObject()
*
* 36 1/30/99 3:44p Chris
* Added support for time-offset'ed 3d sounds (like start at 1.2 seconds
* into the sound)
*
* 35 1/29/99 12:48p Matt
* Rewrote the doorway system
*
* 34 1/26/99 5:16p Matt
* Added StopObjectSound()
*
* 33 1/12/99 4:04p Samir
* added environmental audio on a per room basis.
*
* 32 1/08/99 6:31p Samir
* added reverb
*
* 31 1/08/99 5:37p Samir
* reverb values per room.
*
* 30 11/16/98 4:29p Chris
* Added pause new flag to the high level system
*
* 29 11/13/98 2:27p Samir
* moved music stuff to d3music.h
*
* 28 10/16/98 5:42p Chris
*
* 27 8/18/98 12:17p Chris
* f_in_game for begin sound frame (to do 3d processing)
*
* 26 8/10/98 5:52p Samir
* added tension levels for music.
*
* 25 7/28/98 5:41p Samir
* change some music system protos.
*
* 24 7/24/98 5:26p Samir
* added some D3 music functions.
*
* 23 7/09/98 8:34p Samir
* added argument to callback for streams.
*
* 22 6/29/98 9:29a Chris
* Added some support for Direct Sound 3d
*
* 21 6/24/98 12:09p Chris
* Update
*
* 20 6/22/98 12:00p Chris
* Working on sound system to make it in a nice shape.
*
* 19 6/19/98 3:03p Chris
* Made CheckAndForceSoundDataAlloc a SoundSystem function - useful for
* multiple mixers. Added IsSoundPlaying to the high level sound lib.
*
* 18 6/17/98 7:04p Chris
* Added support for 8bit stream data to be played by our 16bit sound
* mixer
*
* 17 6/16/98 3:48p Chris
* Updated the sound system and added the start of sound streaming
*
* 16 3/20/98 2:59p Chris
* Added a wall hit sound for the player and added support for a base
* volume for 3d sounds
*
* 15 2/27/98 5:31p Chris
* Changed how master_volume is set.
*
* 14 2/23/98 6:32p Chris
* Added support for a hlsoundlib unique id. This is what all the public
* functions use. Also, looping sounds are now correctly turned off and
* on.
*
* 13 2/15/98 6:41p Chris
* Added Update2dSound
*
* 12 2/13/98 5:15p Chris
* Fixed multiple problems with looping sounds not being able to be
* stopped
*
* 11 1/19/98 10:04a Matt
* Added new object handle system
*
* 10 1/13/98 5:08p Chris
* Increased sound object limit
*
* 9 1/06/98 2:12p Chris
* Added muffled sounds v.1 and made 3d sounds keep their roomnum.
*
* 8 1/02/98 5:32p Chris
* More radical changes to the sound system
*
* 7 12/31/97 2:58a Chris
* Another major revision to the SoundLib. This cleaned up the code after
* removing the direct sound secondary buffers.
*
* 6 12/30/97 2:15p Chris
* Adding further support for software 3d stuff
*
* 5 12/12/97 11:43a Chris
* Added support to toggle sndlib on/off
*
* 4 12/11/97 12:58p Chris
* Added support for fixed 3d position updating sounds.
*
* 3 12/10/97 4:47p Chris
* Revision 1.0 of new sound library (no hardware -- uses primary buffer
* streaming)
*
* 2 11/21/97 1:10p Chris
* Incremental Improvements
*
* 20 6/11/97 1:07p Samir
* The removal of gameos and replaced with oeApplication, oeDatabase
*
* 19 5/22/97 6:18p Chris
*
* 18 5/22/97 5:15p Chris
*
* 17 5/15/97 1:59a Chris
*
* 16 4/29/97 8:03a Chris
* Improved the sound code. High-level sound now
* fully uses the flags in the sound page and it
* resulted in a simpilier coding interface :)
*
* 15 4/28/97 11:21a Chris
* Incremental improvements is the sound system
*
* 14 4/24/97 3:25a Chris
* // Added some more support for 3d sounds
*
* 13 4/03/97 8:37p Chris
* Added the Main_OS object pass in the sound library
* initialization code.
*
* 12 3/15/97 1:34p Chris
*
* $NoKeywords: $
*/
#ifndef __HLSOUNDLIB_H__
#define __HLSOUNDLIB_H__
#include "ssl_lib.h"
#include "object.h"
//////////////////////////////////////////////////////////////////////////
#ifdef MACINTOSH
#define MAX_SOUNDS_MIXED 32
#define MIN_SOUNDS_MIXED 8
#define MAX_SOUND_OBJECTS 3000
#else
#define MAX_SOUNDS_MIXED 40
#define MIN_SOUNDS_MIXED 20
#define MAX_SOUND_OBJECTS 3000
#endif
extern char Sound_quality;
extern char Sound_mixer;
extern char Sound_card_name[];
class sound_object {
public:
sound_object() { m_obj_type_flags = SIF_UNUSED; }
public:
unsigned int m_obj_type_flags;
int m_sound_uid;
int m_sound_index;
int m_hlsound_uid;
play_information play_info;
float volume_3d; // Used so that 3d sounds can have a base volume (for 2d this is in play_information)
union {
struct {
int segnum; // Use physics' bit-bit stuff (inside/outside)
vector pos;
matrix orient; // only need pitch and heading -- not roll (sound cones are symetrical)
} pos_info;
int object_handle;
} m_link_info;
};
class hlsSystem {
int m_f_hls_system_init;
class sound_object m_sound_objects[MAX_SOUND_OBJECTS];
float m_master_volume;
int m_sounds_played;
bool m_pause_new;
ubyte m_cur_environment; // current environment being played.
int n_lls_sounds; // number of sounds that we want the low level mixer to mix.
bool Emulate3dSound(int sound_obj_index);
bool ComputePlayInfo(int sound_obj_index, vector *virtual_pos, vector *virtual_vel, float *adjusted_volume);
inline int MakeUniqueId(int sound_obj_index);
inline int ValidateUniqueId(int hl_sound_uid);
// Forcefully ends a sound
void StopSound(int sound_obj_index, unsigned char f_immediately = SKT_STOP_IMMEDIATELY);
private:
int Play3dSound(int sound_index, pos_state *cur_pos, object *cur_obj, int priority, float volume, int flags,
float offset = 0.0);
public:
// Include a lowel-level sound system
class llsSystem *m_ll_sound_ptr;
hlsSystem(); // {m_f_hls_system_init = 0; m_sounds_played=0; m_master_volume = 1.0; m_pause_new = false;}
~hlsSystem() { KillSoundLib(true); }
bool IsActive(void);
// Start and clean-up after the sound library
int InitSoundLib(oeApplication *sos, char mixer_type, char quality, bool f_kill_sound_lib = false);
void KillSoundLib(bool f_kill_sound_list);
void SetLLSoundQuantity(int n_sounds);
int GetLLSoundQuantity();
bool SetLLevelType(); // These are
// Pause and Resume the library
void PauseSounds(bool f_all_sounds = false);
void ResumeSounds();
void StopAllSounds();
// Code for the beginning and ending of a frame of action
// Begin_sound_frame(listener pos/orient/velocity)
// SyncSounds
// Do sound pos updates -- IF VOLUME IS LOW AND NOT FOREVER, THEN STOP SOUND
// compute echo / reverb
// indirect/direct path sounds
void BeginSoundFrame(bool f_in_game = true);
// Plays the deffered 3d stuff
void EndSoundFrame();
// Functions that play a sound
// 3d functions (we use the sound flags in the page to determine all the cool stuff)
// Functions that play a 3d sound -- includes the 2d emulation of 3d sound
int Play3dSound(int sound_index, pos_state *cur_pos, float volume = MAX_GAME_VOLUME, int flags = 0,
float offset = 0.0);
int Play3dSound(int sound_index, object *cur_obj, float volume = MAX_GAME_VOLUME, int flags = 0, float offset = 0.0);
int Play3dSound(int sound_index, int priority, pos_state *cur_pos, float volume = MAX_GAME_VOLUME, int flags = 0,
float offset = 0.0);
int Play3dSound(int sound_index, int priority, object *cur_obj, float volume = MAX_GAME_VOLUME, int flags = 0,
float offset = 0.0);
int PlayStream(int unique_handle, void *data, int size, int stream_format, float volume,
void *stream_callback(void *user_data, int handle, int *size) = NULL);
// 2d functions
int Play2dSound(int sound_index, float volume = MAX_GAME_VOLUME / 2, float pan = 0.0,
unsigned short frequency = 22050);
int Play2dSound(int sound_index, int priority, float volume = MAX_GAME_VOLUME / 2, float pan = 0.0,
unsigned short frequency = 22050);
int Update2dSound(int hlsound_uid, float volume, float pan);
// Do nice looping stop stuff
void StopSoundLooping(int hlsound_uid);
void StopSoundImmediate(int hlsound_uid);
// Stop all sounds attached to an object
void StopObjectSound(int objhandle);
// Set the volume for all the sounds attached to an object
void SetVolumeObject(int objhandle, float volume);
// Master volume controls for sound effects
void SetMasterVolume(float volume);
float GetMasterVolume();
// Queued sound functions
void Add2dSoundQueued(int q_num, int sound_index, float volume, float pan, unsigned short frequency);
void KillQueue(int q_num = 0);
void KillAllQueues();
bool CheckAndForceSoundDataAlloc(int sound_file_index);
bool SetSoundQuality(char quality);
char GetSoundQuality(void);
bool SetSoundMixer(char mixer_type);
char GetSoundMixer(void);
bool IsSoundPlaying(int hlsound_uid);
// Midi play stuff
void SetMidiVolume();
void GetMidiVolume();
void PlayMidi();
void StopMidi();
void PauseMidi();
void ResumeMidi();
};
extern hlsSystem Sound_system;
//////////////////////////////////////////////////////////////////////////
// ENVIRONMENTAL REVERB PRESETS
#define N_ENVAUDIO_PRESETS 26
#define ENVAUD_PRESET_NONE 0
#define ENVAUD_PRESET_PADDEDCELL 1
#define ENVAUD_PRESET_ROOM 2
#define ENVAUD_PRESET_BATHROOM 3
#define ENVAUD_PRESET_LIVINGROOM 4
#define ENVAUD_PRESET_STONEROOM 5
#define ENVAUD_PRESET_AUDITORIUM 6
#define ENVAUD_PRESET_CONCERTHALL 7
#define ENVAUD_PRESET_CAVE 8
#define ENVAUD_PRESET_ARENA 9
#define ENVAUD_PRESET_HANGAR 10
#define ENVAUD_PRESET_CARPETEDHALLWAY 11
#define ENVAUD_PRESET_HALLWAY 12
#define ENVAUD_PRESET_STONECORRIDOR 13
#define ENVAUD_PRESET_ALLEY 14
#define ENVAUD_PRESET_FOREST 15
#define ENVAUD_PRESET_CITY 16
#define ENVAUD_PRESET_MOUNTAINS 17
#define ENVAUD_PRESET_QUARRY 18
#define ENVAUD_PRESET_PLAIN 19
#define ENVAUD_PRESET_PARKINGLOT 20
#define ENVAUD_PRESET_SEWERPIPE 21
#define ENVAUD_PRESET_UNDERWATER 22
#define ENVAUD_PRESET_DRUGGED 23
#define ENVAUD_PRESET_DIZZY 24
#define ENVAUD_PRESET_PSYCHOTIC 25
#endif