Store the listener directly in the context
This commit is contained in:
parent
e79d9bdd1a
commit
38d6df9c1d
66
Alc/alc.cpp
66
Alc/alc.cpp
@ -1623,7 +1623,7 @@ void ALCcontext_ProcessUpdates(ALCcontext *context)
|
||||
|
||||
if(!ATOMIC_EXCHANGE(&context->PropsClean, AL_TRUE, almemory_order_acq_rel))
|
||||
UpdateContextProps(context);
|
||||
if(!ATOMIC_EXCHANGE(&context->Listener->PropsClean, AL_TRUE, almemory_order_acq_rel))
|
||||
if(!ATOMIC_EXCHANGE(&context->Listener.PropsClean, AL_TRUE, almemory_order_acq_rel))
|
||||
UpdateListenerProps(context);
|
||||
UpdateAllEffectSlotProps(context);
|
||||
UpdateAllSourceProps(context);
|
||||
@ -2368,7 +2368,7 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
|
||||
|
||||
ATOMIC_STORE(&context->PropsClean, AL_TRUE, almemory_order_release);
|
||||
UpdateContextProps(context);
|
||||
ATOMIC_STORE(&context->Listener->PropsClean, AL_TRUE, almemory_order_release);
|
||||
ATOMIC_STORE(&context->Listener.PropsClean, AL_TRUE, almemory_order_release);
|
||||
UpdateListenerProps(context);
|
||||
UpdateAllSourceProps(context);
|
||||
almtx_unlock(&context->PropLock);
|
||||
@ -2585,26 +2585,26 @@ static ALCboolean VerifyDevice(ALCdevice **device)
|
||||
*/
|
||||
static ALvoid InitContext(ALCcontext *Context)
|
||||
{
|
||||
ALlistener *listener = Context->Listener;
|
||||
ALlistener &listener = Context->Listener;
|
||||
struct ALeffectslotArray *auxslots;
|
||||
|
||||
//Initialise listener
|
||||
listener->Gain = 1.0f;
|
||||
listener->Position[0] = 0.0f;
|
||||
listener->Position[1] = 0.0f;
|
||||
listener->Position[2] = 0.0f;
|
||||
listener->Velocity[0] = 0.0f;
|
||||
listener->Velocity[1] = 0.0f;
|
||||
listener->Velocity[2] = 0.0f;
|
||||
listener->Forward[0] = 0.0f;
|
||||
listener->Forward[1] = 0.0f;
|
||||
listener->Forward[2] = -1.0f;
|
||||
listener->Up[0] = 0.0f;
|
||||
listener->Up[1] = 1.0f;
|
||||
listener->Up[2] = 0.0f;
|
||||
ATOMIC_INIT(&listener->PropsClean, AL_TRUE);
|
||||
listener.Gain = 1.0f;
|
||||
listener.Position[0] = 0.0f;
|
||||
listener.Position[1] = 0.0f;
|
||||
listener.Position[2] = 0.0f;
|
||||
listener.Velocity[0] = 0.0f;
|
||||
listener.Velocity[1] = 0.0f;
|
||||
listener.Velocity[2] = 0.0f;
|
||||
listener.Forward[0] = 0.0f;
|
||||
listener.Forward[1] = 0.0f;
|
||||
listener.Forward[2] = -1.0f;
|
||||
listener.Up[0] = 0.0f;
|
||||
listener.Up[1] = 1.0f;
|
||||
listener.Up[2] = 0.0f;
|
||||
ATOMIC_INIT(&listener.PropsClean, AL_TRUE);
|
||||
|
||||
ATOMIC_INIT(&listener->Update, static_cast<ALlistenerProps*>(nullptr));
|
||||
ATOMIC_INIT(&listener.Update, static_cast<ALlistenerProps*>(nullptr));
|
||||
|
||||
//Validate Context
|
||||
InitRef(&Context->UpdateCount, 0);
|
||||
@ -2658,16 +2658,16 @@ static ALvoid InitContext(ALCcontext *Context)
|
||||
Context->ExtensionList = alExtList;
|
||||
|
||||
|
||||
listener->Params.Matrix = aluMatrixf::Identity;
|
||||
aluVectorSet(&listener->Params.Velocity, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||
listener->Params.Gain = listener->Gain;
|
||||
listener->Params.MetersPerUnit = Context->MetersPerUnit;
|
||||
listener->Params.DopplerFactor = Context->DopplerFactor;
|
||||
listener->Params.SpeedOfSound = Context->SpeedOfSound * Context->DopplerVelocity;
|
||||
listener->Params.ReverbSpeedOfSound = listener->Params.SpeedOfSound *
|
||||
listener->Params.MetersPerUnit;
|
||||
listener->Params.SourceDistanceModel = Context->SourceDistanceModel;
|
||||
listener->Params.DistanceModel = Context->DistanceModel;
|
||||
listener.Params.Matrix = aluMatrixf::Identity;
|
||||
aluVectorSet(&listener.Params.Velocity, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||
listener.Params.Gain = listener.Gain;
|
||||
listener.Params.MetersPerUnit = Context->MetersPerUnit;
|
||||
listener.Params.DopplerFactor = Context->DopplerFactor;
|
||||
listener.Params.SpeedOfSound = Context->SpeedOfSound * Context->DopplerVelocity;
|
||||
listener.Params.ReverbSpeedOfSound = listener.Params.SpeedOfSound *
|
||||
listener.Params.MetersPerUnit;
|
||||
listener.Params.SourceDistanceModel = Context->SourceDistanceModel;
|
||||
listener.Params.DistanceModel = Context->DistanceModel;
|
||||
|
||||
|
||||
Context->AsyncEvents = ll_ringbuffer_create(63, sizeof(AsyncEvent), false);
|
||||
@ -2683,7 +2683,7 @@ static ALvoid InitContext(ALCcontext *Context)
|
||||
*/
|
||||
static void FreeContext(ALCcontext *context)
|
||||
{
|
||||
ALlistener *listener = context->Listener;
|
||||
ALlistener &listener = context->Listener;
|
||||
struct ALeffectslotProps *eprops;
|
||||
struct ALlistenerProps *lprops;
|
||||
struct ALcontextProps *cprops;
|
||||
@ -2764,7 +2764,7 @@ static void FreeContext(ALCcontext *context)
|
||||
context->VoiceCount = 0;
|
||||
context->MaxVoices = 0;
|
||||
|
||||
if((lprops=ATOMIC_LOAD(&listener->Update, almemory_order_acquire)) != nullptr)
|
||||
if((lprops=ATOMIC_LOAD(&listener.Update, almemory_order_acquire)) != nullptr)
|
||||
{
|
||||
TRACE("Freed unapplied listener update %p\n", lprops);
|
||||
al_free(lprops);
|
||||
@ -3806,7 +3806,6 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
|
||||
}
|
||||
|
||||
InitRef(&ALContext->ref, 1);
|
||||
ALContext->Listener = (ALlistener*)ALContext->_listener_mem;
|
||||
ALContext->DefaultSlot = nullptr;
|
||||
|
||||
ALContext->Voices = nullptr;
|
||||
@ -3835,9 +3834,10 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin
|
||||
}
|
||||
AllocateVoices(ALContext, 256, device->NumAuxSends);
|
||||
|
||||
if(DefaultEffect.type != AL_EFFECT_NULL && device->Type == Playback)
|
||||
// FIXME: Reenable after the default effect slot is handled again
|
||||
if(0 && DefaultEffect.type != AL_EFFECT_NULL && device->Type == Playback)
|
||||
{
|
||||
ALContext->DefaultSlot = (ALeffectslot*)(ALContext->_listener_mem + sizeof(ALlistener));
|
||||
ALContext->DefaultSlot = nullptr;
|
||||
if(InitEffectSlot(ALContext->DefaultSlot) == AL_NO_ERROR)
|
||||
aluInitEffectPanning(ALContext->DefaultSlot);
|
||||
else
|
||||
|
@ -10,8 +10,9 @@
|
||||
#include "vector.h"
|
||||
#include "threads.h"
|
||||
|
||||
#include "alListener.h"
|
||||
|
||||
|
||||
struct ALlistener;
|
||||
struct ALsource;
|
||||
struct ALeffectslot;
|
||||
struct ALcontextProps;
|
||||
@ -49,8 +50,6 @@ TYPEDEF_VECTOR(ALeffectslotPtr, vector_ALeffectslotPtr)
|
||||
struct ALCcontext_struct {
|
||||
RefCount ref;
|
||||
|
||||
ALlistener *Listener;
|
||||
|
||||
vector_SourceSubList SourceList;
|
||||
ALuint NumSources;
|
||||
almtx_t SourceLock;
|
||||
@ -113,8 +112,7 @@ struct ALCcontext_struct {
|
||||
|
||||
ATOMIC(ALCcontext*) next;
|
||||
|
||||
/* Memory space used by the listener (and possibly default effect slot) */
|
||||
alignas(16) ALCbyte _listener_mem[];
|
||||
ALlistener Listener;
|
||||
};
|
||||
|
||||
ALCcontext *GetContextRef(void);
|
||||
|
68
Alc/alu.cpp
68
Alc/alu.cpp
@ -312,23 +312,23 @@ void BsincPrepare(const ALuint increment, BsincState *state, const BSincTable *t
|
||||
|
||||
static bool CalcContextParams(ALCcontext *Context)
|
||||
{
|
||||
ALlistener *Listener = Context->Listener;
|
||||
ALlistener &Listener = Context->Listener;
|
||||
struct ALcontextProps *props;
|
||||
|
||||
props = static_cast<ALcontextProps*>(ATOMIC_EXCHANGE_PTR(&Context->Update,
|
||||
static_cast<ALcontextProps*>(nullptr), almemory_order_acq_rel));
|
||||
if(!props) return false;
|
||||
|
||||
Listener->Params.MetersPerUnit = props->MetersPerUnit;
|
||||
Listener.Params.MetersPerUnit = props->MetersPerUnit;
|
||||
|
||||
Listener->Params.DopplerFactor = props->DopplerFactor;
|
||||
Listener->Params.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity;
|
||||
Listener.Params.DopplerFactor = props->DopplerFactor;
|
||||
Listener.Params.SpeedOfSound = props->SpeedOfSound * props->DopplerVelocity;
|
||||
if(!OverrideReverbSpeedOfSound)
|
||||
Listener->Params.ReverbSpeedOfSound = Listener->Params.SpeedOfSound *
|
||||
Listener->Params.MetersPerUnit;
|
||||
Listener.Params.ReverbSpeedOfSound = Listener.Params.SpeedOfSound *
|
||||
Listener.Params.MetersPerUnit;
|
||||
|
||||
Listener->Params.SourceDistanceModel = props->SourceDistanceModel;
|
||||
Listener->Params.DistanceModel = props->DistanceModel;
|
||||
Listener.Params.SourceDistanceModel = props->SourceDistanceModel;
|
||||
Listener.Params.DistanceModel = props->DistanceModel;
|
||||
|
||||
ATOMIC_REPLACE_HEAD(struct ALcontextProps*, &Context->FreeContextProps, props);
|
||||
return true;
|
||||
@ -336,12 +336,12 @@ static bool CalcContextParams(ALCcontext *Context)
|
||||
|
||||
static bool CalcListenerParams(ALCcontext *Context)
|
||||
{
|
||||
ALlistener *Listener = Context->Listener;
|
||||
ALlistener &Listener = Context->Listener;
|
||||
ALfloat N[3], V[3], U[3], P[3];
|
||||
struct ALlistenerProps *props;
|
||||
aluVector vel;
|
||||
|
||||
props = static_cast<ALlistenerProps*>(ATOMIC_EXCHANGE_PTR(&Listener->Update,
|
||||
props = static_cast<ALlistenerProps*>(ATOMIC_EXCHANGE_PTR(&Listener.Update,
|
||||
static_cast<ALlistenerProps*>(nullptr), almemory_order_acq_rel));
|
||||
if(!props) return false;
|
||||
|
||||
@ -358,7 +358,7 @@ static bool CalcListenerParams(ALCcontext *Context)
|
||||
aluCrossproduct(N, V, U);
|
||||
aluNormalize(U);
|
||||
|
||||
aluMatrixfSet(&Listener->Params.Matrix,
|
||||
aluMatrixfSet(&Listener.Params.Matrix,
|
||||
U[0], V[0], -N[0], 0.0,
|
||||
U[1], V[1], -N[1], 0.0,
|
||||
U[2], V[2], -N[2], 0.0,
|
||||
@ -368,13 +368,13 @@ static bool CalcListenerParams(ALCcontext *Context)
|
||||
P[0] = props->Position[0];
|
||||
P[1] = props->Position[1];
|
||||
P[2] = props->Position[2];
|
||||
aluMatrixfFloat3(P, 1.0, &Listener->Params.Matrix);
|
||||
aluMatrixfSetRow(&Listener->Params.Matrix, 3, -P[0], -P[1], -P[2], 1.0f);
|
||||
aluMatrixfFloat3(P, 1.0, &Listener.Params.Matrix);
|
||||
aluMatrixfSetRow(&Listener.Params.Matrix, 3, -P[0], -P[1], -P[2], 1.0f);
|
||||
|
||||
aluVectorSet(&vel, props->Velocity[0], props->Velocity[1], props->Velocity[2], 0.0f);
|
||||
Listener->Params.Velocity = aluMatrixfVector(&Listener->Params.Matrix, &vel);
|
||||
Listener.Params.Velocity = aluMatrixfVector(&Listener.Params.Matrix, &vel);
|
||||
|
||||
Listener->Params.Gain = props->Gain * Context->GainBoost;
|
||||
Listener.Params.Gain = props->Gain * Context->GainBoost;
|
||||
|
||||
ATOMIC_REPLACE_HEAD(struct ALlistenerProps*, &Context->FreeListenerProps, props);
|
||||
return true;
|
||||
@ -501,7 +501,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALflo
|
||||
const ALfloat DryGainLF, const ALfloat *WetGain,
|
||||
const ALfloat *WetGainLF, const ALfloat *WetGainHF,
|
||||
ALeffectslot **SendSlots, const ALbuffer *Buffer,
|
||||
const struct ALvoiceProps *props, const ALlistener *Listener,
|
||||
const struct ALvoiceProps *props, const ALlistener &Listener,
|
||||
const ALCdevice *Device)
|
||||
{
|
||||
struct ChanMap StereoMap[2] = {
|
||||
@ -609,7 +609,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALflo
|
||||
|
||||
if(Device->AvgSpeakerDist > 0.0f)
|
||||
{
|
||||
ALfloat mdist = Distance * Listener->Params.MetersPerUnit;
|
||||
ALfloat mdist = Distance * Listener.Params.MetersPerUnit;
|
||||
ALfloat w0 = SPEEDOFSOUNDMETRESPERSEC /
|
||||
(mdist * (ALfloat)Device->Frequency);
|
||||
ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC /
|
||||
@ -680,7 +680,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALflo
|
||||
aluNormalize(V);
|
||||
if(!props->HeadRelative)
|
||||
{
|
||||
const aluMatrixf *lmatrix = &Listener->Params.Matrix;
|
||||
const aluMatrixf *lmatrix = &Listener.Params.Matrix;
|
||||
aluMatrixfFloat3(N, 0.0f, lmatrix);
|
||||
aluMatrixfFloat3(V, 0.0f, lmatrix);
|
||||
}
|
||||
@ -852,7 +852,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALflo
|
||||
/* Calculate NFC filter coefficient if needed. */
|
||||
if(Device->AvgSpeakerDist > 0.0f)
|
||||
{
|
||||
ALfloat mdist = Distance * Listener->Params.MetersPerUnit;
|
||||
ALfloat mdist = Distance * Listener.Params.MetersPerUnit;
|
||||
ALfloat w1 = SPEEDOFSOUNDMETRESPERSEC /
|
||||
(Device->AvgSpeakerDist * (ALfloat)Device->Frequency);
|
||||
w0 = SPEEDOFSOUNDMETRESPERSEC /
|
||||
@ -1022,7 +1022,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALflo
|
||||
static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext)
|
||||
{
|
||||
const ALCdevice *Device = ALContext->Device;
|
||||
const ALlistener *Listener = ALContext->Listener;
|
||||
const ALlistener &Listener = ALContext->Listener;
|
||||
ALfloat DryGain, DryGainHF, DryGainLF;
|
||||
ALfloat WetGain[MAX_SENDS];
|
||||
ALfloat WetGainHF[MAX_SENDS];
|
||||
@ -1065,14 +1065,14 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *p
|
||||
|
||||
/* Calculate gains */
|
||||
DryGain = clampf(props->Gain, props->MinGain, props->MaxGain);
|
||||
DryGain *= props->Direct.Gain * Listener->Params.Gain;
|
||||
DryGain *= props->Direct.Gain * Listener.Params.Gain;
|
||||
DryGain = minf(DryGain, GAIN_MIX_MAX);
|
||||
DryGainHF = props->Direct.GainHF;
|
||||
DryGainLF = props->Direct.GainLF;
|
||||
for(i = 0;i < Device->NumAuxSends;i++)
|
||||
{
|
||||
WetGain[i] = clampf(props->Gain, props->MinGain, props->MaxGain);
|
||||
WetGain[i] *= props->Send[i].Gain * Listener->Params.Gain;
|
||||
WetGain[i] *= props->Send[i].Gain * Listener.Params.Gain;
|
||||
WetGain[i] = minf(WetGain[i], GAIN_MIX_MAX);
|
||||
WetGainHF[i] = props->Send[i].GainHF;
|
||||
WetGainLF[i] = props->Send[i].GainLF;
|
||||
@ -1085,7 +1085,7 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *p
|
||||
static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *props, const ALbuffer *ALBuffer, const ALCcontext *ALContext)
|
||||
{
|
||||
const ALCdevice *Device = ALContext->Device;
|
||||
const ALlistener *Listener = ALContext->Listener;
|
||||
const ALlistener &Listener = ALContext->Listener;
|
||||
const ALsizei NumSends = Device->NumAuxSends;
|
||||
aluVector Position, Velocity, Direction, SourceToListener;
|
||||
ALfloat Distance, ClampedDist, DopplerFactor;
|
||||
@ -1127,7 +1127,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
* -60dB.
|
||||
*/
|
||||
DecayDistance[i] = SendSlots[i]->Params.DecayTime *
|
||||
Listener->Params.ReverbSpeedOfSound;
|
||||
Listener.Params.ReverbSpeedOfSound;
|
||||
DecayLFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayLFRatio;
|
||||
DecayHFDistance[i] = DecayDistance[i] * SendSlots[i]->Params.DecayHFRatio;
|
||||
if(SendSlots[i]->Params.DecayHFLimit)
|
||||
@ -1173,7 +1173,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
aluVectorSet(&Velocity, props->Velocity[0], props->Velocity[1], props->Velocity[2], 0.0f);
|
||||
if(props->HeadRelative == AL_FALSE)
|
||||
{
|
||||
const aluMatrixf *Matrix = &Listener->Params.Matrix;
|
||||
const aluMatrixf *Matrix = &Listener.Params.Matrix;
|
||||
/* Transform source vectors */
|
||||
Position = aluMatrixfVector(Matrix, &Position);
|
||||
Velocity = aluMatrixfVector(Matrix, &Velocity);
|
||||
@ -1181,7 +1181,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
}
|
||||
else
|
||||
{
|
||||
const aluVector *lvelocity = &Listener->Params.Velocity;
|
||||
const aluVector *lvelocity = &Listener.Params.Velocity;
|
||||
/* Offset the source velocity to be relative of the listener velocity */
|
||||
Velocity.v[0] += lvelocity->v[0];
|
||||
Velocity.v[1] += lvelocity->v[1];
|
||||
@ -1209,8 +1209,8 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
/* Calculate distance attenuation */
|
||||
ClampedDist = Distance;
|
||||
|
||||
switch(Listener->Params.SourceDistanceModel ?
|
||||
props->DistanceModel : Listener->Params.DistanceModel)
|
||||
switch(Listener.Params.SourceDistanceModel ?
|
||||
props->DistanceModel : Listener.Params.DistanceModel)
|
||||
{
|
||||
case DistanceModel::InverseClamped:
|
||||
ClampedDist = clampf(ClampedDist, props->RefDistance, props->MaxDistance);
|
||||
@ -1319,13 +1319,13 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
|
||||
/* Apply gain and frequency filters */
|
||||
DryGain = clampf(DryGain, props->MinGain, props->MaxGain);
|
||||
DryGain = minf(DryGain*props->Direct.Gain*Listener->Params.Gain, GAIN_MIX_MAX);
|
||||
DryGain = minf(DryGain*props->Direct.Gain*Listener.Params.Gain, GAIN_MIX_MAX);
|
||||
DryGainHF *= props->Direct.GainHF;
|
||||
DryGainLF *= props->Direct.GainLF;
|
||||
for(i = 0;i < NumSends;i++)
|
||||
{
|
||||
WetGain[i] = clampf(WetGain[i], props->MinGain, props->MaxGain);
|
||||
WetGain[i] = minf(WetGain[i]*props->Send[i].Gain*Listener->Params.Gain, GAIN_MIX_MAX);
|
||||
WetGain[i] = minf(WetGain[i]*props->Send[i].Gain*Listener.Params.Gain, GAIN_MIX_MAX);
|
||||
WetGainHF[i] *= props->Send[i].GainHF;
|
||||
WetGainLF[i] *= props->Send[i].GainLF;
|
||||
}
|
||||
@ -1334,7 +1334,7 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
if(ClampedDist > props->RefDistance && props->RolloffFactor > 0.0f)
|
||||
{
|
||||
ALfloat meters_base = (ClampedDist-props->RefDistance) * props->RolloffFactor *
|
||||
Listener->Params.MetersPerUnit;
|
||||
Listener.Params.MetersPerUnit;
|
||||
if(props->AirAbsorptionFactor > 0.0f)
|
||||
{
|
||||
ALfloat hfattn = powf(AIRABSORBGAINHF, meters_base * props->AirAbsorptionFactor);
|
||||
@ -1377,11 +1377,11 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALvoiceProps *prop
|
||||
Pitch = props->Pitch;
|
||||
|
||||
/* Calculate velocity-based doppler effect */
|
||||
DopplerFactor = props->DopplerFactor * Listener->Params.DopplerFactor;
|
||||
DopplerFactor = props->DopplerFactor * Listener.Params.DopplerFactor;
|
||||
if(DopplerFactor > 0.0f)
|
||||
{
|
||||
const aluVector *lvelocity = &Listener->Params.Velocity;
|
||||
const ALfloat SpeedOfSound = Listener->Params.SpeedOfSound;
|
||||
const aluVector *lvelocity = &Listener.Params.Velocity;
|
||||
const ALfloat SpeedOfSound = Listener.Params.SpeedOfSound;
|
||||
ALfloat vss, vls;
|
||||
|
||||
vss = aluDotproduct(&Velocity, &SourceToListener) * DopplerFactor;
|
||||
|
@ -951,7 +951,7 @@ static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *Reflection
|
||||
static void ReverbState_update(ReverbState *State, const ALCcontext *Context, const ALeffectslot *Slot, const ALeffectProps *props)
|
||||
{
|
||||
const ALCdevice *Device = Context->Device;
|
||||
const ALlistener *Listener = Context->Listener;
|
||||
const ALlistener &Listener = Context->Listener;
|
||||
ALuint frequency = Device->Frequency;
|
||||
ALfloat lf0norm, hf0norm, hfRatio;
|
||||
ALfloat lfDecayTime, hfDecayTime;
|
||||
@ -994,7 +994,7 @@ static void ReverbState_update(ReverbState *State, const ALCcontext *Context, co
|
||||
hfRatio = props->Reverb.DecayHFRatio;
|
||||
if(props->Reverb.DecayHFLimit && props->Reverb.AirAbsorptionGainHF < 1.0f)
|
||||
hfRatio = CalcLimitedHfRatio(hfRatio, props->Reverb.AirAbsorptionGainHF,
|
||||
props->Reverb.DecayTime, Listener->Params.ReverbSpeedOfSound
|
||||
props->Reverb.DecayTime, Listener.Params.ReverbSpeedOfSound
|
||||
);
|
||||
|
||||
/* Calculate the LF/HF decay times. */
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include "atomic.h"
|
||||
#include "vecmat.h"
|
||||
|
||||
enum class DistanceModel;
|
||||
|
||||
|
||||
struct ALlistenerProps {
|
||||
ALfloat Position[3];
|
||||
|
@ -43,7 +43,7 @@ AL_API ALvoid AL_APIENTRY alListenerf(ALenum param, ALfloat value)
|
||||
context = GetContextRef();
|
||||
if(!context) return;
|
||||
|
||||
listener = context->Listener;
|
||||
listener = &context->Listener;
|
||||
almtx_lock(&context->PropLock);
|
||||
switch(param)
|
||||
{
|
||||
@ -82,7 +82,7 @@ AL_API ALvoid AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat val
|
||||
context = GetContextRef();
|
||||
if(!context) return;
|
||||
|
||||
listener = context->Listener;
|
||||
listener = &context->Listener;
|
||||
almtx_lock(&context->PropLock);
|
||||
switch(param)
|
||||
{
|
||||
@ -138,7 +138,7 @@ AL_API ALvoid AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values)
|
||||
context = GetContextRef();
|
||||
if(!context) return;
|
||||
|
||||
listener = context->Listener;
|
||||
listener = &context->Listener;
|
||||
almtx_lock(&context->PropLock);
|
||||
if(!values) SETERR_GOTO(context, AL_INVALID_VALUE, done, "NULL pointer");
|
||||
switch(param)
|
||||
@ -269,7 +269,7 @@ AL_API ALvoid AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value)
|
||||
else switch(param)
|
||||
{
|
||||
case AL_GAIN:
|
||||
*value = context->Listener->Gain;
|
||||
*value = context->Listener.Gain;
|
||||
break;
|
||||
|
||||
case AL_METERS_PER_UNIT:
|
||||
@ -298,15 +298,15 @@ AL_API ALvoid AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat
|
||||
else switch(param)
|
||||
{
|
||||
case AL_POSITION:
|
||||
*value1 = context->Listener->Position[0];
|
||||
*value2 = context->Listener->Position[1];
|
||||
*value3 = context->Listener->Position[2];
|
||||
*value1 = context->Listener.Position[0];
|
||||
*value2 = context->Listener.Position[1];
|
||||
*value3 = context->Listener.Position[2];
|
||||
break;
|
||||
|
||||
case AL_VELOCITY:
|
||||
*value1 = context->Listener->Velocity[0];
|
||||
*value2 = context->Listener->Velocity[1];
|
||||
*value3 = context->Listener->Velocity[2];
|
||||
*value1 = context->Listener.Velocity[0];
|
||||
*value2 = context->Listener.Velocity[1];
|
||||
*value3 = context->Listener.Velocity[2];
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -345,12 +345,12 @@ AL_API ALvoid AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values)
|
||||
{
|
||||
case AL_ORIENTATION:
|
||||
// AT then UP
|
||||
values[0] = context->Listener->Forward[0];
|
||||
values[1] = context->Listener->Forward[1];
|
||||
values[2] = context->Listener->Forward[2];
|
||||
values[3] = context->Listener->Up[0];
|
||||
values[4] = context->Listener->Up[1];
|
||||
values[5] = context->Listener->Up[2];
|
||||
values[0] = context->Listener.Forward[0];
|
||||
values[1] = context->Listener.Forward[1];
|
||||
values[2] = context->Listener.Forward[2];
|
||||
values[3] = context->Listener.Up[0];
|
||||
values[4] = context->Listener.Up[1];
|
||||
values[5] = context->Listener.Up[2];
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -396,15 +396,15 @@ AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *valu
|
||||
else switch(param)
|
||||
{
|
||||
case AL_POSITION:
|
||||
*value1 = (ALint)context->Listener->Position[0];
|
||||
*value2 = (ALint)context->Listener->Position[1];
|
||||
*value3 = (ALint)context->Listener->Position[2];
|
||||
*value1 = (ALint)context->Listener.Position[0];
|
||||
*value2 = (ALint)context->Listener.Position[1];
|
||||
*value3 = (ALint)context->Listener.Position[2];
|
||||
break;
|
||||
|
||||
case AL_VELOCITY:
|
||||
*value1 = (ALint)context->Listener->Velocity[0];
|
||||
*value2 = (ALint)context->Listener->Velocity[1];
|
||||
*value3 = (ALint)context->Listener->Velocity[2];
|
||||
*value1 = (ALint)context->Listener.Velocity[0];
|
||||
*value2 = (ALint)context->Listener.Velocity[1];
|
||||
*value3 = (ALint)context->Listener.Velocity[2];
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -438,12 +438,12 @@ AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint* values)
|
||||
{
|
||||
case AL_ORIENTATION:
|
||||
// AT then UP
|
||||
values[0] = (ALint)context->Listener->Forward[0];
|
||||
values[1] = (ALint)context->Listener->Forward[1];
|
||||
values[2] = (ALint)context->Listener->Forward[2];
|
||||
values[3] = (ALint)context->Listener->Up[0];
|
||||
values[4] = (ALint)context->Listener->Up[1];
|
||||
values[5] = (ALint)context->Listener->Up[2];
|
||||
values[0] = (ALint)context->Listener.Forward[0];
|
||||
values[1] = (ALint)context->Listener.Forward[1];
|
||||
values[2] = (ALint)context->Listener.Forward[2];
|
||||
values[3] = (ALint)context->Listener.Up[0];
|
||||
values[4] = (ALint)context->Listener.Up[1];
|
||||
values[5] = (ALint)context->Listener.Up[2];
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -457,7 +457,7 @@ AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint* values)
|
||||
|
||||
void UpdateListenerProps(ALCcontext *context)
|
||||
{
|
||||
ALlistener *listener = context->Listener;
|
||||
ALlistener *listener{&context->Listener};
|
||||
struct ALlistenerProps *props;
|
||||
|
||||
/* Get an unused proprty container, or allocate a new one as needed. */
|
||||
|
Loading…
Reference in New Issue
Block a user