 |
AutoHotkey Community Let's help each other out
|
| View previous topic :: View next topic |
| Author |
Message |
Ron1
Joined: 20 Dec 2007 Posts: 39 Location: United States of America
|
Posted: Mon Jul 14, 2008 8:36 pm Post subject: Can AHK get "play state" of Windows Media Player? |
|
|
Using, as a model, Lexikos excellent script on playing a specific track on a CD-ROM in Windows Media Player 11, I am making a second effort to retrieve the play state of WMP 11 for another purpose, but still unsuccessfully. Any thoughts on where I am going wrong would be gratefully received.
I always get 0 [= undefined] for the play state, no matter what the actual play state. Sean kindly suggested that the play state may only be retrievable if initially set with COM, so I attempted to do that first, which I unfortunately failed to do, so my test for a functioning play state thereafter is not meaningful.
In the first part of the following code, I have extracted the key commands from Lexikos model, and show that they work, to get the number of CD-ROM drives on the computer (1) and to get the number of tracks on the loaded CD (14), both of which are correct results. Then I go on to invoke a "property" called "playState" that the MSDN documentation (URL below) lists as parallel to the property "cdromCollection". Because of that parallel relationship, I use script parallel to that used with cdromCollection. But while cdromCollection works, playState does not work. [My thanks to "Guest" for pointing me to playState.]
I use the hot key P to trigger the routine, so that I can be in Windows Media Player 11, with a CD playing or not, when I hit the P.
| Code: | P::
{
COM_Init()
; Get the number of CD-ROM drives in the computer
wmp := COM_CreateObject("WMPlayer.OCX") ; WORKS (returns number > 0)
cdroms := COM_Invoke(wmp, "cdromCollection") ; WORKS (returns number > 0)
number_of_CD_ROM_drives := COM_Invoke(cdroms, "count") ; WORKS (returns 1, which is correct
; number of CD-ROM drives)
; Get the number of tracks on the CD-ROM currently playing
which_CD_ROM = 0 ; the first (and only CD_ROM on this computer) is number 0
cdrom := COM_Invoke(cdroms, "item", which_CD_ROM) ; WORKS (returns number > 0)
playlist := COM_Invoke(cdrom, "playlist") ; WORKS (returns number > 0)
tracks_on_CD := COM_Invoke(playlist, "count") ; WORKS (returns 14, which is correct
; number of tracks on CD)
; Get the play state of the Windows Media Player
; (0 = undefined, 1 = stopped, 2 = paused, 3 = playing, etc)
playState := COM_Invoke(wmp, "playState") ; FAILS (returns 0 [= undefined],
; no matter what the actual play state
; but does NOT return a null)
; BEGIN SECOND EFFORT TO GET "playState"
; by attemting to invoke "play" with COM first
; Check if control is available
controls := COM_Invoke(wmp, "controls") ; WORKS (returns number > 0)
isAvailable_play := COM_Invoke(controls, "isAvailable", "play" ) ; FAILS (returns 0)
; Use COM to start playing
play := COM_Invoke(controls, "play()") ; FAILS (returns null, which is okay
; because this "method"
; does not return a value)
; Get the play state of the Windows Media Player
; (0 = undefined, 1 = stopped, 2 = paused, 3 = playing, etc)
playState_2 := COM_Invoke(wmp, "playState") ; FAILS (returns 0 [= undefined],
; no matter what the actual play state
; but does NOT return a null)
MsgBox,
(
Get the number of CD-ROM drives in the computer
wmp = %wmp%
cdroms = %cdroms%
number_of_CD_ROM_drives = %number_of_CD_ROM_drives%
Get the number of tracks on the CD-ROM currently playing
cdrom = %cdrom%
playlist = %playlist%
tracks_on_CD = %tracks_on_CD%
Get the play state of the Windows Media Player
playState = %playState%
BEGIN SECOND EFFORT to get valid "playState"
by attemting to invoke "play" with COM first
Check if control is available
controls = %controls%
isAvailable_play = %isAvailable_play%
Use COM to start playing
play = %play%
Get the play state of the Windows Media Player again
playState_2 = %playState%
)
COM_Release(controls)
COM_Release(playlist)
COM_Release(cdroms)
COM_Release(cdrom)
COM_Release(wmp)
COM_Term()
}
return
ExitApp |
Any thoughts on how to get playState working would be gratefully received.
REFERENCES:
Lexikos script to play a specific track on a CD-ROM drive and gather the track titles:
www.autohotkey.com/forum/viewtopic.php?p=172534#172534
MSDN documentation for "player" object:
http://msdn.microsoft.com/en-us/library/bb249349%28VS.85%29.aspx |
|
| Back to top |
|
 |
