Module: wine Branch: master Commit: 503f9be161cd99f8c2e13db5066ce9599b34d9f7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=503f9be161cd99f8c2e13db506...
Author: Ken Thomases ken@codeweavers.com Date: Thu Dec 28 11:06:09 2006 -0600
winecoreaudio: Implement widReset.
---
dlls/winmm/winecoreaudio/audio.c | 36 ++++++++++++++++++++++++++++++++++-- 1 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index f40d8f8..94120e6 100644 --- a/dlls/winmm/winecoreaudio/audio.c +++ b/dlls/winmm/winecoreaudio/audio.c @@ -1755,6 +1755,10 @@ static DWORD widStop(WORD wDevID) */ static DWORD widReset(WORD wDevID) { + DWORD ret = MMSYSERR_NOERROR; + WINE_WAVEIN* wwi; + WAVEHDR* lpWaveHdr = NULL; + TRACE("(%u);\n", wDevID); if (wDevID >= MAX_WAVEINDRV) { @@ -1762,8 +1766,36 @@ static DWORD widReset(WORD wDevID) return MMSYSERR_INVALHANDLE; }
- FIXME("unimplemented\n"); - return MMSYSERR_NOTENABLED; + wwi = &WInDev[wDevID]; + OSSpinLockLock(&wwi->lock); + + if (wwi->state == WINE_WS_CLOSED) + { + WARN("Trying to reset a closed device.\n"); + ret = MMSYSERR_INVALHANDLE; + } + else + { + lpWaveHdr = wwi->lpQueuePtr; + wwi->lpQueuePtr = NULL; + wwi->state = WINE_WS_STOPPED; + wwi->dwTotalRecorded = 0; + } + + OSSpinLockUnlock(&wwi->lock); + + while (lpWaveHdr) + { + WAVEHDR* lpNext = lpWaveHdr->lpNext; + + lpWaveHdr->dwFlags &= ~WHDR_INQUEUE; + lpWaveHdr->dwFlags |= WHDR_DONE; + widNotifyClient(wwi, WIM_DATA, (DWORD)lpWaveHdr, 0); + + lpWaveHdr = lpNext; + } + + return ret; }