tags:

views:

262

answers:

0

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();
    }
}

}