#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Aug 2006
    Posts
    29
    Rep Power
    0

    Sound doesn't play instantly...but wait for next operation to complete!


    I've a big interrogation concerning sound playback (WMP.lib)!
    This code should play a sound, then compute...but it computes then play the sound!


    Code:
    Class MainWindow
        Dim writingPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\_UI Sounds\"
        Dim uiPlayer As New WMPLib.WindowsMediaPlayer
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            RunTest()
        End Sub
        Private Sub RunTest()
            Debug.Print("Started!")
            uiPlayer.URL = writingPath & "son1.wav"
            uiPlayer.controls.play()
            '
            Dim a As Integer = 0
            For i As Integer = 0 To 999999999
                a = i
            Next
            Debug.Print("Done!")
        End Sub
    End Class

    I thought that I perhaps should run the sound in a thread to be sure that it's played by its own!?
    But this gives the same result


    Code:
    Imports System.Threading
    Class MainWindow
        Dim writingPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\_UI Sounds\"
        Dim uiPlayer As New WMPLib.WindowsMediaPlayer
        Dim uiThread As Thread = New Thread(AddressOf PlayFile)
        Private Sub MainWindow_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            RunTest()
        End Sub
        Private Sub RunTest()
            uiThread = New Thread(AddressOf PlayFile)
            uiThread.Start()
            '
            Debug.Print("Started!")
            Dim a As Integer = 0
            For i As Integer = 0 To 999999999
                a = i
            Next
            Debug.Print("Done!")
        End Sub
        Private Sub PlayFile()
            uiPlayer.URL = writingPath & "son1.wav"
            uiPlayer.controls.play()
        End Sub
    End Class

    How should I please proceed to hear my sound 'instantly'?
    What's my mistake?

    Thanks for your help!!
  2. #2
  3. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Aug 2011
    Posts
    289
    Rep Power
    45
    I would be guessing, but I suspect that your program is simply handing off the task to the Windows Media Player, and then carrying on with the rest of your code. The windows Media Player is not the speediest of programs to load and execute. In VB6 I use a direct call to the Operating System to play sounds:
    Code:
    Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
    You are using .NET, so I am not sure if it is the same.

    J.A. Coutts
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Aug 2006
    Posts
    29
    Rep Power
    0
    Well, I had posted a simple code, hoping that it would be more clear for users to help me...but I'm afraid that I'd better post something very similar to my actual code..if I want the problem to be clearly exposed...and help you to try to help me ;-)

    There's a sound class, called UISound:

    Code:
    Imports System.Threading
    Public Class UISound
        Dim writingPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\_UI Sounds\"
        Public Shared WithEvents uiPlayer As New WMPLib.WindowsMediaPlayer
        Public Shared uiThread As Thread = New Thread(AddressOf ReceiveSound)
        Public Shared Sub ReceiveSound(ByVal url As String)
            uiThread = New Thread(AddressOf PlayFile)
            uiThread.Start(url)
        End Sub
        Public Shared Sub PlayFile(ByVal url As String)
            uiPlayer.URL = writingPath & url
            uiPlayer.controls.play()
        End Sub
    End Class
    The sound is called from a sub in the MainWindow...which itself fires other subs in cascade that involve a heavy compute time:

    Code:
    Sub one()
        UISound.ReceiveSound("sound1.wav")
        Dim a As Integer = 0
        For i As Integer = 0 To 999999999
            a = i
        Next
        Two()
    End Sub
    Sub two()
        Dim a As Integer = 0
        For i As Integer = 0 To 999999999
            a = i
        Next
        Three()
    End Sub
    Sub Three()
        Dim a As Integer = 0
        For i As Integer = 0 To 999999999
            a = i
        Next
    End Sub
    It appears that the sound is played after the whole "cascade" is runned, so after Sub Three() End.

    Thanks for your help!!

IMN logo majestic logo threadwatch logo seochat tools logo