[07/18] winecoreaudio: Implement widAddBuffer.

Ken Thomases ken at codeweavers.com
Thu Dec 28 11:06:02 CST 2006


-------------- next part --------------
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index ea14d87..496bad2 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -1666,6 +1666,9 @@ static DWORD widClose(WORD wDevID)
  */
 static DWORD widAddBuffer(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
 {
+    DWORD           ret = MMSYSERR_NOERROR;
+    WINE_WAVEIN*    wwi;
+
     TRACE("(%u, %p, %08lX);\n", wDevID, lpWaveHdr, dwSize);
 
     if (wDevID >= MAX_WAVEINDRV)
@@ -1684,8 +1687,32 @@ static DWORD widAddBuffer(WORD wDevID, L
         return WAVERR_STILLPLAYING;
     }
 
-    FIXME("unimplemented\n");
-    return MMSYSERR_NOTENABLED;
+    wwi = &WInDev[wDevID];
+    OSSpinLockLock(&wwi->lock);
+
+    if (wwi->state == WINE_WS_CLOSED)
+    {
+        WARN("Trying to add buffer to closed device.\n");
+        ret = MMSYSERR_INVALHANDLE;
+    }
+    else
+    {
+        LPWAVEHDR* wh;
+
+        lpWaveHdr->dwFlags |= WHDR_INQUEUE;
+        lpWaveHdr->dwFlags &= ~WHDR_DONE;
+        lpWaveHdr->dwBytesRecorded = 0;
+        lpWaveHdr->lpNext = NULL;
+
+        /* insert buffer at end of queue */
+        for (wh = &(wwi->lpQueuePtr); *wh; wh = &((*wh)->lpNext))
+            /* Do nothing */;
+        *wh = lpWaveHdr;
+    }
+
+    OSSpinLockUnlock(&wwi->lock);
+
+    return ret;
 }
 
 



More information about the wine-patches mailing list