Solved

500 POINTS, Please help me as soon as possible.

Posted on 2006-07-02
4
688 Views
Last Modified: 2012-08-13
I asked this question, but I must say that I'm not satisfied with the answer.
How to record from Microphone ~~>Save in to file and process.
Buy component, look Example CaptureSound, and another solution that too old, required directx7 or too difficult Solution,
I"m not an experts at all.

The best answer is that: if you can modify this code?  It seems work, but it automatically save this file in "C:\test.wav"
Can't here anything. Please help me. If this code is good, I can easily use this by call. "MyVar.StartRecord()" for example.
Please checked it carefully for me?
Thanks a lot.

Here is the code:


Imports Microsoft.VisualBasic
Imports System
Imports Microsoft.DirectX.DirectSound
Imports System.Windows.Forms
Imports Buffer = Microsoft.DirectX.DirectSound.Buffer
Imports System.IO
Imports System.Collections



Namespace DirectSoundRecording
    ''' <summary>
    ''' Class used to handle the sound capture qualities of the program
    ''' </summary>
    Public Class SoundRec
        Private devices As CaptureDevicesCollection = New CaptureDevicesCollection
        Private MyCapture As Capture = New Capture(devices(0).DriverGuid)  ' Am I right to choose this device?
        Private MySndBuf As CaptureBuffer
        ''' <summary>
        ''' Sets a default format capture buffer with no effects; 22KHz 8bit/sample, mono
        ''' </summary>
        Public Sub New()
            Dim MySBufDesc As CaptureBufferDescription = New CaptureBufferDescription()
            'setting the default wave capture format for use
            'by the buffer descriptor
            Dim DefaultFormat As WaveFormat = New WaveFormat()
            DefaultFormat.SamplesPerSecond = 22000 'default freq 22khz
            DefaultFormat.Channels = 1
            DefaultFormat.BitsPerSample = 8
            DefaultFormat.AverageBytesPerSecond = 22000
            DefaultFormat.BlockAlign = 1

            'setting the buffer descriptor to tell the capture buffer object how the
            'buffer should perform            
            MySBufDesc.Format = DefaultFormat
            MySBufDesc.BufferBytes = 2000000
            MySBufDesc.ControlEffects = False
            MySBufDesc.WaveMapped = True

            MySndBuf = New CaptureBuffer(MySBufDesc, MyCapture)
        End Sub

        ''' <summary>
        ''' Constructor that sets format and buffersize, as well as enables
        ''' echo cancellation and noise suppression effects
        ''' </summary>
        ''' <param name="MyFormat"></param>
        ''' <param name="bufsize"></param>
        Public Sub New(ByVal MyFormat As WaveFormat, ByVal bufsize As Integer)
            Dim MySBufDesc As CaptureBufferDescription = New CaptureBufferDescription()
            'Format has been defined in MainForm
            MySBufDesc.Format = MyFormat
            MySBufDesc.BufferBytes = bufsize
            MySBufDesc.ControlEffects = True
            MySBufDesc.WaveMapped = True

            '            CaptureAcousticEchoCancellationEffect AECEffect;
            '
            '            MySBufDesc.CaptureEffectDescription = new CaptureEffectDescription[1];
            '            MySBufDesc.CaptureEffectDescription[0].LocateInSoftware = true;
            '            MySBufDesc.CaptureEffectDescription[0].GuidEffectsClass = DSoundHelper.CaptureEffectsMsAcousticEchoCancellation;
            '            MySBufDesc.CaptureEffectDescription[0].GuidEffectsInstance = DSoundHelper.InterfaceCaptureEffectsAcousticEchoCancellation;
            '            MySBufDesc.CaptureEffectDescription[1].LocateInSoftware = true;
            '            MySBufDesc.CaptureEffectDescription[1].GuidEffectsClass = DSoundHelper.CaptureEffectsMsNoiseSuppression;

            Try
                'Create the CaptureBuffer
                MySndBuf = New CaptureBuffer(MySBufDesc, MyCapture)
            Catch se As SoundException
                MessageBox.Show("There is a " & se.ErrorString & " sound exception", "DirectSound Error")
            End Try
        End Sub
        ''' <summary>
        ''' Starts the capture from the capture device
        ''' </summary>
        Public Sub StartRecord()
            MySndBuf.Start(True)
        End Sub

        ''' <summary>
        ''' Stops the recording of sound.
        ''' </summary>
        Public Sub StopRecord()
            MySndBuf.Stop()
        End Sub

        ''' <summary>
        ''' Saves the data in the capture buffer into a wave file
        ''' </summary>
        Public Sub ReadData()
            Dim readposition, writeposition As Integer
            Dim byteArrayList As ArrayList = New ArrayList()
            Dim ascii As System.Text.ASCIIEncoding = New System.Text.ASCIIEncoding()

            'Create a new wav file to store the capture buffer data.
            'if already exists will overwrite filename is test.wav
            Dim path As String = "c:\test.wav"
            Dim MemStream As Stream = New MemoryStream()
            MySndBuf.GetCurrentPosition(writeposition, readposition)
            MySndBuf.Read(0, MemStream, writeposition, LockFlag.None)
            Dim MyStream As Stream = New FileStream(path, FileMode.Create)
            'begin to write the wave file header. for more details
            'Search google.com for "wave formats"
            'RIFF header
            Try

                byteArrayList.AddRange(ascii.GetBytes("RIFF"))
                byteArrayList.AddRange(ToBytes(36 + CInt(Fix(MemStream.Length)), 4))
                byteArrayList.AddRange(ascii.GetBytes("WAVE"))

                'fmt  chunk
                byteArrayList.AddRange(ascii.GetBytes("fmt "))
                'length of fmt chunk (never changes)
                byteArrayList.AddRange(ToBytes(16, 4))
                '"1" for pcm encoding
                byteArrayList.AddRange(ToBytes(1, 2))
                byteArrayList.AddRange(ToBytes(MySndBuf.Format.Channels, 2))
                byteArrayList.AddRange(ToBytes(MySndBuf.Format.SamplesPerSecond, 4))
                byteArrayList.AddRange(ToBytes(MySndBuf.Format.AverageBytesPerSecond, 4))
                byteArrayList.AddRange(ToBytes(MySndBuf.Format.BlockAlign, 2))
                byteArrayList.AddRange(ToBytes(MySndBuf.Format.BitsPerSample, 2))

                'the data chunk
                byteArrayList.AddRange(ascii.GetBytes("data"))
                byteArrayList.AddRange(ToBytes(CInt(Fix(MemStream.Length)), 4))
                Dim buffer As Byte() = New Byte(MemStream.Length - 1) {}
                MemStream.Read(buffer, 0, CInt(Fix(MemStream.Length)))
                byteArrayList.AddRange(buffer)
                buffer = New Byte(byteArrayList.Count - 1) {}
                byteArrayList.CopyTo(buffer)
                MyStream.Write(buffer, 0, buffer.Length)
            Catch ae As ArgumentException
                MessageBox.Show("Argument Exception with Message:" & Constants.vbLf + Constants.vbTab + ae.Message)
            Finally
                MemStream.Close()
                MyStream.Close()
            End Try


        End Sub

        ''' <summary>
        ''' returns capture status (boolean)
        ''' </summary>
        ''' <returns></returns>
        Public Function Capturing() As Boolean
            Return MySndBuf.Capturing
        End Function


        ''' <summary>
        ''' Recursive method that returns a target number in the form
        ''' of an ArrayList of bytes with designated number of bytes. If not enough
        ''' bytes to hold the targetnumber, will throw argumentexception.
        ''' Should be used in a try-catch clause
        ''' </summary>
        ''' <param name="targetnumber">the value intended to convert</param>
        ''' <param name="numofbytes">number of bytes needed</param>
        ''' <returns></returns>
        Private Function ToBytes(ByVal targetnumber As Integer, ByVal numofbytes As Short) As ArrayList
            Dim remainder, result As Integer
            Dim returningarray As ArrayList

            Dim wrongnumofbytes As ArgumentException = New ArgumentException("Not enough bytes to represent number", "numofbytes")
            result = Math.DivRem(targetnumber, 256, remainder)


            'if not enough bytes specified to represent target number
            If targetnumber >= Math.Pow(256, CDbl(numofbytes)) Then
                Throw wrongnumofbytes
            End If

            'if there are higher significant hexadecima, run a recursion
            If result >= 1 Then
                returningarray = ToBytes(result, CShort(Fix(numofbytes - 1)))
                returningarray.Insert(0, Convert.ToByte(remainder))
                Return returningarray

            Else 'if (result < 1) recursion terminating condition
                returningarray = New ArrayList(numofbytes)
                returningarray.Add(Convert.ToByte(targetnumber))
                Dim i As Integer = 0
                Do While i < numofbytes - 1
                    returningarray.Add(Convert.ToByte(0)) 'fill up most significant hexadecima with 0's
                    i += 1
                Loop
                Return returningarray
            End If
        End Function
    End Class 'end class

