將directdx轉換為slimdx (Converting directdx to slimdx)


問題描述

將directdx轉換為slimdx (Converting directdx to slimdx)

Hey I am having trouble converting from directx to slimdx. My operation system is windows 7 64 bit. Here the old directx code that don't work below:

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

Here my slimdx coversion with following error:

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

I can't figure out a way to resolve the overload expression. Please help! If you have your conversion of directx to slimdx, that will be cool!

I new to both libraries.

‑‑‑‑‑

參考解法

方法 1:

The first error regards the following line in Start():

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

CaptureBuffer cannot be instantiated from a guid. Depending on what audioDevices is you should choose an according constructor from here: http://slimdx.mdxinfo.com/latestdocs/Default.aspx?topic=Class+Reference/SlimDX.DirectSound+Namespace/CaptureBuffer+Class

The second error regards a line below:

buffer = CaptureBuffer(cap, desc)

You probably just forgot the New keyword.

(by Richard TwittyNico Schertler)

參考文件

  1. Converting directdx to slimdx (CC BY‑SA 3.0/4.0)

#slimdx #directx






相關問題

使用紋理作為渲染目標時的大小限制 (Size limitation when using a texture as a render target)

如何安全地將事件傳遞到線程中。SlimDX / DX9 (How to safely pass events into a thread. SlimDX / DX9)

將directdx轉換為slimdx (Converting directdx to slimdx)

Toán véc tơ nhanh trong .NET - Các tùy chọn là gì? (Fast Vector Math in .NET - What are the options?)

DirectX10/ShapDX 自定義控件 (DirectX10/ShapDX Custom control)

使用 GDI 繪製散點圖太慢 (Drawing scatter plot is too slow with GDI)

防止 Direct3D 視口圖像縮放 (SlimDX) (Prevent Direct3D viewport image from scaling (SlimDX))

如何使用 SlimDX 設置 HLSL 統一變量的值? (How do I set the value of a HLSL uniform variable with SlimDX?)

使用 Direct3D 繪製帶有圓角末端的線條 (Drawing lines with rounded endings with Direct3D)

如何使圖元在 DirectX (2D) 中正確覆蓋精靈 (How to make primitives correctly overlay sprites in DirectX (2D))

多個渲染目標不保存數據 (Multiple Render Targets not saving data)

SlimDX VertexDeclaration 內存洩漏?- 如何避免? (SlimDX VertexDeclaration memory leak? - How to avoid it?)







留言討論