private GCHandle callbackHandle; // for the user callback /// <summary> /// Initializes a new instance of the <see cref="WaveOutBuffer"/> class. /// </summary> /// <param name="hWaveOut">WaveOut device to write to</param> /// <param name="bufferSize">Buffer size in bytes</param> /// <param name="bufferFillStream">Stream to provide more data</param> /// <param name="waveOutLock">Lock to protect WaveOut API's from being called on >1 thread</param> public WaveOutBuffer(IntPtr hWaveOut, Int32 bufferSize, IWaveProvider bufferFillStream, object waveOutLock) { this.bufferSize = bufferSize; buffer = new byte[bufferSize]; bufferHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); this.waveOutPtr = hWaveOut; waveStream = bufferFillStream; this.waveOutLock = waveOutLock; header = new WaveHeader(); headerHandle = GCHandle.Alloc(header, GCHandleType.Pinned); header.DataBuffer = bufferHandle.AddrOfPinnedObject(); header.BufferLength = bufferSize; header.Loops = 1; callbackHandle = GCHandle.Alloc(this); header.UserData = (IntPtr)callbackHandle; lock (waveOutLock) { MmException.Try(WaveInterop.NativeMethods.waveOutPrepareHeader(hWaveOut, header, Marshal.SizeOf(header)), "waveOutPrepareHeader"); } }
public static extern MmResult waveOutWrite(IntPtr hWaveOut, WaveHeader lpWaveOutHdr, int uSize);
public static extern MmResult waveOutUnprepareHeader(IntPtr hWaveOut, WaveHeader lpWaveOutHdr, int uSize);