/* * MCIAVI_mciPlay_async */ static DWORD MCIAVI_mciPlay_async(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_PLAY_PARMS lpParams) { HANDLE handle; struct MCIAVI_play_data *data = HeapAlloc(GetProcessHeap(), 0, sizeof(struct MCIAVI_play_data)); if (!data) return MCIERR_OUT_OF_MEMORY; data->wma = wma; data->flags = dwFlags; if (dwFlags & MCI_NOTIFY) data->params.dwCallback = lpParams->dwCallback; if (!(handle = CreateThread(NULL, 0, MCIAVI_mciPlay_thread, data, 0, NULL))) { WARN("Couldn't create thread for async play, playing synchronously\n"); return MCIAVI_mciPlay_thread(data); } SetThreadPriority(handle, THREAD_PRIORITY_TIME_CRITICAL); CloseHandle(handle); return 0; }
/* * MCIAVI_mciPlay_async */ static DWORD MCIAVI_mciPlay_async(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_PLAY_PARMS lpParams) { HANDLE handle, ack_event = wma->ack_event; struct MCIAVI_play_data *data = HeapAlloc(GetProcessHeap(), 0, sizeof(struct MCIAVI_play_data)); if (!data) return MCIERR_OUT_OF_MEMORY; data->wDevID = wma->wDevID; data->flags = dwFlags; data->params = *lpParams; if (!(handle = CreateThread(NULL, 0, MCIAVI_mciPlay_thread, data, 0, NULL))) { WARN("Couldn't create thread for async play, playing synchronously\n"); return MCIAVI_mciPlay_thread(data); } SetThreadPriority(handle, THREAD_PRIORITY_TIME_CRITICAL); CloseHandle(handle); /* wait until the thread starts up, so the app could see a changed status */ WaitForSingleObject(ack_event, INFINITE); TRACE("Async play has started\n"); return 0; }