/*************************************************************************** * MCIQTZ_mciSeek [internal] */ static DWORD MCIQTZ_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) { WINE_MCIQTZ* wma; HRESULT hr; IMediaPosition* pmpos; LONGLONG newpos; 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; MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL); if (dwFlags & MCI_SEEK_TO_START) { newpos = 0; } else if (dwFlags & MCI_SEEK_TO_END) { FIXME("MCI_SEEK_TO_END not implemented yet\n"); return MCIERR_INTERNAL; } else if (dwFlags & MCI_TO) { FIXME("MCI_TO not implemented yet\n"); return MCIERR_INTERNAL; } else { WARN("dwFlag doesn't tell where to seek to...\n"); return MCIERR_MISSING_PARAMETER; } 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_put_CurrentPosition(pmpos, newpos); if (FAILED(hr)) { FIXME("Cannot set position (hr = %x)\n", hr); IMediaPosition_Release(pmpos); return MCIERR_INTERNAL; } IMediaPosition_Release(pmpos); if (dwFlags & MCI_NOTIFY) mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wDevID, MCI_NOTIFY_SUCCESSFUL); return 0; }
static HRESULT WINAPI MediaPositionPassThru_CanSeekBackward(IMediaPosition *iface, LONG *pCanSeekBackward) { PassThruImpl *This = impl_from_IMediaPosition(iface); IMediaPosition *pos; HRESULT hr; TRACE("(%p)\n", pCanSeekBackward); hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos); if (SUCCEEDED(hr)) { hr = IMediaPosition_CanSeekBackward(pos, pCanSeekBackward); IMediaPosition_Release(pos); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaPositionPassThru_get_Rate(IMediaPosition *iface, double *pdRate) { PassThruImpl *This = impl_from_IMediaPosition(iface); IMediaPosition *pos; HRESULT hr; TRACE("(%p)\n", pdRate); hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos); if (SUCCEEDED(hr)) { hr = IMediaPosition_get_Rate(pos, pdRate); IMediaPosition_Release(pos); } else return E_NOTIMPL; return hr; }
static HRESULT WINAPI MediaPositionPassThru_put_PrerollTime(IMediaPosition *iface, REFTIME llTime) { PassThruImpl *This = impl_from_IMediaPosition(iface); IMediaPosition *pos; HRESULT hr; TRACE("(%s)\n", wine_dbgstr_longlong(llTime)); hr = get_connected(This, &IID_IMediaPosition, (LPVOID*)&pos); if (SUCCEEDED(hr)) { hr = IMediaPosition_put_PrerollTime(pos, llTime); IMediaPosition_Release(pos); } else return E_NOTIMPL; return hr; }
/*************************************************************************** * 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; }