1

DirectSound を使用してライン入力から生データをキャプチャしようとしています。

私の問題は、バッファーから別のバッファーへのデータに一貫性がないことです。たとえば、サインをキャプチャすると、最後のバッファーと新しいバッファーからのジャンプが表示されます。これを検出するために、グラフ ウィジェットを使用して、最後のバッファーの最初の 500 要素と新しいバッファーの 500 要素を描画します。

スナップショット http://img199.imageshack.us/img199/206/demodsnap.jpg

この方法でバッファを初期化しました:

   format = new WaveFormat {
            SamplesPerSecond = 44100,
            BitsPerSample = (short)bitpersample,           
            Channels = (short)channels,
            FormatTag = WaveFormatTag.Pcm
        };

        format.BlockAlign = (short)(format.Channels * (format.BitsPerSample / 8));
        format.AverageBytesPerSecond = format.SamplesPerSecond * format.BlockAlign;

        _dwNotifySize = Math.Max(4096, format.AverageBytesPerSecond / 8);
        _dwNotifySize -= _dwNotifySize % format.BlockAlign;
        _dwCaptureBufferSize = NUM_BUFFERS * _dwNotifySize; // my capture buffer
        _dwOutputBufferSize = NUM_BUFFERS * _dwNotifySize / channels; // my output buffer

通知をバッファーの半分に 1 つ、最後に 1 つ設定します。

     _resetEvent = new AutoResetEvent(false);
        _notify = new Notify(_dwCapBuffer);

        bpn1 = new BufferPositionNotify();
        bpn1.Offset = ((_dwCapBuffer.Caps.BufferBytes) / 2) - 1;
        bpn1.EventNotifyHandle = _resetEvent.SafeWaitHandle.DangerousGetHandle();
        bpn2 = new BufferPositionNotify();
        bpn2.Offset = (_dwCapBuffer.Caps.BufferBytes) - 1;
        bpn2.EventNotifyHandle = _resetEvent.SafeWaitHandle.DangerousGetHandle();

        _notify.SetNotificationPositions(new BufferPositionNotify[] { bpn1, bpn2 });

        observer.updateSamplerStatus("Events listener initialization complete!\r\n");

そして、これが私がイベントを処理する方法です。

/* Process thread */
private void eventReceived()
        {
            int offset = 0;
            _dwCaptureThread = new Thread((ThreadStart)delegate
            {

                _dwCapBuffer.Start(true);

                while (isReady)
                {
                    _resetEvent.WaitOne(); // Notification received
                    /* Read the captured buffer */
                    Array read = _dwCapBuffer.Read(offset, typeof(short), LockFlag.None, _dwOutputBufferSize - 1);

                    observer.updateTextPacket("Buffer: " + count.ToString() + " # " + read.GetValue(read.Length - 1).ToString() + " # " + read.GetValue(0).ToString() + "\r\n");
                    /* Print last/new part of the buffer to the debug graph */
                    short[] graphData = new short[1001];
                    Array.Copy(read, graphData, 1000);

                    db.SetBufferDebug(graphData, 500);
                    observer.updateGraph(db.getBufferDebug());



                    offset = (offset + _dwOutputBufferSize) % _dwCaptureBufferSize;

                    /* Out buffer not used */
                    /*_dwDevBuffer.Write(0, read, LockFlag.EntireBuffer);

                    _dwDevBuffer.SetCurrentPosition(0);
                    _dwDevBuffer.Play(0, BufferPlayFlags.Default);*/

                }

                _dwCapBuffer.Stop();
            });
            _dwCaptureThread.Start();

        }

何かアドバイスはありますか?イベント処理のどこかで失敗していると確信していますが、どこを見つけることができません。

WaveIn API を使用して同じアプリケーションを開発したところ、うまく機能しました。

どうもありがとう...

4

1 に答える 1

0

_dwCapBuffer.Read の最後のパラメーターをよく見てください。
その型は、params int[] ランク
です。私は同じ問題を抱えており、これについて知りました。これがあなたと私の両方に役立つことを願っています。

于 2009-11-05T18:08:37.113 に答える