From a1f09d7b03a0e1c49f7c91b521fce3cccd6fff6e Mon Sep 17 00:00:00 2001
From: Miro Kropacek <[EMAIL REDACTED]>
Date: Sun, 23 Aug 2026 23:42:57 +1000
Subject: [PATCH] atari:audio: compute SDL_MintAudio_itbuflen dynamically
That can lead to silencing from 2x to 16x less data than needed.
---
src/audio/mint/SDL_mintaudio.c | 10 ++++++++--
src/audio/mint/SDL_mintaudio.h | 2 +-
src/audio/mint/SDL_mintaudio_it.S | 8 +++++---
3 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/src/audio/mint/SDL_mintaudio.c b/src/audio/mint/SDL_mintaudio.c
index cb974ad8..8620c12e 100644
--- a/src/audio/mint/SDL_mintaudio.c
+++ b/src/audio/mint/SDL_mintaudio.c
@@ -95,8 +95,8 @@ int SDL_MintAudio_InitBuffers(SDL_AudioSpec *spec)
SDL_MintAudio_max_buf = MAX_DMA_BUF;
/* For filling silence when too many interrupts per update */
- SDL_MintAudio_itbuffer = MINTAUDIO_audiobuf[0];
- SDL_MintAudio_itbuflen = (dmabuflen >> 2)-1;
+ SDL_MintAudio_itbuffer = NULL;
+ SDL_MintAudio_itbuflen = 0;
SDL_MintAudio_itsilence = (spec->silence << 24)|(spec->silence << 16)|
(spec->silence << 8)|spec->silence;
@@ -114,6 +114,7 @@ void SDL_MintAudio_FreeBuffers(void)
MINTAUDIO_fastrambuf = NULL;
}
if (MINTAUDIO_audiobuf[0]) {
+ SDL_MintAudio_itbuflen = 0;
Mfree(MINTAUDIO_audiobuf[0]);
SDL_MintAudio_itbuffer = MINTAUDIO_audiobuf[0] = MINTAUDIO_audiobuf[1] = NULL;
}
@@ -137,6 +138,8 @@ void SDL_AtariMint_UpdateAudio(void)
return;
}
+ SDL_MintAudio_itbuflen = 0;
+
if (SDL_MintAudio_num_upd < (SDL_MintAudio_num_its<<2)) {
/* Too many interrupts per update, increase latency */
if (SDL_MintAudio_max_buf < MAX_DMA_BUF) {
@@ -160,6 +163,9 @@ void SDL_AtariMint_UpdateAudio(void)
/* And swap to it */
(*MINTAUDIO_swapbuf)(MINTAUDIO_audiobuf[SDL_MintAudio_numbuf], MINTAUDIO_audiosize);
+
+ SDL_MintAudio_itbuffer = MINTAUDIO_audiobuf[SDL_MintAudio_numbuf];
+ SDL_MintAudio_itbuflen = MINTAUDIO_audiosize >> 2;
}
/* The callback function, called by each driver whenever needed */
diff --git a/src/audio/mint/SDL_mintaudio.h b/src/audio/mint/SDL_mintaudio.h
index 4e5c0775..3dff628a 100644
--- a/src/audio/mint/SDL_mintaudio.h
+++ b/src/audio/mint/SDL_mintaudio.h
@@ -109,7 +109,7 @@ int SDL_MintAudio_SearchFrequency(_THIS, int desired_freq);
/* Variables */
extern volatile unsigned long SDL_MintAudio_num_its;
-extern volatile void *SDL_MintAudio_itbuffer;
+extern void *volatile SDL_MintAudio_itbuffer;
extern volatile unsigned long SDL_MintAudio_itbuflen;
extern volatile unsigned long SDL_MintAudio_itsilence;
diff --git a/src/audio/mint/SDL_mintaudio_it.S b/src/audio/mint/SDL_mintaudio_it.S
index 7462b951..3b5a4dc6 100644
--- a/src/audio/mint/SDL_mintaudio_it.S
+++ b/src/audio/mint/SDL_mintaudio_it.S
@@ -95,17 +95,19 @@ countinterrupt:
cmp.l #5,d0
bmi.s nosilence
- move.l SYM(SDL_MintAudio_itbuffer),d1
+ move.l SYM(SDL_MintAudio_itbuflen),d0
beq.s nosilence
- move.l d1,a0
+ subq.l #1,d0
- move.l SYM(SDL_MintAudio_itbuflen),d0
+ move.l SYM(SDL_MintAudio_itbuffer),a0
move.l SYM(SDL_MintAudio_itsilence),d1
fillsilence:
move.l d1,a0@+
subq.l #1,d0
bpl.s fillsilence
+ clr.l SYM(SDL_MintAudio_itbuflen)
+
nosilence:
rts