示例#1
0
        private void WorkerThread(object start)
        {
            if (BehaviorVector[(int)BehaviorVectorMask.DispatchOnWorkerThread])
            {
                _dispatchOnWorkerThread = true;
            }
            WaveInfo = ((Func <IWaveInfo>)start)();
            var grabber = new Grabber(WaveInfo, _dispatchOnWorkerThread);

            OnEnterWorkerThread();
            try
            {
                var format     = new WaveFormat(44100, 16, _device.Channels);
                int bufferSize = (_device.Channels == 1 ? 8192 : 16384);
                int buffers    = 2;
                Helper.Try(WindowsMultimedia.waveInOpen(out _wave, _device.Device, format, _bufferDelegate, 0, WindowsMultimedia.CALLBACK_FUNCTION));
                AllocateAllBuffers(bufferSize, buffers);
                Helper.Try(WindowsMultimedia.waveInStart(_wave));
                //
                if (_dispatchOnWorkerThread)
                {
                    Dispatcher.Run();
                    //while (!WaitHandle.WaitAll(new WaitHandle[] { _stopSignal }, 10, true))
                    while (!_stopEvent.WaitOne(10, true))
                    {
                        AdvanceBuffer();
                        grabber.Buffer(_currentBuffer.Data, _currentBuffer.Size);
                        _currentBuffer.AddBuffer();
                        Dispatcher.Run();
                    }
                    Dispatcher.ExitAllFrames();
                }
                else
                {
                    while (!_stopEvent.WaitOne(0, true))
                    {
                        AdvanceBuffer();
                        grabber.Buffer(_currentBuffer.Data, _currentBuffer.Size);
                        _currentBuffer.AddBuffer();
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                throw;
            }
            finally
            {
                // guaranteed exit
                OnExitWorkerThread();
            }
        }
示例#2
0
 public Grabber(IWaveInfo waveInfo, bool dispatchOnWorkerThread)
 {
     _waveInfo = waveInfo;
     _dispatchOnWorkerThread = dispatchOnWorkerThread;
 }