using System; using System.Threading; using System.Runtime.InteropServices; namespace WaveLib ... { internal class WaveInHelper ...{ public static void Try(int err) ...{ if (err != WaveNative.MMSYSERR_NOERROR) throw new Exception(err.ToString()); } } public delegate void BufferDoneEventHandler(IntPtr data, int size); internal class WaveInBuffer : IDisposable ...{ public WaveInBuffer NextBuffer; private AutoResetEvent m_RecordEvent = new AutoResetEvent(false); private IntPtr m_WaveIn; private WaveNative.WaveHdr m_Header;//m_Header 数据缓存 private byte[] m_HeaderData; private GCHandle m_HeaderHandle; private GCHandle m_HeaderDataHandle; private bool m_Recording; internal static void WaveInProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2) ...{ if (uMsg == WaveNative.MM_WIM_DATA) ...{ try ...{ GCHandle h = (GCHandle)wavhdr.dwUser; WaveInBuffer buf = (WaveInBuffer)h.Target; buf.OnCompleted(); } catch ...{ } } } public WaveInBuffer(IntPtr waveInHandle, int<