public IPEndPoint FindStunAddress() { JingleMediaSession session = new JingleMediaSession(localEp); session.AudioRTPStream = stream; IPEndPoint ep = session.PerformSTUNRequest(new DnsEndPoint("stun.ekiga.net", 3478), 4000); IPEndPoint ep1 = session.PerformSTUNRequest(new DnsEndPoint("stun.ekiga.net", 3478), 4000); Log(ep.ToString()); Log(ep1.ToString()); return ep; }
public IPEndPoint FindStunAddress() { JingleMediaSession session = new JingleMediaSession(localEp); session.AudioRTPStream = stream; IPEndPoint ep = session.PerformSTUNRequest(new DnsEndPoint("stun.ekiga.net", 3478), 4000); IPEndPoint ep1 = session.PerformSTUNRequest(new DnsEndPoint("stun.ekiga.net", 3478), 4000); Log(ep.ToString()); Log(ep1.ToString()); return(ep); }
public void MicrophoneThreadFunction() { StartMic(); JingleMediaSession session = MediaSession; if (session == null) { return; } int nSamplesPerPacket = MediaSession.AudioRTPStream.AudioCodec.AudioFormat.CalculateNumberOfSamplesForDuration(TimeSpan.FromMilliseconds(MediaSession.AudioRTPStream.PTimeTransmit)); int nBytesPerPacket = nSamplesPerPacket * MediaSession.AudioRTPStream.AudioCodec.AudioFormat.BytesPerSample; // Min size in ICS was 1280 or 40 ms TimeSpan tsPTime = TimeSpan.FromMilliseconds(MediaSession.AudioRTPStream.PTimeTransmit); DateTime dtNextPacketExpected = DateTime.Now + tsPTime; int nUnavailableAudioPackets = 0; while (m_bCallActive == true) { dtNextPacketExpected = DateTime.Now + tsPTime; if (MicrophoneQueue.Size >= nBytesPerPacket) { byte[] buffer = MicrophoneQueue.GetNSamples(nBytesPerPacket); session.AudioRTPStream.SendNextSample(buffer); } else { nUnavailableAudioPackets++; } if (MicrophoneQueue.Size > nBytesPerPacket * 6) { MicrophoneQueue.GetNSamples(MicrophoneQueue.Size - nBytesPerPacket * 5); } TimeSpan tsRemaining = dtNextPacketExpected - DateTime.Now; int nMsRemaining = (int)tsRemaining.TotalMilliseconds; if (nMsRemaining > 0) { System.Threading.Thread.Sleep(nMsRemaining); } } StopMic(); }
public void SpeakerThreadFunction() { /// Send the data to our AudioStreamSource /// TimeSpan tsPTime = TimeSpan.FromMilliseconds(MediaSession.AudioRTPStream.PTimeReceive); int nSamplesPerPacket = MediaSession.AudioRTPStream.AudioCodec.AudioFormat.CalculateNumberOfSamplesForDuration(tsPTime); int nBytesPerPacket = nSamplesPerPacket * MediaSession.AudioRTPStream.AudioCodec.AudioFormat.BytesPerSample; JingleMediaSession session = MediaSession; if (session == null) { return; } byte[] bDummySample = new byte[nBytesPerPacket]; source.PacketSize = nBytesPerPacket; session.AudioRTPStream.IncomingRTPPacketBuffer.InitialPacketQueueMinimumSize = 4; session.AudioRTPStream.IncomingRTPPacketBuffer.PacketSizeShiftMax = 10; Deployment.Current.Dispatcher.BeginInvoke(new EventHandler(SafeStartMediaElement), null, null); int nMsTook = 0; /// Get first packet... have to wait for our rtp buffer to fill byte[] bData = session.AudioRTPStream.WaitNextPacketSample(true, MediaSession.AudioRTPStream.PTimeReceive * 5, out nMsTook); if ((bData != null) && (bData.Length > 0)) { source.Write(bData); } DateTime dtNextPacketExpected = DateTime.Now + tsPTime; System.Diagnostics.Stopwatch WaitPacketWatch = new System.Diagnostics.Stopwatch(); int nDeficit = 0; while (m_bCallActive == true) { bData = session.AudioRTPStream.WaitNextPacketSample(true, MediaSession.AudioRTPStream.PTimeReceive, out nMsTook); if ((bData != null) && (bData.Length > 0)) { source.Write(bData); } //int nRemaining = MediaSession.AudioRTPStream.PTimeReceive - nMsTook; //if (nRemaining > 0) // System.Threading.Thread.Sleep(nRemaining); //dtNextPacketExpected = dtLastPacket + tsPTime; //byte[] bData = session.AudioRTPStream.GetNextPacketSample(false); //if ((bData != null) && (bData.Length > 0)) // source.Write(bData); //else // source.Write(bDummySample); TimeSpan tsRemaining = dtNextPacketExpected - DateTime.Now; int nMsRemaining = (int)tsRemaining.TotalMilliseconds; if (nMsRemaining > 0) { nMsRemaining += nDeficit; if (nMsRemaining > 0) { System.Threading.Thread.Sleep(nMsRemaining); } else { nDeficit = nMsRemaining; } } else { nDeficit += nMsRemaining; } dtNextPacketExpected += tsPTime; } Deployment.Current.Dispatcher.BeginInvoke(new EventHandler(SafeStopMediaElement), null, null); }