This sample demonstrates receiving speech packets, decoding and playing them out using WaveOutput.
using System;
using System.Net;
using StreamCoders.Network;
using StreamCoders.Wave;
namespace SpeechReceiverTest
{
class Receiver
{
public void Start()
{
jitter = new System.Collections.Generic.SortedDictionary<Int32, RTPPacket>();
session = new RTPSession();
receiver = new RTPReceiver();
sender = new RTPSender();
IPEndPoint rtpEp = new IPEndPoint(IPAddress.Parse(StreamCoders.Network.Helper.GetLocalIP()), 23152);
participant = new RTPParticipant(rtpEp, null, null, null);
session.NewRTPPacket = NewRTPPacket;
session.NewRTCPPacket = null;
receiver.AddParticipant(participant);
session.AddReceiver(receiver);
decoder = new StreamCoders.Decoder.SpeechDecoder();
decoder.SetCodec(StreamCoders.SpeechCodecs.G711A);
decoder.Bitrate = 64000;
decoder.Init();
wout = new WaveOutput();
wout.Channels = 1;
wout.SampleRate = 8000;
wout.BitsPerSample = 16;
wout.Init();
wout.OpenDevice(null);
decoderThread = new System.Threading.Thread(new System.Threading.ThreadStart(DecoderThread));
decoderThread.Start();
}
private void DecoderThread()
{
lock (jitter) // Clear jitter to avoid delays
{
jitter.Clear();
}
while (true)
{
RTPPacket f = CheckJitterForCompleteFrame();
if (f == null)
{
System.Threading.Thread.Sleep(0);
wout.UnprepareBuffers();
continue;
}
byte[] pcm = decoder.Decode(f.DataPointer);
if (pcm != null)
{
wout.Enqueue(pcm);
}
}
}
private bool NewRTPPacket(RTPPacket packet, byte[] rawBuffer)
{
AddPacketToJitter(packet);
return false;
}
private void AddPacketToJitter(RTPPacket packet)
{
if (packet == null)
return;
lock (jitter)
{
jitter.Add(packet.Timestamp, packet);
}
}
private RTPPacket CheckJitterForCompleteFrame()
{
lock (jitter)
{
foreach (RTPPacket f in jitter.Values)
{
jitter.Remove(f.Timestamp);
return f;
}
}
return null;
}
private RTPSession session;
private RTPReceiver receiver;
private RTPSender sender;
private RTPParticipant participant;
private System.Collections.Generic.SortedDictionary<Int32, RTPPacket> jitter;
private StreamCoders.Decoder.SpeechDecoder decoder;
private System.Threading.Thread decoderThread;
private WaveOutput wout;
}
class Program
{
static void Main(string[] args)
{
Receiver rec = new Receiver();
rec.Start();
Console.ReadLine();
}
}
}