protected override void Update() { base.Update(); while (_rcvDataQueue.Count > 0) { RcvData rcvData = _rcvDataQueue.Dequeue(); doReceive(rcvData); } }
protected override void OnReceiveHandler(StringBuilder json) { base.OnReceiveHandler(json); #if UNITY_EDITOR //showErrorCodeTip(cmdId); #endif //object obj = System.Activator.CreateInstance(rspdType); //MyDebug.Log("收到数据 NetCmd:" + " " + cmdId); RcvData rcvData = new RcvData(0, json); _rcvDataQueue.Enqueue(rcvData);//进入消息处理队列 }
//Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); /// <summary> /// 开始监听 /// </summary> public UDPReciverWithTime Start() { InitialUDPReciver(); IsListening = true; TaskTrigger = Task.Factory.StartNew(() => { RcvData buffData = new RcvData(); while (IsListening) { // 避免 CPU 占用过高 if (_QueueData.Count == 0) { System.Threading.Thread.Sleep(1); //socket.Poll(1, SelectMode.SelectRead); continue; } if (_QueueData.TryDequeue(out buffData)) { DataRcv_Event?.Invoke(buffData.Bytes, buffData.Point, buffData.Time); } } }); TaskCheck = Task.Factory.StartNew(() => { while (IsListening) { if (_QueueData.Count > QueueHeapCountMax) { if (QueueHeap_Event != null) { QueueClearMode clearMode = QueueHeap_Event.Invoke(_QueueData.Count); switch (clearMode) { case QueueClearMode.All: _QueueData = new ConcurrentQueue <RcvData>(); break; case QueueClearMode.Half: while (_QueueData.Count > QueueHeapCountMax / 2) { RcvData buffData = new RcvData(); _QueueData.TryDequeue(out buffData); } break; case QueueClearMode.Cancel: break; default: _QueueData = new ConcurrentQueue <RcvData>(); break; } } else { _QueueData = new ConcurrentQueue <RcvData>(); } } System.Threading.Thread.Sleep(100); } }); TaskListen = Task.Factory.StartNew(() => { try { while (IsListening) { _QueueData.Enqueue(new RcvData() { // 内部有阻塞无需 System.Threading.Thread.Sleep(1); Bytes = _UDPClient.Receive(ref point), Point = pointListen, Time = DateTime.UtcNow }); } } catch (SocketException e) { // 由 Stop 函数触发 if (e.ErrorCode == 10004) { // Do Nothing } else { throw e; } } catch (Exception e) { throw e; } }); return(this); }
private void ProcessMixingFinal(RcvData data, int dataSize) { string processingFn = string.Format("e:\\{0}_{1}_{2}.wav", data.seqnum, data.extension, data.peernumber); List <RecInfos> ls0 = lExtension0.FindAll( delegate(RecInfos list) { return(list.rcvData.Equals(data) && list.isExtension == 0); }); List <RecInfos> ls1 = lExtension1.FindAll( delegate(RecInfos list) { return(list.rcvData.Equals(data) && list.isExtension == 1); }); IsExtensionComparer isExtensionCompare = new IsExtensionComparer(); ls0.Sort(isExtensionCompare); ls1.Sort(isExtensionCompare); int count = 0; int count0 = ls0.Count(); int count1 = ls1.Count(); if (count0 - count1 < 0) { count = count0; } else { count = count1; } for (int i = 0; i < count; i++) { if (ls0[i].seq == ls1[i].seq) { // 믹싱 byte[] wavSrc0 = new byte[160]; byte[] wavSrc1 = new byte[160]; Array.Copy(ls0[i].voice, 12, wavSrc0, 0, wavSrc0.Length); Array.Copy(ls1[i].voice, 12, wavSrc1, 0, wavSrc1.Length); WaveMixerStream32 mixer = new WaveMixerStream32(); //mixer.AutoStop = true; WaveChannel32 channelStm = null; for (int j = 0; j < 2; j++) { MemoryStream memStm = null; BufferedStream bufStm = null; RawSourceWaveStream rawSrcStm = null; WaveFormatConversionStream conversionStm = null; if (j == 0) { memStm = new MemoryStream(wavSrc0); } else { memStm = new MemoryStream(wavSrc1); } bufStm = new BufferedStream(memStm); rawSrcStm = new RawSourceWaveStream(bufStm, mulawFormat); conversionStm = new WaveFormatConversionStream(pcmFormat, rawSrcStm); channelStm = new WaveChannel32(conversionStm); mixer.AddInputStream(channelStm); } mixer.Position = 0; if (File.Exists(processingFn)) { var wavefilestream = new WaveFileReader(processingFn); byte[] wavefilebyte = new byte[(int)wavefilestream.Length]; int chk0 = wavefilestream.Read(wavefilebyte, 0, wavefilebyte.Length); Wave32To16Stream to16 = new Wave32To16Stream(mixer); var conversionStm = new WaveFormatConversionStream(pcmFormat, to16); byte[] tobyte = new byte[(int)conversionStm.Length]; int chk1 = conversionStm.Read(tobyte, 0, (int)conversionStm.Length); byte[] desByte = new byte[wavefilebyte.Length + tobyte.Length]; conversionStm.Close(); wavefilestream.Close(); Buffer.BlockCopy(wavefilebyte, 0, desByte, 0, wavefilebyte.Length); Buffer.BlockCopy(tobyte, 0, desByte, wavefilebyte.Length, tobyte.Length); using (MemoryStream memStm = new MemoryStream(desByte)) using (BufferedStream buffStm = new BufferedStream(memStm)) using (RawSourceWaveStream rawSrcStm = new RawSourceWaveStream(buffStm, pcmFormat)) { WaveFileWriter.CreateWaveFile(processingFn, rawSrcStm); } } else { var mixedStm = new Wave32To16Stream(mixer); var convStm = new WaveFormatConversionStream(pcmFormat, mixedStm); WaveFileWriter.CreateWaveFile(processingFn, convStm); convStm.Close(); mixedStm.Close(); } mixer.Close(); // 삭제 lExtension0.Remove(ls0[i]); lExtension1.Remove(ls1[i]); } else if (ls0[i].seq - ls1[i].seq < 0) { // ls0 만 믹싱 // ls0 원본에 byte[] 붙임 > 원본 byte[]를 wavesream 으로 변환 > wave 파일로 저장 if (File.Exists(processingFn)) { //wavefilestream = new WaveFileReader(processingFn); } else { } // 삭제 lExtension0.Remove(ls0[i]); ls1.Insert(i + 1, ls1[i]); } else if (ls0[i].seq - ls1[i].seq > 0) { // ls1 만 믹싱 // ls1 원본에 byte[] 붙임 > 원본 byte[]를 wavesream 으로 변환 > wave 파일로 저장 if (File.Exists(processingFn)) { //wavefilestream = new WaveFileReader(processingFn); } else { } // 삭제 lExtension1.Remove(ls1[i]); ls0.Insert(i + 1, ls0[i]); } } }
private void ProcessMixing2(RcvData data, int dataSize) { string processingFn = string.Format("d:\\{0}_{1}_{2}.wav", data.seqnum, data.extension, data.peernumber); List <RecInfos> ls0 = lExtension0.FindAll( delegate(RecInfos list) { return(list.rcvData.Equals(data) && list.isExtension == 0); }); List <RecInfos> ls1 = lExtension1.FindAll( delegate(RecInfos list) { return(list.rcvData.Equals(data) && list.isExtension == 1); }); IsExtensionComparer isExtensionCompare = new IsExtensionComparer(); ls0.Sort(isExtensionCompare); ls1.Sort(isExtensionCompare); int count = 0; int count0 = ls0.Count(); int count1 = ls1.Count(); if (count0 - count1 < 0) { count = count0; } else { count = count1; } byte[] buffWriting = new byte[320 * count]; for (int i = 0; i < count; i++) { if (ls0[i].seq == ls1[i].seq) { // 믹싱 // 코덱 종류에 따라서 바이트 길이는 달라질 수 있다. 실제로 만들 때 경우의 수 확인하고 만들어야 한다. byte[] wavSrc0 = new byte[160]; byte[] wavSrc1 = new byte[160]; Array.Copy(ls0[i].voice, 12, wavSrc0, 0, wavSrc0.Length); Array.Copy(ls1[i].voice, 12, wavSrc1, 0, wavSrc1.Length); WaveMixerStream32 mixer = new WaveMixerStream32(); //mixer.AutoStop = true; WaveChannel32 channelStm = null; MemoryStream memStm = null; BufferedStream bufStm = null; RawSourceWaveStream rawSrcStm = null; WaveFormatConversionStream conversionStm = null; for (int j = 0; j < 2; j++) { if (j == 0) { memStm = new MemoryStream(wavSrc0); } else { memStm = new MemoryStream(wavSrc1); } bufStm = new BufferedStream(memStm); rawSrcStm = new RawSourceWaveStream(bufStm, mulawFormat); conversionStm = new WaveFormatConversionStream(pcmFormat, rawSrcStm); channelStm = new WaveChannel32(conversionStm); mixer.AddInputStream(channelStm); } mixer.Position = 0; Wave32To16Stream to16 = new Wave32To16Stream(mixer); var convStm = new WaveFormatConversionStream(pcmFormat, to16); byte[] tobyte = new byte[(int)convStm.Length]; int chk = convStm.Read(tobyte, 0, (int)convStm.Length); Buffer.BlockCopy(tobyte, 0, buffWriting, i * tobyte.Length, tobyte.Length); conversionStm.Close(); rawSrcStm.Close(); bufStm.Close(); memStm.Close(); convStm.Close(); to16.Close(); channelStm.Close(); mixer.Close(); // 삭제 lExtension0.Remove(ls0[i]); lExtension1.Remove(ls1[i]); } else if (ls0[i].seq - ls1[i].seq < 0) { // ls0 만 믹싱 // ls0 원본에 byte[] 붙임 > 원본 byte[]를 wavesream 으로 변환 > wave 파일로 저장 // 믹싱 // 코덱 종류에 따라서 바이트 길이는 달라질 수 있다. 실제로 만들 때 경우의 수 확인하고 만들어야 한다. byte[] wavSrc0 = new byte[160]; byte[] wavSrc1 = new byte[160]; Array.Copy(ls0[i].voice, 12, wavSrc0, 0, wavSrc0.Length); Array.Copy(ls1[i].voice, 12, wavSrc1, 0, wavSrc1.Length); WaveMixerStream32 mixer = new WaveMixerStream32(); //mixer.AutoStop = true; WaveChannel32 channelStm = null; MemoryStream memStm = null; BufferedStream bufStm = null; RawSourceWaveStream rawSrcStm = null; WaveFormatConversionStream conversionStm = null; for (int j = 0; j < 2; j++) { if (j == 0) { memStm = new MemoryStream(wavSrc0); } else { memStm = new MemoryStream(wavSrc1); } bufStm = new BufferedStream(memStm); rawSrcStm = new RawSourceWaveStream(bufStm, mulawFormat); conversionStm = new WaveFormatConversionStream(pcmFormat, rawSrcStm); channelStm = new WaveChannel32(conversionStm); mixer.AddInputStream(channelStm); } mixer.Position = 0; Wave32To16Stream to16 = new Wave32To16Stream(mixer); var convStm = new WaveFormatConversionStream(pcmFormat, to16); byte[] tobyte = new byte[(int)convStm.Length]; int chk = convStm.Read(tobyte, 0, (int)convStm.Length); Buffer.BlockCopy(tobyte, 0, buffWriting, i * tobyte.Length, tobyte.Length); conversionStm.Close(); rawSrcStm.Close(); bufStm.Close(); memStm.Close(); convStm.Close(); to16.Close(); channelStm.Close(); mixer.Close(); // 삭제 lExtension0.Remove(ls0[i]); ls1.Insert(i + 1, ls1[i]); } else if (ls0[i].seq - ls1[i].seq > 0) { // ls1 만 믹싱 // ls1 원본에 byte[] 붙임 > 원본 byte[]를 wavesream 으로 변환 > wave 파일로 저장 // 믹싱 // 코덱 종류에 따라서 바이트 길이는 달라질 수 있다. 실제로 만들 때 경우의 수 확인하고 만들어야 한다. byte[] wavSrc0 = new byte[160]; byte[] wavSrc1 = new byte[160]; Array.Copy(ls0[i].voice, 12, wavSrc0, 0, wavSrc0.Length); Array.Copy(ls1[i].voice, 12, wavSrc1, 0, wavSrc1.Length); WaveMixerStream32 mixer = new WaveMixerStream32(); //mixer.AutoStop = true; WaveChannel32 channelStm = null; MemoryStream memStm = null; BufferedStream bufStm = null; RawSourceWaveStream rawSrcStm = null; WaveFormatConversionStream conversionStm = null; for (int j = 0; j < 2; j++) { if (j == 0) { memStm = new MemoryStream(wavSrc0); } else { memStm = new MemoryStream(wavSrc1); } bufStm = new BufferedStream(memStm); rawSrcStm = new RawSourceWaveStream(bufStm, mulawFormat); conversionStm = new WaveFormatConversionStream(pcmFormat, rawSrcStm); channelStm = new WaveChannel32(conversionStm); mixer.AddInputStream(channelStm); } mixer.Position = 0; Wave32To16Stream to16 = new Wave32To16Stream(mixer); var convStm = new WaveFormatConversionStream(pcmFormat, to16); byte[] tobyte = new byte[(int)convStm.Length]; int chk = convStm.Read(tobyte, 0, (int)convStm.Length); Buffer.BlockCopy(tobyte, 0, buffWriting, i * tobyte.Length, tobyte.Length); conversionStm.Close(); rawSrcStm.Close(); bufStm.Close(); memStm.Close(); convStm.Close(); to16.Close(); channelStm.Close(); mixer.Close(); // 삭제 lExtension1.Remove(ls1[i]); ls0.Insert(i + 1, ls0[i]); } } // 10개의 버프를 바이트로 만들어 WaveFileWrite WaveFileWriting(buffWriting, processingFn); }
public void Rtp2Wav2(RecordInfo_t recordInfo, int dataSize) { string fn = string.Empty; RcvData ingData = null; ingData = rcvqueList.Find( delegate(RcvData qlist) { return(qlist.extension == recordInfo.extension && qlist.peernumber == recordInfo.peer_number); }); if (ingData == null) { DateTime now = DateTime.Now; int yyyy = now.Year; int mm = now.Month; int dd = now.Day; int hh = now.Hour; int m = now.Minute; int sec = now.Second; int ms = now.Millisecond; seqnum = string.Format("{0}{1:00}{2:00}{3:00}{4:00}{5:00}{6:000}", yyyy, mm, dd, hh, m, sec, ms); ingData = new RcvData() { extension = recordInfo.extension, peernumber = recordInfo.peer_number, seqnum = seqnum }; rcvqueList.Add(ingData); } if (dataSize == -12) { // MP3로 저장할 경우 이 곳에서 마지막에 wav를 mp3로 변환 ProcessMixing2(ingData, dataSize); lock (rcvqueList) { rcvqueList.Remove(ingData); } return; } RecInfos recinfo = new RecInfos() { rcvData = ingData , isExtension = recordInfo.isExtension , seq = recordInfo.seq , size = recordInfo.size , voice = recordInfo.voice }; if (recordInfo.isExtension == 0) { lock (lExtension0) { lExtension0.Add(recinfo); } } if (recordInfo.isExtension == 1) { lock (lExtension1) { lExtension1.Add(recinfo); } } int list0 = lExtension0.Count( delegate(RecInfos list) { return(list.rcvData.Equals(ingData) && list.isExtension == 0); }); int list1 = lExtension1.Count( delegate(RecInfos list) { return(list.rcvData.Equals(ingData) && list.isExtension == 1); }); if (list0 >= 20 && list1 >= 20) { ProcessMixing2(ingData, dataSize); } }
private void doReceive(RcvData rcvData) { /* * if (GlobalConsts.EnableLogNetwork) * { #if UNITY_EDITOR * MyDebug.Log(string.Format("[Socket] <color=#1fac75ff>recv json</color>:{0}\t{1}\n{2}", rcvData.cmdId, (NetCmd)rcvData.cmdId, JCode.ToFormart(rcvData.json.ToString()))); #else * MyDebug.Log(string.Format("[Socket] recv json:{0}\t{1}\n{2}", rcvData.cmdId, (NetCmd)rcvData.cmdId, JCode.ToFormart(rcvData.json.ToString()))); #endif * }*/ if (GlobalConsts.EnableLogNetwork) { String jsonStr = rcvData.json.ToString(); Match match = reg.Match(jsonStr); MyDebug.Log(string.Format("[Socket] <color=#1fac75ff>recv json</color>:{0} {1}", match.Groups[0], jsonStr)); } if (jsonCallback != null) { jsonCallback(rcvData.json); } /* * //默认监听对象 * RspdType rspdType = null; * NetData obj = null; * if (_rspdTypeMap.TryGetValue((NetCmd)rcvData.cmdId, out rspdType)) * { * obj = (NetData)rspdType.method.Invoke(null, new object[1] { rcvData.json.ToString() }); * CmdMethodInfo cmdMethod = null; * if (_cmdMethodInfoListMap.TryGetValue((NetCmd)rcvData.cmdId, out cmdMethod)) * { * for (int i = 0; i < cmdMethod.methodList.Count; i++) * { * //cmdMethod.methodList[i].Invoke(cmdMethod.serviceList[i], new object[] { obj }); * } * } * } * if (obj != null) * { * List<CmdHandler> rspdList = null; * if (_rspdListMap.TryGetValue((NetCmd)rcvData.cmdId, out rspdList)) * { * List<CmdHandler> tempList = new List<CmdHandler>(rspdList.ToArray()); * for (int i = 0; i < tempList.Count; i++) * { * tempList[i](obj as NetData); * } * } * } * else * { * MyDebug.LogError(string.Format("json 类型转换失败 cmd:{0}", (NetCmd)rcvData.cmdId)); * } * //Lua 单独的 json 监听对象 * List<CmdJsonHandler> rspdJsonList = null; * if (_rspdJsonListMap.TryGetValue(rcvData.cmdId, out rspdJsonList)) * { * for (int i = 0; i < rspdJsonList.Count; i++) * { * //rspdJsonList[i](rcvData.json.ToString()); * } * } */ }