50 #define VOL_PAN_UPDATE 50 // time in ms to update a persistent sound vol/pan
51 #define MIN_PERSISTANT_VOL 0.10f
52 #define MIN_FORWARD_SPEED 5
53 #define SPEED_SOUND 600.0f // speed of sound in FreeSpace
55 static int MAX_OBJ_SOUNDS_PLAYING = -1;
56 static int Num_obj_sounds_playing;
58 #define OBJSND_CHANGE_FREQUENCY_THRESHOLD 10
61 static int Doppler_enabled =
TRUE;
63 #define MAX_OBJ_SNDS 256
71 #define FLYBY_MIN_DISTANCE 90
72 #define FLYBY_MIN_SPEED 50
73 #define FLYBY_MIN_RELATIVE_SPEED 100
74 #define FLYBY_MIN_NEXT_TIME 1000 // in ms
75 #define FLYBY_MIN_REPEAT_TIME 4000 // in ms
97 DCF(objsnd,
"Persistent sound stuff" )
106 dc_printf (
"[-list] -- displays status of all objects with linked sounds\n");
107 dc_printf (
"with no parameters, object sounds are toggled on/off\n");
141 dc_printf(
"Object %d => name: %s vol: %.2f pan: %.2f dist: %.2f status: %s\n", osp->
objnum, buf2, osp->
vol, osp->
pan, distance, buf1);
144 dc_printf(
"Number object-linked sounds playing: %d\n", Num_obj_sounds_playing);
157 dc_printf(
"Unknown argument '%s'\n", arg.c_str());
165 DCF_BOOL( doppler, Doppler_enabled )
195 if (MAX_OBJ_SOUNDS_PLAYING < 0)
205 Num_obj_sounds_playing = 0;
208 Flyby_last_objp = NULL;
234 Error(
LOCATION,
"Object sound index %d is bigger than the actual size %d!", index, (
int) objp->
objsnd_num.size());
246 osp = &Objsnds[*iter];
256 Num_obj_sounds_playing--;
257 Assert(Num_obj_sounds_playing >= 0);
281 Num_obj_sounds_playing--;
282 Assert(Num_obj_sounds_playing >= 0);
344 obj_snd *lowest_vol_osp = NULL;
346 int obj_snd_index = -1;
348 lowest_vol = 1000.0f;
353 if ( (osp->
instance != -1) && (osp->
vol < lowest_vol) ) {
354 lowest_vol = osp->
vol;
355 lowest_vol_osp = osp;
359 if (lowest_vol_osp != NULL)
362 if ( (lowest_vol < new_vol) && (objp != NULL) ) {
366 if(*iter == (lowest_vol_osp - Objsnds)){
372 if((obj_snd_index == -1) || (obj_snd_index >= (
int) objp->
objsnd_num.size())){
397 if ( closest_objp == NULL || closest_objp->
type !=
OBJ_SHIP || closest_objp == listener_objp ) {
402 float relative_speed;
411 if ( closest_objp == Flyby_last_objp ) {
446 Flyby_last_objp = closest_objp;
459 float closest_dist, distance, speed_vol_multiplier, rot_vol_mult, percent_max, alive_vol_mult;
461 object *
objp, *closest_objp;
478 closest_dist = 1000000.0f;
481 object *observer_obj = NULL;
507 add_distance = objp->
radius;
510 distance -= add_distance;
511 if ( distance < 0.0
f ) {
516 if ( (objp->
type ==
OBJ_SHIP) && (distance < closest_dist) && (objp != observer_obj) ) {
518 closest_dist = distance;
525 speed_vol_multiplier = 1.0f;
527 alive_vol_mult = 1.0f;
539 if ( percent_max >= 0.5
f ) {
540 speed_vol_multiplier = 1.0f;
542 speed_vol_multiplier = 0.5f + (percent_max);
576 alive_vol_mult = 1.0f;
578 alive_vol_mult = 0.0f;
584 alive_vol_mult = 1.0f;
586 alive_vol_mult = 0.0f;
592 CLAMP(alive_vol_mult, 0.0
f, 1.0
f);
598 go_ahead_flag =
TRUE;
599 float max_vol,new_vol;
601 if ( distance <
Snds[osp->
id].max ) {
602 max_vol =
Snds[osp->
id].default_volume;
603 if ( distance <=
Snds[osp->
id].min ) {
607 new_vol = max_vol - (distance -
Snds[osp->
id].min) * max_vol / (
Snds[osp->
id].max -
Snds[osp->
id].min);
610 if ( new_vol < 0.1
f ) {
614 switch( objp->
type ) {
618 if ( Num_obj_sounds_playing >= MAX_OBJ_SOUNDS_PLAYING ) {
628 if ( go_ahead_flag ) {
629 osp->
instance =
snd_play_3d(gs, &source_pos, &
View_position, add_distance, &objp->
phys_info.
vel, 1, 1.0f,
SND_PRIORITY_TRIPLE_INSTANCE, NULL, 1.0f, 0,
true);
631 Num_obj_sounds_playing++;
634 Assert(Num_obj_sounds_playing <= MAX_OBJ_SOUNDS_PLAYING);
639 if ( distance >
Snds[osp->
id].max ) {
640 int sound_index = -1;
645 if(*iter == (osp - Objsnds)){
651 Assert(sound_index != -1);
735 if ( sound_index == -1 ){
742 nprintf((
"Sound",
"SOUND ==> No free object-linked sounds left\n"));
745 snd = &Objsnds[objp->
objsnd_num[sound_index]];
763 snd->
ss = associated_sub;
830 osp = &Objsnds[*iter];
835 if(((sndnum != -1) && (osp->
id != sndnum))
836 || ((ss != NULL) && (osp->
ss != ss))){
920 osp->
offset = *new_offset;
void obj_snd_level_close()
int timestamp(int delta_ms)
model_subsystem * system_info
float vm_vec_mag_quick(const vec3d *v)
LOCAL state_stack gs[GS_STACK_SIZE]
SCP_vector< game_snd > Snds
void obj_snd_delete(int objnum, int index)
int min
distance at which sound will stop getting louder
int Cmdline_no_enhanced_sound
#define FLYBY_MIN_DISTANCE
#define list_append(head, elem)
void obj_snd_delete_type(int objnum, int sndnum, ship_subsys *ss)
struct vec3d::@225::@227 xyz
int obj_snd_return_instance(int objnum, int index)
#define END_OF_LIST(head)
obj_snd Objsnds[MAX_OBJ_SNDS]
int obj_snd_is_playing(int object, int index)
int obj_snd_update_offset(int objnum, int index, vec3d *new_offset)
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
void maybe_play_flyby_snd(float closest_dist, object *closest_objp, object *listener_objp)
float base_rotation_rate_pct
float turret_base_rotation_snd_mult
int obj_snd_assign(int objnum, int sndnum, vec3d *pos, int main, int flags, ship_subsys *associated_sub)
#define CLAMP(x, min, max)
int ds3d_update_buffer(int channel_id, float min, float max, vec3d *pos, vec3d *vel)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
void joy_ff_fly_by(int mag)
int ds_get_channel(int sig)
#define OS_TURRET_BASE_ROTATION
int snd_play_3d(game_snd *gs, vec3d *source_pos, vec3d *listen_pos, float radius, vec3d *source_vel, int looping, float vol_scale, int priority, vec3d *sound_fvec, float range_factor, int force, bool is_ambient)
int ship_get_SIF(ship *shipp)
sprintf(buf,"(%f,%f,%f)", v3->xyz.x, v3->xyz.y, v3->xyz.z)
DCF(objsnd,"Persistent sound stuff")
float vm_vec_normalized_dir(vec3d *dest, const vec3d *end, const vec3d *start)
bool dc_optional_string_either(const char *str1, const char *str2)
Searches for an optional string and it's alias.
vec3d * vm_vec_unrotate(vec3d *dest, const vec3d *src, const matrix *m)
float turret_gun_rotation_snd_mult
object Objects[MAX_OBJECTS]
int snd_get_3d_vol_and_pan(game_snd *gs, vec3d *pos, float *vol, float *pan, float radius, float range_factor)
#define FLYBY_MIN_RELATIVE_SPEED
int max
distance at which sound is inaudible
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
int obj_snd_get_freq(int source_freq, object *source, object *observor, vec3d *source_pos)
int obj_snd_stop_lowest_vol(float new_vol)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
float gun_rotation_rate_pct
int main(int argc, char *argv[])
#define FLYBY_MIN_REPEAT_TIME
#define DCF_BOOL(function_name, bool_variable)
float vm_vec_dist_quick(const vec3d *v0, const vec3d *v1)
void obj_snd_delete_all()
An overhauled/updated debug console to allow monitoring, testing, and general debugging of new featur...
void snd_set_volume(int sig, float volume)
SCP_vector< ship_info > Ship_info
#define timestamp_elapsed(stamp)
SCP_vector< species_info > Species_info
#define list_remove(head, elem)
#define SND_PRIORITY_TRIPLE_INSTANCE
float vm_vec_dot(const vec3d *v0, const vec3d *v1)
GLsizei GLsizei GLchar * source
bool dc_optional_string(const char *pstr)
Searches for an optional string.
void dc_printf(const char *format,...)
Prints the given char string to the debug console.
#define OS_TURRET_GUN_ROTATION
#define OS_SUBSYS_ROTATION
#define FLYBY_MIN_NEXT_TIME
void obj_snd_level_init()
SCP_vector< int > objsnd_num
float default_volume
range: 0.0 -> 1.0
void obj_snd_stop(object *objp, int index)
int timer_get_milliseconds()
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
char ship_name[NAME_LENGTH]
#define OS_SUBSYS_DAMAGED
bool dc_maybe_stuff_string_white(char *str, size_t len)
Tries to stuff a whitespace delimited string to out_str from the command line, stopping at the end of...
void obj_snd_source_pos(vec3d *sound_pos, obj_snd *osp)