On 12/03/18 23:34, Anton Romanov wrote:
static HRESULT WINAPI WMPPlayer4_get_openState(IWMPPlayer4 *iface, WMPOpenState *pwmpos) @@ -1357,16 +1366,53 @@ static HRESULT WINAPI WMPControls_get_isAvailable(IWMPControls *iface, BSTR bstr
static HRESULT WINAPI WMPControls_play(IWMPControls *iface) { + HRESULT hres; WindowsMediaPlayer *This = impl_from_IWMPControls(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + WMPMedia *media; + TRACE("(%p)\n", This); + if (!This->wmpmedia) { + return NS_S_WMPCORE_COMMAND_NOT_AVAILABLE; + } + media = impl_from_IWMPMedia(This->wmpmedia); + if (!This->pFilterGraph) { + hres = CoCreateInstance(&CLSID_FilterGraph, + NULL, + CLSCTX_INPROC_SERVER, + &IID_IGraphBuilder, + (void **)&This->pFilterGraph); + if (SUCCEEDED(hres)) + hres = IGraphBuilder_RenderFile(This->pFilterGraph, media->url, NULL); + if (SUCCEEDED(hres)) + hres = IGraphBuilder_QueryInterface(This->pFilterGraph, &IID_IMediaControl, + (void**)&This->media_control); + } + hres = IMediaControl_Run(This->media_control);
This will crash if either of the above calls fail.
+ if (hres == S_FALSE) { + OAFilterState fs; + hres = IMediaControl_GetState(This->media_control, 1000, &fs); + if (hres != S_OK || fs != State_Running) { + hres = S_FALSE; + } + }
1 second seems arbitrary, especially given that IWMPControls has no similar method to force a state change.
+ return hres; }
This function on the whole (and several others in the file) could use some spacing.