コード例 #1
0
        private void m_recmw_WaveDoneMessage(object sender, IntPtr wParam, IntPtr lParam)
        {
#if !NDOC
            // Retrieve Waveheader object by the lpHeader pointer
            Monitor.Enter(m_HandleMap.SyncRoot);
            WaveHeader hdr = m_HandleMap[lParam.ToInt32()] as WaveHeader;
            m_HandleMap.Remove(hdr.Header.ToInt32());
            Monitor.Exit(m_HandleMap.SyncRoot);

            // unprepare the header
            CheckWaveError(Wave.waveInUnprepareHeader(m_hWaveIn, hdr.Header, hdr.HeaderLength));
            hdr.RetrieveHeader();
            m_qBuffers.Enqueue(hdr);

            if (recordingFinished)               // last chunk
            {
                DumpRecordBuffers();
                CheckWaveError(Wave.waveInClose(m_hWaveIn));
                WaveChunk wck = m_ck[0] as WaveChunk;
                if (wck != null)
                {
                    DataChunk dck = wck.FindChunk(FourCC.Data) as DataChunk;
                    if (dck != null)
                    {
                        dck.EndWrite();
                    }
                    wck.EndWrite();
                }
                m_ck.EndWrite();
                m_streamRecord.Close();
                // clean up the messageWindow
                m_recmw.Dispose();

                // reset the global flag
                recording = false;
                // set our event
                if (DoneRecording != null)
                {
                    DoneRecording();
                }

                foreach (WaveHeader whdr in m_HandleMap.Values)
                {
                    whdr.Dispose();
                }
                m_HandleMap.Clear();
            }
            else
            {
                hdr = GetNewRecordBuffer(m_recBufferSize);
                CheckWaveError(Wave.waveInAddBuffer(m_hWaveIn, hdr.Header, hdr.HeaderLength));
                DumpRecordBuffers();
            }
#endif
        }