Signed-off-by: Anton Romanov <theli.ua(a)gmail.com>
---
Changed test media file that works more consistently across all windows VMs
as far as duration goes. Hopefully this'll help different versions of
gstreamer as well.
dlls/wmp/player.c | 65 +++++++++++++++++++++++++++++++++-------
dlls/wmp/tests/media.c | 38 +++++++++++++++++++++++
dlls/wmp/tests/rsrc.rc | 2 +-
dlls/wmp/tests/test.mp3 | Bin 240333 -> 240333 bytes
dlls/wmp/wmp_private.h | 3 ++
5 files changed, 97 insertions(+), 11 deletions(-)
diff --git a/dlls/wmp/player.c b/dlls/wmp/player.c
index f4ce62a447..8448916a80 100644
--- a/dlls/wmp/player.c
+++ b/dlls/wmp/player.c
@@ -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)
diff --git a/dlls/wmp/tests/media.c b/dlls/wmp/tests/media.c
index c2cd1cf941..e327c1c213 100644
--- a/dlls/wmp/tests/media.c
+++ b/dlls/wmp/tests/media.c
@@ -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);
@@ -380,6 +389,34 @@ 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 = 15.0;
+ 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((int)duration >= 15.0, "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) == 60 || broken(round(duration) == 57),
+ "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 +451,7 @@ playback_skip:
IOleObject_Release(oleobj);
DeleteFileW(filename);
SysFreeString(filename);
+ SysFreeString(bstrcurrentPosition);
return test_ran;
}
diff --git a/dlls/wmp/tests/rsrc.rc b/dlls/wmp/tests/rsrc.rc
index a92079e798..7ce8c4b687 100644
--- a/dlls/wmp/tests/rsrc.rc
+++ b/dlls/wmp/tests/rsrc.rc
@@ -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=r=48000:cl=4 -t 60 -acodec libmp3lame -aq 4 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 */
diff --git a/dlls/wmp/tests/test.mp3 b/dlls/wmp/tests/test.mp3
index 149a2cd346ee52ae179c46198ce290a5dd4d6251..a8f22ce279cda0861cefe6851dcae0bced1372ad 100644
GIT binary patch
literal 240333
zcmeIxVWgdP9Ki9X?nXsMMod)NB697zTaCn0m$o+1ZbrsTx%MKf#3W)&WJV%Il2WE6
ziHzBlD@`Oa#*{=N5s5^ataI*ObidzMn|9cX@AKk0|L^mh=YM|Z<D4xI%&r*5$8GaF
zcFc`lR}I6|wmth7Hr_qGX?A*M{raW57f$ET%`Yy?3(GD07M>cdM$cV)YMA=q?O|%=
zHP>Cg>W0-fuDR*vTi4!x$DPwNvv+N}=ibft&po(x`@@gS?|f|6?mbT|?0s_IGtcgS
z?)euE9DMPmLx*2}<<-~Uc=N4y-aYdEhaY|X$+6=nK3)9$)R$j<{mtn!XTSaahaZ3X
z`IldR`~8nU|N8r%@h6Xle0((I%<=(;wO4N*-y6?y^t0)mOY8qm=g+PFVwhSSu6l2D
z?UrHKa9|i#Y`bs!+|n0)bbPRuE?xX-y#Km`+MkdA@BJV0{FizErzbrBYZIRT<b>z{
zZo>1oKY!56YyAJpXSoR1`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCF
zMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|
z(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3a
zk44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(
z`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@I
zm5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk
z*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!
z!<COk*!j@Im5)W(`Ow3ak44z|(8HCFMcDb!!<COk*!j@Im5)W(`Ow3ak44z|(8F~F
X_;{pC>Wi5FlJ@hP+utJWN&EZ@Ay;|i
literal 240333
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
diff --git a/dlls/wmp/wmp_private.h b/dlls/wmp/wmp_private.h
index 3792e52abd..e8d534803f 100644
--- a/dlls/wmp/wmp_private.h
+++ b/dlls/wmp/wmp_private.h
@@ -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;
--
2.17.0