I got a microphone to speaker output program which sometimes works, but most of the times this unhandled exception is appearing:
'Microsoft.DirectX.DirectSound.InvalidCallException' occurred in Microsoft.DirectX.DirectSound.dll
Additional information: Error in the application.
How can I solve it?
private void EchoThread() { int offset = 0;
_captureBuffer.Start(true);
_playbackBuffer.Play(0, BufferPlayFlags.Looping);
//byte[] buffer = (byte[])_captureBuffer.Read(offset, typeof(byte), LockFlag.FromWriteCursor, _bufferSize);
for (; ; )
{
_notificationEvent.WaitOne(Timeout.Infinite, true);
byte[] buffer = (byte[])_captureBuffer.Read(offset, typeof(byte), LockFlag.None, _bufferSize);
_playbackBuffer.Write(offset, buffer, LockFlag.None);
offset = (offset + _bufferSize) % (_bufferPositions * _bufferSize);
}
}
public Form1()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
_captureDevice = new Capture();
short channels = 2;
short bitsPerSample = 16;
int samplesPerSecond = 22050;
//Set up the wave format to be captured
WaveFormat waveFormat = new WaveFormat();
waveFormat.Channels = channels;
waveFormat.FormatTag = WaveFormatTag.Pcm;
waveFormat.SamplesPerSecond = samplesPerSecond;
waveFormat.BitsPerSample = bitsPerSample;
waveFormat.BlockAlign = (short)(channels * (bitsPerSample / 8));
waveFormat.AverageBytesPerSecond = waveFormat.BlockAlign * samplesPerSecond;
_bufferSize = waveFormat.AverageBytesPerSecond / 20;
CaptureBufferDescription captureBufferDescription = new CaptureBufferDescription();
captureBufferDescription.BufferBytes = _bufferPositions * _bufferSize;
captureBufferDescription.Format = waveFormat;
_captureBuffer = new CaptureBuffer(captureBufferDescription, _captureDevice);
_playbackDevice = new Device();
_playbackDevice.SetCooperativeLevel(this, CooperativeLevel.Normal);
BufferDescription playbackBufferDescription = new BufferDescription();
playbackBufferDescription.BufferBytes = _bufferPositions * _bufferSize;
playbackBufferDescription.Format = waveFormat;
_playbackBuffer = new SecondaryBuffer(playbackBufferDescription, _playbackDevice);
_echoThread = new Thread(new ThreadStart(EchoThread));
_echoThread.Start();
_notificationEvent = new AutoResetEvent(false);
for (int i = 0; i < _bufferPositions; i++)
{
//_positionNotify[i] = new BufferPositionNotify();
_positionNotify[i].Offset = (_bufferSize * i) + _bufferSize - 1;
_positionNotify[i].EventNotifyHandle = _notificationEvent.SafeWaitHandle.DangerousGetHandle();
//_positionNotify[i].EventNotifyHandle =
// _notificationEvent.SafeWaitHandle.DangerousGetHandle();
}
_echoNotify = new Notify(_captureBuffer);
_echoNotify.SetNotificationPositions(_positionNotify, _bufferPositions); **//unhandled exception is occurring in this line**
}
private void EchoClose(object sender, FormClosingEventArgs e)
{
_echoThread.Abort();
}
}
}