/// <summary> /// Fills recording buffers. /// </summary> private void EnsureBuffers() { // We keep 3 x buffer. lock (m_pBuffers){ while (m_pBuffers.Count < 3) { byte[] data = new byte[m_BufferSize]; GCHandle dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); WAVEHDR wavHeader = new WAVEHDR(); wavHeader.lpData = dataHandle.AddrOfPinnedObject(); wavHeader.dwBufferLength = (uint)data.Length; wavHeader.dwBytesRecorded = 0; wavHeader.dwUser = IntPtr.Zero; wavHeader.dwFlags = 0; wavHeader.dwLoops = 0; wavHeader.lpNext = IntPtr.Zero; wavHeader.reserved = 0; GCHandle headerHandle = GCHandle.Alloc(wavHeader, GCHandleType.Pinned); int result = 0; result = WavMethods.waveInPrepareHeader(m_pWavDevHandle, headerHandle.AddrOfPinnedObject(), Marshal.SizeOf(wavHeader)); if (result == MMSYSERR.NOERROR) { m_pBuffers.Add(new BufferItem(ref headerHandle, ref dataHandle, m_BufferSize)); result = WavMethods.waveInAddBuffer(m_pWavDevHandle, headerHandle.AddrOfPinnedObject(), Marshal.SizeOf(wavHeader)); if (result != MMSYSERR.NOERROR) { throw new Exception("Error adding wave in buffer, error: " + result + "."); } } } } }