private void SDFilePlayThread(object obj) { IPAddress localaddr = IPAddress.Parse("0.0.0.0"); TcpListener tcpserver = new TcpListener(localaddr, 0); tcpserver.Start(); IPEndPoint localep = (IPEndPoint)tcpserver.LocalEndpoint; WorkProcessHandler h = new WorkProcessHandler(UploadFileProcess); ThreadParam ap = (ThreadParam)obj; DeviceListener.Device d = deviceListener.Find(ap.id); if (d == null) { return; } string fname = System.IO.Path.GetFileName(ap.filename); int ret = deviceListener.SDCardPlayFile(d, fname, ap.volume); if (ret != 0) { return; } TcpClient tc = null; try { while (true) { int ret2 = deviceListener.SDCardGetPlayFileStatus(d, out string filename, out int runtime, out int process); if (ret2 == 0) { this.BeginInvoke(h, d, filename, false, process); } else { break; } Thread.Sleep(1000); } this.BeginInvoke(h, d, null, true, 0); dataThread = null; } catch (ThreadAbortException abortException) { dataThread = null; } }
private void SDFilePlayThread(object obj) { WorkProcessHandler h = new WorkProcessHandler(SDPlayFileProcess); ThreadParam ap = (ThreadParam)obj; DeviceListener.Device d = deviceListener.Find(ap.id); if (d == null) { this.BeginInvoke(h, d, null, true, -1); return; } string fname = System.IO.Path.GetFileName(ap.filename); int ret = deviceListener.SDCardPlayFile(d, fname, ap.volume); if (ret != 0) { this.BeginInvoke(h, d, null, true, -2); return; } //TcpClient tc = null; try { while (true) { int ret2 = deviceListener.SDCardGetPlayFileStatus(d, out string filename, out int runtime, out int process); if (ret2 == 0) { this.BeginInvoke(h, d, filename, false, process); } else { break; } Thread.Sleep(1000); } this.BeginInvoke(h, d, null, true, 0); } catch (ThreadAbortException abortException) { } finally { } }
private void EmergencyFilePlayThread(Object arg) { uint sHandle = 0; uint ret; ThreadParam ap = (ThreadParam)arg; WorkProcessHandler h = new WorkProcessHandler(EmergencyFilePlayProcess); try { ret = DeviceInterfaceDll.SR_Emergency(out sHandle, ap.userid); if (ret == DeviceInterfaceDll.RC_OK) { int offset = 0; byte[] dat = new byte[640]; short[] pcm = new short[320]; FileStream fs = File.OpenRead(ap.filename); fs.Read(dat, 0, 44);//跳过文件头,wav文件头不一定是44字节,有些会更多,此演示程序不处理此差异。 while (true) { int datlen = fs.Read(dat, 0, 640); if (datlen >= 640) { IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(dat, 0); Marshal.Copy(p, pcm, 0, pcm.Length); DeviceInterfaceDll.SR_EmergencyData(sHandle, pcm); offset += 640; } else { break; } this.Invoke(h, sHandle, "", false, (int)(100 * offset / fs.Length)); } } } finally { DeviceInterfaceDll.SR_EmergencyClose(sHandle, ap.userid); this.Invoke(h, sHandle, "", true, 0); EmergencyPlayThead = null; } }
private void FilePlayThread(Object arg) { uint ret; ThreadParam ap = (ThreadParam)arg; WorkProcessHandler h = new WorkProcessHandler(FilePlayProcess); //ret = DeviceInterfaceDll.SR_UploadFile(out uint sHandle, ap.userid, ap.filename, DeviceInterfaceDll.UPLOAD_AUDIO_FILE_RELEASE, false); ret = DeviceInterfaceDll.SR_PlayFile(out uint sHandle, ap.userid, ap.filename, 97); if (ret == DeviceInterfaceDll.RC_OK) { try { int offset = 0; byte[] dat = new byte[1024]; FileStream fs = File.OpenRead(ap.filename); while (true) { int datlen = fs.Read(dat, 0, dat.Length); if (datlen > 0) { DeviceInterfaceDll.SR_PlayFileData(sHandle, dat, datlen); offset += datlen; } else { break; } this.Invoke(h, sHandle, "", false, (int)(100 * offset / fs.Length)); } } finally { DeviceInterfaceDll.SR_PlayFileClose(sHandle); this.Invoke(h, sHandle, "", true, 0); PlayThread = null; } } }
private void FileEmergencyPlayThread(object obj) { UdpClient udpserver = new UdpClient(9999); IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0); WorkProcessHandler h = new WorkProcessHandler(FileEmergencyPlayProcess); ThreadParam ap = (ThreadParam)obj; DeviceListener.Device d = deviceListener.Find(ap.id); if (d == null) { return; } int ret = deviceListener.FileEmergencyPlayStart(d, "0.0.0.0", 9999, ap.filename, ap.streamtype, ap.volume, d.id.ToString()); if (ret != 0) { return; } FileStream fs = File.OpenRead(ap.filename); if (fs == null) { return; } try { long starttime = DateTime.Now.Ticks; string d_ip = null; int d_port = 0; while ((DateTime.Now.Ticks - starttime) < 3000 * 10000)//3000ms { if (udpserver.Available > 0) { byte[] bs = udpserver.Receive(ref ep); string s = System.Text.Encoding.Default.GetString(bs); if (s.Contains(d.id.ToString())) { d_ip = ep.Address.ToString(); d_port = ep.Port; break; } } } if (d_port != 0) { int playfiletime = 0; int time = System.Environment.TickCount; int starttime1 = time; bool eof = false; byte[] fbs = new byte[320]; short[] pcm = new short[160]; int sequenceNumber = 0; long timestamp = 0; fs.Read(fbs, 0, 44); long writebytes = 44; while (!eof) { int runtime = System.Environment.TickCount - starttime1; if ((runtime + 500) >= playfiletime) { int readbytes = fs.Read(fbs, 0, fbs.Length); IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(fbs, 0); Marshal.Copy(p, pcm, 0, 160); //GroovyCodecs.G711.uLaw.ULawEncoder g711encode = new GroovyCodecs.G711.uLaw.ULawEncoder(); //byte[] ba = g711encode.Process(pcm); byte[] ba = g711.g711Encode_ulwa(pcm); RtpPacket packet = new RtpPacket(RtpPayloadType.G711_uLaw, sequenceNumber, timestamp, ba, ba.Length); sequenceNumber++; timestamp += 20;// ba.Length; playfiletime += 20; udpserver.Send(packet.ToArray(), packet.Length, d_ip, d_port); writebytes += readbytes; if (readbytes < fbs.Length) { eof = true; } int process = (int)(100 * writebytes / fs.Length); this.BeginInvoke(h, d, ap.filename, false, process); } } } udpserver.Close(); Thread.Sleep(500); deviceListener.FileEmergencyPlayStop(d); this.BeginInvoke(h, d, ap.filename, true, 0); } catch (ThreadAbortException abortException) { udpserver.Close(); dataThread = null; } }
private void FilePlayThread(object obj) { IPAddress localaddr = IPAddress.Parse("0.0.0.0"); TcpListener tcpserver = new TcpListener(localaddr, 0); tcpserver.Start(); IPEndPoint localep = (IPEndPoint)tcpserver.LocalEndpoint; WorkProcessHandler h = new WorkProcessHandler(FilePlayProcess); ThreadParam ap = (ThreadParam)obj; DeviceListener.Device d = deviceListener.Find(ap.id); if (d == null) { return; } int ret = deviceListener.FilePlayStart(d, "0.0.0.0", localep.Port, ap.streamtype, ap.volume, null); if (ret != 0) { return; } TcpClient tc = null; try { long starttime = DateTime.Now.Ticks; while ((DateTime.Now.Ticks - starttime) < 3000 * 10000)//3000ms { if (tcpserver.Pending()) { tc = tcpserver.AcceptTcpClient(); break; } } if (tc != null) { FileStream fs = File.OpenRead(ap.filename); if (fs != null) { bool eof = false; long writebytes = 0; byte[] fbs = new byte[1024]; NetworkStream tcs = tc.GetStream(); while (!eof) { if (tcs.CanWrite) { int readbytes = fs.Read(fbs, 0, fbs.Length); tcs.Write(fbs, 0, readbytes); writebytes += readbytes; if (readbytes < fbs.Length) { eof = true; } int process = (int)(100 * writebytes / fs.Length); this.BeginInvoke(h, d, ap.filename, false, process); } else { Thread.Sleep(10); } } } tc.Close(); } Thread.Sleep(500); deviceListener.FilePlayStop(d); this.BeginInvoke(h, d, ap.filename, true, 0); dataThread = null; } catch (ThreadAbortException abortException) { //this.BeginInvoke(h, ap.filename, true, 0); if (tc != null) { tc.Close(); } dataThread = null; } }
private void MicInputThread(object obj) { //int sequenceNumber = 0; //long timestamp = 0; short[] inputbuffer = new short[2048]; WorkProcessHandler cb = new WorkProcessHandler(MicInputThreadCallBack); DeviceListener.Device d = deviceListener.Find(DeviceID); UdpClient udpserver; try { udpserver = new UdpClient(9999); } catch (Exception ex) { //MessageBox.Show("port is in use"); this.BeginInvoke(cb, d, "端口已经被占用", true, -1); return; } int port = 9999; DelegateShowWave h = new DelegateShowWave(ShowWave); int ret; ret = deviceListener.IntercomStart(d, "0.0.0.0", port, "g711-u", "rtp", 100, 20, "mic", "disable"); if (ret != 0) { this.BeginInvoke(cb, d, "命令没有回应", true, -2); udpserver.Close(); return; } IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0); udpserver.Client.ReceiveTimeout = 3000; byte[] bs = udpserver.Receive(ref ipep); if (bs == null) { this.BeginInvoke(cb, d, "终端没有连接", true, -3); deviceListener.IntercomStop(d); udpserver.Close(); return; } string dev_ip = null; int dev_port = 0; string str = System.Text.Encoding.Default.GetString(bs); if (str.Contains(DeviceID.ToString()) == false) { this.BeginInvoke(cb, d, "错误的设备ID", true, -4); deviceListener.IntercomStop(d); udpserver.Close(); return; } dev_ip = ipep.Address.ToString(); dev_port = ipep.Port; try { short[] micpack = new short[2048]; //int micpack_length = 0; short[] speakerpack = new short[2048]; //int speakerpack_length = 0; while (true) { //micpack_length = 0; //speakerpack_length = 0; while (udpserver.Available > 0) { bs = udpserver.Receive(ref ipep); if (dev_ip.Equals(ipep.Address.ToString())) { RtpPacket packet = new RtpPacket(bs, bs.Length); if (packet.PayloadType == RtpPayloadType.G711_uLaw) { short[] pcmbuf1 = g711.g711Decode_ulaw(packet.Payload); this.BeginInvoke(h, pcmbuf1); } } } } } //catch (ThreadAbortException abortException) //{ // deviceListener.IntercomStop(d); // //udpserver.Close(); //} finally { deviceListener.IntercomStop(d); udpserver.Close(); } }