From e233be33952457bdaac41c4da8727df58d3c2d6f Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 5 Jun 2016 19:30:31 +0000 Subject: [PATCH] [MCIQTZ32] Sync with Wine Staging 1.9.11. CORE-11368 svn path=/trunk/; revision=71561 --- reactos/dll/win32/mciqtz32/mciqtz.c | 219 +++++++------------- reactos/dll/win32/mciqtz32/mciqtz_private.h | 13 -- reactos/media/doc/README.WINE | 2 +- 3 files changed, 74 insertions(+), 160 deletions(-) diff --git a/reactos/dll/win32/mciqtz32/mciqtz.c b/reactos/dll/win32/mciqtz32/mciqtz.c index 125b2041c5a..62aa04aa6c0 100644 --- a/reactos/dll/win32/mciqtz32/mciqtz.c +++ b/reactos/dll/win32/mciqtz32/mciqtz.c @@ -33,7 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mciqtz); -static DWORD CALLBACK MCIQTZ_taskThread(LPVOID arg); +static DWORD MCIQTZ_mciClose(UINT, DWORD, LPMCI_GENERIC_PARMS); static DWORD MCIQTZ_mciStop(UINT, DWORD, LPMCI_GENERIC_PARMS); /*======================================================================* @@ -70,40 +70,6 @@ static WINE_MCIQTZ* MCIQTZ_mciGetOpenDev(UINT wDevID) return wma; } -/*************************************************************************** - * MCIQTZ_relayTaskMessage [internal] - */ -static LRESULT MCIQTZ_relayTaskMessage(DWORD_PTR dwDevID, UINT wMsg, - DWORD dwFlags, LPARAM lpParms) -{ - WINE_MCIQTZ *wma; - LRESULT res; - HANDLE handles[2]; - DWORD ret; - TRACE("(%08lX, %08x, %08x, %08lx)\n", dwDevID, wMsg, dwFlags, lpParms); - - wma = MCIQTZ_mciGetOpenDev(dwDevID); - if (!wma) - return MCIERR_INVALID_DEVICE_ID; - EnterCriticalSection(&wma->cs); - wma->task.devid = dwDevID; - wma->task.msg = wMsg; - wma->task.flags = dwFlags; - wma->task.parms = lpParms; - SetEvent(wma->task.notify); - handles[0] = wma->task.done; - handles[1] = wma->task.thread; - ret = WaitForMultipleObjects(sizeof(handles)/sizeof(handles[0]), handles, - FALSE, INFINITE); - if (ret == WAIT_OBJECT_0) - res = wma->task.res; - else - res = MCIERR_INTERNAL; - LeaveCriticalSection(&wma->cs); - - return res; -} - /************************************************************************** * MCIQTZ_drvOpen [internal] */ @@ -123,25 +89,12 @@ static DWORD MCIQTZ_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) return 0; wma->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL); - wma->task.notify = CreateEventW(NULL, FALSE, FALSE, NULL); - if (!wma->task.notify) goto err; - wma->task.done = CreateEventW(NULL, FALSE, FALSE, NULL); - if (!wma->task.done) goto err; - wma->task.thread = CreateThread(NULL, 0, MCIQTZ_taskThread, &wma->task, 0, NULL); - if (!wma->task.thread) goto err; - InitializeCriticalSection(&wma->cs); - wma->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": WINE_MCIQTZ"); modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO; wma->wDevID = modp->wDeviceID; modp->wCustomCommandTable = wma->command_table = mciLoadCommandResource(MCIQTZ_hInstance, mciAviWStr, 0); mciSetDriverData(wma->wDevID, (DWORD_PTR)wma); return modp->wDeviceID; -err: - if (wma->task.notify) CloseHandle(wma->task.notify); - if (wma->task.done) CloseHandle(wma->task.done); - HeapFree(GetProcessHeap(), 0, wma); - return 0; } /************************************************************************** @@ -157,16 +110,9 @@ static DWORD MCIQTZ_drvClose(DWORD dwDevID) if (wma) { /* finish all outstanding things */ - MCIQTZ_relayTaskMessage(dwDevID, MCI_CLOSE_DRIVER, MCI_WAIT, 0); + MCIQTZ_mciClose(dwDevID, MCI_WAIT, NULL); mciFreeCommandResource(wma->command_table); - MCIQTZ_relayTaskMessage(dwDevID, MCI_CLOSE, MCI_WAIT, 0); - WaitForSingleObject(wma->task.thread, INFINITE); - CloseHandle(wma->task.notify); - CloseHandle(wma->task.done); - CloseHandle(wma->task.thread); - wma->cs.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&wma->cs); mciSetDriverData(dwDevID, 0); CloseHandle(wma->stop_event); HeapFree(GetProcessHeap(), 0, wma); @@ -223,6 +169,9 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpOpenParms); + if(!lpOpenParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -446,6 +395,9 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -503,6 +455,9 @@ static DWORD MCIQTZ_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -586,6 +541,29 @@ static DWORD MCIQTZ_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP return 0; } +/*************************************************************************** + * MCIQTZ_mciResume [internal] + */ +static DWORD MCIQTZ_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) +{ + WINE_MCIQTZ* wma; + HRESULT hr; + + TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + + wma = MCIQTZ_mciGetOpenDev(wDevID); + if (!wma) + return MCIERR_INVALID_DEVICE_ID; + + hr = IMediaControl_Run(wma->pmctrl); + if (FAILED(hr)) { + TRACE("Cannot run filtergraph (hr = %x)\n", hr); + return MCIERR_INTERNAL; + } + + return 0; +} + /*************************************************************************** * MCIQTZ_mciGetDevCaps [internal] */ @@ -595,6 +573,9 @@ static DWORD MCIQTZ_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_P TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -691,6 +672,9 @@ static DWORD MCIQTZ_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpPar TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -745,6 +729,9 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -845,6 +832,9 @@ static DWORD MCIQTZ_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lp TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -907,6 +897,9 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + if (!wma) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_TEST) @@ -951,6 +944,9 @@ static DWORD MCIQTZ_mciPut(UINT wDevID, DWORD dwFlags, MCI_GENERIC_PARMS *lpParm TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -997,6 +993,9 @@ static DWORD MCIQTZ_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS TRACE("%04x, %08x, %p\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -1058,6 +1057,9 @@ static DWORD MCIQTZ_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P TRACE("(%04x, %08x, %p)\n", wDevID, dwFlags, lpParms); + if(!lpParms) + return MCIERR_NULL_PARAMETER_BLOCK; + wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; @@ -1096,79 +1098,6 @@ static DWORD MCIQTZ_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P return ret; } -/*************************************************************************** - * MCIQTZ_taskThread [internal] - */ -static DWORD CALLBACK MCIQTZ_taskThread(LPVOID arg) -{ - WINE_MCIQTZ_TASK *task = (WINE_MCIQTZ_TASK *)arg; - - for (;;) { - DWORD ret = WaitForSingleObject(task->notify, INFINITE); - if (ret != WAIT_OBJECT_0) { - TRACE("Got error (%u)\n", ret); - continue; - } - - switch (task->msg) { - case MCI_OPEN_DRIVER: - task->res = MCIQTZ_mciOpen(task->devid, task->flags, (LPMCI_DGV_OPEN_PARMSW)task->parms); - break; - case MCI_CLOSE_DRIVER: - task->res = MCIQTZ_mciClose(task->devid, task->flags, (LPMCI_GENERIC_PARMS)task->parms); - break; - case MCI_PLAY: - task->res = MCIQTZ_mciPlay(task->devid, task->flags, (LPMCI_PLAY_PARMS)task->parms); - break; - case MCI_SEEK: - task->res = MCIQTZ_mciSeek(task->devid, task->flags, (LPMCI_SEEK_PARMS)task->parms); - break; - case MCI_STOP: - task->res = MCIQTZ_mciStop(task->devid, task->flags, (LPMCI_GENERIC_PARMS)task->parms); - break; - case MCI_PAUSE: - task->res = MCIQTZ_mciPause(task->devid, task->flags, (LPMCI_GENERIC_PARMS)task->parms); - break; - case MCI_GETDEVCAPS: - task->res = MCIQTZ_mciGetDevCaps(task->devid, task->flags, (LPMCI_GETDEVCAPS_PARMS)task->parms); - break; - case MCI_SET: - task->res = MCIQTZ_mciSet(task->devid, task->flags, (LPMCI_DGV_SET_PARMS)task->parms); - break; - case MCI_STATUS: - task->res = MCIQTZ_mciStatus(task->devid, task->flags, (LPMCI_DGV_STATUS_PARMSW)task->parms); - break; - case MCI_WHERE: - task->res = MCIQTZ_mciWhere(task->devid, task->flags, (LPMCI_DGV_RECT_PARMS)task->parms); - break; - case MCI_SETAUDIO: - task->res = MCIQTZ_mciSetAudio(task->devid, task->flags, (LPMCI_DGV_SETAUDIO_PARMSW)task->parms); - break; - case MCI_UPDATE: - task->res = MCIQTZ_mciUpdate(task->devid, task->flags, (LPMCI_DGV_UPDATE_PARMS)task->parms); - break; - case MCI_WINDOW: - task->res = MCIQTZ_mciWindow(task->devid, task->flags, (LPMCI_DGV_WINDOW_PARMSW)task->parms); - break; - case MCI_PUT: - task->res = MCIQTZ_mciPut(task->devid, task->flags, (MCI_GENERIC_PARMS*)task->parms); - break; - case MCI_CLOSE: - /* Special internal message */ - SetEvent(task->done); - goto end; - default: - FIXME("Shouldn't receive another message (%04x)\n", task->msg); - task->res = MCIERR_UNRECOGNIZED_COMMAND; - break; - } - SetEvent(task->done); - } - -end: - return 0; -} - /*======================================================================* * MCI QTZ entry points * *======================================================================*/ @@ -1200,28 +1129,26 @@ LRESULT CALLBACK MCIQTZ_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, return 1; switch (wMsg) { - case MCI_OPEN_DRIVER: - case MCI_PLAY: - case MCI_SEEK: - case MCI_GETDEVCAPS: - case MCI_SET: - case MCI_STATUS: - case MCI_WHERE: - if (!dwParam2) return MCIERR_NULL_PARAMETER_BLOCK; - return MCIQTZ_relayTaskMessage(dwDevID, wMsg, dwParam1, dwParam2); - case MCI_CLOSE_DRIVER: - case MCI_STOP: - case MCI_PAUSE: - return MCIQTZ_relayTaskMessage(dwDevID, wMsg, dwParam1, dwParam2); + case MCI_OPEN_DRIVER: return MCIQTZ_mciOpen (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSW) dwParam2); + case MCI_CLOSE_DRIVER: return MCIQTZ_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_PLAY: return MCIQTZ_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); + case MCI_SEEK: return MCIQTZ_mciSeek (dwDevID, dwParam1, (LPMCI_SEEK_PARMS) dwParam2); + case MCI_STOP: return MCIQTZ_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_PAUSE: return MCIQTZ_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_RESUME: return MCIQTZ_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_GETDEVCAPS: return MCIQTZ_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS) dwParam2); + case MCI_SET: return MCIQTZ_mciSet (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS) dwParam2); + case MCI_STATUS: return MCIQTZ_mciStatus (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSW) dwParam2); + case MCI_WHERE: return MCIQTZ_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2); /* Digital Video specific */ - case MCI_SETAUDIO: + case MCI_SETAUDIO: return MCIQTZ_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2); case MCI_UPDATE: + return MCIQTZ_mciUpdate(dwDevID, dwParam1, (LPMCI_DGV_UPDATE_PARMS)dwParam2); case MCI_WINDOW: + return MCIQTZ_mciWindow(dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSW)dwParam2); case MCI_PUT: - if (!dwParam2) return MCIERR_NULL_PARAMETER_BLOCK; - return MCIQTZ_relayTaskMessage(dwDevID, wMsg, dwParam1, dwParam2); + return MCIQTZ_mciPut(dwDevID, dwParam1, (MCI_GENERIC_PARMS*)dwParam2); case MCI_RECORD: - case MCI_RESUME: case MCI_INFO: case MCI_LOAD: case MCI_SAVE: diff --git a/reactos/dll/win32/mciqtz32/mciqtz_private.h b/reactos/dll/win32/mciqtz32/mciqtz_private.h index 20d5742edf5..d54a45e6d28 100644 --- a/reactos/dll/win32/mciqtz32/mciqtz_private.h +++ b/reactos/dll/win32/mciqtz32/mciqtz_private.h @@ -25,17 +25,6 @@ #include -typedef struct { - HANDLE thread; - HANDLE notify; - HANDLE done; - DWORD msg; - DWORD_PTR devid; - DWORD flags; - DWORD_PTR parms; - LRESULT res; -} WINE_MCIQTZ_TASK; - typedef struct { MCIDEVICEID wDevID; BOOL opened; @@ -54,8 +43,6 @@ typedef struct { HANDLE callback; HANDLE thread; HANDLE stop_event; - CRITICAL_SECTION cs; - WINE_MCIQTZ_TASK task; } WINE_MCIQTZ; #endif /* __WINE_PRIVATE_MCIQTZ_H */ diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 98d436defa2..16c0282eb39 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -94,7 +94,7 @@ reactos/dll/win32/lz32 # Synced to WineStaging-1.9.4 reactos/dll/win32/mapi32 # Synced to WineStaging-1.9.4 reactos/dll/win32/mciavi32 # Synced to WineStaging-1.9.11 reactos/dll/win32/mcicda # Synced to WineStaging-1.9.4 -reactos/dll/win32/mciqtz32 # Synced to WineStaging-1.9.4 +reactos/dll/win32/mciqtz32 # Synced to WineStaging-1.9.11 reactos/dll/win32/mciseq # Synced to WineStaging-1.9.4 reactos/dll/win32/mciwave # Synced to WineStaging-1.9.4 reactos/dll/win32/mgmtapi # Synced to WineStaging-1.9.4