aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/ALc.c2
-rw-r--r--Alc/ALu.c14
-rw-r--r--Alc/effects/dedicated.c18
-rw-r--r--OpenAL32/Include/alMain.h17
4 files changed, 30 insertions, 21 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 6a0a1ed0..04c3f398 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1535,6 +1535,8 @@ void SetDefaultChannelOrder(ALCdevice *device)
}
}
+extern inline ALint GetChannelIdxByName(const ALCdevice *device, enum Channel chan);
+
/* alcSetError
*
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 564ab133..49ebd0c2 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -409,15 +409,8 @@ ALvoid CalcNonAttnSourceParams(ALvoice *voice, const ALsource *ALSource, const A
for(j = 0;j < MaxChannels;j++)
gains[j].Target = 0.0f;
- for(i = 0;i < (ALint)Device->NumSpeakers;i++)
- {
- enum Channel chan = Device->Speaker[i].ChanName;
- if(chan == chans[c].channel)
- {
- gains[chan].Target = DryGain;
- break;
- }
- }
+ if(GetChannelIdxByName(Device, chans[c].channel) != -1)
+ gains[chans[c].channel].Target = DryGain;
}
UpdateDryStepping(&voice->Direct, num_channels);
@@ -467,7 +460,8 @@ ALvoid CalcNonAttnSourceParams(ALvoice *voice, const ALsource *ALSource, const A
{
for(i = 0;i < MaxChannels;i++)
Target[i] = 0.0f;
- Target[chans[c].channel] = DryGain;
+ if(GetChannelIdxByName(Device, chans[c].channel) != -1)
+ Target[chans[c].channel] = DryGain;
ok = true;
}
else for(i = 0;i < (ALint)Device->NumSpeakers;i++)
diff --git a/Alc/effects/dedicated.c b/Alc/effects/dedicated.c
index ea028046..e3014967 100644
--- a/Alc/effects/dedicated.c
+++ b/Alc/effects/dedicated.c
@@ -55,21 +55,17 @@ static ALvoid ALdedicatedState_update(ALdedicatedState *state, ALCdevice *device
Gain = Slot->Gain * Slot->EffectProps.Dedicated.Gain;
if(Slot->EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT)
- state->gains[LFE] = Gain;
+ {
+ if(GetChannelIdxByName(device, LFE) != -1)
+ state->gains[LFE] = Gain;
+ }
else if(Slot->EffectType == AL_EFFECT_DEDICATED_DIALOGUE)
{
- ALboolean done = AL_FALSE;
/* Dialog goes to the front-center speaker if it exists, otherwise it
* plays from the front-center location. */
- for(i = 0;i < device->NumSpeakers;i++)
- {
- if(device->Speaker[i].ChanName == FrontCenter)
- {
- state->gains[FrontCenter] = Gain;
- done = AL_TRUE;
- }
- }
- if(!done)
+ if(GetChannelIdxByName(device, FrontCenter) != -1)
+ state->gains[FrontCenter] = Gain;
+ else
{
static const ALfloat front_dir[3] = { 0.0f, 0.0f, -1.0f };
ComputeDirectionalGains(device, front_dir, Gain, state->gains);
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 2c7784c8..8cbac90e 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -828,6 +828,23 @@ void SetDefaultWFXChannelOrder(ALCdevice *device);
const ALCchar *DevFmtTypeString(enum DevFmtType type) DECL_CONST;
const ALCchar *DevFmtChannelsString(enum DevFmtChannels chans) DECL_CONST;
+/**
+ * GetChannelIdxByName
+ *
+ * Returns the device's channel index given a channel name (e.g. FrontCenter),
+ * or -1 if it doesn't exist.
+ */
+inline ALint GetChannelIdxByName(const ALCdevice *device, enum Channel chan)
+{
+ ALint i = 0;
+ for(i = 0;i < MaxChannels;i++)
+ {
+ if(device->ChannelName[i] == chan)
+ return i;
+ }
+ return -1;
+}
+
extern FILE *LogFile;