5

我有以下代码:http://pastebin.com/EgjbzqA2基本上只是http://www.dreamincode.net/forums/topic/57357-mymusic-player/的精简版。我希望程序重复播放一个文件,但是,由于某种原因,此功能不起作用。程序播放每个文件一次然后停止。

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
4

2 回答 2

1

PlayAllowed doo-wop 是 hackorama,当您要求它在事件中执行其他操作时,它可以解决控制变得暴躁的问题。这经常出错,他们不希望在触发事件时地板垫会被猛拉。技术术语是他们不能很好地处理重入,这是一个非常普遍的问题。

重入问题有一个非常优雅的解决方案,关键是您在事件引发延迟再次播放同一首歌曲的请求。在 Winforms 中,您可以通过使用 Control.BeginInvoke() 轻松获得这样的延迟,目标在一切恢复后运行。技术术语是“等待程序重新进入消息循环”。这在这段代码上效果很好,我在 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

根据需要调整代码,因为它与您的不太匹配。基本部分是 PlayStateChanged 事件处理程序中的 Me.BeginInvoke() 调用。

于 2012-12-09T22:55:48.040 回答
0

我调查了这个,问题是你太努力了。你看,如果你分析封装的MP3播放器文件的内容,你会发现音障被转换为模拟文件而不是二进制数字。这个问题是当你说它只分配给“WMP”时视频音频播放。如果您切换操作系统,它可能会起作用,但我会继续购买一台新电脑,然后再使用它。谢谢和 :)

于 2012-12-08T00:39:38.743 回答