MediaSuite.NET Sample code

Receiving G.711 over RTP

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();
        }
    }
}