/************************************************************************** * wodBreakLoop [internal] */ static DWORD wodBreakLoop(WORD wDevID) { TRACE("(%u);\n", wDevID); if (wDevID >= ALSA_WodNumDevs) { TRACE("Asked for device %d, but only %d known!\n", wDevID, ALSA_WodNumDevs); return MMSYSERR_BADDEVICEID; } if (WOutDev[wDevID].pcm == NULL) { WARN("Requested to breakloop of closed device %d!\n", wDevID); return MMSYSERR_BADDEVICEID; } ALSA_AddRingMessage(&WOutDev[wDevID].msgRing, WINE_WM_BREAKLOOP, 0, TRUE); return MMSYSERR_NOERROR; }
/************************************************************************** * wodPause [internal] */ static DWORD wodPause(WORD wDevID) { TRACE("(%u);!\n", wDevID); if (wDevID >= ALSA_WodNumDevs) { TRACE("Asked for device %d, but only %d known!\n", wDevID, ALSA_WodNumDevs); return MMSYSERR_BADDEVICEID; } if (WOutDev[wDevID].pcm == NULL) { WARN("Requested to pause closed device %d!\n", wDevID); return MMSYSERR_BADDEVICEID; } ALSA_AddRingMessage(&WOutDev[wDevID].msgRing, WINE_WM_PAUSING, 0, TRUE); return MMSYSERR_NOERROR; }
/************************************************************************** * widStop [internal] * */ static DWORD widStop(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize) { TRACE("(%u, %p, %08X);\n", wDevID, lpWaveHdr, dwSize); /* first, do the sanity checks... */ if (wDevID >= ALSA_WidNumDevs) { TRACE("Requested device %d, but only %d are known!\n", wDevID, ALSA_WidNumDevs); return MMSYSERR_BADDEVICEID; } if (WInDev[wDevID].pcm == NULL) { WARN("Requested to stop closed device %d!\n", wDevID); return MMSYSERR_BADDEVICEID; } ALSA_AddRingMessage(&WInDev[wDevID].msgRing, WINE_WM_STOPPING, 0, TRUE); return MMSYSERR_NOERROR; }
/************************************************************************** * widClose [internal] */ static DWORD widClose(WORD wDevID) { DWORD ret = MMSYSERR_NOERROR; WINE_WAVEDEV* wwi; TRACE("(%u);\n", wDevID); if (wDevID >= ALSA_WidNumDevs) { TRACE("Requested device %d, but only %d are known!\n", wDevID, ALSA_WidNumDevs); return MMSYSERR_BADDEVICEID; } if (WInDev[wDevID].pcm == NULL) { WARN("Requested to close already closed device %d!\n", wDevID); return MMSYSERR_BADDEVICEID; } wwi = &WInDev[wDevID]; if (wwi->lpQueuePtr) { WARN("buffers still playing !\n"); ret = WAVERR_STILLPLAYING; } else { if (wwi->hThread != INVALID_HANDLE_VALUE) { ALSA_AddRingMessage(&wwi->msgRing, WINE_WM_CLOSING, 0, TRUE); } ALSA_DestroyRingMessage(&wwi->msgRing); snd_pcm_hw_params_free(wwi->hw_params); wwi->hw_params = NULL; snd_pcm_close(wwi->pcm); wwi->pcm = NULL; ret = widNotifyClient(wwi, WIM_CLOSE, 0L, 0L); } return ret; }