wmp: Add seeking and duration.
Signed-off-by: Anton Romanov <theli.ua@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
63ccdfeaaa
commit
bb2d13b44c
|
@ -1396,8 +1396,21 @@ static HRESULT WINAPI WMPControls_Invoke(IWMPControls *iface, DISPID dispIdMembe
|
|||
static HRESULT WINAPI WMPControls_get_isAvailable(IWMPControls *iface, BSTR bstrItem, VARIANT_BOOL *pIsAvailable)
|
||||
{
|
||||
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
|
||||
FIXME("(%p)->(%s)\n", This, debugstr_w(bstrItem));
|
||||
return E_NOTIMPL;
|
||||
static const WCHAR currentPosition[] = {'c','u','r','r','e','n','t','P','o','s','i','t','i','o','n',0};
|
||||
TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrItem), pIsAvailable);
|
||||
if (!This->filter_graph) {
|
||||
*pIsAvailable = VARIANT_FALSE;
|
||||
} else if (strcmpW(currentPosition, bstrItem) == 0) {
|
||||
DWORD capabilities;
|
||||
IMediaSeeking_GetCapabilities(This->media_seeking, &capabilities);
|
||||
*pIsAvailable = (capabilities & AM_SEEKING_CanSeekAbsolute) ?
|
||||
VARIANT_TRUE : VARIANT_FALSE;
|
||||
} else {
|
||||
FIXME("%s not implemented\n", debugstr_w(bstrItem));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WMPControls_play(IWMPControls *iface)
|
||||
|
@ -1428,11 +1441,16 @@ static HRESULT WINAPI WMPControls_play(IWMPControls *iface)
|
|||
|
||||
if (SUCCEEDED(hres))
|
||||
hres = IGraphBuilder_RenderFile(This->filter_graph, media->url, NULL);
|
||||
if (SUCCEEDED(hres))
|
||||
update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, wmposMediaOpen);
|
||||
if (SUCCEEDED(hres))
|
||||
hres = IGraphBuilder_QueryInterface(This->filter_graph, &IID_IMediaControl,
|
||||
(void**)&This->media_control);
|
||||
if (SUCCEEDED(hres))
|
||||
update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, wmposMediaOpen);
|
||||
hres = IGraphBuilder_QueryInterface(This->filter_graph, &IID_IMediaSeeking,
|
||||
(void**)&This->media_seeking);
|
||||
if (SUCCEEDED(hres))
|
||||
hres = IMediaSeeking_SetTimeFormat(This->media_seeking, &TIME_FORMAT_MEDIA_TIME);
|
||||
if (SUCCEEDED(hres))
|
||||
hres = IGraphBuilder_QueryInterface(This->filter_graph, &IID_IMediaEvent,
|
||||
(void**)&This->media_event);
|
||||
|
@ -1459,7 +1477,10 @@ static HRESULT WINAPI WMPControls_play(IWMPControls *iface)
|
|||
}
|
||||
|
||||
if (SUCCEEDED(hres)) {
|
||||
LONGLONG duration;
|
||||
update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, wmppsPlaying);
|
||||
if (SUCCEEDED(IMediaSeeking_GetDuration(This->media_seeking, &duration)))
|
||||
media->duration = (DOUBLE)duration / 10000000.0f;
|
||||
} else {
|
||||
update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, wmppsUndefined);
|
||||
}
|
||||
|
@ -1482,11 +1503,14 @@ static HRESULT WINAPI WMPControls_stop(IWMPControls *iface)
|
|||
if (This->media_event) {
|
||||
IMediaEvent_Release(This->media_event);
|
||||
}
|
||||
|
||||
if (This->media_seeking) {
|
||||
IMediaSeeking_Release(This->media_seeking);
|
||||
}
|
||||
IGraphBuilder_Release(This->filter_graph);
|
||||
This->filter_graph = NULL;
|
||||
This->media_control = NULL;
|
||||
This->media_event = NULL;
|
||||
This->media_seeking = NULL;
|
||||
|
||||
update_state(This, DISPID_WMPCOREEVENT_OPENSTATECHANGE, wmposPlaylistOpenNoMedia);
|
||||
update_state(This, DISPID_WMPCOREEVENT_PLAYSTATECHANGE, wmppsStopped);
|
||||
|
@ -1517,15 +1541,33 @@ static HRESULT WINAPI WMPControls_fastReverse(IWMPControls *iface)
|
|||
static HRESULT WINAPI WMPControls_get_currentPosition(IWMPControls *iface, DOUBLE *pdCurrentPosition)
|
||||
{
|
||||
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
|
||||
FIXME("(%p)->(%p)\n", This, pdCurrentPosition);
|
||||
return E_NOTIMPL;
|
||||
HRESULT hres;
|
||||
LONGLONG currentPosition;
|
||||
|
||||
TRACE("(%p)->(%p)\n", This, pdCurrentPosition);
|
||||
if (!This->media_seeking)
|
||||
return S_FALSE;
|
||||
|
||||
hres = IMediaSeeking_GetCurrentPosition(This->media_seeking, ¤tPosition);
|
||||
*pdCurrentPosition = (DOUBLE) currentPosition / 10000000.0f;
|
||||
TRACE("hres: %d, pos: %f\n", hres, *pdCurrentPosition);
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WMPControls_put_currentPosition(IWMPControls *iface, DOUBLE dCurrentPosition)
|
||||
{
|
||||
LONGLONG Current;
|
||||
HRESULT hres;
|
||||
WindowsMediaPlayer *This = impl_from_IWMPControls(iface);
|
||||
FIXME("(%p)->(%f)\n", This, dCurrentPosition);
|
||||
return E_NOTIMPL;
|
||||
TRACE("(%p)->(%f)\n", This, dCurrentPosition);
|
||||
if (!This->media_seeking)
|
||||
return S_FALSE;
|
||||
|
||||
Current = 10000000 * dCurrentPosition;
|
||||
hres = IMediaSeeking_SetPositions(This->media_seeking, &Current,
|
||||
AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning);
|
||||
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WMPControls_get_currentPositionString(IWMPControls *iface, BSTR *pbstrCurrentPosition)
|
||||
|
@ -1762,9 +1804,12 @@ static HRESULT WINAPI WMPMedia_getMarkerName(IWMPMedia *iface, LONG MarkerNum, B
|
|||
|
||||
static HRESULT WINAPI WMPMedia_get_duration(IWMPMedia *iface, DOUBLE *pDuration)
|
||||
{
|
||||
/* MSDN: If this property is used with a media item other than the one
|
||||
* specified in Player.currentMedia, it may not contain a valid value. */
|
||||
WMPMedia *This = impl_from_IWMPMedia(iface);
|
||||
FIXME("(%p)->(%p)\n", This, pDuration);
|
||||
return E_NOTIMPL;
|
||||
TRACE("(%p)->(%p)\n", This, pDuration);
|
||||
*pDuration = This->duration;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI WMPMedia_get_durationString(IWMPMedia *iface, BSTR *pbstrDuration)
|
||||
|
|
|
@ -303,6 +303,11 @@ static BOOL test_wmp(void)
|
|||
static DWORD dw = 100;
|
||||
IWMPSettings *settings;
|
||||
BOOL test_ran = TRUE;
|
||||
DOUBLE duration;
|
||||
VARIANT_BOOL vbool;
|
||||
IWMPMedia *media;
|
||||
static const WCHAR currentPosition[] = {'c','u','r','r','e','n','t','P','o','s','i','t','i','o','n',0};
|
||||
BSTR bstrcurrentPosition = SysAllocString(currentPosition);
|
||||
|
||||
hres = CoCreateInstance(&CLSID_WindowsMediaPlayer, NULL, CLSCTX_INPROC_SERVER, &IID_IOleObject, (void**)&oleobj);
|
||||
if(hres == REGDB_E_CLASSNOTREG) {
|
||||
|
@ -338,6 +343,10 @@ static BOOL test_wmp(void)
|
|||
ok(hres == S_OK, "get_controls failed: %08x\n", hres);
|
||||
ok(controls != NULL, "controls = NULL\n");
|
||||
|
||||
hres = IWMPControls_get_isAvailable(controls, bstrcurrentPosition, &vbool);
|
||||
ok(hres == S_OK, "IWMPControls_get_isAvailable failed: %08x\n", hres);
|
||||
ok(vbool == VARIANT_FALSE, "unexpected value\n");
|
||||
|
||||
hres = IWMPControls_play(controls);
|
||||
ok(hres == NS_S_WMPCORE_COMMAND_NOT_AVAILABLE, "IWMPControls_play is available: %08x\n", hres);
|
||||
|
||||
|
@ -364,7 +373,7 @@ static BOOL test_wmp(void)
|
|||
SET_EXPECT(OPENSTATE, wmposMediaOpening);
|
||||
hres = IWMPControls_play(controls);
|
||||
ok(hres == S_OK, "IWMPControls_play failed: %08x\n", hres);
|
||||
res = pump_messages(5000, 1, &playing_event);
|
||||
res = pump_messages(1000, 1, &playing_event);
|
||||
ok(res == WAIT_OBJECT_0 || broken(res == WAIT_TIMEOUT), "Timed out while waiting for media to become ready\n");
|
||||
if (res == WAIT_TIMEOUT) {
|
||||
/* This happens on Vista Ultimate 64 vms
|
||||
|
@ -380,6 +389,33 @@ static BOOL test_wmp(void)
|
|||
/* MediaOpening happens only on xp, 2003 */
|
||||
CLEAR_CALLED(OPENSTATE, wmposMediaOpening);
|
||||
|
||||
hres = IWMPControls_get_isAvailable(controls, bstrcurrentPosition, &vbool);
|
||||
ok(hres == S_OK, "IWMPControls_get_isAvailable failed: %08x\n", hres);
|
||||
ok(vbool == VARIANT_TRUE, "unexpected value\n");
|
||||
|
||||
duration = 0.0;
|
||||
hres = IWMPControls_get_currentPosition(controls, &duration);
|
||||
ok(hres == S_OK, "IWMPControls_get_currentPosition failed: %08x\n", hres);
|
||||
ok((int)duration == 0, "unexpected value %f\n", duration);
|
||||
|
||||
duration = 1.1;
|
||||
hres = IWMPControls_put_currentPosition(controls, duration);
|
||||
ok(hres == S_OK, "IWMPControls_put_currentPosition failed: %08x\n", hres);
|
||||
|
||||
duration = 0.0;
|
||||
hres = IWMPControls_get_currentPosition(controls, &duration);
|
||||
ok(hres == S_OK, "IWMPControls_get_currentPosition failed: %08x\n", hres);
|
||||
/* builtin quartz does not handle this currently and resets to 0.0, works
|
||||
* with native quartz */
|
||||
todo_wine ok(duration >= 1.05 /* save some fp errors */, "unexpected value %f\n", duration);
|
||||
|
||||
hres = IWMPPlayer4_get_currentMedia(player4, &media);
|
||||
ok(hres == S_OK, "IWMPPlayer4_get_currentMedia failed: %08x\n", hres);
|
||||
hres = IWMPMedia_get_duration(media, &duration);
|
||||
ok(hres == S_OK, "IWMPMedia_get_duration failed: %08x\n", hres);
|
||||
ok(round(duration) == 3, "unexpected value: %f\n", duration);
|
||||
IWMPMedia_Release(media);
|
||||
|
||||
SET_EXPECT(PLAYSTATE, wmppsStopped);
|
||||
/* The following happens on wine only since we close media on stop */
|
||||
SET_EXPECT(OPENSTATE, wmposPlaylistOpenNoMedia);
|
||||
|
@ -414,6 +450,7 @@ playback_skip:
|
|||
IOleObject_Release(oleobj);
|
||||
DeleteFileW(filename);
|
||||
SysFreeString(filename);
|
||||
SysFreeString(bstrcurrentPosition);
|
||||
|
||||
return test_ran;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include "windef.h"
|
||||
|
||||
/* ffmpeg -ar 48000 -t 60 -f s16le -acodec pcm_s16le -ac 2 -i /dev/zero -acodec libmp3lame -aq 4 output.mp3 */
|
||||
/* ffmpeg -f lavfi -i anullsrc -t 3 -acodec libmp3lame -b:a 64k dlls/wmp/tests/test.mp3 */
|
||||
/* @makedep: test.mp3 */
|
||||
test.mp3 RCDATA "test.mp3"
|
||||
/* ffmpeg -ar 48000 -t 1 -f s16le -acodec pcm_s16le -ac 2 -i /dev/zero -acodec libmp3lame -aq 4 test1s.mp3 */
|
||||
|
|
Binary file not shown.
|
@ -42,6 +42,8 @@ typedef struct {
|
|||
LONG ref;
|
||||
|
||||
WCHAR *url;
|
||||
|
||||
DOUBLE duration;
|
||||
} WMPMedia;
|
||||
|
||||
struct WindowsMediaPlayer {
|
||||
|
@ -76,6 +78,7 @@ struct WindowsMediaPlayer {
|
|||
IGraphBuilder* filter_graph;
|
||||
IMediaControl* media_control;
|
||||
IMediaEvent* media_event;
|
||||
IMediaSeeking* media_seeking;
|
||||
|
||||
/* Async event notification */
|
||||
HWND msg_window;
|
||||
|
|
Loading…
Reference in New Issue