From 83f8124af58307eae378846c9746b5d769673474 Mon Sep 17 00:00:00 2001 From: divverent Date: Fri, 20 Sep 2019 15:27:46 +0000 Subject: [PATCH] Fix issue with noise during startup MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12480 d7cf8633-e32d-0410-b094-e92efae38249 --- snd_sdl.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/snd_sdl.c b/snd_sdl.c index 850ca773..f7e0f472 100644 --- a/snd_sdl.c +++ b/snd_sdl.c @@ -68,10 +68,20 @@ static void Buffer_Callback (void *userdata, Uint8 *stream, int len) 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 + // FIXME this is another place that assumes 8bit is always unsigned and others always signed + memset(&stream[PartialLength1 + PartialLength2], snd_renderbuffer->format.width == 1 ? 0x80 : 0, len - (PartialLength1 + PartialLength2)); } else + { 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 + // FIXME this is another place that assumes 8bit is always unsigned and others always signed + 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) -- 2.39.2