Files
Goober5000 f4669db41c constify some turret code
Apply `const` to a whole bunch of functions.  Also change a bunch of ints to bools.
2023-12-30 00:00:31 -05:00

124 lines
3.0 KiB
C++

/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#include "cmdline/cmdline.h"
#include "globalincs/pstypes.h"
#include "object/object.h"
#include "sound/channel.h"
#include "sound/ds.h"
#include "sound/ds3d.h"
#include "sound/openal.h"
#include "sound/sound.h"
// ---------------------------------------------------------------------------------------
// ds3d_update_buffer()
//
// parameters: channel => identifies the 3D sound to update
// min => the distance at which sound doesn't get any louder
// max => the distance at which sound doesn't attenuate any further
// pos => world position of sound
// vel => velocity of the objects producing the sound
//
// returns: 0 => success
// -1 => failure
//
//
int ds3d_update_buffer(int channel_id, float min, float max, const vec3d *pos, const vec3d *vel)
{
if (Cmdline_no_3d_sound) {
nprintf(("Sound", "Aborting ds3d_update_buffer due to Cmdline_no_3d_sound...\n"));
return -1;
}
if (channel_id < 0) {
return 0;
}
ALuint source_id = Channels[channel_id].source_id;
ALfloat rolloff = 1.0f;
if (pos) {
OpenAL_ErrorPrint( alSource3f(source_id, AL_POSITION, pos->xyz.x, pos->xyz.y, -pos->xyz.z) );
}
if (vel) {
OpenAL_ErrorPrint( alSource3f(source_id, AL_VELOCITY, vel->xyz.x, vel->xyz.y, vel->xyz.z) );
//OpenAL_ErrorPrint( alDopplerFactor(1.0f) );
} else {
OpenAL_ErrorPrint( alSource3f(source_id, AL_VELOCITY, 0.0f, 0.0f, 0.0f) );
OpenAL_ErrorPrint( alDopplerFactor(0.0f) );
}
if (max <= min) {
rolloff = 0.0f;
} else {
#define MIN_GAIN 0.05f
rolloff = (min / (min + (max - min))) / MIN_GAIN;
if (rolloff < 0.0f) {
rolloff = 0.0f;
}
}
OpenAL_ErrorPrint( alSourcef(source_id, AL_ROLLOFF_FACTOR, rolloff) );
OpenAL_ErrorPrint( alSourcef(source_id, AL_REFERENCE_DISTANCE, min) );
OpenAL_ErrorPrint( alSourcef(source_id, AL_MAX_DISTANCE, max) );
return 0;
}
// ---------------------------------------------------------------------------------------
// ds3d_update_listener()
//
// returns: 0 => success
// -1 => failure
//
int ds3d_update_listener(const vec3d *pos, const vec3d *vel, const matrix *orient)
{
if (!ds_initialized) {
return -1;
}
if (Cmdline_no_3d_sound) {
nprintf(("Sound", "Aborting ds3d_update_listener due to Cmdline_no_3d_sound...\n"));
return -1;
}
if (pos) {
OpenAL_ErrorPrint( alListener3f(AL_POSITION, pos->xyz.x, pos->xyz.y, -pos->xyz.z) );
}
if (vel) {
OpenAL_ErrorPrint( alListener3f(AL_VELOCITY, vel->xyz.x, vel->xyz.y, vel->xyz.z) );
}
if (orient) {
ALfloat alOrient[6];
alOrient[0] = orient->vec.fvec.xyz.x;
alOrient[1] = orient->vec.fvec.xyz.y;
alOrient[2] = -orient->vec.fvec.xyz.z;
alOrient[3] = orient->vec.uvec.xyz.x;
alOrient[4] = orient->vec.uvec.xyz.y;
alOrient[5] = -orient->vec.uvec.xyz.z;
OpenAL_ErrorPrint( alListenerfv(AL_ORIENTATION, alOrient) );
}
return 0;
}