Module: wine Branch: master Commit: 58ea6abe726c935a602b210297a2cd4a76405704 URL: http://source.winehq.org/git/wine.git/?a=commit;h=58ea6abe726c935a602b210297...
Author: Ken Thomases ken@codeweavers.com Date: Thu Dec 28 11:06:02 2006 -0600
winecoreaudio: Implement widAddBuffer.
---
dlls/winmm/winecoreaudio/audio.c | 31 +++++++++++++++++++++++++++++-- 1 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index 51e71a8..f40d8f8 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, %08X);\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; }