Andrew Eikum : wineoss.drv: Fix DeleteTimerQueueTimer usage.
Alexandre Julliard
julliard at winehq.org
Thu Feb 23 15:11:37 CST 2012
Module: wine
Branch: master
Commit: 7437eb63fc2801ceeca0cf072aea58bd5571c99b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7437eb63fc2801ceeca0cf072aea58bd5571c99b
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Thu Feb 23 09:44:20 2012 -0600
wineoss.drv: Fix DeleteTimerQueueTimer usage.
---
dlls/wineoss.drv/mmdevdrv.c | 30 +++++++++++++++++++-----------
1 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 5f8c4ac..8658348 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -1335,13 +1335,15 @@ static void CALLBACK oss_period_callback(void *user, BOOLEAN timer)
EnterCriticalSection(&This->lock);
- if(This->dataflow == eRender && This->held_frames)
- oss_write_data(This);
- else if(This->dataflow == eCapture)
- oss_read_data(This);
+ if(This->playing){
+ if(This->dataflow == eRender && This->held_frames)
+ oss_write_data(This);
+ else if(This->dataflow == eCapture)
+ oss_read_data(This);
- if(This->event)
- SetEvent(This->event);
+ if(This->event)
+ SetEvent(This->event);
+ }
LeaveCriticalSection(&This->lock);
}
@@ -1384,6 +1386,8 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient *iface)
static HRESULT WINAPI AudioClient_Stop(IAudioClient *iface)
{
ACImpl *This = impl_from_IAudioClient(iface);
+ HANDLE event;
+ DWORD wait;
TRACE("(%p)\n", This);
@@ -1399,16 +1403,20 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient *iface)
return S_FALSE;
}
- if(This->timer && This->timer != INVALID_HANDLE_VALUE){
- DeleteTimerQueueTimer(g_timer_q, This->timer,
- INVALID_HANDLE_VALUE);
- This->timer = NULL;
- }
+ event = CreateEventW(NULL, TRUE, FALSE, NULL);
+ wait = !DeleteTimerQueueTimer(g_timer_q, This->timer, event);
+ if(wait)
+ WARN("DeleteTimerQueueTimer error %u\n", GetLastError());
+ wait = wait && GetLastError() == ERROR_IO_PENDING;
This->playing = FALSE;
LeaveCriticalSection(&This->lock);
+ if(event && wait)
+ WaitForSingleObject(event, INFINITE);
+ CloseHandle(event);
+
return S_OK;
}
More information about the wine-cvs
mailing list