Ejemplo n.º 1
0
        private void mw_WaveDoneMessage(object sender, IntPtr wParam, IntPtr lParam)
        {
            // free the header
            Monitor.Enter(m_HandleMap.SyncRoot);
            WaveHeader hdr = m_HandleMap[lParam.ToInt32()] as WaveHeader;

            m_HandleMap.Remove(lParam.ToInt32());
            Monitor.Exit(m_HandleMap.SyncRoot);
            CheckWaveError(Wave.waveOutUnprepareHeader(m_hWaveOut, lParam, hdr.HeaderLength));
            hdr.Dispose();

            // Check if we got here because of waveOutReset
            if (!m_playing)
            {
                // Cleanup - free buffers and headers
                Monitor.Enter(m_qBuffers.SyncRoot);
                while (m_qBuffers.Count > 0)
                {
                    hdr = m_qBuffers.Dequeue() as WaveHeader;
                    CheckWaveError(Wave.waveOutUnprepareHeader(m_hWaveOut, hdr.Header, hdr.HeaderLength));
                    m_HandleMap.Remove(hdr.Header.ToInt32());
                    hdr.Dispose();
                }
                Monitor.Exit(m_qBuffers.SyncRoot);
            }

            // Are there any pending buffers?
            if (m_qBuffers.Count == 0)
            {
                // No more buffers
                // Close the device
                CheckWaveError(Wave.waveOutClose(m_hWaveOut));
                m_playing  = false;
                m_qBuffers = null;

                // Notify clients
                if (DonePlaying != null)
                {
                    DonePlaying(this, wParam, lParam);
                }
            }
            else
            {
                //Get next buffer (already prepared)
                Monitor.Enter(m_qBuffers.SyncRoot);
                hdr = (WaveHeader)m_qBuffers.Dequeue();
                Monitor.Exit(m_qBuffers.SyncRoot);

                // play the file
                CheckWaveError(Wave.waveOutWrite(m_hWaveOut, hdr.Header, hdr.HeaderLength));

                // Add more buffers
                RefillPlayBuffers();
            }
        }
Ejemplo n.º 2
0
        private void DumpRecordBuffers()
        {
            while (m_qBuffers.Count > 0)
            {
                Monitor.Enter(m_qBuffers.SyncRoot);
                WaveHeader hdr = (WaveHeader)m_qBuffers.Dequeue();
                Monitor.Exit(m_qBuffers.SyncRoot);


                m_streamRecord.Write(hdr.GetData(), 0, (int)hdr.waveHdr.BytesRecorded);
                hdr.Dispose();
            }
        }