End Namespace
0
Comment
Question by:cutoi
  • 3
4 Comments
 

Author Comment

by:cutoi
ID: 17027186
Please help me.
0
 

Author Comment

by:cutoi
ID: 17027249
OK, My purpose is very simple.
Instead of chosing a lot of choice to record.
I just want to record:
- from Microphone
-44100,16bit,stereo
-saved to "c:\test.wav"

please help me.
0
 
LVL 9

Accepted Solution

by:
jrscherer earned 500 total points
ID: 17027330
0
 

Author Comment

by:cutoi
ID: 17027530
Oh, I'm doing with it, But I don't want all the Form, What I need is not a form, It has 2 button:
StartRecording and StopRecording(and save file in C:\test.wav) - 44100,16bit,stereo.
To read all code and translate is too difficult for me. I've just learn VB and need it to do my work. That's all.
Please help me.
0

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Close tabpage of custom control 9 37
send messages to whatsapp programatically 2 50
HTML - Color not displaying correctly in EMAIL. 6 42
Expression Evaluater 3 28
This tutorial demonstrates one way to create an application that runs without any Forms but still has a GUI presence via an Icon in the System Tray. The magic lies in Inheriting from the ApplicationContext Class and passing that to Application.Ru…
1.0 - Introduction Converting Visual Basic 6.0 (VB6) to Visual Basic 2008+ (VB.NET). If ever there was a subject full of murkiness and bad decisions, it is this one!   The first problem seems to be that people considering this task of converting…
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

825 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question