static ULONG WINAPI IAMMultiMediaStreamImpl_Release(IAMMultiMediaStream* iface) { IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); ULONG ref = InterlockedDecrement(&This->ref); ULONG i; TRACE("(%p/%p)\n", iface, This); if (!ref) { for(i = 0; i < This->nbStreams; i++) IMediaStream_Release(This->pStreams[i]); if (This->ipin) IPin_Release(This->ipin); if (This->media_stream_filter) IBaseFilter_Release(This->media_stream_filter); if (This->media_seeking) IMediaSeeking_Release(This->media_seeking); if (This->media_control) IMediaControl_Release(This->media_control); if (This->pFilterGraph) IGraphBuilder_Release(This->pFilterGraph); HeapFree(GetProcessHeap(), 0, This); } return ref; }
/*************************************************************************** * MCIQTZ_mciClose [internal] */ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { WINE_MCIQTZ* wma; TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); wma = MCIQTZ_mciGetOpenDev(wDevID); if (!wma) return MCIERR_INVALID_DEVICE_ID; MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL); if (wma->opened) { IVideoWindow_Release(wma->vidwin); IBasicVideo_Release(wma->vidbasic); IMediaSeeking_Release(wma->seek); IMediaEvent_Release(wma->mevent); IGraphBuilder_Release(wma->pgraph); IMediaControl_Release(wma->pmctrl); if (wma->uninit) CoUninitialize(); wma->opened = FALSE; } return 0; }
static HRESULT WINAPI MediaSeekingPassThru_GetCurrentPosition(IMediaSeeking * iface, LONGLONG * pCurrent) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr = S_OK; TRACE("(%p/%p)->(%p)\n", iface, This, pCurrent); if (!pCurrent) return E_POINTER; EnterCriticalSection(&This->time_cs); if (This->timevalid) *pCurrent = This->time_earliest; else hr = E_FAIL; LeaveCriticalSection(&This->time_cs); if (SUCCEEDED(hr)) { hr = IMediaSeeking_ConvertTimeFormat(iface, pCurrent, NULL, *pCurrent, &TIME_FORMAT_MEDIA_TIME); return hr; } hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_GetCurrentPosition(seek, pCurrent); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
/*** IAMMultiMediaStream methods ***/ static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* iface, STREAM_TYPE StreamType, DWORD dwFlags, IGraphBuilder* pFilterGraph) { IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); HRESULT hr = S_OK; const WCHAR filternameW[] = {'M','e','d','i','a','S','t','r','e','a','m','F','i','l','t','e','r',0}; TRACE("(%p/%p)->(%x,%x,%p)\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph); if (pFilterGraph) { This->pFilterGraph = pFilterGraph; IGraphBuilder_AddRef(This->pFilterGraph); } else { hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&This->pFilterGraph); } if (SUCCEEDED(hr)) { This->StreamType = StreamType; hr = IGraphBuilder_QueryInterface(This->pFilterGraph, &IID_IMediaSeeking, (void**)&This->media_seeking); if (SUCCEEDED(hr)) IGraphBuilder_QueryInterface(This->pFilterGraph, &IID_IMediaControl, (void**)&This->media_control); if (SUCCEEDED(hr)) hr = CoCreateInstance(&CLSID_MediaStreamFilter, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&This->media_stream_filter); if (SUCCEEDED(hr)) IGraphBuilder_AddFilter(This->pFilterGraph, This->media_stream_filter, filternameW); if (SUCCEEDED(hr)) { IMediaEventEx* media_event = NULL; hr = IGraphBuilder_QueryInterface(This->pFilterGraph, &IID_IMediaEventEx, (void**)&media_event); if (SUCCEEDED(hr)) hr = IMediaEventEx_GetEventHandle(media_event, &This->event); if (SUCCEEDED(hr)) hr = IMediaEventEx_SetNotifyFlags(media_event, AM_MEDIAEVENT_NONOTIFY); if (media_event) IMediaEventEx_Release(media_event); } } if (FAILED(hr)) { if (This->media_stream_filter) IBaseFilter_Release(This->media_stream_filter); This->media_stream_filter = NULL; if (This->media_seeking) IMediaSeeking_Release(This->media_seeking); This->media_seeking = NULL; if (This->media_control) IMediaControl_Release(This->media_control); This->media_control = NULL; if (This->pFilterGraph) IGraphBuilder_Release(This->pFilterGraph); This->pFilterGraph = NULL; } return hr; }
static HRESULT WINAPI MediaSeekingPassThru_SetPositions(IMediaSeeking * iface, LONGLONG * pCurrent, DWORD dwCurrentFlags, LONGLONG * pStop, DWORD dwStopFlags) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p,%x,%p,%x)\n", iface, This, pCurrent, dwCurrentFlags, pStop, dwStopFlags); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_SetPositions(seek, pCurrent, dwCurrentFlags, pStop, dwStopFlags); IMediaSeeking_Release(seek); } else if (hr == VFW_E_NOT_CONNECTED) hr = S_OK; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_GetPreroll(IMediaSeeking * iface, LONGLONG * pPreroll) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p)\n", pPreroll); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_GetPreroll(seek, pPreroll); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_GetRate(IMediaSeeking * iface, double * dRate) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p)\n", iface, This, dRate); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_GetRate(seek, dRate); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_GetAvailable(IMediaSeeking * iface, LONGLONG * pEarliest, LONGLONG * pLatest) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p,%p)\n", iface, This, pEarliest, pLatest); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_GetAvailable(seek, pEarliest, pLatest); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_GetPositions(IMediaSeeking * iface, LONGLONG * pCurrent, LONGLONG * pStop) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p, %p)\n", iface, This, pCurrent, pStop); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_GetPositions(seek, pCurrent, pStop); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_ConvertTimeFormat(IMediaSeeking * iface, LONGLONG * pTarget, const GUID * pTargetFormat, LONGLONG Source, const GUID * pSourceFormat) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p,%s,%x%08x,%s)\n", iface, This, pTarget, debugstr_guid(pTargetFormat), (DWORD)(Source>>32), (DWORD)Source, debugstr_guid(pSourceFormat)); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_ConvertTimeFormat(seek, pTarget, pTargetFormat, Source, pSourceFormat); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_SetTimeFormat(IMediaSeeking * iface, const GUID * pFormat) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%s)\n", iface, This, debugstr_guid(pFormat)); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_SetTimeFormat(seek, pFormat); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_QueryPreferredFormat(IMediaSeeking * iface, GUID * pFormat) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p)\n", iface, This, pFormat); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_QueryPreferredFormat(seek, pFormat); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaSeekingPassThru_CheckCapabilities(IMediaSeeking * iface, DWORD * pCapabilities) { PassThruImpl *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; TRACE("(%p/%p)->(%p)\n", iface, This, pCapabilities); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_CheckCapabilities(seek, pCapabilities); IMediaSeeking_Release(seek); } else return E_NOTIMPL; return hr; }
/*************************************************************************** * MCIQTZ_mciOpen [internal] */ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms) { WINE_MCIQTZ* wma; HRESULT hr; DWORD style = 0; RECT rc = { 0, 0, 0, 0 }; 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; MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL); hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); wma->uninit = SUCCEEDED(hr); hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&wma->pgraph); if (FAILED(hr)) { TRACE("Cannot create filtergraph (hr = %x)\n", hr); goto err; } hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaControl, (LPVOID*)&wma->pmctrl); if (FAILED(hr)) { TRACE("Cannot get IMediaControl interface (hr = %x)\n", hr); goto err; } hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaSeeking, (void**)&wma->seek); if (FAILED(hr)) { TRACE("Cannot get IMediaSeeking interface (hr = %x)\n", hr); goto err; } hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaEvent, (void**)&wma->mevent); if (FAILED(hr)) { TRACE("Cannot get IMediaEvent interface (hr = %x)\n", hr); goto err; } hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IVideoWindow, (void**)&wma->vidwin); if (FAILED(hr)) { TRACE("Cannot get IVideoWindow interface (hr = %x)\n", hr); goto err; } hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IBasicVideo, (void**)&wma->vidbasic); if (FAILED(hr)) { TRACE("Cannot get IBasicVideo interface (hr = %x)\n", hr); goto err; } if (!(dwFlags & MCI_OPEN_ELEMENT) || (dwFlags & MCI_OPEN_ELEMENT_ID)) { TRACE("Wrong dwFlags %x\n", dwFlags); goto err; } if (!lpOpenParms->lpstrElementName || !lpOpenParms->lpstrElementName[0]) { TRACE("Invalid filename specified\n"); goto err; } TRACE("Open file %s\n", debugstr_w(lpOpenParms->lpstrElementName)); hr = IGraphBuilder_RenderFile(wma->pgraph, lpOpenParms->lpstrElementName, NULL); if (FAILED(hr)) { TRACE("Cannot render file (hr = %x)\n", hr); goto err; } IVideoWindow_put_AutoShow(wma->vidwin, OAFALSE); IVideoWindow_put_Visible(wma->vidwin, OAFALSE); if (dwFlags & MCI_DGV_OPEN_WS) style = lpOpenParms->dwStyle; if (dwFlags & MCI_DGV_OPEN_PARENT) { IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpOpenParms->hWndParent); IVideoWindow_put_WindowState(wma->vidwin, SW_HIDE); IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD); IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpOpenParms->hWndParent); GetClientRect(lpOpenParms->hWndParent, &rc); IVideoWindow_SetWindowPosition(wma->vidwin, rc.left, rc.top, rc.right - rc.top, rc.bottom - rc.top); wma->parent = (HWND)lpOpenParms->hWndParent; } else if (style) IVideoWindow_put_WindowStyle(wma->vidwin, style); IBasicVideo_GetVideoSize(wma->vidbasic, &rc.right, &rc.bottom); wma->opened = TRUE; if (dwFlags & MCI_NOTIFY) mciDriverNotify(HWND_32(LOWORD(lpOpenParms->dwCallback)), wDevID, MCI_NOTIFY_SUCCESSFUL); return 0; err: if (wma->vidbasic) IBasicVideo_Release(wma->vidbasic); wma->vidbasic = NULL; if (wma->seek) IMediaSeeking_Release(wma->seek); wma->seek = NULL; if (wma->vidwin) IVideoWindow_Release(wma->vidwin); wma->vidwin = NULL; if (wma->pgraph) IGraphBuilder_Release(wma->pgraph); wma->pgraph = NULL; if (wma->mevent) IMediaEvent_Release(wma->mevent); wma->mevent = NULL; if (wma->pmctrl) IMediaControl_Release(wma->pmctrl); wma->pmctrl = NULL; if (wma->uninit) CoUninitialize(); wma->uninit = 0; return MCIERR_INTERNAL; }
/*************************************************************************** * 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: { IMediaSeeking *seek; 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 = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaSeeking, (void**)&seek); if (FAILED(hr)) { FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr); return MCIERR_INTERNAL; } hr = IMediaSeeking_SetTimeFormat(seek, &format); if (FAILED(hr)) { IMediaSeeking_Release(seek); FIXME("Cannot set time format (hr = %x)\n", hr); lpParms->dwReturn = 0; break; } hr = IMediaSeeking_GetDuration(seek, &duration); IMediaSeeking_Release(seek); 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: { IMediaPosition* pmpos; REFTIME curpos; hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaPosition, (LPVOID*)&pmpos); if (FAILED(hr)) { FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr); return MCIERR_INTERNAL; } hr = IMediaPosition_get_CurrentPosition(pmpos, &curpos); if (FAILED(hr)) { FIXME("Cannot get position (hr = %x)\n", hr); IMediaPosition_Release(pmpos); return MCIERR_INTERNAL; } IMediaPosition_Release(pmpos); 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: FIXME("MCI_STATUS_MODE not implemented yet\n"); return MCIERR_UNRECOGNIZED_COMMAND; 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; }