Ken Thomases : winecoreaudio: Add widHelper_NotifyCompletions.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Dec 29 06:47:22 CST 2006
Module: wine
Branch: master
Commit: 9ef54e4ebee50a6cdef70138ba22db6b3167e2c3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ef54e4ebee50a6cdef70138ba22db6b3167e2c3
Author: Ken Thomases <ken at codeweavers.com>
Date: Thu Dec 28 11:06:43 2006 -0600
winecoreaudio: Add widHelper_NotifyCompletions.
It scans for completed input wavehdrs, removes them from the queue,
and notifies the application that they're done.
---
dlls/winmm/winecoreaudio/audio.c | 50 ++++++++++++++++++++++++++++++++++++++
1 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index 2a13f8d..607b711 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -202,6 +202,7 @@ static CFMessagePortRef Port_SendToMessa
static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo);
static void wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force);
+static void widHelper_NotifyCompletions(WINE_WAVEIN* wwi);
extern int AudioUnit_CreateDefaultAudioUnit(void *wwo, AudioUnit *au);
extern int AudioUnit_CloseAudioUnit(AudioUnit au);
@@ -1504,6 +1505,55 @@ static DWORD widNotifyClient(WINE_WAVEIN
/**************************************************************************
+ * widHelper_NotifyCompletions [internal]
+ */
+static void widHelper_NotifyCompletions(WINE_WAVEIN* wwi)
+{
+ LPWAVEHDR lpWaveHdr;
+ LPWAVEHDR lpFirstDoneWaveHdr = NULL;
+ LPWAVEHDR lpLastDoneWaveHdr = NULL;
+
+ OSSpinLockLock(&wwi->lock);
+
+ /* First, excise all of the done headers from the queue into
+ * a free-standing list. */
+
+ /* Start from lpQueuePtr and keep notifying until:
+ * - we hit an unfilled wavehdr
+ * - we hit the end of the list
+ */
+ for (
+ lpWaveHdr = wwi->lpQueuePtr;
+ lpWaveHdr &&
+ lpWaveHdr->dwBytesRecorded >= lpWaveHdr->dwBufferLength;
+ lpWaveHdr = lpWaveHdr->lpNext
+ )
+ {
+ if (!lpFirstDoneWaveHdr)
+ lpFirstDoneWaveHdr = lpWaveHdr;
+ lpLastDoneWaveHdr = lpWaveHdr;
+ }
+
+ if (lpLastDoneWaveHdr)
+ {
+ wwi->lpQueuePtr = lpLastDoneWaveHdr->lpNext;
+ lpLastDoneWaveHdr->lpNext = NULL;
+ }
+
+ OSSpinLockUnlock(&wwi->lock);
+
+ /* Now, send the "done" notification for each header in our list. */
+ for (lpWaveHdr = lpFirstDoneWaveHdr; lpWaveHdr; lpWaveHdr = lpWaveHdr->lpNext)
+ {
+ lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
+ lpWaveHdr->dwFlags |= WHDR_DONE;
+
+ widNotifyClient(wwi, WIM_DATA, (DWORD)lpWaveHdr, 0);
+ }
+}
+
+
+/**************************************************************************
* widGetDevCaps [internal]
*/
static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPSW lpCaps, DWORD dwSize)
More information about the wine-cvs
mailing list