DirectSound - recording sound from microphone

TaLz

Newcomer
Joined
Mar 9, 2004
Messages
3
hello,
i am trying to record sound from a microphone and play it.
i created a capture object..recorded sound and transfered it to a secondary buffer via memory stream.
when i try to play the secondary buffer i get a short "bump" sound...after checking with the debugger i noticed that it passes the "secondaryBuffer.play" line very fast (not really playing).
the buffer size is 60000 bytes long.
the capture buffer, memory buffer (for the stream) and the secondary buffer are all the same size so i don't need any notifications.
in need of help,
TaLz
:)
 
i think I have a problem with the stream I'm using to transfer data between the captureBuffer and the buffer I use to play the sound with.

here is the code...changed it a bit

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Microsoft.DirectX;
using System.IO;
using Microsoft.DirectX.DirectSound;

using Buffer = Microsoft.DirectX.DirectSound.Buffer;

namespace Sound
{
public class Sound : System.Windows.Forms.Form
{
// private fields
private Device device;
private Capture capture;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private Buffer buffer;
private BufferDescription bufferDesc;
private CaptureBuffer captureBuffer;
private WaveFormat waveFormat;
private CaptureBufferDescription captureBuffDesc;
private MemoryStream stream;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button4;
private byte[] streamBuffer;

public Sound()
{
InitializeComponent();
// Set up DirectSound
CreateDevice();
// Load the sound
CreateWaveFormat();
CreateBufferDescription();
CreateBuffer();

// Set the cooperative level
SetCooperativeLevel();

CreateCapture();
CreateCapureDescription();
CreateCaptureBuffer();
CreateStreamBuffer();
CreateStream();
}

private void CreateDevice()
{
device = new Device();
}

private void CreateBuffer()
{
buffer = new Buffer(bufferDesc, this.device);
}

private void CreateBufferDescription()
{
bufferDesc = new BufferDescription();
bufferDesc.Format = waveFormat;
bufferDesc.BufferBytes = 100000;
bufferDesc.ControlPositionNotify = true;
bufferDesc.ControlFrequency = true;
bufferDesc.ControlPan = true;
bufferDesc.ControlVolume = true;
}

private void SetCooperativeLevel()
{
device.SetCooperativeLevel(
this , // The window for the application
CooperativeLevel.Priority // The cooperative level
);
}

private void CreateWaveFormat()
{
waveFormat = new WaveFormat();
waveFormat.BitsPerSample = 8;
waveFormat.BlockAlign = 1;
waveFormat.Channels = 1;
waveFormat.AverageBytesPerSecond = 20500;
waveFormat.SamplesPerSecond = 20500;
waveFormat.FormatTag = WaveFormatTag.Pcm;
}

private void CreateCapture()
{
capture = new Capture();
}

private void CreateCapureDescription()
{
captureBuffDesc = new CaptureBufferDescription();
captureBuffDesc.BufferBytes = 100000;
captureBuffDesc.Format = this.waveFormat;
}

private void CreateCaptureBuffer()
{
captureBuffer = new CaptureBuffer(captureBuffDesc, capture);
}

private void CreateStream()
{
stream = new MemoryStream(streamBuffer);
}

private void CreateStreamBuffer()
{
streamBuffer = new byte[100000];
for(int i=0; i<100000; i++)
streamBuffer = 0;
}



#region Windows Form Designer generated code
///<summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///</summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(48, 32);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(208, 23);
this.button1.TabIndex = 0;
this.button1.Text = "Play Sound";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(48, 72);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(208, 23);
this.button2.TabIndex = 1;
this.button2.Text = "Stop Sound";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(48, 136);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(208, 23);
this.button3.TabIndex = 2;
this.button3.Text = "Start Recording";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// button4
//
this.button4.Location = new System.Drawing.Point(48, 176);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(208, 23);
this.button4.TabIndex = 3;
this.button4.Text = "Stop Recording";
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// Game
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Name = "Sound";
this.Text = "Sound";
this.ResumeLayout(false);

}
#endregion

public static void Main ()
{
Sound s = new Sound();
s.Show();
Application.Run(s);
}

private void button1_Click( object sender, System.EventArgs e)
{
this.captureBuffer.Read(0, this.stream, 100000, LockFlag.None);
buffer.Write(0, this.stream, (int)this.stream.Length, LockFlag.EntireBuffer);
buffer.Play(0, BufferPlayFlags.Looping);
}

private void button2_Click(object sender, System.EventArgs e)
{
buffer.Stop();
}

private void button3_Click(object sender, System.EventArgs e)
{
this.captureBuffer.Start(true);
}

private void button4_Click(object sender, System.EventArgs e)
{
this.captureBuffer.Stop();
}


}
}
 
Use the other Read method

I needed to do the exact same thing, but I was having the same problem with your code that you did. After about 6 hours of trying different things, I got the data succesfully to the secondary buffer using the following code.

This is taken right from my code, but hopefully you can understand it.




byte [] data = (byte[])m_captureBuffer.Read(
0,
typeof(byte ),
LockFlag.None,
BUFFER_SIZE );

MemoryStream stream = new MemoryStream(
data, false );

BufferDescription desc = new BufferDescription();
desc.Format = WaveFormat;
desc.BufferBytes = BUFFER_SIZE;
desc.ControlPositionNotify = true;
desc.ControlFrequency = true;
desc.ControlPan = true;
desc.ControlVolume = true;

DirectSound.Buffer buffer = new DirectSound.Buffer(
desc, m_window.SoundDevice );
buffer.Write(
0,
stream,
(int)stream.Length,
LockFlag.EntireBuffer);
 
Back
Top