[06/18] winecoreaudio: Implement widReset.
Ken Thomases
ken at codeweavers.com
Thu Dec 28 11:06:09 CST 2006
-------------- next part --------------
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index 28c43cf..ea14d87 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -1728,6 +1728,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)
{
@@ -1735,8 +1739,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;
}
More information about the wine-patches
mailing list