'现在的程序只能播放 .MID   文件,我现在要播放 .WAV 怎么改?
Private Sub cmdPlayPassport_Click()
Dim dmA As DMUS_AUDIOPARAMS
            
        cmdPlayPassport.Caption = "&Stop Passport.MID"
        Set dmp = dx.DirectMusicPerformanceCreate
        dmp.InitAudio Me.hWnd, DMUS_AUDIOF_ALL, dmA, Nothing, DMUS_APATH_SHARED_STEREOPLUSREVERB, 64
        dml.SetSearchDirectory App.Path & IIf(Right$(App.Path, 1) = "\", "", "\")
            
        Set seg = dml.LoadSegment("PASSPORT.MID")
        seg.Download dmp.GetDefaultAudioPath
        
        dmp.PlaySegmentEx seg, 0, 0
    Else
        m_blnPassport = False
        cmdPlayPassport.Caption = "&Play Passport.MID"
        If Not seg Is Nothing Then
            dmp.StopEx dmp.GetDefaultAudioPath, 0, 0
            dmp.CloseDown
    If Not m_blnPassport Then
        m_blnPassport = True            Set dmp = Nothing
        End If
    End If
        
End Sub

解决方案 »

  1.   

    有个多路语音播放控件的部分代码,你看一下
    Option ExplicitDim DirectX As New DirectX7
    Dim DS() As DirectSound
    Dim DScaps As DirectSoundEnum
    Dim mavrInterval As Integer'事件
    Public Event TaskEnd(iSourceNumber As Byte)
    Public Event Tasking(TaskStatus As Collection)
    Dim ChannleNumber As IntegerType channel
        ChannleEnabled As Boolean
        ChannleBuffer As DirectSoundBuffer
        Files As Collection
    End Type
    Public iHwnd As Integer
    Dim tChannle() As channelPublic Property Let ReturnInterval(i As Integer)
    mavrInterval = i
    End Property
    Public Function Task_Play(i As Integer, cfilelist As Collection) As Boolean
    If cfilelist.Count > 0 Then
        Set tChannle(i).Files = cfilelist
        tChannle(i).ChannleEnabled = True
    End If
    End Function
    Public Function Task_Stop(i As Integer) As Boolean
    tChannle(i).ChannleEnabled = False
    Set tChannle(i).Files = Nothing
    tChannle(i).ChannleBuffer.Stop
    Set tChannle(i).ChannleBuffer = Nothing
    End FunctionPublic Function SetCooperativeLevel(iHwnd As Long) As Boolean
    Dim i As Integer
    For i = 0 To (ChannleNumber / 2) - 1    DS(i).SetCooperativeLevel iHwnd, DSSCL_PRIORITY ' DSSCL_PRIORITY
    Next i
    End FunctionPrivate Function LoadWavebuffer(DSound As DirectSound, waveFile As String)Dim bufferDesc As DSBUFFERDESC
    Dim waveFormat As WAVEFORMATEX
    'bufferDesc.lBufferBytes = 1024 * 1024
    bufferDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_STATICwaveFormat.nFormatTag = WAVE_FORMAT_PCM
    waveFormat.nChannels = 0
    waveFormat.lSamplesPerSec = 22050
    waveFormat.nBitsPerSample = 16
    waveFormat.nBlockAlign = waveFormat.nBitsPerSample / 8 * waveFormat.nChannels
    waveFormat.lAvgBytesPerSec = waveFormat.lSamplesPerSec * waveFormat.nBlockAlignSet LoadWavebuffer = DSound.CreateSoundBufferFromFile(waveFile, bufferDesc, waveFormat)
    End FunctionPrivate Sub Timer1_Timer()
    Dim i As Integer
    For i = 0 To ChannleNumber - 1
        If tChannle(i).ChannleEnabled Then
            Select Case tChannle(i).ChannleBuffer.GetStatus
                Case DSBSTATUS_BUFFERLOST
                
                Case DSBSTATUS_LOOPING
                
                Case DSBSTATUS_PLAYING
                    
                Case 0
                    Select Case i
                        Case 0, 1
                            If tChannle(i).Files.Count > 0 Then
                                Set tChannle(i).ChannleBuffer = LoadWavebuffer(DS(0), tChannle(i).Files.Item(1))
                            Else
                                tChannle(i).ChannleEnabled = False
                                Set tChannle(i).Files = Nothing
                                Set tChannle(i).ChannleBuffer = Nothing
                                RaiseEvent TaskEnd(CByte(i))
                            End If
                            
                        Case 2, 3
                            If tChannle(i).Files.Count > 0 Then
                                Set tChannle(i).ChannleBuffer = LoadWavebuffer(DS(1), tChannle(i).Files.Item(1))
                            Else
                                tChannle(i).ChannleEnabled = False
                                Set tChannle(i).Files = Nothing
                                Set tChannle(i).ChannleBuffer = Nothing
                                RaiseEvent TaskEnd(CByte(i))
                            End If
                            
                        Case 4, 5
                            If tChannle(i).Files.Count > 0 Then
                                Set tChannle(i).ChannleBuffer = LoadWavebuffer(DS(2), tChannle(i).Files.Item(1))
                            Else
                                tChannle(i).ChannleEnabled = False
                                Set tChannle(i).Files = Nothing
                                Set tChannle(i).ChannleBuffer = Nothing
                                RaiseEvent TaskEnd(CByte(i))
                            End If
                            
                        Case 6, 7
                            If tChannle(i).Files.Count > 0 Then
                                Set tChannle(i).ChannleBuffer = LoadWavebuffer(DS(3), tChannle(i).Files.Item(1))
                            Else
                                tChannle(i).ChannleEnabled = False
                                Set tChannle(i).Files = Nothing
                                Set tChannle(i).ChannleBuffer = Nothing
                                RaiseEvent TaskEnd(CByte(i))
                            End If
                            
                    End Select
                    If i Mod 2 = 1 Then
                        tChannle(i).ChannleBuffer.SetPan 10000
                    ElseIf i Mod 2 = 0 Then
                        tChannle(i).ChannleBuffer.SetPan -10000
                    End If
                    tChannle(i).ChannleBuffer.Play DSBPLAY_DEFAULT
                    If tChannle(i).ChannleBuffer.GetStatus = DSBSTATUS_PLAYING Then tChannle(i).Files.Remove 1
            End Select
        End If
    Next i
    End SubPrivate Sub UserControl_Initialize()
    Dim i As Integer
    Set DScaps = DirectX.GetDSEnum '获得系统中的声音设备数
    If DScaps.GetCount > 1 Then
        ChannleNumber = (DScaps.GetCount - 1) * 2
        ReDim DS(DScaps.GetCount - 2) As DirectSound
        ReDim tChannle(ChannleNumber - 1) As channel
        For i = 2 To DScaps.GetCount
            Set DS(i - 2) = DirectX.DirectSoundCreate(DScaps.GetGuid(i)) '为每一个设备创建一个主缓冲区
            tChannle(i - 2).ChannleEnabled = False ' False
            tChannle(i - 1).ChannleEnabled = False '
        Next i
        Timer1.Enabled = True
        Timer1.Interval = 10
    End If
    End Sub
      

  2.   

    有directx sdk for vb的
    有大把的例子
      

  3.   

    自己看directx sdk for vb
      

  4.   

    一个例子:Option ExplicitDim objDX As New DirectX7
    Dim objDS As DirectSound
    Dim objDSB As DirectSoundBuffer
    Dim blnLoaded As BooleanPrivate Sub Form_Load()
        On Local Error Resume Next
        Set objDS = objDX.DirectSoundCreate("")
        If Err.Number <> 0 Then
            MsgBox "创建DirectSound失败!"
            End
        End If
        objDS.SetCooperativeLevel Me.hWnd, DSSCL_NORMAL
        
        LoadWaveFile
    End SubSub LoadWaveFile()
        Dim bufferDesc As DSBUFFERDESC
        Dim waveFormat As WAVEFORMATEX
        Dim sndFile As String
        sndFile = "c:\windows\media\logoff.wav"
        
        bufferDesc.lFlags = DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME Or DSBCAPS_STATIC
        
        waveFormat.nFormatTag = WAVE_FORMAT_PCM
        waveFormat.nChannels = 2                    'stereo
        waveFormat.lSamplesPerSec = 22050           '22kHz
        waveFormat.nBitsPerSample = 16              '16-bit
        waveFormat.nBlockAlign = waveFormat.nBitsPerSample / 8 * waveFormat.nChannels
        waveFormat.lAvgBytesPerSec = waveFormat.lSamplesPerSec * waveFormat.nBlockAlign
        
        Set objDSB = objDS.CreateSoundBufferFromFile(sndFile, bufferDesc, waveFormat)
            If Err.Number <> 0 Then
            MsgBox "ERROR!!"
            End
        End If    objDSB.SetVolume 0
        objDSB.SetPan 0    Dim flag As Long
        flag = 0
        objDSB.Play flag
        
    End Sub