# liblinphone_flutter A Flutter plugin that provides integration with the Linphone library for VoIP calls (audio and video) on Android and iOS platforms. ## Third-Party Licenses This project depends on the Linphone SDK, developed by Belledonne Communications, which is dual-licensed under the GNU Affero General Public License v3 (AGPLv3) and a proprietary commercial license. This wrapper library itself is licensed under the MIT License. However, it is designed to work with the Linphone SDK, and therefore **does not remove or replace the licensing requirements of Linphone**. ### Important Any application using this plugin and linking against the Linphone SDK is subject to the terms of the AGPLv3, unless a commercial license for Linphone is obtained. In practice, this means that applications using this plugin must comply with AGPLv3 requirements, which may include releasing the application's source code under a compatible license. For proprietary or closed-source applications, you must obtain a commercial license for the Linphone SDK from Belledonne Communications. ## Description This plugin wraps the native Linphone SDK (liblinphone) and exposes a Dart API for making SIP-based voice and video calls in Flutter applications. ## Features - SIP account registration - Audio and video calls - Video streaming with local preview and remote view - Call management (answer, hangup, toggle video/microphone) - Registration and call state event streams ## Platform Support | Platform | Status | | -------- | --------- | | Android | Supported | | iOS | Supported | ## Requirements - Flutter SDK >= 3.3.0 - Dart SDK >= 3.9.0-333.2.beta - Linphone SDK (native dependency) ## Installation Add this to your `pubspec.yaml`: ```yaml dependencies: liblinphone_flutter: ^0.0.3 ``` Or if you want to go with git: ```yaml dependencies: liblinphone_flutter: git: url: https://git.nuark.xyz/nuark/liblinphone_flutter.git ref: commit-hash ``` Then run: ```bash flutter pub get ``` ### Platform-Specific Setup #### Android Ensure you have the necessary permissions in your `AndroidManifest.xml`: ```xml ``` #### iOS The plugin requires access to the camera and microphone. Add the following to your `Info.plist`: ```xml NSCameraUsageDescription Camera access is required for video calls NSMicrophoneUsageDescription Microphone access is required for audio and video calls ``` ## Usage ### Basic Example ```dart import 'package:liblinphone_flutter/liblinphone_flutter.dart'; final liblinphone = LiblinphoneFlutter(); // Initialize await liblinphone.checkPermissions(); await liblinphone.initialize(); // Register to SIP server await liblinphone.register( 'username', 'password', 'sip.server.com', 5060, ); // Listen to registration events liblinphone.registrationEvents.listen((state) { print('Registration state: $state'); }); // Listen to call events liblinphone.callEvents.listen((state) { print('Call state: $state'); }); // Make a video call await liblinphone.makeCall('sip:recipient@sip.server.com', true); // Answer incoming call await liblinphone.answerCall(); // Toggle video during call await liblinphone.toggleVideo(); // Toggle microphone await liblinphone.toggleMicrophone(); // Hangup await liblinphone.hangupCall(); // Send DTMF tone during a call await liblinphone.sendDtmf('5'); // Send tone '5' await liblinphone.sendDtmf('#'); // Send tone '#' await liblinphone.sendDtmf('*'); // Send tone '*' // Unregister and cleanup await liblinphone.unregister(); await liblinphone.stop(); ``` ### Video Views For video calls, use the provided widgets to display local and remote video streams: ```dart import 'package:liblinphone_flutter/widgets/local_view.dart'; import 'package:liblinphone_flutter/widgets/remote_view.dart'; // In your widget tree Column( children: [ // Remote video (full screen or large area) Expanded( child: RemoteView(), ), // Local video preview (picture-in-picture) SizedBox( height: 150, width: 100, child: LocalView(), ), ], ) ``` ## API Reference ### Main Class: `LiblinphoneFlutter` #### Methods | Method | Description | | ----------------------------------------------------------------- | -------------------------------------------------- | | `Future checkPermissions()` | Checks and requests camera/microphone permissions | | `Future initialize()` | Initializes the Linphone core | | `Future register(username, password, serverIp, serverPort)` | Registers to a SIP server | | `Future unregister()` | Unregisters from the SIP server | | `Future makeCall(callTo, isVideoEnabled)` | Makes an outgoing call | | `Future answerCall()` | Answers an incoming call | | `Future hangupCall()` | Hangs up the current call | | `Future inCall()` | Returns true if there is an active call | | `Future callType()` | Returns the type of the current call (audio/video) | | `Future toggleVideo()` | Toggles video enabled state during a call | | `Future toggleMicrophone()` | Toggles microphone muted state | | `Future sendDtmf(tone)` | Sends a DTMF tone during a call (0-9, *, #, A-D) | | `Future stop()` | Stops the Linphone core | | `Future syncCurrentState()` | Forces synchronization of current state | #### Event Streams | Stream | Type | Description | | -------------------- | --------------------------- | -------------------------------- | | `registrationEvents` | `Stream` | Emits registration state changes | | `callEvents` | `Stream` | Emits call state changes | ### Enums #### `RegistrationState` - `None` - Not registered - `Progress` - Registration in progress - `Ok` - Successfully registered - `Cleared` - Registration cleared - `Failed` - Registration failed #### `CallState` - `Idle` - No active call - `IncomingReceived` - Incoming call received - `OutgoingInit` - Outgoing call initialized - `OutgoingProgress` - Outgoing call in progress - `OutgoingRinging` - Remote party ringing - `Connected` - Call connected - `StreamsRunning` - Media streams running - `Pausing` - Call pausing - `Paused` - Call paused - `Resuming` - Call resuming - `Error` - Call error - `End` - Call ended - And other states... #### `CallType` - `Audio` - Audio-only call - `Video` - Video call - `Unknown` - Call type unknown ## License This project is licensed under the MIT License. ## Links - [Homepage](https://git.nuark.xyz/nuark/liblinphone_flutter) - [Linphone Project](https://www.linphone.org/)