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 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)); } }