private void ReadNextPacket(AudioCaptureClient capture) { int packetSize = capture.GetNextPacketSize(); int recordBufferOffset = 0; //Debug.WriteLine(string.Format("packet size: {0} samples", packetSize / 4)); while (packetSize != 0) { int framesAvailable; AudioClientBufferFlags flags; IntPtr buffer = capture.GetBuffer(out framesAvailable, out flags); int bytesAvailable = framesAvailable * bytesPerFrame; // apparently it is sometimes possible to read more frames than we were expecting? // fix suggested by Michael Feld: int spaceRemaining = Math.Max(0, recordBuffer.Length - recordBufferOffset); if (spaceRemaining < bytesAvailable && recordBufferOffset > 0) { if (DataAvailable != null) { DataAvailable(this, new WaveInEventArgs(recordBuffer, recordBufferOffset)); } recordBufferOffset = 0; } // if not silence... if ((flags & AudioClientBufferFlags.Silent) != AudioClientBufferFlags.Silent) { Marshal.Copy(buffer, recordBuffer, recordBufferOffset, bytesAvailable); } else { Array.Clear(recordBuffer, recordBufferOffset, bytesAvailable); } recordBufferOffset += bytesAvailable; capture.ReleaseBuffer(framesAvailable); packetSize = capture.GetNextPacketSize(); } if (DataAvailable != null) { DataAvailable(this, new WaveInEventArgs(recordBuffer, recordBufferOffset)); } }
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); } } }
/// <summary> /// Dispose /// </summary> public void Dispose() { if (audioClientInterface != null) { if (audioClockClient != null) { audioClockClient.Dispose(); audioClockClient = null; } if (audioRenderClient != null) { audioRenderClient.Dispose(); audioRenderClient = null; } if (audioCaptureClient != null) { audioCaptureClient.Dispose(); audioCaptureClient = null; } Marshal.ReleaseComObject(audioClientInterface); audioClientInterface = null; GC.SuppressFinalize(this); } }
private void ReadNextPacket(AudioCaptureClient capture) { int packetSize = capture.GetNextPacketSize(); int recordBufferOffset = 0; //Debug.WriteLine(string.Format("packet size: {0} samples", packetSize / 4)); while (packetSize != 0) { int framesAvailable; AudioClientBufferFlags flags; IntPtr buffer = capture.GetBuffer(out framesAvailable, out flags); int bytesAvailable = framesAvailable * bytesPerFrame; // apparently it is sometimes possible to read more frames than we were expecting? // fix suggested by Michael Feld: int spaceRemaining = Math.Max(0, recordBuffer.Length - recordBufferOffset); if (spaceRemaining < bytesAvailable && recordBufferOffset > 0) { if (DataAvailable != null) DataAvailable(this, new WaveInEventArgs(recordBuffer, recordBufferOffset)); recordBufferOffset = 0; } // if not silence... if ((flags & AudioClientBufferFlags.Silent) != AudioClientBufferFlags.Silent) { Marshal.Copy(buffer, recordBuffer, recordBufferOffset, bytesAvailable); } else { Array.Clear(recordBuffer, recordBufferOffset, bytesAvailable); } recordBufferOffset += bytesAvailable; capture.ReleaseBuffer(framesAvailable); packetSize = capture.GetNextPacketSize(); } if (DataAvailable != null) { DataAvailable(this, new WaveInEventArgs(recordBuffer, recordBufferOffset)); } }