diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-02-17 10:57:23 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-02-17 10:57:23 +0300 |
commit | 3e66410de0bf006c4b90eeb259d59da7ff8e8355 (patch) | |
tree | 9159d3ec398485aef351a0b101e4811c341f05c0 /src/nukedopl3.c | |
parent | 57911fca4a7179677174cea7449af9687232e473 (diff) | |
download | libADLMIDI-3e66410de0bf006c4b90eeb259d59da7ff8e8355.tar.gz libADLMIDI-3e66410de0bf006c4b90eeb259d59da7ff8e8355.tar.bz2 libADLMIDI-3e66410de0bf006c4b90eeb259d59da7ff8e8355.zip |
Better audio clipping while mixing
Diffstat (limited to 'src/nukedopl3.c')
-rw-r--r-- | src/nukedopl3.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/nukedopl3.c b/src/nukedopl3.c index 3557df9..21877ab 100644 --- a/src/nukedopl3.c +++ b/src/nukedopl3.c @@ -1455,16 +1455,24 @@ void OPL3_GenerateStream(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples) } } +#define OPL3_MIN(A, B) (((A) > (B)) ? (B) : (A)) +#define OPL3_MAX(A, B) (((A) < (B)) ? (B) : (A)) +#define OPL3_CLAMP(V, MIN, MAX) OPL3_MAX(OPL3_MIN(V, MAX), MIN) + void OPL3_GenerateStreamMix(opl3_chip *chip, Bit16s *sndptr, Bit32u numsamples) { Bit32u i; Bit16s sample[2]; + Bit32s mix[2]; for(i = 0; i < numsamples; i++) { OPL3_GenerateResampledREAL(chip, sample); - sndptr[0] += sample[0]; - sndptr[1] += sample[1]; + mix[0] = sndptr[0] + sample[0]; + mix[1] = sndptr[1] + sample[1]; + sndptr[0] = OPL3_CLAMP(mix[0], INT16_MIN, INT16_MAX); + sndptr[1] = OPL3_CLAMP(mix[1], INT16_MIN, INT16_MAX); sndptr += 2; } } + |