From 025e6650e4378771a4fd1a872bebfbfb2b2b72d7 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Mon, 6 Apr 2015 08:21:48 -0500 Subject: [PATCH] wineoss.drv: Cap reported OSS fill level to expected level. Some devices apparently return that the buffer contains an extra frame that we never wrote. We should account for that to avoid an integer underflow. --- dlls/wineoss.drv/mmdevdrv.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index ccd5c86bd8e..d2a0c86e9b9 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1412,6 +1412,12 @@ static void oss_write_data(ACImpl *This) }else in_oss_frames = (This->oss_bufsize_bytes - bi.bytes) / This->fmt->nBlockAlign; + if(in_oss_frames > This->in_oss_frames){ + TRACE("Capping reported frames from %u to %u\n", + in_oss_frames, This->in_oss_frames); + in_oss_frames = This->in_oss_frames; + } + write_limit = 0; while(write_limit + in_oss_frames < max_period * 3) write_limit += max_period;