From 7964e0adf80b3693072d6facf21d94d0233dafbe Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Sun, 13 Jan 2019 15:27:50 +0100 Subject: [PATCH] atari: Fill audio buffer with silence when too many interrupts triggered on same buffer --- src/audio/mint/SDL_mintaudio.c | 8 +++++- src/audio/mint/SDL_mintaudio.h | 4 +++ src/audio/mint/SDL_mintaudio_it.S | 41 ++++++++++++++++++++++++++----- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/audio/mint/SDL_mintaudio.c b/src/audio/mint/SDL_mintaudio.c index 159990201..61ab26763 100644 --- a/src/audio/mint/SDL_mintaudio.c +++ b/src/audio/mint/SDL_mintaudio.c @@ -103,6 +103,12 @@ int SDL_MintAudio_InitBuffers(SDL_AudioSpec *spec) SDL_MintAudio_numbuf = SDL_MintAudio_num_its = SDL_MintAudio_num_upd = 0; 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_itsilence = (spec->silence << 24)|(spec->silence << 16)| + (spec->silence << 8)|spec->silence; + return (1); } @@ -118,7 +124,7 @@ void SDL_MintAudio_FreeBuffers(void) } if (MINTAUDIO_audiobuf[0]) { Mfree(MINTAUDIO_audiobuf[0]); - MINTAUDIO_audiobuf[0] = MINTAUDIO_audiobuf[1] = NULL; + SDL_MintAudio_itbuffer = MINTAUDIO_audiobuf[0] = MINTAUDIO_audiobuf[1] = NULL; } } diff --git a/src/audio/mint/SDL_mintaudio.h b/src/audio/mint/SDL_mintaudio.h index e3fc73ce4..50a2d4abc 100644 --- a/src/audio/mint/SDL_mintaudio.h +++ b/src/audio/mint/SDL_mintaudio.h @@ -121,6 +121,10 @@ void SDL_MintAudio_WaitThread(void); extern volatile unsigned long SDL_MintAudio_clocktics; extern volatile unsigned long SDL_MintAudio_num_its; +extern volatile void *SDL_MintAudio_itbuffer; +extern volatile unsigned long SDL_MintAudio_itbuflen; +extern volatile unsigned long SDL_MintAudio_itsilence; + /* Functions */ void SDL_MintAudio_XbiosInterruptMeasureClock(void); void SDL_MintAudio_XbiosInterrupt(void); diff --git a/src/audio/mint/SDL_mintaudio_it.S b/src/audio/mint/SDL_mintaudio_it.S index 0ffe7cccb..cb033e6be 100644 --- a/src/audio/mint/SDL_mintaudio_it.S +++ b/src/audio/mint/SDL_mintaudio_it.S @@ -71,22 +71,47 @@ SDL_MintAudio_EndIntMeasure: _SDL_MintAudio_XbiosInterrupt: _SDL_MintAudio_Dma8Interrupt: +#if defined(__mcoldfire__) + lea sp@(-12),sp + moveml d0-d1/a0,sp@ +#else + moveml d0-d1/a0,sp@- +#endif /* Clear service bit, so other MFP interrupts can work */ #if defined(__mcoldfire__) - movel d0,sp@- - moveql #5,d0 bclr d0,0xfffffa0f:w - - movel sp@+,d0 #else bclr #5,0xfffffa0f:w #endif _SDL_MintAudio_StfaInterrupt: - addql #1,_SDL_MintAudio_num_its - + move.l _SDL_MintAudio_num_its,d0 + addql #1,d0 + move.l d0,_SDL_MintAudio_num_its + + cmp.l #5,d0 + bmi.s _SDL_MintAudio_nosilence + + move.l _SDL_MintAudio_itbuffer,d1 + beq.s _SDL_MintAudio_nosilence + move.l d1,a0 + + move.l _SDL_MintAudio_itbuflen,d0 + move.l _SDL_MintAudio_itsilence,d1 +_SDL_MintAudio_fillsilence: + move.l d1,a0@+ + subq.l #1,d0 + bpl.s _SDL_MintAudio_fillsilence + +_SDL_MintAudio_nosilence: +#if defined(__mcoldfire__) + moveml sp@,d0-d1/a0 + lea sp@(12),sp +#else + moveml sp@+,d0-d1/a0 +#endif rte .bss @@ -94,3 +119,7 @@ _SDL_MintAudio_StfaInterrupt: .even .comm _SDL_MintAudio_clocktics,4 .comm _SDL_MintAudio_num_its,4 + + .comm _SDL_MintAudio_itbuffer,4 /* Audio DMA buffer */ + .comm _SDL_MintAudio_itbuflen,4 /* Length in longword */ + .comm _SDL_MintAudio_itsilence,4 /* Silence value */