Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
bb2d13b4
Commit
bb2d13b4
authored
Apr 18, 2018
by
Anton Romanov
Committed by
Alexandre Julliard
Apr 19, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wmp: Add seeking and duration.
Signed-off-by:
Anton Romanov
<
theli.ua@gmail.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
63ccdfea
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
97 additions
and
12 deletions
+97
-12
player.c
dlls/wmp/player.c
+55
-10
media.c
dlls/wmp/tests/media.c
+38
-1
rsrc.rc
dlls/wmp/tests/rsrc.rc
+1
-1
test.mp3
dlls/wmp/tests/test.mp3
+0
-0
wmp_private.h
dlls/wmp/wmp_private.h
+3
-0
No files found.
dlls/wmp/player.c
View file @
bb2d13b4
...
...
@@ -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
)
...
...
@@ -1429,10 +1442,15 @@ 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
.
0
f
;
}
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
,
&
currentPosition
);
*
pdCurrentPosition
=
(
DOUBLE
)
currentPosition
/
10000000
.
0
f
;
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
)
...
...
dlls/wmp/tests/media.c
View file @
bb2d13b4
...
...
@@ -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
(
5
000
,
1
,
&
playing_event
);
res
=
pump_messages
(
1
000
,
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
;
}
...
...
dlls/wmp/tests/rsrc.rc
View file @
bb2d13b4
...
...
@@ -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 outpu
t.mp3 */
/* ffmpeg -
f lavfi -i anullsrc -t 3 -acodec libmp3lame -b:a 64k dlls/wmp/tests/tes
t.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 */
...
...
dlls/wmp/tests/test.mp3
View file @
bb2d13b4
No preview for this file type
dlls/wmp/wmp_private.h
View file @
bb2d13b4
...
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment