info@voip-sip-sdk.com Tel: +36 1 371 0150

How to receive voice data from SIP voice call using C# speaker?

Download: SDK_Speaker.zip

This example demonstrates how to get speaker using c#, how to connect media handlers and attach speaker to call, how to receive and play audio stream from a call in c#, using Ozeki VoIP SIP SDK.
To fully understand this example, you might have to study the How to register to a SIP PBX chapter and the How to ring a SIP extension chapter first.
To use this example, you need to have Ozeki VoIP SIP SDK installed, and a reference to ozeki.dll should be added to your visual studio project.


Figure 1 - when the call has been established, the softphone is able to receive voice stream from the call

What is speaker used for during a SIP voice call? How does it work?

A speaker is an electroacoustic transducer that produces sound in response to an electrical audio signal input. In other words, speakers convert electrical signals into audible signals.

Softphones are using speakers as audio receiver devices for the purpose to play the received voice stream through them. Since the audio voice stream arrives as digital numbers which are representing the quantity's amplitude, a digital-to-analog device automatically converts the received digital voice data to electrical signals, which the speaker can send into the air as sound.

Pulse-code modulation (PCM) is a method, used to digitally represent sampled analog signals. In this example, PCM means the uncompressed form of digital audio data. This example is using the G.711 waveform codec, which is an ITU-T standard for audio companding, and it is primarily used in telephony and to communicate over IP networks. It is a lossless, encoded data (to about 50%), which has got 64 kbit/s transfer rate.

The Real-time Transport Protocol (RTP) defines a standardized packet format for delivering audio and video over IP networks. RTP is used extensively in communication and entertainment systems that involve streaming media, such as telephony, video teleconference applications, television services and web-based push-to-talk features.
RTP is designed for end-to-end, real-time transfer of stream data, and is able to transfer the data to multiple destinations. The RTP package construction:

You can learn more about RTP from the How to work with RTP in VoIP SIP calls article.

How to access speaker and play audio stream as sound using c#?

Ozeki VoIP SIP SDK provides C# Speaker class for the purpose to create speaker object. With this c# virtual speaker, users are able to reach system speaker and change speaker volume, manage speaker sound. A speaker object is able to be attached to a call with the correct media receiver object, to play the received audio from the call.

Connect speaker to call example in C#

using System;
using Ozeki.Media;
using Ozeki.VoIP;

namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;

        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);

            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = "858";
            var displayName = "858";
            var authenticationId = "858";
            var registerPassword = "858";
            var domainHost = "192.168.115.100";
            var domainPort = 5060;

            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);

            // Send SIP regitration request
            RegisterAccount(account);

            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();

            // Prevents the termination of the application
            Console.ReadLine();
        }

        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error during SIP registration: " + ex);
            }
        }

        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.NotRegistered || e.State == RegState.Error)
                Console.WriteLine("Registration failed!");

            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine("Registration succeeded - Online!");
                CreateCall();
            }
        }

        private static void CreateCall()
        {
            var numberToDial = "853";
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }

        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);

            speaker.Start();
            Console.WriteLine("The speaker is functioning.");
        }

        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine("Call state: {0}.", e.State);

            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}

Training guides, simple examples

If you would like to visit the detailed developer documentations, you can learn much more from the Ozeki VoIP SIP SDK Training chapter.

Communication through the network

When the call has been accepted by the called party, the softphone is ready to receive the voice stream from the source through the UDP network as RTP packages. This example also writes to the console that the speaker has been successfully started.

Step 1: the application notifies the user about the success of starting the speaker

The speaker is functioning.

Step 2: RTP packages are being received from the source (a sample package)

[Stream setup by SDP (frame 28)]
10.. .... = Version: RFC 1889 Version (2)
..0. .... = Padding: False
...0 .... = Extension: False
.... 0000 = Contributing source identifiers count: 0
1... .... = Marker: True
Payload type: ITU-T G.711 PCMU (0)
Sequence number: 7133
[Extended sequence number: 72669]
Timestamp: 85000
Synchronization Source identifier: 0x712f7356 (1898935126)
Payload: d55555545657545756565455575051575650515557515050...

If you have any questions or need assistance, please contact us at info@voip-sip-sdk.com

Related Pages

Ozeki Cookie Policy
Ozeki Informatics Ltd uses cookies to provide you the best experience on this website. The further use of the website will be considered as an agreement to the use of cookies. For more information read this website.

Cookies are enabled You are browsing the optimized version of this website. For more information read this website.