Chris Site Admin
Joined: 02 Mar 2004 Posts: 10467
|
Posted: Tue Jul 15, 2008 1:08 am Post subject: |
|
|
| I think there is some kind of glitch in phpBB that prevented the post above from being visible. I've edited its final URL a little and now the entire post is visible. |
|
| Back to top |
|
 |
Sean
Joined: 12 Feb 2007 Posts: 1339
|
Posted: Tue Jul 15, 2008 1:33 am Post subject: |
|
|
What I meant was that you must start playing the CDRom from the created wmp. Please try again after replacing your first playState := COM_Invoke(wmp, "playState") with
| Code: | COM_Invoke(wmp, "currentPlaylist", "+" playlist) ; playlist is a COM object, so the prefix + is required when used as a parameter.
controls := COM_Invoke(wmp, "controls")
COM_Invoke(controls, "play")
Sleep 3000
playState := COM_Invoke(wmp, "playState")
|
|
|
| Back to top |
|
 |
engunneer
Joined: 30 Aug 2005 Posts: 6772 Location: Pacific Northwest, US
|
Posted: Tue Jul 15, 2008 3:06 am Post subject: |
|
|
| Chris wrote: | | I think there is some kind of glitch in phpBB that prevented the post above from being visible. I've edited its final URL a little and now the entire post is visible. |
I noticed the same thing in another topic when I was trying to fix a URL. Glad it wasn't just me. _________________
Unless otherwise noted, all code is untested.
Common Answers: 1.(Loops, Viruses, etc.) 2. Search 3.RTFM |
|
| Back to top |
|
 |
Ron1
Joined: 20 Dec 2007 Posts: 39 Location: United States of America
|
Posted: Tue Jul 15, 2008 3:21 am Post subject: |
|
|
Sean,
Thank you again for the effort to help. I am most grateful.
I modified my code, as you suggested, as shown below. But, unfortunately, I got the same result. That is, playState = 0 always.
Further, as the annotations in the code below indicate, the CD player did not start.
I noted, too, that if I placed "Result :=" in front of the following line
COM_Invoke(wmp, "currentPlaylist", "+" playlist)
to form
Result := COM_Invoke(wmp, "currentPlaylist", "+" playlist)
then Result returned a null. I am not sure if that is significant, since no return value from this COM_Invoke is utilized by the code.
| Code: | P::
{
COM_Init()
; Get the number of CD-ROM drives in the computer
wmp := COM_CreateObject("WMPlayer.OCX") ; WORKS (returns number > 0)
cdroms := COM_Invoke(wmp, "cdromCollection") ; WORKS (returns number > 0)
number_of_CD_ROM_drives := COM_Invoke(cdroms, "count") ; WORKS (returns 1, which is correct
; number of CD-ROM drives)
; Get the number of tracks on the CD-ROM currently playing
which_CD_ROM = 0 ; the first (and only CD_ROM on this computer) is number 0
cdrom := COM_Invoke(cdroms, "item", which_CD_ROM) ; WORKS (returns number > 0)
playlist := COM_Invoke(cdrom, "playlist") ; WORKS (returns number > 0)
tracks_on_CD := COM_Invoke(playlist, "count") ; WORKS (returns 14, which is correct
; number of tracks on CD)
; Get the play state of the Windows Media Player, after first starting it to play.
; (0 = undefined, 1 = stopped, 2 = paused, 3 = playing, etc)
; Insert script from Sean, and annotate with comments to the right
; =================
COM_Invoke(wmp, "currentPlaylist", "+" playlist) ; playlist is a COM object, so the prefix + is required when used as a parameter.
; When "Result :=" is placed in front of above line, a null is returned.
controls := COM_Invoke(wmp, "controls") ; WORKS (returns number > 0)
COM_Invoke(controls, "play") ; FAILS (player does not start playing loaded CD)
Sleep 3000
playState := COM_Invoke(wmp, "playState") ; FAILS (returns 0 [= undefined])
; ================
MsgBox,
(
Get the number of CD-ROM drives in the computer
wmp = %wmp%
cdroms = %cdroms%
number_of_CD_ROM_drives = %number_of_CD_ROM_drives%
Get the number of tracks on the CD-ROM currently playing
cdrom = %cdrom%
playlist = %playlist%
tracks_on_CD = %tracks_on_CD%
Get the play state of the Windows Media Player
controls = %controls%
playState = %playState%
)
COM_Release(controls)
COM_Release(playlist)
COM_Release(cdroms)
COM_Release(cdrom)
COM_Release(wmp)
COM_Term()
}
return
ExitApp
|
I am puzzled as to why Microsoft would require that the CD-ROM player be put in motion by commands like
COM_Invoke(controls, "play")
in order for the detection of playState to work.
Any thoughts would be appreciated.
Ron1 |
|
| Back to top |
|
 |
