Liblinphone  5.0.0
Functions


Multitasking
Liblinphone for IOS natively supports multitasking assuming application follows multitasking guides provided by Apple. More...

Functions

void linphone_core_start_dtmf_stream (LinphoneCore *core)
 
void linphone_core_stop_dtmf_stream (LinphoneCore *core)
 
void linphone_core_activate_audio_session (LinphoneCore *core, bool_t actived)
 Special function to indicate if the audio session is activated. More...
 
void linphone_core_configure_audio_session (LinphoneCore *core)
 Special function to configure audio session with default settings. More...
 
void linphone_core_enable_callkit (LinphoneCore *core, bool_t enabled)
 Special function to enable the callkit. More...
 
MS2_DEPRECATED void linphone_core_audio_route_changed (LinphoneCore *core)
 Special function to indicate if the audio route is changed. More...
 
bool_t linphone_core_callkit_enabled (const LinphoneCore *core)
 Special function to check if the callkit is enabled, False by default. More...
 
bool_t linphone_core_local_permission_enabled (const LinphoneCore *core)
 Special function to check if the local network permission has been granted by the user (useful for iOS). More...
 

Detailed Description


Multitasking
Liblinphone for IOS natively supports multitasking assuming application follows multitasking guides provided by Apple.

First step is to declare application as multitasked. It means adding background mode for both audio and voip to Info.plist file.

<key>UIBackgroundModes</key>
<array>
<string>voip</string>
<string>audio</string>
</array>


Networking

Sound cards
Since IOS 5.0, liblinphone supports 2 sound cards. AU: Audio Unit Receiver based on IO units for voice calls plus AQ: Audio Queue Device dedicated to rings. Here under the recommended settings (I.E default one)

linphone_core_set_playback_device(lc, "AU: Audio Unit Receiver");
linphone_core_set_ringer_device(lc, "AQ: Audio Queue Device");
linphone_core_set_capture_device(lc, "AU: Audio Unit Receiver");

GSM call interaction
To ensure gentle interaction with GSM calls, it is recommended to register an AudioSession delegate. This allows the application to be notified when its audio session is interrupted/resumed (presumably by a GSM call).

// declare a class handling the AVAudioSessionDelegate protocol
@interface MyClass : NSObject <AVAudioSessionDelegate> { [...] }
// implement 2 methods : here's an example implementation
-(void) beginInterruption {
ms_message("Sound interruption detected!");
if (c) {
linphone_core_pause_call(theLinphoneCore, c);
}
}
-(void) endInterruption {
ms_message("Sound interruption ended!");
const MSList* c = linphone_core_get_calls(theLinphoneCore);
if (c) {
ms_message("Auto resuming call");
linphone_core_resume_call(theLinphoneCore, (LinphoneCall*) c->data);
}
}
See also
http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSessionDelegate_ProtocolReference/Reference/Reference.html


Declare an instance of your class as AudioSession's delegate :

[audioSession setDelegate:myClassInstance];
See also
http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAudioSession_ClassReference/Reference/Reference.html

Video
Since 3.5 video support has been added to liblinphone for IOS. It requires the application to provide liblinphone with pointers to IOS's views hosting video display and video previous.
These 2 UIView objects must be passed to the core using functions linphone_core_set_native_video_window_id() and linphone_core_set_native_preview_window_id(). here under speudo code:

UIView* display = [[UIView alloc] init];
UIView* preview = [[UIView alloc] init];
linphone_core_set_native_video_window_id(lc,(unsigned long)display);
linphone_core_set_native_preview_window_id(lc,(unsigned long)preview);


Screen rotations are also handled by liblinphone. 2 positions are currently supported, namely UIInterfaceOrientationPortrait and UIInterfaceOrientationLandscapeRight. Applications may invoke linphone_core_set_device_rotation() followed by linphone_core_update_call() to notify liblinphone of an orientation change. Here under a speudo code to handle orientation changes

-(void) configureOrientation:(UIInterfaceOrientation) oritentation {
int oldLinphoneOrientation = linphone_core_get_device_rotation(lc);
if (oritentation == UIInterfaceOrientationPortrait ) {
linphone_core_set_native_video_window_id(lc,(unsigned long)display-portrait);
linphone_core_set_native_preview_window_id(lc,(unsigned long)preview-portrait);
} else if (oritentation == UIInterfaceOrientationLandscapeRight ) {
linphone_core_set_native_video_window_id(lc,(unsigned long)display-landscape);
linphone_core_set_native_preview_window_id(lc,(unsigned long)preview-landscape);
}
if ((oldLinphoneOrientation != linphone_core_get_device_rotation(lc))
//Orientation has changed, must call update call
}
}

