Commit c47c82a2 authored by Ken Thomases's avatar Ken Thomases Committed by Alexandre Julliard

winecoreaudio: Implement widStop.

parent 335ab8c1
...@@ -1885,6 +1885,11 @@ static DWORD widStart(WORD wDevID) ...@@ -1885,6 +1885,11 @@ static DWORD widStart(WORD wDevID)
*/ */
static DWORD widStop(WORD wDevID) static DWORD widStop(WORD wDevID)
{ {
DWORD ret = MMSYSERR_NOERROR;
WINE_WAVEIN* wwi;
WAVEHDR* lpWaveHdr = NULL;
OSStatus err;
TRACE("(%u);\n", wDevID); TRACE("(%u);\n", wDevID);
if (wDevID >= MAX_WAVEINDRV) if (wDevID >= MAX_WAVEINDRV)
{ {
...@@ -1892,8 +1897,51 @@ static DWORD widStop(WORD wDevID) ...@@ -1892,8 +1897,51 @@ static DWORD widStop(WORD wDevID)
return MMSYSERR_INVALHANDLE; return MMSYSERR_INVALHANDLE;
} }
FIXME("unimplemented\n"); wwi = &WInDev[wDevID];
return MMSYSERR_NOTENABLED;
/* The order of the following operations is important since we can't hold
* the mutex while we make an Audio Unit call. Stop the Audio Unit before
* setting the STOPPED state. In widStart, the order is reversed. This
* guarantees that we can't get into a situation where the state is
* PLAYING but the Audio Unit isn't running. Although we can be in STOPPED
* state with the Audio Unit still running, that's harmless because the
* input callback will just throw away the sound data.
*/
err = AudioOutputUnitStop(wwi->audioUnit);
if (err != noErr)
WARN("Failed to stop AU: %08lx\n", err);
TRACE("Recording stopped.\n");
OSSpinLockLock(&wwi->lock);
if (wwi->state == WINE_WS_CLOSED)
{
WARN("Trying to stop closed device.\n");
ret = MMSYSERR_INVALHANDLE;
}
else if (wwi->state != WINE_WS_STOPPED)
{
wwi->state = WINE_WS_STOPPED;
/* If there's a buffer in progress, it's done. Remove it from the
* queue so that we can return it to the app, below. */
if (wwi->lpQueuePtr)
{
lpWaveHdr = wwi->lpQueuePtr;
wwi->lpQueuePtr = lpWaveHdr->lpNext;
}
}
OSSpinLockUnlock(&wwi->lock);
if (lpWaveHdr)
{
lpWaveHdr->dwFlags &= ~WHDR_INQUEUE;
lpWaveHdr->dwFlags |= WHDR_DONE;
widNotifyClient(wwi, WIM_DATA, (DWORD)lpWaveHdr, 0);
}
return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment