# Voice Calling Voice calling with javascript Voice and Video SDK. Set up calling between applications, from application to phone, app to SIP and conference calls. Get more information here. The Sinch SDK supports four types of calls: *app-to-app (audio or video)*, *app-to-phone*, *app-to-sip* and *conference* calls. The *CallClient* is the entry point for the calling functionality of the Sinch SDK. Calls are placed through the *CallClient* and events are received using the *CallClientListener*. The call client is owned by the SinchClient and accessed using `sinchClient.callClient`. ## Set Up an *App-to-App* Call Use the [CallClient.callUser()](https://download.sinch.com/js/latest/reference/interfaces/CallClient.html) to the call method, so that Sinch services can connect the call to the callee. ```javascript var callClient = sinchClient.callClient; var call = callClient.callUser(''); // Or for video call: var call = callClient.callUserVideo(''); call.addListener(...); ``` A call object is returned, containing details about the participants in the call, call details such as start time, call state, possible errors. Assuming the callee's device is available, the [CallListener.onCallProgressing()](https://download.sinch.com/js/latest/reference/interfaces/CallListener.html) is called. It notifies the application that the outgoing call is progressing. If a progress tone should be played, this is where it should be started. When the other party answers, the [CallListener.onCallEstablished()](https://download.sinch.com/js/latest/reference/interfaces/SinchClientListener.html) is called. Now, the users can start talking. If a progress tone was previously played, it should be stopped now. ## Set Up an *App-to-Phone* Call An *app-to-phone* call is a call that's made to a phone on the regular telephone network. Setting up an *app-to-phone* call is not much different than setting up an *app-to-app* call. Instead of invoking the `callUser` method, invoke the [CallClient.callPhoneNumber()](https://download.sinch.com/js/latest/reference/interfaces/CallClient.html) recommendation and it should be prefixed with a `+`. For example, to call the US phone number 415 555 0101, the phone number should be specified as "+14155550101." The `+` is the required prefix and the US country code `1` prepended to the local subscriber number. Placing an *app-to-phone* call requires a developer account with credits. Topping up credits can be done on your Sinch account page. Credits are used each time an *app-to-phone* call is placed and the balance history is updated after each call. *App-to-phone* calls can be tested by calling the following test number: *+46000000000*. When placing a call to this number, you will hear a voice prompt stating that the call has been connected, and shortly after that the call will automatically be ended. Credits Required Placing an *App-to-Phone* call requires that your Sinch account has sufficient credits; Top up credits on your [Billing](https://dashboard.sinch.com/billing/management) page. Credits are used each time an *App-to-Phone* call is placed and your account balance is updated after each call. Testing DTMF In *App-to-Phone* scenario, it's possible to issue DTMF sequences using Sinch SDK. Note that if the receiving end of the call is an iOS device, you might have to disable *VoLTE* ("Voice over LTE") option in the settings of the phone at the receiving end of the call in order to be able to hear DTMF tones. ## Set Up an *App-to-sip* Call An *app-to-sip* call is a call that's made to a SIP server. Setting up an *app-to-sip* call is not much different from setting up an *app-to-app* call. Instead of invoking the `callUser` method, invoke the [CallClient.callSip()](https://download.sinch.com/js/latest/reference/interfaces/CallClient.html). The SIP identity should be in the form "[user@server](mailto:user@server)." By convention, when passing custom headers in the SIP call, the headers should be prefixed with "x-." If the SIP server reported any errors, the `CallDetails` object will provide an error with the `SIP` error type. ## Set Up a *Conference* Call A *conference* call can be made to connect a user to a conference room where multiple users can be connected at the same time. The identifier for a conference room may not be longer than 64 characters. ```javascript var callClient = sinchClient.callClient; var call = callClient.callConference(''); call.addCallListener(...); ``` ## Handle Incoming Calls To answer calls, the application must be notified when the user receives an incoming call. Add a [CallClientListener](https://download.sinch.com/js/latest/reference/interfaces/CallClientListener.html) to the `CallClient` to act on the incoming calls. As calls come into device [CallClientListener.onIncomingCall()](https://download.sinch.com/js/latest/reference/interfaces/CallClientListener.html) will be executed. ```javascript var callClient = sinchClient.callClient; callClient.addCallClientListener(...); ``` When the incoming call method is executed, the call can either be connected automatically without any user action, or it can wait for the user to press the answer or the hangup button. If the call is set up to wait for a user response, we recommended that a ringtone is played to notify the user that there is an incoming call. ```javascript onIncomingCall = (callClient, call) => { // Start playing ringing tone ... // Add call listener call.addCallListener(...); } ``` To get events related to the call, add a call listener. The call object contains details about participants, start time, potential error codes, and error messages. ### Incoming video call When an incoming call is a video call, the [CallClientListener.onIncomingCall()](https://download.sinch.com/js/latest/reference/interfaces/CallClientListener.html) section for details on how to add video views. ### Answer incoming call To answer the call, use the [Call.answer()](https://download.sinch.com/js/latest/reference/interfaces/Call.html) method on the call to accept it. If a ringtone was previously played, it should be stopped now. User presses the answer button: ```javascript // User answers the call call.answer(); // Stop playing ringing tone ... ``` Now, the clients on both ends establish the connection. When the call is established and the voice streams are running in both directions, the [CallListener.onCallEstablished()](https://download.sinch.com/js/latest/reference/interfaces/CallListener.html) is called. ### Decline incoming call If the call shouldn't be answered, use the [Call.hangup()](https://download.sinch.com/js/latest/reference/interfaces/Call.html) on the call to decline. The caller is notified that the incoming call was denied. If a ringtone was previously played, it should be stopped now. User presses the hangup button: ```javascript // User doesn't want to answer call.hangup(); // Stop playing ringing tone ... ``` ## Disconnecting a Call When the user wants to disconnect an ongoing call, use the [Call.hangup()](https://download.sinch.com/js/latest/reference/interfaces/Call.html) method. Either user taking part in a call can disconnect it. Hanging up a call: ```javascript call.hangup(); ``` When either party disconnects a call, the application is notified using the call listener method [CallListener.onCallEnded()](https://download.sinch.com/js/latest/reference/interfaces/CallListener.html). This allows the user interface to be updated, an alert tone to be played, or similar actions to occur. A call can be disconnected before it has been completely established. Hanging up a connecting call: ```javascript // Starts a call asynchronously var call = callClient.callUser(''); // User changed his/her mind, let’s hangup call.hangup(); ```