0

嘿,我无法从 directx 转换为 slimdx。我的操作系统是windows 7 64位。这里是旧的directx 代码,它在下面不起作用:

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,那就太酷了!

我对这两个图书馆都是新手。

4

1 回答 1

0

第一个错误与以下行有关Start()

Dim cap As New CaptureBuffer(audioDevices(deviceIndex).DriverGuid)

ACaptureBuffer不能从 guid 实例化。根据audioDevices你应该从这里选择一个相应的构造函数:http ://slimdx.mdxinfo.com/latestdocs/Default.aspx?topic=Class+Reference/SlimDX.DirectSound+Namespace/CaptureBuffer+Class

第二个错误与下面的一行有关:

buffer = CaptureBuffer(cap, desc)

您可能只是忘记了New关键字。

于 2012-11-24T17:43:16.700 回答