2012-11-23 82 views
0

嘿,我無法從directx轉換爲slimdx。我的操作系統是Windows 7 64位。在這裏,老的DirectX代碼不低於工作:將directx轉換爲slimdx

Imports Microsoft.DirectX.DirectSound 
Imports System.Threading 
Imports System.Collections.Specialized 

Public Class VU_Sound_Form 

    Private Const SAMPLES As Integer = 8 
    Private Shared SAMPLE_FORMAT_ARRAY As Integer() = {SAMPLES, 2, 1} 
    Public Shared audioDevices As CaptureDevicesCollection 
    Private Shared m_deviceNames As StringCollection 

    Private deviceIndex As Integer = -1 
    Private buffer As Microsoft.DirectX.DirectSound.CaptureBuffer 
    Private liveVolumeThread As System.Threading.Thread 
    Private m_frameDelay As Integer = 20 
    Private Range_Division As Integer = 10 

    'FrameDelay - the time in milliseconds between animation frames, measured in milliseconds. 
    'Values between 10 and 30 generally give good results, default is 20. 


    Private Sub VU_Sound_Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim audioDevices As New CaptureDevicesCollection 
     Dim x As Integer = 0 
     MsgBox(audioDevices.Count.ToString()) 
     While x < audioDevices.Count 
      ComboBox1.Items.Add(audioDevices.Item(x).Description) 
      ' x = x + 1 
     End While 
     ComboBox1.SelectedIndex = 0 
     Start() 
    End Sub 


    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged 
     Start() 
    End Sub 


    Public Sub Start() 
     [Stop]() 
     Dim audioDevices As New CaptureDevicesCollection 
     deviceIndex = ComboBox1.SelectedIndex 
     If deviceIndex <> -1 Then 
      ' initialize the capture buffer and start the animation thread 
      Dim cap As New Capture(audioDevices(deviceIndex).DriverGuid) 
      Dim desc As New CaptureBufferDescription() 
      Dim wf As New WaveFormat() 
      wf.BitsPerSample = 16 
      wf.SamplesPerSecond = 44100 
      wf.Channels = 2 
      wf.BlockAlign = CShort(wf.Channels * wf.BitsPerSample/8) 
      wf.AverageBytesPerSecond = wf.BlockAlign * wf.SamplesPerSecond 
      wf.FormatTag = WaveFormatTag.Pcm 

      desc.Format = wf 
      desc.BufferBytes = SAMPLES * wf.BlockAlign 

      buffer = New Microsoft.DirectX.DirectSound.CaptureBuffer(desc, cap) 
      buffer.Start(True) 

      ' Start a seperate thread to read the buffer and update the progress bars 
      liveVolumeThread = New Thread(AddressOf updateProgress) 'Thread starts at updateProgress 
      Control.CheckForIllegalCrossThreadCalls = False ' This is needed otherwise the form will not update 
      liveVolumeThread.Priority = ThreadPriority.Lowest ' Thread works in the background 
      liveVolumeThread.Start() 

     End If 
    End Sub 

    Public Sub [Stop]() 
     If liveVolumeThread IsNot Nothing Then 
      liveVolumeThread.Abort() 
      liveVolumeThread.Join() 
      liveVolumeThread = Nothing 
     End If 

     If buffer IsNot Nothing Then 
      If buffer.Capturing Then 
       buffer.[Stop]() 
      End If 

      buffer.Dispose() 
      buffer = Nothing 
     End If 
    End Sub 



    Public Sub updateProgress() 

     While True 
      Dim tempFrameDelay As Integer = m_frameDelay 
      Dim samples__1 As Array = buffer.Read(0, GetType(Int16), LockFlag.FromWriteCursor, SAMPLE_FORMAT_ARRAY) 

      Dim leftGoal As Integer = 0 
      Dim rightGoal As Integer = 0 

      ' Convert the 8 samples to positive values and sum them togather 
      For i As Integer = 0 To SAMPLES - 1 
       If CType(samples__1.GetValue(i, 0, 0), Int16) < 0 Then 
        leftGoal -= CType(samples__1.GetValue(i, 0, 0), Int16) 
       Else 
        leftGoal += CType(samples__1.GetValue(i, 0, 0), Int16) 
       End If 
       If CType(samples__1.GetValue(i, 1, 0), Int16) < 0 Then 
        rightGoal -= CType(samples__1.GetValue(i, 1, 0), Int16) 
       Else 
        rightGoal += CType(samples__1.GetValue(i, 1, 0), Int16) 
       End If 
      Next 

      ' Calculate the average of the 8 samples 
      leftGoal = CInt(Math.Abs(leftGoal \ SAMPLES)) 
      rightGoal = CInt(Math.Abs(rightGoal \ SAMPLES)) 

      ' Convert values to deecibels 
      If leftGoal = 0 Then leftGoal = 1 
      If rightGoal = 0 Then rightGoal = 1 
      leftGoal = (100 + (20 * Math.Log10(leftGoal/32768))) 
      rightGoal = (100 + (20 * Math.Log10(rightGoal/32768))) 

      'By adding 100 sets the display range from 0 to 100 
      'By limiting the progreess bars to 74-100 gives a viewed range of +10dB to -26dB 




      'Trap the range between 74-100, giving a 26dB meter 
      If leftGoal < 74 Then leftGoal = 74 
      If rightGoal < 74 Then rightGoal = 74 ' Set the display range to minimum -10dB 
      If leftGoal > 100 Then leftGoal = 100 
      If rightGoal > 100 Then rightGoal = 100 

      Dim range1 As Double = leftGoal - ProgressBar1.Value ' calculates the difference between new and the current progress bar value 
      Dim range2 As Double = rightGoal - ProgressBar2.Value 

      ' Assign the exact current value of the progress bar 
      Dim exactValue1 As Double = ProgressBar1.Value 
      Dim exactValue2 As Double = ProgressBar2.Value 

      Dim stepSize1 As Double = range1/Range_Division 
      Dim absStepSize1 As Double = Math.Abs(stepSize1) 

      Dim stepSize2 As Double = range2/Range_Division 
      Dim absStepSize2 As Double = Math.Abs(stepSize2) 

      If ProgressBar1.Value < leftGoal Then ' Display the peak 
       ProgressBar1.Value = leftGoal 
      End If 

      If ProgressBar1.Value > leftGoal Then ' decrement the value by the Range_Division 
       If absStepSize1 < Math.Abs(leftGoal - ProgressBar1.Value) Then 
        exactValue1 += stepSize1 
        ProgressBar1.Value = Math.Truncate(exactValue1) 
       Else 
        ProgressBar1.Value = leftGoal 
       End If 
      End If 

      If ProgressBar2.Value < rightGoal Then 
       ProgressBar2.Value = rightGoal 
      End If 

      If ProgressBar2.Value > rightGoal Then ' decrement the value by the Range_Division 
       If absStepSize2 < Math.Abs(rightGoal - ProgressBar2.Value) Then 
        exactValue2 += stepSize2 
        ProgressBar2.Value = Math.Truncate(exactValue2) 
       Else 
        ProgressBar2.Value = rightGoal 
       End If 
      End If 
      Thread.Sleep(m_frameDelay) 
     End While 
    End Sub 


    Private Sub ProgressBar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgressBar1.Click 

    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 



    End Sub 
