From a92c29bbdb27aee2d7989e5ddf115afc9f5c7698 Mon Sep 17 00:00:00 2001 From: Ian Karlsson Date: Wed, 23 Feb 2022 23:51:34 +0100 Subject: [PATCH] qsound clipping fix from MAME --- src/engine/platform/sound/qsound.c | 14 ++++++++------ src/engine/platform/sound/qsound.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/engine/platform/sound/qsound.c b/src/engine/platform/sound/qsound.c index 838ece1aa..b52475b36 100644 --- a/src/engine/platform/sound/qsound.c +++ b/src/engine/platform/sound/qsound.c @@ -162,7 +162,7 @@ void qsound_reset(struct qsound_chip *chip) chip->state_counter = 0; } -uint8_t qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int samples) +void qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int samples) { // Clear the buffers memset(outputs[0], 0, samples * sizeof(*outputs[0])); @@ -174,10 +174,9 @@ uint8_t qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int sa outputs[0][i] = chip->out[0]; outputs[1][i] = chip->out[1]; } - return 0; } -uint8_t qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data) +void qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data) { switch (offset) { @@ -193,7 +192,6 @@ uint8_t qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data) default: break; } - return 0; } uint8_t qsound_r(struct qsound_chip *chip) @@ -614,10 +612,14 @@ static void state_normal_update(struct qsound_chip *chip) pan_index = 97; // Apply different volume tables on the dry and wet inputs. - dry -= (chip->voice_output[v] * chip->pan_tables[ch][PANTBL_DRY][pan_index])<<2; - wet -= (chip->voice_output[v] * chip->pan_tables[ch][PANTBL_WET][pan_index])<<2; + dry -= (chip->voice_output[v] * chip->pan_tables[ch][PANTBL_DRY][pan_index]); + wet -= (chip->voice_output[v] * chip->pan_tables[ch][PANTBL_WET][pan_index]); } + // Saturate accumulated voices + dry = CLAMP(dry, -0x1fffffff, 0x1fffffff) << 2; + wet = CLAMP(wet, -0x1fffffff, 0x1fffffff) << 2; + // Apply FIR filter on 'wet' input wet = fir(&chip->filter[ch], wet >> 16); diff --git a/src/engine/platform/sound/qsound.h b/src/engine/platform/sound/qsound.h index 7c04850ae..ed05dd65a 100644 --- a/src/engine/platform/sound/qsound.h +++ b/src/engine/platform/sound/qsound.h @@ -109,8 +109,8 @@ long qsound_start(struct qsound_chip *chip, int clock); void qsound_reset(struct qsound_chip *chip); void qsound_update(struct qsound_chip *chip); -uint8_t qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int samples); -uint8_t qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data); +void qsound_stream_update(struct qsound_chip *chip, int16_t **outputs, int samples); +void qsound_w(struct qsound_chip *chip, uint8_t offset, uint8_t data); uint8_t qsound_r(struct qsound_chip *chip); void qsound_write_data(struct qsound_chip *chip, uint8_t address, uint16_t data); uint16_t qsound_read_data(struct qsound_chip *chip, uint8_t address);