/*************************************************************************** * MCIQTZ_mciStop [internal] */ static DWORD MCIQTZ_mciStop(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; if (!wma->opened) return 0; hr = IMediaControl_Stop(wma->pmctrl); if (FAILED(hr)) { TRACE("Cannot stop filtergraph (hr = %x)\n", hr); return MCIERR_INTERNAL; } if (!wma->parent) IVideoWindow_put_Visible(wma->vidwin, OAFALSE); return 0; }
static void rungraph(void) { HRESULT hr; IMediaControl* pmc; IMediaEvent* pme; HANDLE hEvent; hr = IGraphBuilder_QueryInterface(pgraph, &IID_IMediaControl, (LPVOID*)&pmc); ok(hr==S_OK, "Cannot get IMediaControl interface returned: %lx\n", hr); hr = IMediaControl_Run(pmc); ok(hr==S_FALSE, "Cannot run the graph returned: %lx\n", hr); hr = IGraphBuilder_QueryInterface(pgraph, &IID_IMediaEvent, (LPVOID*)&pme); ok(hr==S_OK, "Cannot get IMediaEvent interface returned: %lx\n", hr); hr = IMediaEvent_GetEventHandle(pme, (OAEVENT*)&hEvent); ok(hr==S_OK, "Cannot get event handle returned: %lx\n", hr); /* WaitForSingleObject(hEvent, INFINITE); */ Sleep(20000); hr = IMediaControl_Release(pme); ok(hr==2, "Releasing mediaevent returned: %lx\n", hr); hr = IMediaControl_Stop(pmc); ok(hr==S_OK, "Cannot stop the graph returned: %lx\n", hr); hr = IMediaControl_Release(pmc); ok(hr==1, "Releasing mediacontrol returned: %lx\n", hr); }
/*************************************************************************** * MCIQTZ_notifyThread [internal] */ static DWORD CALLBACK MCIQTZ_notifyThread(LPVOID parm) { WINE_MCIQTZ* wma = (WINE_MCIQTZ *)parm; HRESULT hr; HANDLE handle[2]; DWORD n = 0, ret = 0; handle[n++] = wma->stop_event; IMediaEvent_GetEventHandle(wma->mevent, (OAEVENT *)&handle[n++]); for (;;) { DWORD r; HANDLE old; r = WaitForMultipleObjects(n, handle, FALSE, INFINITE); if (r == WAIT_OBJECT_0) { TRACE("got stop event\n"); old = InterlockedExchangePointer(&wma->callback, NULL); if (old) mciDriverNotify(old, wma->notify_devid, MCI_NOTIFY_ABORTED); break; } else if (r == WAIT_OBJECT_0+1) { LONG event_code; LONG_PTR p1, p2; do { hr = IMediaEvent_GetEvent(wma->mevent, &event_code, &p1, &p2, 0); if (SUCCEEDED(hr)) { TRACE("got event_code = 0x%02x\n", event_code); IMediaEvent_FreeEventParams(wma->mevent, event_code, p1, p2); } } while (hr == S_OK && event_code != EC_COMPLETE); if (hr == S_OK && event_code == EC_COMPLETE) { old = InterlockedExchangePointer(&wma->callback, NULL); if (old) mciDriverNotify(old, wma->notify_devid, MCI_NOTIFY_SUCCESSFUL); break; } } else { TRACE("Unknown error (%d)\n", (int)r); break; } } hr = IMediaControl_Stop(wma->pmctrl); if (FAILED(hr)) { TRACE("Cannot stop filtergraph (hr = %x)\n", hr); ret = MCIERR_INTERNAL; } return ret; }
static HRESULT WINAPI IAMMultiMediaStreamImpl_SetState(IAMMultiMediaStream* iface, STREAM_STATE new_state) { IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); HRESULT hr = E_INVALIDARG; TRACE("(%p/%p)->(%u)\n", This, iface, new_state); if (new_state == STREAMSTATE_RUN) hr = IMediaControl_Run(This->media_control); else if (new_state == STREAMSTATE_STOP) hr = IMediaControl_Stop(This->media_control); return hr; }
static void QUARTZ_DestroyFilterGraph(IUnknown* punk) { CFilterGraph_THIS(punk,unk); int i; TRACE( "(%p)\n", punk ); /* At first, call Stop. */ IMediaControl_Stop( CFilterGraph_IMediaControl(This) ); TRACE(" sent Stop 1\n"); IMediaFilter_Stop( CFilterGraph_IMediaFilter(This) ); TRACE(" sent Stop 2\n"); i = 0; while ( FGRAPH_Init[i].pInit != NULL ) { FGRAPH_Init[i].pUninit( This ); i++; } TRACE( "succeeded.\n" ); }
static int dshow_read_close(AVFormatContext *s) { struct dshow_ctx *ctx = s->priv_data; AVPacketList *pktl; if (ctx->control) { IMediaControl_Stop(ctx->control); IMediaControl_Release(ctx->control); } if (ctx->media_event) IMediaEvent_Release(ctx->media_event); if (ctx->graph) { IEnumFilters *fenum; int r; r = IGraphBuilder_EnumFilters(ctx->graph, &fenum); if (r == S_OK) { IBaseFilter *f; IEnumFilters_Reset(fenum); while (IEnumFilters_Next(fenum, 1, &f, NULL) == S_OK) { if (IGraphBuilder_RemoveFilter(ctx->graph, f) == S_OK) IEnumFilters_Reset(fenum); /* When a filter is removed, * the list must be reset. */ IBaseFilter_Release(f); } IEnumFilters_Release(fenum); } IGraphBuilder_Release(ctx->graph); } if (ctx->capture_pin[VideoDevice]) libAVPin_Release(ctx->capture_pin[VideoDevice]); if (ctx->capture_pin[AudioDevice]) libAVPin_Release(ctx->capture_pin[AudioDevice]); if (ctx->capture_filter[VideoDevice]) libAVFilter_Release(ctx->capture_filter[VideoDevice]); if (ctx->capture_filter[AudioDevice]) libAVFilter_Release(ctx->capture_filter[AudioDevice]); if (ctx->device_pin[VideoDevice]) IPin_Release(ctx->device_pin[VideoDevice]); if (ctx->device_pin[AudioDevice]) IPin_Release(ctx->device_pin[AudioDevice]); if (ctx->device_filter[VideoDevice]) IBaseFilter_Release(ctx->device_filter[VideoDevice]); if (ctx->device_filter[AudioDevice]) IBaseFilter_Release(ctx->device_filter[AudioDevice]); if (ctx->device_name[0]) av_freep(&ctx->device_name[0]); if (ctx->device_name[1]) av_freep(&ctx->device_name[1]); if(ctx->mutex) CloseHandle(ctx->mutex); if(ctx->event[0]) CloseHandle(ctx->event[0]); if(ctx->event[1]) CloseHandle(ctx->event[1]); pktl = ctx->pktl; while (pktl) { AVPacketList *next = pktl->next; av_packet_unref(&pktl->pkt); av_free(pktl); pktl = next; } CoUninitialize(); return 0; }
/*************************************************************************** * MCIQTZ_mciStatus [internal] */ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms) { WINE_MCIQTZ* wma; HRESULT hr; 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; if (!(dwFlags & MCI_STATUS_ITEM)) { WARN("No status item specified\n"); return MCIERR_UNRECOGNIZED_COMMAND; } switch (lpParms->dwItem) { case MCI_STATUS_LENGTH: { LONGLONG duration = -1; GUID format; switch (wma->time_format) { case MCI_FORMAT_MILLISECONDS: format = TIME_FORMAT_MEDIA_TIME; break; case MCI_FORMAT_FRAMES: format = TIME_FORMAT_FRAME; break; default: ERR("Unhandled format %x\n", wma->time_format); break; } hr = IMediaSeeking_SetTimeFormat(wma->seek, &format); if (FAILED(hr)) { FIXME("Cannot set time format (hr = %x)\n", hr); lpParms->dwReturn = 0; break; } hr = IMediaSeeking_GetDuration(wma->seek, &duration); if (FAILED(hr) || duration < 0) { FIXME("Cannot read duration (hr = %x)\n", hr); lpParms->dwReturn = 0; } else if (wma->time_format != MCI_FORMAT_MILLISECONDS) lpParms->dwReturn = duration; else lpParms->dwReturn = duration / 10000; break; } case MCI_STATUS_POSITION: { REFERENCE_TIME curpos; hr = IMediaSeeking_GetCurrentPosition(wma->seek, &curpos); if (FAILED(hr)) { FIXME("Cannot get position (hr = %x)\n", hr); return MCIERR_INTERNAL; } lpParms->dwReturn = curpos / 10000; break; } case MCI_STATUS_NUMBER_OF_TRACKS: FIXME("MCI_STATUS_NUMBER_OF_TRACKS not implemented yet\n"); return MCIERR_UNRECOGNIZED_COMMAND; case MCI_STATUS_MODE: { LONG state = State_Stopped; IMediaControl_GetState(wma->pmctrl, -1, &state); if (state == State_Stopped) lpParms->dwReturn = MCI_MODE_STOP; else if (state == State_Running) { LONG code; LONG_PTR p1, p2; lpParms->dwReturn = MCI_MODE_PLAY; do { hr = IMediaEvent_GetEvent(wma->mevent, &code, &p1, &p2, 0); if (hr == S_OK && code == EC_COMPLETE){ lpParms->dwReturn = MCI_MODE_STOP; IMediaControl_Stop(wma->pmctrl); } } while (hr == S_OK); } else if (state == State_Paused) lpParms->dwReturn = MCI_MODE_PAUSE; break; } case MCI_STATUS_MEDIA_PRESENT: FIXME("MCI_STATUS_MEDIA_PRESENT not implemented yet\n"); return MCIERR_UNRECOGNIZED_COMMAND; case MCI_STATUS_TIME_FORMAT: lpParms->dwReturn = wma->time_format; break; case MCI_STATUS_READY: FIXME("MCI_STATUS_READY not implemented yet\n"); return MCIERR_UNRECOGNIZED_COMMAND; case MCI_STATUS_CURRENT_TRACK: FIXME("MCI_STATUS_CURRENT_TRACK not implemented yet\n"); return MCIERR_UNRECOGNIZED_COMMAND; default: FIXME("Unknown command %08X\n", lpParms->dwItem); return MCIERR_UNRECOGNIZED_COMMAND; } if (dwFlags & MCI_NOTIFY) mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wDevID, MCI_NOTIFY_SUCCESSFUL); return 0; }