]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
Fix issue with noise during startup
authorAmadeusz Sławiński <amade@asmblr.net>
Mon, 18 Feb 2019 18:09:29 +0000 (19:09 +0100)
committerAmadeusz Sławiński <amade@asmblr.net>
Tue, 26 Feb 2019 19:03:54 +0000 (20:03 +0100)
After migrating to SDL2 interfaces there is noise during startup fix
this by initializng buffer as specification requires.

Per SDL_AudioCallback spec:
The callback must completely initialize the buffer; as of SDL 2.0, this buffer is not initialized before the callback is called. If there is nothing to play, the callback should fill the buffer with silence.

Signed-off-by: Amadeusz Sławiński <amade@asmblr.net>
snd_sdl.c

index 21341dce883a6c111b502a2a91113ce9a13b99e8..6de41d659f787b14cc99b93c67e1ed9d90fc6d69 100644 (file)
--- a/snd_sdl.c
+++ b/snd_sdl.c
@@ -68,10 +68,18 @@ static void Buffer_Callback (void *userdata, Uint8 *stream, int len)
 
                        PartialLength2 = FrameCount * factor - PartialLength1;
                        memcpy(&stream[PartialLength1], &snd_renderbuffer->ring[0], PartialLength2);
 
                        PartialLength2 = FrameCount * factor - PartialLength1;
                        memcpy(&stream[PartialLength1], &snd_renderbuffer->ring[0], PartialLength2);
+
+                       // As of SDL 2.0 buffer needs to be fully initialized, so fill leftover part with silence
+                       memset(&stream[PartialLength1 + PartialLength2], snd_renderbuffer->format.width == 1 ? 0x80 : 0, len - (PartialLength1 + PartialLength2));
                }
                else
                }
                else
+               {
                        memcpy(stream, &snd_renderbuffer->ring[StartOffset * factor], FrameCount * factor);
 
                        memcpy(stream, &snd_renderbuffer->ring[StartOffset * factor], FrameCount * factor);
 
+                       // As of SDL 2.0 buffer needs to be fully initialized, so fill leftover part with silence
+                       memset(&stream[FrameCount * factor], snd_renderbuffer->format.width == 1 ? 0x80 : 0, len - (FrameCount * factor));
+               }
+
                snd_renderbuffer->startframe += FrameCount;
 
                if (FrameCount < RequestedFrames && developer_insane.integer && vid_activewindow)
                snd_renderbuffer->startframe += FrameCount;
 
                if (FrameCount < RequestedFrames && developer_insane.integer && vid_activewindow)