DTMF feebacks
Liblinphone provides functions to play dtmf to the local user. Usually this is used to play a sound when the user presses a digit, inside or outside of any call. On IOS, libLinphone relies on AudioUnits for interfacing with the audio system. Unfortunately the Audio Unit initialization is a quite long operation that may trigger a bad user experience if performed each time a DTMF is played, the sound being delayed half a second after the press. To solve this issue and thus insure real-time precision, liblinphone introduces 2 functions for preloading and unloading the underlying audio graph responsible for playing DTMFs.
For an application using function linphone_core_play_dtmf(), it is recommanded to call linphone_core_start_dtmf_stream() when entering in foreground and linphone_core_stop_dtmf_stream() upon entering background mode.

Plugins
On iOS, plugins are built as static libraries so Liblinphone will not be able to load them at runtime dynamically. Instead, you should declare their prototypes:

extern void libmsamr_init(MSFactory *factory);
extern void libmsx264_init(MSFactory *factory);
extern void libmsopenh264_init(MSFactory *factory);
extern void libmssilk_init(MSFactory *factory);
extern void libmsbcg729_init(MSFactory *factory);
extern void libmswebrtc_init(MSFactory *factory);

Then you should register them after the instantiation of LinphoneCore:

theLinphoneCore = linphone_core_new_with_config(/* options ... */);
// Load plugins if available in the linphone SDK - otherwise these calls will do nothing
MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore);
libmssilk_init(f);
libmsamr_init(f);
libmsx264_init(f);
libmsopenh264_init(f);
libmsbcg729_init(f);
libmswebrtc_init(f);
linphone_core_reload_ms_plugins(theLinphoneCore, NULL);

If the plugin has not been enabled at compilation time, a stubbed library will be generated with only libplugin_init method declared, doing nothing. You should see these trace in logs, if plugin is stubbed:

I/lib/Could not find encoder for SILK
I/lib/Could not find decoder for SILK

Function Documentation

◆ linphone_core_activate_audio_session()

void linphone_core_activate_audio_session ( LinphoneCore core,
bool_t  actived 
)

Special function to indicate if the audio session is activated.

Must be called when ProviderDelegate of the callkit notifies that the audio session is activated or deactivated.

Parameters
coreThe LinphoneCore object.
activatedTRUE to activate the audio session, FALSE to disable it.

◆ linphone_core_audio_route_changed()

MS2_DEPRECATED void linphone_core_audio_route_changed ( LinphoneCore core)

Special function to indicate if the audio route is changed.

Must be called in the callback of AVAudioSessionRouteChangeNotification.

Parameters
coreThe LinphoneCore object.
Deprecated:
07/01/2020 now handled in the linphone SDK directly

◆ linphone_core_callkit_enabled()

bool_t linphone_core_callkit_enabled ( const LinphoneCore core)

Special function to check if the callkit is enabled, False by default.

Parameters
coreThe LinphoneCore object.
Returns
TRUE if callkit is enabled, FALSE otherwise.

◆ linphone_core_configure_audio_session()

void linphone_core_configure_audio_session ( LinphoneCore core)

Special function to configure audio session with default settings.

Must be called in ProviderDelegate's callbacks when answer an incoming call and start an outgoing call.

Parameters
coreThe LinphoneCore object.

◆ linphone_core_enable_callkit()

void linphone_core_enable_callkit ( LinphoneCore core,
bool_t  enabled 
)

Special function to enable the callkit.

Parameters
coreThe LinphoneCore object.
enabledTRUE to enable callkit, FALSE to disable it.

◆ linphone_core_local_permission_enabled()

bool_t linphone_core_local_permission_enabled ( const LinphoneCore core)

Special function to check if the local network permission has been granted by the user (useful for iOS).

The test performed by this function may popup the local network permission dialog, for that reason it could be a good idea to check it twice to conclude that the user has deny the permission.

Parameters
coreThe LinphoneCore object.
Returns
TRUE if local permission request is granted, FALSE otherwise.

◆ linphone_core_start_dtmf_stream()

void linphone_core_start_dtmf_stream ( LinphoneCore core)
Parameters
coreThe LinphoneCore object. Special function to warm up dtmf feeback stream. linphone_core_stop_dtmf_stream() must be called before entering FG mode

◆ linphone_core_stop_dtmf_stream()

void linphone_core_stop_dtmf_stream ( LinphoneCore core)
Parameters
coreThe LinphoneCore object. Special function to stop dtmf feed back function. Must be called before entering BG mode