none
Playing Audio files immediately on clicking a button, without any delay. RRS feed

  • Question

  • I am trying to code for virtual drums application that works in real time without any delay, and also i wanted to have multiple audio playback in parallel, on clicking multiple buttons at a time. After trying many things 

    couldn't solve for delay problem. Please help me regarding the same. 

    Saturday, November 30, 2019 1:20 PM

Answers

  • Yes you need to show exactly what you mean.

    For discussion, here is an example that plays two different wav files with drum sounds both at the same time as the buttons are clicked.

    The example does not play the same sound twice at the same time. A single individual sound is re-started from the beginning each time it is played. But two different sounds play together at the same time

    For example you can Click A and then B and you hear A + B at the same time. But if you click A and click A again, A is restarted and you only hear one song playing. If you made two buttons for the same file, ie Note B is the same song as Note A, then that will play A and B at the same time which would be two instances of song A started at different times.

    When the examaple app is first started the sounds have a slight delay on the first click as they are cached but after that I dont hear any delay.

    The example makes the controls. Just cut and paste into an empty form. Change the form name as required. Change the file paths to the sounds for your system.

    'plays two or more different sounds at once
    'sounds play from the start each time
    
    Imports System.Runtime.InteropServices
    Public Class Form2
        Private Snds As New MultiSounds
        Private WithEvents ButtonA As New Button With {.Parent = Me, .Text = "Play A", .Location = New Point(20, 20)}
        Private WithEvents ButtonB As New Button With {.Parent = Me, .Text = "Play B", .Location = New Point(120, 20)}
        Private WithEvents RepeatCb As New CheckBox With {.Parent = Me, .Text = "Repeat", .Location = New Point(220, 20)}
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'https://freewavesamples.com/ensoniq-esq-1-snare
            'https://freewavesamples.com/sample-type/cymbals/crash
    
            Text = "Play Multiple Sounds"
            Snds.AddSound("Note A", "C:\test sounds\Drum Wavs\Ensoniq-ESQ-1-Snare.wav")
            Snds.AddSound("Note B", "C:\test sounds\Drum Wavs\Crash-Cymbal-1.wav")
        End Sub
    
        Private Sub ButtonA_Click_1(sender As Object, e As EventArgs) Handles ButtonA.Click
            Snds.Play("Note A")
        End Sub
    
        Private Sub ButtonB_Click(sender As Object, e As EventArgs) Handles ButtonB.Click
            Snds.Play("Note B")
        End Sub
    
        Private Sub RepeatCb_CheckedChanged(sender As Object, e As EventArgs) Handles RepeatCb.CheckedChanged
            Snds.repeat = RepeatCb.Checked
        End Sub
    End Class
    
    Public Class MultiSounds
        Private Snds As New Dictionary(Of String, String)
        Private sndcnt As Integer = 0
        Public repeat As Boolean
    
        <DllImport("winmm.dll", EntryPoint:="mciSendStringW")>
        Private Shared Function mciSendStringW(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpszCommand As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpszReturnString As System.Text.StringBuilder, ByVal cchReturn As UInteger, ByVal hwndCallback As IntPtr) As Integer
        End Function
    
        Public Function AddSound(ByVal SoundName As String, ByVal SndFilePath As String) As Boolean
            If SoundName.Trim = "" Or Not IO.File.Exists(SndFilePath) Then Return False
            'to repeat must use type mpegvideo ????
            If mciSendStringW("open " & Chr(34) & SndFilePath & Chr(34) & " type mpegvideo alias " & "Snd_" & sndcnt.ToString, Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            'If mciSendStringW("open " & Chr(34) & SndFilePath & Chr(34) & " alias " & "Snd_" & sndcnt.ToString, Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            Snds.Add(SoundName, "Snd_" & sndcnt.ToString)
            sndcnt += 1
            Return True
        End Function
    
        Public Function Play(ByVal SoundName As String) As Boolean
            If Not Snds.ContainsKey(SoundName) Then Return False
            mciSendStringW("seek " & Snds.Item(SoundName) & " to start", Nothing, 0, IntPtr.Zero)
    
            If repeat Then
                If mciSendStringW("play " & Snds.Item(SoundName) & " repeat", Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            Else
                If mciSendStringW("play " & Snds.Item(SoundName), Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            End If
    
            Return True
        End Function
    
        Public Function [Stop](ByVal SoundName As String) As Boolean
            If Not Snds.ContainsKey(SoundName) Then Return False
            If mciSendStringW("stop " & Snds.Item(SoundName), Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            Return True
        End Function
    End Class




    • Edited by tommytwotrain Monday, December 2, 2019 1:19 PM
    • Marked as answer by mayurpl Thursday, January 2, 2020 1:42 PM
    Monday, December 2, 2019 12:25 PM

All replies

  • After trying many things couldn't solve for delay problem. Please help me regarding the same. 

    Which "things" ?

    There are several methods to play Audio files

    One of the simplest ones is with mciSendString , and I don't see any delay with open/play commands (Windows 10)

    (plenty of samples on those forums for mci)

    Saturday, November 30, 2019 1:39 PM
  • Hi,

    Do you have any code show us? I will test it on my side. It could be better to help us to find the root cause. When providing the code please indicate the methods and events also.

    Best Regards,

    Julie


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    Monday, December 2, 2019 6:04 AM
    Moderator
  • Yes you need to show exactly what you mean.

    For discussion, here is an example that plays two different wav files with drum sounds both at the same time as the buttons are clicked.

    The example does not play the same sound twice at the same time. A single individual sound is re-started from the beginning each time it is played. But two different sounds play together at the same time

    For example you can Click A and then B and you hear A + B at the same time. But if you click A and click A again, A is restarted and you only hear one song playing. If you made two buttons for the same file, ie Note B is the same song as Note A, then that will play A and B at the same time which would be two instances of song A started at different times.

    When the examaple app is first started the sounds have a slight delay on the first click as they are cached but after that I dont hear any delay.

    The example makes the controls. Just cut and paste into an empty form. Change the form name as required. Change the file paths to the sounds for your system.

    'plays two or more different sounds at once
    'sounds play from the start each time
    
    Imports System.Runtime.InteropServices
    Public Class Form2
        Private Snds As New MultiSounds
        Private WithEvents ButtonA As New Button With {.Parent = Me, .Text = "Play A", .Location = New Point(20, 20)}
        Private WithEvents ButtonB As New Button With {.Parent = Me, .Text = "Play B", .Location = New Point(120, 20)}
        Private WithEvents RepeatCb As New CheckBox With {.Parent = Me, .Text = "Repeat", .Location = New Point(220, 20)}
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'https://freewavesamples.com/ensoniq-esq-1-snare
            'https://freewavesamples.com/sample-type/cymbals/crash
    
            Text = "Play Multiple Sounds"
            Snds.AddSound("Note A", "C:\test sounds\Drum Wavs\Ensoniq-ESQ-1-Snare.wav")
            Snds.AddSound("Note B", "C:\test sounds\Drum Wavs\Crash-Cymbal-1.wav")
        End Sub
    
        Private Sub ButtonA_Click_1(sender As Object, e As EventArgs) Handles ButtonA.Click
            Snds.Play("Note A")
        End Sub
    
        Private Sub ButtonB_Click(sender As Object, e As EventArgs) Handles ButtonB.Click
            Snds.Play("Note B")
        End Sub
    
        Private Sub RepeatCb_CheckedChanged(sender As Object, e As EventArgs) Handles RepeatCb.CheckedChanged
            Snds.repeat = RepeatCb.Checked
        End Sub
    End Class
    
    Public Class MultiSounds
        Private Snds As New Dictionary(Of String, String)
        Private sndcnt As Integer = 0
        Public repeat As Boolean
    
        <DllImport("winmm.dll", EntryPoint:="mciSendStringW")>
        Private Shared Function mciSendStringW(<MarshalAs(UnmanagedType.LPTStr)> ByVal lpszCommand As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpszReturnString As System.Text.StringBuilder, ByVal cchReturn As UInteger, ByVal hwndCallback As IntPtr) As Integer
        End Function
    
        Public Function AddSound(ByVal SoundName As String, ByVal SndFilePath As String) As Boolean
            If SoundName.Trim = "" Or Not IO.File.Exists(SndFilePath) Then Return False
            'to repeat must use type mpegvideo ????
            If mciSendStringW("open " & Chr(34) & SndFilePath & Chr(34) & " type mpegvideo alias " & "Snd_" & sndcnt.ToString, Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            'If mciSendStringW("open " & Chr(34) & SndFilePath & Chr(34) & " alias " & "Snd_" & sndcnt.ToString, Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            Snds.Add(SoundName, "Snd_" & sndcnt.ToString)
            sndcnt += 1
            Return True
        End Function
    
        Public Function Play(ByVal SoundName As String) As Boolean
            If Not Snds.ContainsKey(SoundName) Then Return False
            mciSendStringW("seek " & Snds.Item(SoundName) & " to start", Nothing, 0, IntPtr.Zero)
    
            If repeat Then
                If mciSendStringW("play " & Snds.Item(SoundName) & " repeat", Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            Else
                If mciSendStringW("play " & Snds.Item(SoundName), Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            End If
    
            Return True
        End Function
    
        Public Function [Stop](ByVal SoundName As String) As Boolean
            If Not Snds.ContainsKey(SoundName) Then Return False
            If mciSendStringW("stop " & Snds.Item(SoundName), Nothing, 0, IntPtr.Zero) <> 0 Then Return False
            Return True
        End Function
    End Class




    • Edited by tommytwotrain Monday, December 2, 2019 1:19 PM
    • Marked as answer by mayurpl Thursday, January 2, 2020 1:42 PM
    Monday, December 2, 2019 12:25 PM
  • The "things" here refer to My.Computer.Audio.Play()
    We added a .wav file within this function on click for a button but we need response from the system to play that specific audio file as fast as you see the letter "a" on the screen when you hit "a" on your keyboard.

    Also,
    No matter if the second audio played starts from the beginning, but an already playing audio when triggered to initiate from another button, should not stop and this second audio file should also start playing as soon as the keystroke press in any text area.

    We actually were directed to design a drum software to which we're using A, B, C, D, E, F, G to play the audio file attached within My.Computer.Audio.Play() for the seven buttons that has been created in [Design] Form1 of VB Studio.

    The problem now we're facing is only the 800 milli seconds delay (approx.) after pressing a keystroke and the first audio getting stopped on triggering the second


    • Edited by Shashank V Ray Monday, December 2, 2019 3:11 PM spelling mistake
    Monday, December 2, 2019 3:08 PM
  • Thank you for the response @tommytwotrain,
    Actually the "things" here refer to My.Computer.Audio.Play().

    We added a .wav file within this function on click for a button but we need response from the system to play that specific audio file as fast as you see the letter "a" on the screen when you hit "a" on your keyboard.

    Also,
    No matter if the second audio played starts from the beginning, but an already playing audio when triggered to initiate from another button, should not stop and this second audio file should also start playing as soon as the keystroke press in any text area.

    We actually were directed to design a drum software to which we're using A, B, C, D, E, F, G to play the audio file attached within My.Computer.Audio.Play() for the seven buttons that has been created in [Design] Form1 of VB Studio.

    The problem now we're facing is only the 800 - 900 milli seconds delay (approx.) after pressing a keystroke and the first audio getting stopped on triggering the second


    Monday, December 2, 2019 3:10 PM
  • Thank you for the response @tommytwotrain,
    Actually the "things" here refer to My.Computer.Audio.Play().

    We added a .wav file within this function on click for a button but we need response from the system to play that specific audio file as fast as you see the letter "a" on the screen when you hit "a" on your keyboard.

    Also,
    No matter if the second audio played starts from the beginning, but an already playing audio when triggered to initiate from another button, should not stop and this second audio file should also start playing as soon as the keystroke press in any text area.

    We actually were directed to design a drum software to which we're using A, B, C, D, E, F, G to play the audio file attached within My.Computer.Audio.Play() for the seven buttons that has been created in [Design] Form1 of VB Studio.

    The problem now we're facing is only the 800 - 900 milli seconds delay (approx.) after pressing a keystroke and the first audio getting stopped on triggering the second


    Oh. Why did you not say that then?

    Are you mayurpl?

    Did you even bother to try the example I posted and does it have a delay?

    No? Ok then lets go back to Castor's and Julie's response.

    You show your code that produces the problem first then we will try to help?


    Monday, December 2, 2019 4:13 PM
  • No I actually am a teammate of his with this assignment to be solved.
    He couldn't address our problem appropriately back then so thought of replying our prime hurdle from my side.
    Our part of progress so far is as follows:
    Basically all we have is My.Computer.Audio.Play() as the initial try from our side.
    As a progress, we could find a solution on this thread forum "https://social.msdn.microsoft.com/Forums/en-US/95eacab3-1892-49b9-ad36-6cdc59ecec64/play-multiple-sound-clips-simultaneously?forum=vblanguage" but could not pursue a solution specifically to our problem.

    Also few deeper digging on the internet could not solve our part of concern in particular.

    Consider,
    If keystroke 'A' plays audio in Button 1 and 'B' plays Button 2 and ..... 'G' plays the audio file embedded within Button 7 on the UI [Design] Form1 :
    If you could help us design a 7 button UI that plays 7 different .wav audio files without delay and also we're making this project work in a way that would play an audio embedded within one of those 7 buttons louder when the value '255' is sent along with the Musical note character 'A' and at medium volume with value 128 and low volume with value 10.
    So overall, we're sending the computer not just the character 'A' but a value within 0 - 255 to denote the volume of the audio file in the form of an array via an Arduino UNO board connected to the same computer.
    And this array of a character at index [0] and a value at index [1] is the max size of the input data to the computer which always has to play that audio file corresponding to the character mentioned at [0] at volume "value" where 0 is zero% volume and 128 is 50% volume and 255 is 100% volume.

    Monday, December 2, 2019 4:54 PM
  • No I actually am a teammate of his with this assignment to be solved.
    He couldn't address our problem appropriately back then so thought of replying our prime hurdle from my side.
    Our part of progress so far is as follows:
    Basically all we have is My.Computer.Audio.Play() as the initial try from our side.
    As a progress, we could find a solution on this thread forum "https://social.msdn.microsoft.com/Forums/en-US/95eacab3-1892-49b9-ad36-6cdc59ecec64/play-multiple-sound-clips-simultaneously?forum=vblanguage" but could not pursue a solution specifically to our problem.

    Also few deeper digging on the internet could not solve our part of concern in particular.

    Consider,
    If keystroke 'A' plays audio in Button 1 and 'B' plays Button 2 and ..... 'G' plays the audio file embedded within Button 7 on the UI [Design] Form1 :
    If you could help us design a 7 button UI that plays 7 different .wav audio files without delay and also we're making this project work in a way that would play an audio embedded within one of those 7 buttons louder when the value '255' is sent along with the Musical note character 'A' and at medium volume with value 128 and low volume with value 10.
    So overall, we're sending the computer not just the character 'A' but a value within 0 - 255 to denote the volume of the audio file in the form of an array via an Arduino UNO board connected to the same computer.
    And this array of a character at index [0] and a value at index [1] is the max size of the input data to the computer which always has to play that audio file corresponding to the character mentioned at [0] at volume "value" where 0 is zero% volume and 128 is 50% volume and 255 is 100% volume.

    I see.

    Well a school project and etc... this forum is a learning forum so the idea is you ask questions of things you dont understand and we try to help. Basically you show the problem in code and ask specific questions. ie how to multiply 2 x 4. Not how to do a complete application like Adobe... give us the code.

    "If you could help us design a 7 button UI that plays 7 different .wav audio files without delay"

    Did you try my example?

    Do you know classes? What do you know? Since its for school you need to show us what you have already done and etc. But sounds like you need a class similar to the example above and add the parameters you want etc...

    Finally I think you need to expand beyond  AxWindowsMediaPlayer for some of what you say. There are about 3 for 5 ways to play sounds and you might need to be familiar with 2 o 3 and then pick which one has the capability. Or have you done that? Are you stuck on My.Computer.Audio.Play() ? etc.

    Others will have more ideas too as you define the problems. Probably need many questions.



    Monday, December 2, 2019 6:28 PM
  • I am trying to code for virtual drums application that works in real time without any delay, and also i wanted to have multiple audio playback in parallel, on clicking multiple buttons at a time. After trying many things 

    couldn't solve for delay problem. Please help me regarding the same. 

    Hi

    Here is some VERY SIMPLE code that seems to do as you want - there doesn't appear to be any delay (though since .wav on HDD there must be a very short one), plays multiple simultaneous sounds. I have just left the .wav files on HDD, but presumably, they could be added to a playlist for immediate use?

    ' an overly simple example (due to
    ' the fact that I know little
    ' of using Media Player)
    ' Multiple simultaneaous sounds
    ' Form1 with Windows Media Player1,
    ' 5 Buttons
    Option Strict On
    Option Explicit On
    Imports AxWMPLib
    Public Class Form1
    	Dim ax1, ax2, ax3, ax4, ax5 As New AxWindowsMediaPlayer
    	Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    		ax1.CreateControl()
    		ax2.CreateControl()
    		ax3.CreateControl()
    		ax4.CreateControl()
    		ax5.CreateControl()
    	End Sub
    	Private Sub Button1_Click_1(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    		ax1.URL = Application.StartupPath & "\Data\GameOver.wav"
    	End Sub
    	Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    		ax2.URL = Application.StartupPath & "\Data\bargain.wav"
    	End Sub
    	Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    		ax3.URL = Application.StartupPath & "\Data\click.wav"
    	End Sub
    	Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    		ax4.URL = Application.StartupPath & "\Data\yes.wav"
    	End Sub
    	Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    		ax5.URL = Application.StartupPath & "\Data\cases.wav"
    	End Sub
    End Class


    Regards Les, Livingston, Scotland

    Monday, December 2, 2019 8:11 PM
  • @ Shashank V Ray,

     I have read your buddies original post as well as your last 3 posts and it seems that you keep changing the requirements that you need to meet. If you have not found a solution yet then please explain clearly what it is that you need to do.

    1. Do you need to click buttons that are on your keyboard,  on your VB Form,  or on your Arduino uno board?

    2. Where are you getting these Arrays from that contain the note and volume level?  How do you process these Arrays?

     

     @ Tom & Others...

     Hi Its been a long time but,  I'm still here and glad to see you all around.  8)


    If you say it can`t be done then i`ll try it

    Saturday, December 7, 2019 11:56 PM
  • Hi Razerz !

    Good to see you. Don't be a stranger now.

    :)

    Sunday, December 8, 2019 9:51 AM
  • With this code of yours I found an error saying that

    "Type 'AxWindowsMediaPlayer' is not defined". I suspected that this is because of not having Windows Media Player installed. But I incurred the same error even after installing Windows Media Player. What might be the problem

    Friday, December 27, 2019 1:24 PM
  • Hi

    Did you add a Media Player control to the Form either via the Designer or at run time?


    Regards Les, Livingston, Scotland

    Friday, December 27, 2019 1:35 PM
  • @IronRazer
    The complete project of ours is to design Drum Set by hitting on 4 different piezo electric sensors each of which will be names as A, B, C, D.
    On hitting A, the arduino will send 'A' as input to the computer which will play "A.wav" file.
    But now we enhanced the working of our project to such a way that even the volume should differ on receiving different PWM values from the Arduino Leonardo (Piezo sensors).
    The values so received would now be not just "A" now but will be "A-255" or "A-128" or "A-50" with hyphen (-) being the delimiter; where 50, 128, 255 would be the intensity of the hits on the Piezo electric sensors thus playing the audio file mapped with Button A playing a low volume on receiving A-50, medium volume on receiving A-128 and high on receiving A-255.
    This is the total project of ours.

    Help me with the same along with the one that we're getting an error saying "Type 'AxWindowsMediaPlayer' is not defined". I suspected that this is because of not having Windows Media Player installed. But I incurred the same error even after installing Windows Media Player. What might be the problem
    • Edited by Shashank V Ray Friday, December 27, 2019 1:42 PM addressed specifically
    Friday, December 27, 2019 1:39 PM
  • Is there a solution for the same without using Windows Media Player?
    Coz I fail to suit the application of Windows Media Player in accordance with my project.. I dont prefer to have any external third party applications made use to play a simple small audio file. As python can play any given audio files just by importing few modules which plays the audio file directly accessing the kernel or the OS event handlers without needing to use any players.

    Huge thanks to all the helpers so far, it would be a great help from the community end if this project is a grand success for me. I owe you guys the credits of this project of mine.
    Thank you again, hoping to be given with a working solution.
    • Edited by Shashank V Ray Thursday, January 2, 2020 11:38 AM Solved myself with the previous problem
    Friday, December 27, 2019 1:44 PM
  • Hey tommytwotrain,
    your solution seems to be taking me near my expected outputs and requirements to be met.

    Let me clarify, I dont need replay option and I need only an audio file to be played on clicking the button and also, should not take any delay between me clicking and the laptop speaker playing the audio file.

    But unfortunately your code is showing an error saying "Event Load cannot be found" in the line "Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load"

    Thursday, January 2, 2020 1:42 PM
  • Hey tommytwotrain,
    thanks for the solution.
    Could you please make any slight changes to make the delay even more slighter so that it should be as fast as seeing the letter "A" when you hit A on your keyboard while having the cursor in any Notepad.exe (or any other text field area)

    we still observe a slightest delay on clicking the buttons with your code.
    Thursday, January 2, 2020 1:47 PM
  • Hey tommytwotrain,
    thanks for the solution.
    Could you please make any slight changes to make the delay even more slighter so that it should be as fast as seeing the letter "A" when you hit A on your keyboard while having the cursor in any Notepad.exe (or any other text field area)

    we still observe a slightest delay on clicking the buttons with your code.

    Oh good.

    Post a complete working example of the code you are using now so we can reproduce exactly what you have.

    Define exactly what you mean best you can ie too slow is that 1 second or 1 millisecond and exactly what are you doing and how do you know there is a delay... just by ear? Can you time it somehow? What have you done already?

    Where did Razer's comments on Ardino board come from are you using that?

    What is your final goal purpose for your app? Real time drum machine drumstick activated? Or a pure electronic drum machine... what do they call it sampler, no, ...

    Why dont the other solutions "work"?

    What sound do you want to hear? Does it have to be a wav file? How many sounds do you have?  ie 2 like my example or 20?

    If you just want to make a sound you can just beep the speaker a wavelength for a single note like A and then C.

    And on and on...

    The better you can describe the givens and druthers the more ideas we will have.

    Look into DirectSound.

    PS I mean post a simple one form example of what you have now. Similar to the example I posted. Or is that it?

    Is it keyboard or mouse or both?

    PS Lets see your wav file. The wav file can have blank no sound lead ins and tapers etc so you could have 10ms of silence playing in your wave file??


    Thursday, January 2, 2020 2:01 PM
  • Hey tommytwotrain

    This code of yours helped me a lot in solving my current issue.
    Now with a small change that I would like to have, can you please help me out with that too.
    I want to set in milli seconds, when the Repeat checkbox is selected to apply the delay to play the same audio file after a certain milli seconds gap.

    When repeat is selected, the audio file going on repeat has to be played again and again with each time, having a minor delay in playing the same audio file next time.
    Thank you

    Sunday, January 12, 2020 3:53 AM