Esempio n. 1
0
        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 &gt;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");
            }
        }
Esempio n. 2
0
 public static extern MmResult waveOutWrite(IntPtr hWaveOut, WaveHeader lpWaveOutHdr, int uSize);
Esempio n. 3
0
 public static extern MmResult waveOutUnprepareHeader(IntPtr hWaveOut, WaveHeader lpWaveOutHdr, int uSize);