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(); } }
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(); } }