問題描述
將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)
A 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 Twitty、Nico Schertler)