private void DoRecording(AudioClient client) { int bufferSize = client.BufferSize; long num = (long)(10000000.0 * (double)bufferSize / (double)this.waveFormat.SampleRate); int millisecondsTimeout = (int)(num / 10000L / 2L); int millisecondsTimeout2 = (int)(3L * num / 10000L); AudioCaptureClient audioCaptureClient = client.AudioCaptureClient; client.Start(); if (this.isUsingEventSync) { } while (!this.requestStop) { bool flag = true; if (this.isUsingEventSync) { flag = this.frameEventWaitHandle.WaitOne(millisecondsTimeout2, false); } else { Thread.Sleep(millisecondsTimeout); } if (!this.requestStop && flag) { this.ReadNextPacket(audioCaptureClient); } } }
private void CaptureThread(AudioClient client) { Debug.WriteLine(client.BufferSize); int bufferFrameCount = audioClient.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)REFTIMES_PER_SEC * bufferFrameCount / WaveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); try { Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); while (!this.stop) { Thread.Sleep(sleepMilliseconds); ReadNextPacket(capture); } client.Stop(); if (RecordingStopped != null) { RecordingStopped(this, EventArgs.Empty); } } finally { if (capture != null) { capture.Dispose(); } if (client != null) { client.Dispose(); } client = null; capture = null; } System.Diagnostics.Debug.WriteLine("stop wasapi"); }
private void DoRecording(AudioClient client) { //Debug.WriteLine(String.Format("Client buffer frame count: {0}", client.BufferSize)); int bufferFrameCount = client.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)ReftimesPerSec * bufferFrameCount / waveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / ReftimesPerMillisec / 2); int waitMilliseconds = (int)(3 * actualDuration / ReftimesPerMillisec); var capture = client.AudioCaptureClient; lock (syncLock) { if (captureState != CaptureState.Starting) { return; // Client probably requested stop (or some other state change happened) before we actually started capturing. } client.Start(); captureState = CaptureState.Capturing; } while (captureState == CaptureState.Capturing) { bool readBuffer = true; if (isUsingEventSync) { readBuffer = frameEventWaitHandle.WaitOne(waitMilliseconds, false); } else { Thread.Sleep(sleepMilliseconds); } if (captureState != CaptureState.Capturing) { break; } // If still recording and notification is ok if (readBuffer) { ReadNextPacket(capture); } } }
private void DoRecording(AudioClient client) { Debug.WriteLine(String.Format("Client buffer frame count: {0}", client.BufferSize)); int bufferFrameCount = client.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)REFTIMES_PER_SEC * bufferFrameCount / waveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); int waitMilliseconds = (int)(3 * actualDuration / REFTIMES_PER_MILLISEC); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); if (isUsingEventSync) { Debug.WriteLine(string.Format("wait: {0} ms", waitMilliseconds)); } else { Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); } while (!this.requestStop) { bool readBuffer = true; if (isUsingEventSync) { readBuffer = frameEventWaitHandle.WaitOne(waitMilliseconds, false); } else { Thread.Sleep(sleepMilliseconds); } // If still playing and notification is ok if (!this.requestStop && readBuffer) { ReadNextPacket(capture); } } }
private void DoRecording(AudioClient client) { //Debug.WriteLine(String.Format("Client buffer frame count: {0}", client.BufferSize)); int bufferFrameCount = client.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)ReftimesPerSec * bufferFrameCount / waveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / ReftimesPerMillisec / 2); int waitMilliseconds = (int)(3 * actualDuration / ReftimesPerMillisec); var capture = client.AudioCaptureClient; client.Start(); // avoid race condition where we stop immediately after starting if (captureState == CaptureState.Starting) { captureState = CaptureState.Capturing; } while (captureState == CaptureState.Capturing) { bool readBuffer = true; if (isUsingEventSync) { readBuffer = frameEventWaitHandle.WaitOne(waitMilliseconds, false); } else { Thread.Sleep(sleepMilliseconds); } if (captureState != CaptureState.Capturing) { break; } // If still recording and notification is ok if (readBuffer) { ReadNextPacket(capture); } } }
private void DoRecording(AudioClient client) { Debug.WriteLine(client.BufferSize); int bufferFrameCount = audioClient.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)REFTIMES_PER_SEC * bufferFrameCount / WaveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); while (!this.stop) { Thread.Sleep(sleepMilliseconds); ReadNextPacket(capture); } }
private void CaptureThread(AudioClient client) { Debug.WriteLine(client.BufferSize); int bufferFrameCount = audioClient.BufferSize; // Calculate the actual duration of the allocated buffer. var actualDuration = (long)((double)REFTIMES_PER_SEC * bufferFrameCount / WaveFormat.SampleRate); var sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); try { Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); while (!stop) { Thread.Sleep(sleepMilliseconds); ReadNextPacket(capture); } } finally { client.Stop(); if (RecordingStopped != null) { RecordingStopped(this, EventArgs.Empty); } // don't dispose - the AudioClient only gets disposed when WasapiCapture is disposed } Debug.WriteLine("stop wasapi"); }
private void DoRecording(AudioClient client) { Debug.WriteLine(client.BufferSize); int bufferFrameCount = audioClient.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)REFTIMES_PER_SEC * bufferFrameCount / WaveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); while (!this.stop) { Thread.Sleep(sleepMilliseconds); ReadNextPacket(capture); } }
private void CaptureThread(AudioClient client) { Debug.WriteLine(client.BufferSize); int bufferFrameCount = audioClient.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long) ((double)REFTIMES_PER_SEC * bufferFrameCount / WaveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); try { Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); while (!this.stop) { Thread.Sleep(sleepMilliseconds); ReadNextPacket(capture); } client.Stop(); if (RecordingStopped != null) { RecordingStopped(this, null); } } finally { if (capture != null) { capture.Dispose(); } if (client != null) { client.Dispose(); } client = null; capture = null; } System.Diagnostics.Debug.WriteLine("stop wasapi"); }
private void DoRecording(AudioClient client) { Debug.WriteLine(client.BufferSize); var buf = new Byte[client.BufferSize * bytesPerFrame]; int bufLength = 0; int minPacketSize = waveFormat.AverageBytesPerSecond / 100; //100ms IntPtr hEvent = NativeMethods.CreateEventEx(IntPtr.Zero, IntPtr.Zero, 0, EventAccess.EVENT_ALL_ACCESS); client.SetEventHandle(hEvent); try { AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); int packetSize = capture.GetNextPacketSize(); while (!this.stop) { IntPtr pData = IntPtr.Zero; int numFramesToRead = 0; AudioClientBufferFlags dwFlags = 0; if (packetSize == 0) { if (NativeMethods.WaitForSingleObjectEx(hEvent, 100, true) != 0) { throw new Exception("Capture event timeout"); } } pData = capture.GetBuffer(out numFramesToRead, out dwFlags); if ((int)(dwFlags & AudioClientBufferFlags.Silent) > 0) { pData = IntPtr.Zero; } if (numFramesToRead == 0) { continue; } int capturedBytes = numFramesToRead * bytesPerFrame; if (pData == IntPtr.Zero) { Array.Clear(buf, bufLength, capturedBytes); } else { Marshal.Copy(pData, buf, bufLength, capturedBytes); } bufLength += capturedBytes; capture.ReleaseBuffer(numFramesToRead); if (bufLength >= minPacketSize) { if (DataAvailable != null) { DataAvailable(this, new WaveInEventArgs(buf, bufLength)); } bufLength = 0; } packetSize = capture.GetNextPacketSize(); } } catch (Exception ex) { RaiseRecordingStopped(ex); Debug.WriteLine("stop wasapi"); } finally { RaiseRecordingStopped(null); NativeMethods.CloseHandle(hEvent); client.Stop(); client.Dispose(); } }
private void DoRecording(AudioClient client) { Debug.WriteLine(String.Format("Client buffer frame count: {0}", client.BufferSize)); int bufferFrameCount = client.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)REFTIMES_PER_SEC * bufferFrameCount / waveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / REFTIMES_PER_MILLISEC / 2); int waitMilliseconds = (int)(3 * actualDuration / REFTIMES_PER_MILLISEC); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); if (isUsingEventSync) { Debug.WriteLine(string.Format("wait: {0} ms", waitMilliseconds)); } else { Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); } while (!this.requestStop) { bool readBuffer = true; if (isUsingEventSync) { readBuffer = frameEventWaitHandle.WaitOne(waitMilliseconds, false); } else { Thread.Sleep(sleepMilliseconds); } // If still playing and notification is ok if (!this.requestStop && readBuffer) { ReadNextPacket(capture); } } }
private void InitializeAudioClient() { var enumerator = new MMDeviceEnumerator(); var captureDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); audioClient = captureDevice.AudioClient; int recordBufferLength = samplingRate; // 20ms worth of recording recordBuffer = new float[recordBufferLength * channelCount]; long requestedDuration = 10000 * period * 2; audioClient.Initialize(AudioClientShareMode.Shared, AudioClientStreamFlags.Loopback, requestedDuration, 0, WaveFormat.CreateIeeeFloatWaveFormat(samplingRate, channelCount), Guid.Empty); capClient = audioClient.AudioCaptureClient; audioClient.Start(); }
private void DoRecording(AudioClient client) { //Debug.WriteLine(String.Format("Client buffer frame count: {0}", client.BufferSize)); int bufferFrameCount = client.BufferSize; // Calculate the actual duration of the allocated buffer. long actualDuration = (long)((double)ReftimesPerSec * bufferFrameCount / waveFormat.SampleRate); int sleepMilliseconds = (int)(actualDuration / ReftimesPerMillisec / 2); int waitMilliseconds = (int)(3 * actualDuration / ReftimesPerMillisec); var capture = client.AudioCaptureClient; client.Start(); captureState = CaptureState.Capturing; while (captureState == CaptureState.Capturing) { bool readBuffer = true; if (isUsingEventSync) { readBuffer = frameEventWaitHandle.WaitOne(waitMilliseconds, false); } else { Thread.Sleep(sleepMilliseconds); } if (captureState != CaptureState.Capturing) break; // If still recording and notification is ok if (readBuffer) { ReadNextPacket(capture); } } }
private void CaptureThread(AudioClient client) { Debug.WriteLine(client.BufferSize); int bufferFrameCount = audioClient.BufferSize; // Calculate the actual duration of the allocated buffer. var actualDuration = (long) ((double) REFTIMES_PER_SEC* bufferFrameCount/WaveFormat.SampleRate); var sleepMilliseconds = (int) (actualDuration/REFTIMES_PER_MILLISEC/2); AudioCaptureClient capture = client.AudioCaptureClient; client.Start(); try { Debug.WriteLine(string.Format("sleep: {0} ms", sleepMilliseconds)); while (!stop) { Thread.Sleep(sleepMilliseconds); ReadNextPacket(capture); } } finally { client.Stop(); if (RecordingStopped != null) { RecordingStopped(this, EventArgs.Empty); } // don't dispose - the AudioClient only gets disposed when WasapiCapture is disposed } Debug.WriteLine("stop wasapi"); }