www.pudn.com > waveindemo.rar > Wave.cs


using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.IO; 
 
namespace WaveLib 
{ 
	///  
	/// Wave 的摘要说明。 
	///  
	public class Wave : IWaveControl 
	{ 
		private WaveLib.WaveInRecorder m_Recorder; 
		private WaveLib.WaveFormat m_Format; 
		 
		 
		System.IO.BinaryWriter bw_tmp ; 
		private string tmpName= "tmp.wav"; 
		private FileStream fs_tmp; 
		private byte[] m_RecBuffer; 
 
		public Wave() 
		{ 
 
		} 
 
		private void DataArrived(IntPtr data, int size) 
		{ 
			try 
			{ 
				if (m_RecBuffer == null || m_RecBuffer.Length < size) 
				{ 
					m_RecBuffer = new byte[size]; 
				} 
				System.Runtime.InteropServices.Marshal.Copy(data, m_RecBuffer, 0, size); 
 
				bw_tmp.Write(m_RecBuffer); 
				_recordSize+=m_RecBuffer.Length; 
			} 
			catch(Exception e) 
			{ 
				return; 
			} 
		} 
 
		private void WriteToFile() 
		{ 
			FileStream fs = null; 
			BinaryReader br = null; 
			FileStream fs_2 = null; 
			BinaryWriter bw = null; 
			bool _isFinish = false; 
 
			try 
			{ 
				fs = new FileStream(tmpName,FileMode.Open); 
				br = new BinaryReader( fs ); 
 
				fs_2 = new FileStream(SavedFile,FileMode.Create); 
				bw = new BinaryWriter(fs_2); 
 
				//wav头 
				long chunksize = fs.Length + 36; 
				WriteChars(bw, "RIFF");//格式 
				bw.Write((int)chunksize);//文件长度(要加上头的36字节) 
				WriteChars(bw, "WAVE");//标示 
				WriteChars(bw, "fmt ");//fmt 
				bw.Write((int)16);//fmt长度 
				bw.Write(m_Format.wFormatTag);//压缩模式 
				bw.Write(m_Format.nChannels);//声道 
				bw.Write(m_Format.nSamplesPerSec);//采样率包含:32000Hz,44100Hz,48000Hz. 
				bw.Write(m_Format.nAvgBytesPerSec);//每秒播放字节 
				bw.Write(m_Format.nBlockAlign);//位速 
				bw.Write(m_Format.wBitsPerSample);//采样大小 
				WriteChars(bw,"data");//data标志 
				bw.Write(fs.Length);//音频长度 
				bw.Flush(); 
 
				byte [] bytes = new byte[512]; 
				while(true) 
				{ 
					if(br.Read(bytes,0,bytes.Length)>0) 
					{ 
						bw.Write( bytes ); 
					} 
					else 
					{ 
						break; 
					} 
				} 
 
				_isFinish = true; 
 
			} 
			catch(Exception e) 
			{ 
				OnError(e,"文件流写入异常!"); 
			} 
			finally 
			{ 
				if(br!=null)br.Close(); 
				if(bw!=null)bw.Close(); 
 
				System.Threading.Thread.Sleep(500); 
 
				if(_isFinish) 
				{ 
					FileInfo fi = new FileInfo(tmpName); 
					fi.Delete(); 
				} 
			} 
			 
		} 
 
		private void WriteChars(BinaryWriter wrtr, string text) 
		{ 
			for (int i = 0; i < text.Length; i++) 
			{ 
				char c = (char)text[i]; 
				wrtr.Write(c); 
			} 
		} 
 
		public void Stop() 
		{ 
			if (m_Recorder != null) 
			{ 
				try 
				{ 
					bw_tmp.Close(); 
					m_Recorder.Dispose(); 
 
 
					WriteToFile(); 
 
					_recordSize = 0; 
					_isRecord = false; 
				} 
				finally 
				{ 
					m_Recorder = null; 
				} 
			} 
		} 
		 
		public void Start() 
		{ 
			if(_isRecord) return; 
			Stop(); 
			try 
			{ 
				FileInfo file = new FileInfo(tmpName); 
				if (file.Exists) 
				{ 
					file.Delete(); 
				} 
				fs_tmp = new FileStream(tmpName, System.IO.FileMode.Create); 
				bw_tmp = new BinaryWriter(fs_tmp); 
 
				dt_Start = DateTime.Now; 
				_isRecord = true; 
 
				if(RecordQuality==Quality.low) m_Format = new WaveLib.WaveFormat(32000, 8, 2); 
				else if(RecordQuality==Quality.Normal) m_Format = new WaveLib.WaveFormat(44100, 8, 2); 
				else m_Format = new WaveLib.WaveFormat(44100, 16, 2); 
 
				m_Recorder = new WaveLib.WaveInRecorder(-1, m_Format, 16384, 3, new WaveLib.BufferDoneEventHandler(DataArrived)); 
				 
			} 
			catch(Exception e) 
			{ 
				OnError(e,"启动录音失败!"); 
				Stop(); 
			} 
		} 
 
		public void Suspend() 
		{ 
			m_Recorder.Suspend(); 
			_isSuspend = true; 
		} 
 
		public void Continue() 
		{ 
			m_Recorder.Resume(); 
			_isSuspend = false; 
		} 
 
		#region IWaveRecordInfo 成员 
 
		private string _saveFile = null; 
		public string SavedFile 
		{ 
			get 
			{ 
				return _saveFile; 
			} 
			set 
			{ 
				_saveFile = value; 
			} 
		} 
 
		private Quality _RecordQuality; 
		public Quality RecordQuality 
		{ 
			get 
			{ 
				return _RecordQuality; 
			} 
			set 
			{ 
				_RecordQuality = value; 
			} 
		} 
 
		public string RecordTmpFile 
		{ 
			get 
			{ 
				return tmpName; 
			} 
		} 
 
		private long _recordSize = 36; 
		public long RecordSize 
		{ 
			get 
			{ 
				// TODO:  添加 Wave.RecordSize getter 实现 
				return _recordSize; 
			} 
		} 
 
		DateTime dt_Start ; 
		TimeSpan ts_now ; 
		public TimeSpan RecordTimeSpan 
		{ 
			get 
			{ 
				// TODO:  添加 Wave.RecordTimeSpan getter 实现 
				if(IsRecord&&!IsSuspend) 
					ts_now = DateTime.Now.Subtract(dt_Start); 
 
				return ts_now; 
			} 
		} 
 
		private bool _isRecord = false; 
		public bool IsRecord 
		{ 
			get 
			{ 
				// TODO:  添加 Wave.IsRecord getter 实现 
				return _isRecord; 
			} 
		} 
 
		private bool _isSuspend = false; 
		public bool IsSuspend 
		{ 
			get 
			{ 
				// TODO:  添加 Wave.IsRecord getter 实现 
				return _isSuspend; 
			} 
		} 
 
 
		#endregion 
 
		#region IWaveControl 成员 
 
		public event WaveLib.ErrorEventHandle ErrorEvent; 
 
		private void OnError(Exception e,string error) 
		{ 
			if(ErrorEvent!=null) 
				ErrorEvent(e,error); 
		} 
		#endregion 
	} 
}