コード例 #1
0
ファイル: JsonClient.cs プロジェクト: mengtest/zhengnan
 protected override void Update()
 {
     base.Update();
     while (_rcvDataQueue.Count > 0)
     {
         RcvData rcvData = _rcvDataQueue.Dequeue();
         doReceive(rcvData);
     }
 }
コード例 #2
0
ファイル: JsonClient.cs プロジェクト: mengtest/zhengnan
    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);//进入消息处理队列
    }
コード例 #3
0
        //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);
        }
コード例 #4
0
ファイル: RTPRecorder.cs プロジェクト: step4u/CallService
        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]);
                }
            }
        }
コード例 #5
0
ファイル: RTPRecorder.cs プロジェクト: step4u/CallService
        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);
        }
コード例 #6
0
ファイル: RTPRecorder.cs プロジェクト: step4u/CallService
        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);
            }
        }
コード例 #7
0
ファイル: JsonClient.cs プロジェクト: mengtest/zhengnan
    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());
         *  }
         * }
         */
    }