From d227bc54bb7b1683e6de3f93c7059e2c90b6ff94 Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 27 Dec 2025 17:10:43 -0600 Subject: [PATCH 1/2] AD1816: Don't reset playback_pos when sample count is < 0, fixes playback glitches on Win3.1 drivers --- src/sound/snd_ad1816.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sound/snd_ad1816.c b/src/sound/snd_ad1816.c index 2ba79fc4c..c989b9fad 100644 --- a/src/sound/snd_ad1816.c +++ b/src/sound/snd_ad1816.c @@ -337,7 +337,6 @@ ad1816_poll(void *priv) if (ad1816->count < 0) { ad1816->count = ad1816->iregs[8]; ad1816->regs[1] |= 0x80; - ad1816->playback_pos = 0; if (ad1816->iregs[1] & 0x8000) { ad1816_log(ad1816->log, "AD1816 Playback interrupt fired\n"); picint(1 << ad1816->cur_irq); From b65217a3cb85c7fe3211266a0364d82635810dde Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sat, 27 Dec 2025 17:17:30 -0600 Subject: [PATCH 2/2] AD1816: Right shift master and wave volume values by 1, makes wave output audible on Win3.1 at default volume --- src/sound/snd_ad1816.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sound/snd_ad1816.c b/src/sound/snd_ad1816.c index c989b9fad..4e929794d 100644 --- a/src/sound/snd_ad1816.c +++ b/src/sound/snd_ad1816.c @@ -129,12 +129,12 @@ ad1816_update_mastervol(void *priv) if (ad1816->iregs[14] & 0x8000) ad1816->master_l = 0; else - ad1816->master_l = ad1816_vols_5bits[(ad1816->iregs[14] >> 8) & 0x1f] / 65536.0; + ad1816->master_l = ad1816_vols_5bits[((ad1816->iregs[14] >> 8) & 0x1f) >> 1] / 65536.0; if (ad1816->iregs[14] & 0x0080) ad1816->master_r = 0; else - ad1816->master_r = ad1816_vols_5bits[(ad1816->iregs[14]) & 0x1f] / 65536.0; + ad1816->master_r = ad1816_vols_5bits[((ad1816->iregs[14]) & 0x1f) >> 1] / 65536.0; } void @@ -327,12 +327,12 @@ ad1816_poll(void *priv) if (ad1816->iregs[4] & 0x8000) ad1816->out_l = 0; else - ad1816->out_l = (int16_t) ((ad1816->out_l * ad1816_vols_6bits[(ad1816->iregs[4] >> 8) & 0x3f]) >> 16); + ad1816->out_l = (int16_t) ((ad1816->out_l * ad1816_vols_6bits[((ad1816->iregs[4] >> 8) & 0x3f) >> 1]) >> 16); if (ad1816->iregs[4] & 0x0080) ad1816->out_r = 0; else - ad1816->out_r = (int16_t) ((ad1816->out_r * ad1816_vols_6bits[ad1816->iregs[4] & 0x3f]) >> 16); + ad1816->out_r = (int16_t) ((ad1816->out_r * ad1816_vols_6bits[(ad1816->iregs[4] & 0x3f) >> 1]) >> 16); if (ad1816->count < 0) { ad1816->count = ad1816->iregs[8];