Sean
Joined: 12 Feb 2007 Posts: 1339
|
Posted: Tue Jul 15, 2008 4:42 am Post subject: |
|
|
| Ron1 wrote: | | Code: | | COM_Invoke(wmp, "currentPlaylist", "+" playlist) | then Result returned a null. | This used to be not allowed in old versions of COM.ahk. Please redownload the latest COM.ahk.
| Quote: | | I am puzzled as to why Microsoft would require that the CD-ROM player be put in motion by commands like COM_Invoke(controls, "play") in order for the detection of playState to work. | It depends on your setting of autoStart of WMP. If you haven't changed it, probably you don't need to include it in the script. |
|
| Back to top |
|
 |
Ron1
Joined: 20 Dec 2007 Posts: 39 Location: United States of America
|
Posted: Fri Jul 18, 2008 10:29 pm Post subject: Windows Media Player 11 "playState" |
|
|
Sean,
Thank you alerting me to the update needed for the COM Standard Library. That worked. I am most grateful for your help.
Two questions:
(1) Why is there a period (.) after the "+" in your example
COM_Invoke(Object, "Function", "+" . ObjPrm)
on the COM Standard Library thread:
http://www.autohotkey.com/forum/topic22923.html&highlight=com+standard+library
The example that you sent to me earlier in this thread did not contain that period (.)
COM_Invoke(wmp, "currentPlaylist", "+" playlist)
and adding that period did defeat operation. Perhaps it has a different significance.
(2) Could you embed the date in the header of the COM.ahk file of future versions of the COM Standard Library? That would facilitate checking that date later.
Progress to date in using playState
While I have gotten three examples (discussed below) of the use of playState to work with a hidden version of Windows Media Player 11, I have not yet figured out how to get the playState of the normal, visible version of Windows Media Player 11.
My hope was to read the playState of the normal, visible version of Windows Media Player 11 and to monitor it. With that capability, I could determine when playing actually begins, so that other actions could be triggered at the right moment. This is particularly helpful when Internet radio and Internet TV stations, with long buffering times, are being accessed.
I have also not yet found a way to feed the URL of a desired Internet radio station or Internet television station directly into the normal, visible version of the Windows Media Player. I can, of course, feed that URL in using ^u to activate the "Open URL" menu and then SendInput to send the individual keystrokes of the URL; but I was hoping for a more direct method.
Three successful examples using playState
The following three scripts provide successful examples of retrieving the playState of a hidden version of Windows Media Player 11, running under Windows XP. Perhaps these examples will prove helpful to other users.
(1) This first script gathers certain data about the CD-ROM drives and the CD-ROM in the first such drive, then evokes a hidden version of the Windows Media Player to play that CD-ROM, and then monitors the evolution of playState of that hidden version, once a second for five seconds. I have documented this script internally.
| Code: | ; Demonstration of several COM functions related
; to playing CD-ROMs in the Windows Media Player.
; Thanks to Lexikos and Sean for the methods.
; Thanks to Sean for the COM library.
MsgBox,
(
Insert CD-ROM into first CD-ROM drive. Then click on OK to cause a
hidden version of the Windows Media Player to play that CD-ROM.
Then wait 5 seconds for a MsgBox reporting the values of key parameters
and the time evolution of the "playState" of the hidden version of
the Windows Media Player.
)
{
COM_Init()
; (1) and (2) thanks to Lexikos
; (1) Get the number of CD-ROM drives in the computer
wmp := COM_CreateObject("WMPlayer.OCX") ; Reference: Not sure of ultimate reference, but see Sean's COM functions at
; http://www.autohotkey.com/forum/topic22923.html&highlight=com+functions
cdroms := COM_Invoke(wmp, "cdromCollection") ; MSDN Reference: http://msdn.microsoft.com/en-us/library/bb249303(VS.85).aspx
number_of_CD_ROM_drives := COM_Invoke(cdroms, "count") ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb262138(VS.85).aspx
; (2) Get the number of tracks on the first CD-ROM drive
which_CD_ROM = 0 ; the first (and only CD_ROM on this computer) is number 0
cdrom := COM_Invoke(cdroms, "item", which_CD_ROM) ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb262140(VS.85).aspx
playlist := COM_Invoke(cdrom, "playlist") ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb262145(VS.85).aspx
tracks_on_CD := COM_Invoke(playlist, "count") ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb249404(VS.85).aspx
; (3) thanks to Sean
; (3) Command a hiddeen version of the Windows Media Player to play
; the CD-ROM in the CD-ROM drive. Then capture the playState of that
; CD-ROM drive immediately, and after each of the next five seconds,
; to show how playState evolves.
Result := COM_Invoke(wmp, "currentPlaylist", "+" playlist) ; playlist is a COM object, so the prefix + is required when used as a parameter.
; MSDN reference: http://msdn.microsoft.com/en-us/library/bb249313(VS.85).aspx#playercurrentplaylist
; See also format for Sean's COM functions at:
; http://www.autohotkey.com/forum/topic22923.html&highlight=com+functions
controls := COM_Invoke(wmp, "controls") ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb249309(VS.85).aspx
COM_Invoke(controls, "play") ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb262211(VS.85).aspx
playState_0000 := COM_Invoke(wmp, "playState") ; MSDN reference: http://msdn.microsoft.com/en-us/library/bb249361(VS.85).aspx
Sleep 1000
playState_1000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_2000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_3000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_4000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_5000 := COM_Invoke(wmp, "playState")
MsgBox,
(
Windows Media Player:
(1) Get the number of CD-ROM drives in the computer
wmp = %wmp% number > 0 means working
cdroms = %cdroms% number > 0 means working
number_of_CD_ROM_drives = %number_of_CD_ROM_drives%
(2) Get the number of tracks on the first CD-ROM drive
cdrom = %cdrom% number > 0 means working
playlist = %playlist% number > 0 means working
tracks_on_CD = %tracks_on_CD%
(3) Command a hidden version of the Windows Media Player to play
the CD-ROM in the CD-ROM drive. Then capture the playState of that
CD-ROM drive immediately, and after each of the next five seconds,
to show how playState evolves.
Result = %Result% 0 means working, nothing(null) means not working
controls = %controls% number > 0 means working
playState_0000 = %playState_0000% playState at time 0 seconds
playState_1000 = %playState_1000% playState at time 1 second
playState_2000 = %playState_2000% playState at time 2 seconds
playState_3000 = %playState_3000% playState at time 3 seconds
playState_4000 = %playState_4000% playState at time 4 seconds
playState_5000 = %playState_5000% playState at time 5 seconds
Meaning of playState values:
0 Undefined
1 Stopped
2 Paused
3 Playing
4 ScanForward
5 ScanReverse
6 Buffering
7 Waiting
8 MediaEnded
9 Transitioning
10 Ready
11 Reconnecting
MSDN Reference: http://msdn.microsoft.com/en-us/library/bb249361(VS.85).aspx
)
COM_Release(controls)
COM_Release(playlist)
COM_Release(cdroms)
COM_Release(cdrom)
COM_Release(wmp)
COM_Term()
}
Exit
|
(2) This second script uses a a different method, called WMPCD, to evoke a hidden version of Windows Media Player and to play a specific track on a CD-ROM in a specific CD-ROM drive. Then the script monitors the evolution of the playState of that hidden version, once a second for five seconds.
| Code: | MsgBox,
(
Click on OK to command a hidden version of the
Windows Media Player to play track 2 on the first
CD-ROM drive in the computer. Then wait five seconds
for a second MsgBox reporting on the evolution of the
playState during that period.
)
COM_Init()
wmp := COM_CreateObject("WMPlayer.OCX")
url := COM_Invoke(wmp, "Url","wmpcd://0/2" ) ; first drive has drive number 0. Track 2 is specified.
; MSDN reference: http://msdn.microsoft.com/en-us/library/bb249720(VS.85).aspx
playState_0000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_1000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_2000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_3000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_4000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_5000 := COM_Invoke(wmp, "playState")
MsgBox,
(
wmp = %wmp% number > 0 means success
url = %url%
playState_0000 = %playState_0000% playState at time 0 seconds
playState_1000 = %playState_1000% playState at time 1 second
playState_2000 = %playState_2000% playState at time 2 seconds
playState_3000 = %playState_3000% playState at time 3 seconds
playState_4000 = %playState_4000% playState at time 4 seconds
playState_5000 = %playState_5000% playState at time 5 seconds
Meaning of playState values:
0 Undefined
1 Stopped
2 Paused
3 Playing
4 ScanForward
5 ScanReverse
6 Buffering
7 Waiting
8 MediaEnded
9 Transitioning
10 Ready
11 Reconnecting
MSDN Reference: http://msdn.microsoft.com/en-us/library/bb249361(VS.85).aspx
)
COM_Release(wmp)
COM_Term()
Exit
|
(3) This third script evokes a hidden version of the Windows Media Player, plays an Internet radio station, and then monitors the evolution of the playState of that hidden version, once a second for five seconds.
| Code: | MsgBox,
(
Click on OK to command a hidden version of the Windows Media Player
to play an Internet radio station, WAMU, which is public radio from
American University in Washington, D.C.
Then wait five seconds for another message box, reporting
on the evolution of the "playState" over that five seconds.
)
COM_Init()
wmp := COM_CreateObject("WMPlayer.OCX")
url_to_play := "http://wamu.org/streams/live/1/win"
url := COM_Invoke(wmp, "Url", url_to_play) ; MSDN Reference:
; http://msdn.microsoft.com/en-us/library/bb249371(VS.85).aspx
playState_0000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_1000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_2000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_3000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_4000 := COM_Invoke(wmp, "playState")
Sleep 1000
playState_5000 := COM_Invoke(wmp, "playState")
MsgBox,
(
Windows Media Player:
wmp = %wmp% number > 0 means success
url = %url% 0 is returned whether url_to_play is valid or not
playState_0000 = %playState_0000% playState at time 0 seconds
playState_1000 = %playState_1000% playState at time 1 second
playState_2000 = %playState_2000% playState at time 2 seconds
playState_3000 = %playState_3000% playState at time 3 seconds
playState_4000 = %playState_4000% playState at time 4 seconds
playState_5000 = %playState_5000% playState at time 5 seconds
Meaning of playState values:
0 Undefined
1 Stopped
2 Paused
3 Playing
4 ScanForward
5 ScanReverse
6 Buffering
7 Waiting
8 MediaEnded
9 Transitioning
10 Ready
11 Reconnecting
MSDN Reference: http://msdn.microsoft.com/en-us/library/bb249361(VS.85).aspx
)
COM_Release(wmp)
COM_Term()
Exit
|
I am very grateful to all who have helped me get this far, including Lexikos, Sean, Guest, and jaco0646.
Ron1
Last edited by Ron1 on Sun Jul 20, 2008 11:19 am; edited 3 times in total |
|
| Back to top |
|
 |
engunneer
Joined: 30 Aug 2005 Posts: 6772 Location: Pacific Northwest, US
|
Posted: Sat Jul 19, 2008 12:56 am Post subject: |
|
|
Re: (1):
the period is the technical operator for concatenate. It is somewhat optional, and AHK is fine without it.
| Code: |
var = This
msgbox % var . " is one way to do it"
msgbox % var " is another"
|
_________________
Unless otherwise noted, all code is untested.
Common Answers: 1.(Loops, Viruses, etc.) 2. Search 3.RTFM |
|
| Back to top |
|
 |
Ron1
Joined: 20 Dec 2007 Posts: 39 Location: United States of America
|
Posted: Sun Jul 20, 2008 11:32 am Post subject: |
|
|
Thank you, engunneer. I will explore that concatenate operator.
Ron1 |
|
| Back to top |
|
 |
|
|
You can post new topics in this forum You can reply to topics in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|