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.
i am writing my program in c#.
in need of help,
TaLz
Comments
here is the code...
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[i] = 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.
///
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();
}
}
}
:
: here is the code...
:
: 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[i] = 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.
: ///
: 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();
: }
:
:
: }
: }
:
:
:
I know it's kind of late, but I just came across this post. I'm interested in capturing sounds also, but from the sound card. Has anyone solved the above problem? I would really appreciate any replies.