private int WriteWaveOut(IntPtr buf, int size) { int ret; WaveNative.WaveHdr m_Header = new WaveNative.WaveHdr(); ; GCHandle m_HeaderHandle = GCHandle.Alloc(m_Header, GCHandleType.Pinned); m_Header.dwUser = (IntPtr)GCHandle.Alloc(this); m_Header.lpData = buf; m_Header.dwBufferLength = size; ret = WaveNative.waveOutPrepareHeader(waveOut, ref m_Header, Marshal.SizeOf(m_Header)); if (ret != WaveNative.MMSYSERR_NOERROR) throw new Exception("can not open wave device"); lock (queue) { ret = WaveNative.waveOutWrite(waveOut, ref m_Header, Marshal.SizeOf(m_Header)); } if (ret != WaveNative.MMSYSERR_NOERROR) throw new Exception("can not open wave device"); while (WaveNative.waveOutUnprepareHeader(waveOut, ref m_Header, Marshal.SizeOf(m_Header)) == WaveNative.WAVERR_STILLPLAYING) { Thread.Sleep(5); } ((GCHandle)m_Header.dwUser).Free(); m_HeaderHandle.Free(); return ret; }
internal static void WaveInProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2) { if (uMsg == WaveNative.MM_WIM_DATA) { GCHandle h = (GCHandle)wavhdr.dwUser; WaveInBuffer buf = (WaveInBuffer)h.Target; buf.OnCompleted(); } }
internal static void WaveOutProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2) { if (uMsg == WaveNative.MM_WOM_DONE) { try { GCHandle h = (GCHandle)wavhdr.dwUser; WaveOutBuffer buf = (WaveOutBuffer)h.Target; buf.OnCompleted(); } catch { } } }
internal static void WaveOutProc( IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2) { if (uMsg != 957) { return; } try { ((WaveOutBuffer)((GCHandle)wavhdr.dwUser).Target).OnCompleted(); } catch { } }
public static extern int waveOutWrite( IntPtr hWaveOut, ref WaveNative.WaveHdr lpWaveOutHdr, int uSize);
public static extern int waveOutUnprepareHeader( IntPtr hWaveOut, ref WaveNative.WaveHdr lpWaveOutHdr, int uSize);