Unable to call WMP's controls.play() function in VisualBasic

ぃ、小莉子 提交于 2019-11-26 23:30:42

问题


I have the following code: http://pastebin.com/EgjbzqA2 which is basically just a stripped down version of http://www.dreamincode.net/forums/topic/57357-mymusic-player/. I want the program to play one file repeatedly, however, this function doesn't work for some reason. The program plays each file once and then stops.

Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange
    Static Dim PlayAllowed As Boolean = True
    Select Case CType(NewState, WMPLib.WMPPlayState)
        Case WMPLib.WMPPlayState.wmppsReady
            If PlayAllowed Then
                Player3.controls.play()
            End If
        Case WMPLib.WMPPlayState.wmppsMediaEnded
            ' Start protection (without it next wouldn't play
           PlayAllowed = False
            ' Play track
           Player3.controls.play()
            ' End Protection
           PlayAllowed = True
            updatePlayer()
    End Select
End Sub

回答1:


The PlayAllowed doo-wop is hackorama to work around a control getting cranky when you ask it to do something else in an event. That often goes wrong, they don't expect the floor mat to be jerked when they fire an event. The technical term is that they don't handle re-entrancy well, a very common problem.

There's a very elegant solution to re-entrancy problems, the key is that you delay the request to play the same song again, after the event was raised. In Winforms you can easily get such a delay by using Control.BeginInvoke(), the target runs after everything settles back down. The technical term for that is "waiting for the program to re-enter the message loop". That worked very well on this code, I had no trouble looping the same song over and over again with this code, tested on Windows 8:

Public Class Form1
    Dim WithEvents Player3 As New WMPLib.WindowsMediaPlayer
    Dim Song As String = "c:\temp\ding.wav"

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        PlayCurrentSong()
    End Sub

    Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange
        If NewState = WMPLib.WMPPlayState.wmppsMediaEnded Then
            Me.BeginInvoke(New MethodInvoker(AddressOf PlayCurrentSong))
        End If
    End Sub

    Private Sub PlayCurrentSong()
        Player3.URL = Song
        Player3.controls.play()
    End Sub
End Class

Tweak the code as needed since it won't match yours very well. The essential part is the Me.BeginInvoke() call in the PlayStateChanged event handler.




回答2:


i looke into this and problem is that you trying too hard to make it so. YOu see, if you analyze the content of of the encapsulated MP3 player files, you will find that the sound barrier is converted to analog files instead of binary digital. This problem is when only allocated to the "WMP" as you say it video-audo play. If you switch opperating system it might work but i would go ahead and just buy a new computer first then use it instead. thanks and ty :)



来源:https://stackoverflow.com/questions/13770806/unable-to-call-wmps-controls-play-function-in-visualbasic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!