SDL-1.2: atari:audio: compute SDL_MintAudio_itbuflen dynamically

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