在vb中调用sndPlaySound放一段wav,声音数据在程序启动时已全部调入内存
Public soundBuffer() As Byte
soundBuffer = LoadResData(101, "CUSTOM")现在点鼠标放声音时:
Sub Button1_Click()
    sndPlaySound soundBuffer(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY
End Sub有0.1-0.2秒的延迟,感觉很不爽,把参数SND_ASYNC改成SND_SYNC就没有延迟,但是又必须异步播放,请问高手解决方法。

解决方案 »

  1.   

    ' 你播的wav是什么?有多大?
    ' 试试我的这个,直接播硬盘上的试试。Option Explicit
    Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As LongPrivate Sub Command1_Click()
    PlaySound "c:\windows\media\ding.wav"
    End Sub' 播放指定磁盘中的音乐文件(.wav或.mid)
    ' Filename 为音乐文件的路径及文件名
    Function PlaySound(ByVal FileName As String) As Boolean
    Dim cmd As String, exName As String
    exName = Right(FileName, 3)
    mciSendString "close " & exName, 0, 0, 0
    If LCase(exName) = "wav" Then
        cmd = "open " & FileName & " type WAVEAudio alias " & exName
    ElseIf LCase(exName) = "mid" Then
        cmd = "open " & FileName & " type sequencer alias " & exName
    End If
    mciSendString cmd, 0, 0, 0
    PlaySound = mciSendString("play " & exName, 0, 0, 0)
    End Function
      

  2.   

    Flags : 播放方式。为数值方式:0 = 播放完才往下 RUN
    1 = 边放边 RUN 程式
    2 = 若档案不存在,将不发出警告讯息
    4 = 先将档存於变数内,可避免延迟
    8 = 重覆播放 (须配合 1 !)可合并使用,如 Flags = 1 + 8
      

  3.   

    TO goodname008(卢培培,LPP Software):
    声音文件很小,但是要反应灵敏,不能让用户感觉到停顿,你的代码我试过了,可以,但是:我的声音文件都是打包在资源文件中,防止用户修改,同时只需要发布一个exe文件即可,最好在内存能直接播放。不知有没有好的解决方案。mciSendString能不能播放加载到内存中的数据?
      

  4.   

    将sndPlaySound 的Flags参数设为:1+4
      

  5.   

    ' 我的和你的一样啊.  :(' 播放资源文件中的.wav文件
    ' ID 为.wav文件的标识号Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (lpszSoundName As Any, ByVal uFlags As Long) As Long
    Const SND_ASYNC = &H1     ' 异步播放
    Const SND_MEMORY = &H4    ' lpszSoundName 指向一个内存文件
    Const SND_NODEFAULT = &H2 ' 不使用缺省声音Function PlayResSound(ByVal ID As Integer) As Boolean
    Dim SoundBuffer() As Byte
    SoundBuffer = LoadResData(ID, "CUSTOM")
    PlayResSound = sndPlaySound(SoundBuffer(0), SND_ASYNC Or SND_NODEFAULT Or SND_MEMORY)
    End Function
      

  6.   

    ' 如果现实的话可以在程序加载时把资源文件中的文件导出到硬盘上.' 将资源文件中的文件导出到硬盘
    ' ID 为资源文件中的文件标识号, FileName 为文件导出到硬盘后的存放路径及文件名
    Function ExportFileFromRes(ByVal ID As Long, ByVal FileName As String) As Boolean
    ExportFileFromRes = False
    Dim bytDbt() As Byte
    Dim intT As Integer
    If Dir(FileName) <> "" Then
        ExportFileFromRes = False
        Exit Function
    End If
    bytDbt = LoadResData(ID, "CUSTOM")
    intT = FreeFile
    Open FileName For Binary As intT
        Put intT, , bytDbt
    Close intT
    ExportFileFromRes = True
    End Function