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(); } }
public Grabber(IWaveInfo waveInfo, bool dispatchOnWorkerThread) { _waveInfo = waveInfo; _dispatchOnWorkerThread = dispatchOnWorkerThread; }