Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectSound
Imports System.Threading
Imports System.IO
Public Class Form1
Dim cBuff As CaptureBuffer 'buffer di registrazione
Dim th As New Threading.Thread(AddressOf checkD) 'thread che salva ad intervalli regolari i dati nel file
Public PositionNotify(16) As BufferPositionNotify 'posizioni di notifica
Public appNotify As Notify 'notificatore
Public NotificationEvent As AutoResetEvent = Nothing 'gestore delle attese nel thread
Dim captureBufferSize As Integer 'dimensione del buffer
Dim notifySize As Integer 'dimensione della notifica
Public NextCaptureOffset As Integer = 0 'prossimo intervallo di cattura
Private WaveFile As FileStream = Nothing 'file wave
Private Writer As BinaryWriter = Nothing 'scrittore del file
Private SampleCount As Integer = 0 'bit catturati
Private isRecording As Boolean = False
Const nNotification As Integer = 16
'guide del sistema
Dim guide() As Guid
Private Sub Rec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Rec.Click
'bit per sample
Dim bitS As Integer
If bit1.Checked Then bitS = 8 Else bitS = 16
'canali
Dim canali As Integer
If canali1.Checked Then canali = 1 Else canali = 2
'frequenza
Dim freq As Integer
If freq1.Checked Then freq = 48000
If freq2.Checked Then freq = 44100
If freq3.Checked Then freq = 22050
If freq4.Checked Then freq = 11025
If freq5.Checked Then freq = 8000
Rec.Enabled = False
stopRec.Enabled = True
'descrizione del capBuffer
Dim capD As CaptureBufferDescription
Dim captureF As New Capture(guide(ComboBox1.SelectedIndex))
'formato
Dim format As WaveFormat
format.BitsPerSample = bitS
format.Channels = canali
format.SamplesPerSecond = freq
format.BlockAlign = CShort(format.Channels * (format.BitsPerSample / 8))
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond
format.FormatTag = WaveFormatTag.Pcm
capD.Format = format
Select Case SaveD.ShowDialog
Case Windows.Forms.DialogResult.OK, Windows.Forms.DialogResult.Yes
'crea il file
CreateRIFF(SaveD.FileName, format)
Case Else
Exit Sub
End Select
notifySize = IIf(1024 > format.AverageBytesPerSecond / 8, 1024, format.AverageBytesPerSecond / 8)
notifySize -= notifySize Mod format.BlockAlign
' imposta la dimensione del buffer
captureBufferSize = notifySize * nNotification
' Crea il capture buffer
capD.BufferBytes = captureBufferSize
cBuff = New CaptureBuffer(capD, captureF)
NotificationEvent = New AutoResetEvent(False)
'creazione notifica
Dim i As Integer
For i = 0 To nNotification - 1
PositionNotify(i).Offset = notifySize * i + notifySize - 1
PositionNotify(i).EventNotifyHandle = NotificationEvent.Handle
Next
appNotify = New Notify(cBuff)
'imposta il notificatore affinchè generi l'evento nel thread
appNotify.SetNotificationPositions(PositionNotify, nNotification)
isRecording = True
cBuff.Start(True)
th.Start() 'inizia il thread
End Sub