aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/midi/base.c2
-rw-r--r--Alc/midi/sf2load.c7
-rw-r--r--OpenAL32/Include/alMidi.h14
-rw-r--r--OpenAL32/alFontsound.c5
4 files changed, 19 insertions, 9 deletions
diff --git a/Alc/midi/base.c b/Alc/midi/base.c
index fbf02556..cab85c1a 100644
--- a/Alc/midi/base.c
+++ b/Alc/midi/base.c
@@ -16,6 +16,8 @@
#include "alu.h"
+extern inline ALboolean IsValidCtrlInput(int cc);
+
extern inline size_t Reader_read(Reader *self, void *buf, size_t len);
diff --git a/Alc/midi/sf2load.c b/Alc/midi/sf2load.c
index 3c81b256..933166ad 100644
--- a/Alc/midi/sf2load.c
+++ b/Alc/midi/sf2load.c
@@ -614,11 +614,8 @@ static ALenum getModSrcInput(int input)
if(input == 16) return AL_PITCHBEND_SENSITIVITY_SOFT;
if((input&0x80))
{
- input ^= 0x80;
- if(input > 0 && input < 120 && !(input == 6 || (input >= 32 && input <= 63) ||
- (input >= 98 && input <= 101)))
- return input;
- input ^= 0x80;
+ if(IsValidCtrlInput(input^0x80))
+ return input^0x80;
}
ERR("Unhandled modulator source input: 0x%02x\n", input);
return AL_INVALID;
diff --git a/OpenAL32/Include/alMidi.h b/OpenAL32/Include/alMidi.h
index 76567db0..948fc319 100644
--- a/OpenAL32/Include/alMidi.h
+++ b/OpenAL32/Include/alMidi.h
@@ -157,6 +157,20 @@ inline struct ALsoundfont *RemoveSfont(ALCdevice *device, ALuint id)
void ReleaseALSoundfonts(ALCdevice *device);
+
+inline ALboolean IsValidCtrlInput(int cc)
+{
+ /* These correspond to MIDI functions, not real controller values. */
+ if(cc == 0 || cc == 6 || cc == 32 || cc == 38 || (cc >= 98 && cc <= 101) || cc >= 120)
+ return AL_FALSE;
+ /* These are the LSB components of CC0...CC31, which are automatically used when
+ * reading the MSB controller value. */
+ if(cc >= 32 && cc <= 63)
+ return AL_FALSE;
+ /* All the rest are okay! */
+ return AL_TRUE;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/OpenAL32/alFontsound.c b/OpenAL32/alFontsound.c
index 1e2c303d..64c2a227 100644
--- a/OpenAL32/alFontsound.c
+++ b/OpenAL32/alFontsound.c
@@ -871,10 +871,7 @@ void ALfontsound_setModStagei(ALfontsound *self, ALCcontext *context, ALsizei st
value == AL_NOTEON_KEY_SOFT || value == AL_KEYPRESSURE_SOFT ||
value == AL_CHANNELPRESSURE_SOFT || value == AL_PITCHBEND_SOFT ||
value == AL_PITCHBEND_SENSITIVITY_SOFT ||
- (value > 0 && value < 120 && !(value == 6 || (value >= 32 && value <= 63) ||
- (value >= 98 && value <= 101))
- )
- ))
+ IsValidCtrlInput(value)))
SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
ALfontsound_getModStage(self, stage)->Source[srcidx].Input = value;
break;