End Class 

這裏我slimdx丁文與以下錯誤:

Error 1 Overload resolution failed because no accessible 'New' accepts this number of arguments. C:\Users\UltimateSoul\Documents\Visual Studio 2010\Projects\WindowsApplication3\WindowsApplication3\Form1.vb 43 17 WindowsApplication3 

Error 2 'CaptureBuffer' is a type and cannot be used as an expression. C:\Users\UltimateSoul\Documents\Visual Studio 2010\Projects\WindowsApplication3\WindowsApplication3\Form1.vb 56 22 WindowsApplication3 


'Imports Microsoft.DirectX.DirectSound 
Imports System.Threading 
Imports System.Collections.Specialized 
Imports SlimDX.DirectSound 
Imports SlimDX.Multimedia 

'Imports SlimDX.DirectSound 


Public Class Form1 

    Private Const SAMPLES As Integer = 8 
    Private Shared SAMPLE_FORMAT_ARRAY As Integer() = {SAMPLES, 2, 1} 
    Public Shared audioDevices As DeviceCollection 
    Private Shared m_deviceNames As StringCollection 

    Private deviceIndex As Integer = -1 
    Private buffer As Microsoft.DirectX.DirectSound.CaptureBuffer 
    Private liveVolumeThread As System.Threading.Thread 
    Private m_frameDelay As Integer = 20 
    Private Range_Division As Integer = 10 

    'FrameDelay - the time in milliseconds between animation frames, measured in milliseconds. 
    'Values between 10 and 30 generally give good results, default is 20. 


    Private Sub VU_Sound_Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    End Sub 


    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged 
     Start() 
    End Sub 


    Public Sub Start() 
     [Stop]() 
     Dim audioDevices As New DeviceCollection 
     deviceIndex = ComboBox1.SelectedIndex 
     If deviceIndex <> -1 Then 
      ' initialize the capture buffer and start the animation thread 
      Dim cap As New CaptureBuffer(audioDevices(deviceIndex).DriverGuid) 
      Dim desc As New CaptureBufferDescription() 
      Dim wf As New WaveFormat() 
      wf.BitsPerSample = 16 
      wf.SamplesPerSecond = 44100 
      wf.Channels = 2 
      wf.BlockAlignment = CShort(wf.Channels * wf.BitsPerSample/8) 
      wf.AverageBytesPerSecond = wf.BlockAlignment * wf.SamplesPerSecond 
      wf.FormatTag = WaveFormatTag.Pcm 

      desc.Format = wf 
      desc.BufferBytes = SAMPLES * wf.BlockAlignment 

      buffer = CaptureBuffer(cap, desc) 
      buffer.Start(True) 

      ' Start a seperate thread to read the buffer and update the progress bars 
      liveVolumeThread = New Thread(AddressOf updateProgress) 'Thread starts at updateProgress 
      Control.CheckForIllegalCrossThreadCalls = False ' This is needed otherwise the form will not update 
      liveVolumeThread.Priority = ThreadPriority.Lowest ' Thread works in the background 
      liveVolumeThread.Start() 

     End If 
    End Sub 

    Public Sub [Stop]() 
     If liveVolumeThread IsNot Nothing Then 
      liveVolumeThread.Abort() 
      liveVolumeThread.Join() 
      liveVolumeThread = Nothing 
     End If 

     If buffer IsNot Nothing Then 
      If buffer.Capturing Then 
       buffer.[Stop]() 
      End If 

      buffer.Dispose() 
      buffer = Nothing 
     End If 
    End Sub 



    Public Sub updateProgress() 

     While True 
      Dim tempFrameDelay As Integer = m_frameDelay 
      Dim samples__1 As Array = buffer.Read(0, GetType(Int16), LockFlags.FromWriteCursor, SAMPLE_FORMAT_ARRAY) 

      Dim leftGoal As Integer = 0 
      Dim rightGoal As Integer = 0 

      ' Convert the 8 samples to positive values and sum them togather 
      For i As Integer = 0 To SAMPLES - 1 
       If CType(samples__1.GetValue(i, 0, 0), Int16) < 0 Then 
        leftGoal -= CType(samples__1.GetValue(i, 0, 0), Int16) 
       Else 
        leftGoal += CType(samples__1.GetValue(i, 0, 0), Int16) 
       End If 
       If CType(samples__1.GetValue(i, 1, 0), Int16) < 0 Then 
        rightGoal -= CType(samples__1.GetValue(i, 1, 0), Int16) 
       Else 
        rightGoal += CType(samples__1.GetValue(i, 1, 0), Int16) 
       End If 
      Next 

      ' Calculate the average of the 8 samples 
      leftGoal = CInt(Math.Abs(leftGoal \ SAMPLES)) 
      rightGoal = CInt(Math.Abs(rightGoal \ SAMPLES)) 

      ' Convert values to deecibels 
      If leftGoal = 0 Then leftGoal = 1 
      If rightGoal = 0 Then rightGoal = 1 
      leftGoal = (100 + (20 * Math.Log10(leftGoal/32768))) 
      rightGoal = (100 + (20 * Math.Log10(rightGoal/32768))) 

      'By adding 100 sets the display range from 0 to 100 
      'By limiting the progreess bars to 74-100 gives a viewed range of +10dB to -26dB 




      'Trap the range between 74-100, giving a 26dB meter 
      If leftGoal < 74 Then leftGoal = 74 
      If rightGoal < 74 Then rightGoal = 74 ' Set the display range to minimum -10dB 
      If leftGoal > 100 Then leftGoal = 100 
      If rightGoal > 100 Then rightGoal = 100 

      Dim range1 As Double = leftGoal - ProgressBar1.Value ' calculates the difference between new and the current progress bar value 
      Dim range2 As Double = rightGoal - ProgressBar2.Value 

      ' Assign the exact current value of the progress bar 
      Dim exactValue1 As Double = ProgressBar1.Value 
      Dim exactValue2 As Double = ProgressBar2.Value 

      Dim stepSize1 As Double = range1/Range_Division 
      Dim absStepSize1 As Double = Math.Abs(stepSize1) 

      Dim stepSize2 As Double = range2/Range_Division 
      Dim absStepSize2 As Double = Math.Abs(stepSize2) 

      If ProgressBar1.Value < leftGoal Then ' Display the peak 
       ProgressBar1.Value = leftGoal 
      End If 

      If ProgressBar1.Value > leftGoal Then ' decrement the value by the Range_Division 
       If absStepSize1 < Math.Abs(leftGoal - ProgressBar1.Value) Then 
        exactValue1 += stepSize1 
        ProgressBar1.Value = Math.Truncate(exactValue1) 
       Else 
        ProgressBar1.Value = leftGoal 
       End If 
      End If 

      If ProgressBar2.Value < rightGoal Then 
       ProgressBar2.Value = rightGoal 
      End If 

      If ProgressBar2.Value > rightGoal Then ' decrement the value by the Range_Division 
       If absStepSize2 < Math.Abs(rightGoal - ProgressBar2.Value) Then 
        exactValue2 += stepSize2 
        ProgressBar2.Value = Math.Truncate(exactValue2) 
       Else 
        ProgressBar2.Value = rightGoal 
       End If 
      End If 
      Thread.Sleep(m_frameDelay) 
     End While 
    End Sub 


    Private Sub ProgressBar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgressBar1.Click 

    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim audioDevices As New DeviceCollection 
     Dim x As Integer = 0 
     MsgBox(audioDevices.Count.ToString()) 
     While x < audioDevices.Count 
      ComboBox1.Items.Add(audioDevices.Item(x).Description) 
      ' x = x + 1 
     End While 
     ComboBox1.SelectedIndex = 0 
     Start() 


    End Sub 
End Class 

我不能想出一個辦法來解決超載的表達。請幫忙! 如果您將directx轉換爲slimdx,那將很酷!

我對這兩個庫都很陌生。

+0

我不是VB專家,但這些錯誤似乎只不過是語法錯誤。谷歌給出了大量的錯誤消息的結果。檢查行號和你的VB手冊,你應該能夠很快解決這個問題。 – Lucius

回答