diff --git a/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LiblinphoneFlutterPlugin.kt b/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LiblinphoneFlutterPlugin.kt index 2edd74f..9e68b06 100644 --- a/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LiblinphoneFlutterPlugin.kt +++ b/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LiblinphoneFlutterPlugin.kt @@ -242,6 +242,23 @@ class LiblinphoneFlutterPlugin : FlutterPlugin, ActivityAware, MethodCallHandler result.success(linphoneBridge.getPlaybackGain()) } + "setDscp" -> { + try { + val sipDscp = call.argument("sipDscp") + val audioDscp = call.argument("audioDscp") + val videoDscp = call.argument("videoDscp") + linphoneBridge.setDscp(sipDscp, audioDscp, videoDscp) + result.success(true) + } catch (e: Exception) { + Log.e(TAG, "setDscp: ${e.message}") + result.error("error", e.message, e) + } + } + + "getDscp" -> { + result.success(linphoneBridge.getDscp().toMap()) + } + else -> { result.notImplemented() } diff --git a/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LinphoneBridge.kt b/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LinphoneBridge.kt index 354a5c2..ff1e766 100644 --- a/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LinphoneBridge.kt +++ b/android/src/main/kotlin/xyz/nuark/liblinphone_flutter/LinphoneBridge.kt @@ -393,4 +393,24 @@ class LinphoneBridge( fun getPlaybackGain(): Float { return core.getPlaybackGainDb() } + + data class DscpValues(val sipDscp: Int, val audioDscp: Int, val videoDscp: Int) { + fun toMap(): Map { + return mapOf( + "sipDscp" to core.sipDscp, + "audioDscp" to core.audioDscp, + "videoDscp" to core.videoDscp, + ); + } + } + + fun setDscp(sipDscp: Int?, audioDscp: Int?, videoDscp: Int?) { + sipDscp?.let { core.sipDscp = it } + audioDscp?.let { core.audioDscp = it } + videoDscp?.let { core.videoDscp = it } + } + + fun getDscp(): DscpValues { + return DscpValues(core.sipDscp, core.audioDscp, core.videoDscp) + } } diff --git a/lib/liblinphone_flutter.dart b/lib/liblinphone_flutter.dart index 474b2fa..97cb465 100644 --- a/lib/liblinphone_flutter.dart +++ b/lib/liblinphone_flutter.dart @@ -2,6 +2,7 @@ import 'package:flutter/services.dart' show EventChannel; import 'liblinphone_flutter_platform_interface.dart'; import 'models/call_type.dart'; +import 'models/dscp_values.dart'; import 'models/registration_state.dart'; import 'models/call_state.dart'; @@ -102,4 +103,14 @@ class LiblinphoneFlutter { Future getPlaybackGain() async => LiblinphoneFlutterPlatform.instance.getPlaybackGain(); + + Future setDscp(int sipDscp, int audioDscp, int videoDscp) async => + LiblinphoneFlutterPlatform.instance.setDscp( + sipDscp, + audioDscp, + videoDscp, + ); + + Future getDscp() async => + LiblinphoneFlutterPlatform.instance.getDscp(); } diff --git a/lib/liblinphone_flutter_method_channel.dart b/lib/liblinphone_flutter_method_channel.dart index 775f9ce..093bb25 100644 --- a/lib/liblinphone_flutter_method_channel.dart +++ b/lib/liblinphone_flutter_method_channel.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'liblinphone_flutter_platform_interface.dart'; import 'models/call_type.dart'; +import 'models/dscp_values.dart'; /// An implementation of [LiblinphoneFlutterPlatform] that uses method channels. class MethodChannelLiblinphoneFlutter extends LiblinphoneFlutterPlatform { @@ -143,4 +144,22 @@ class MethodChannelLiblinphoneFlutter extends LiblinphoneFlutterPlatform { Future getPlaybackGain() async { return (await methodChannel.invokeMethod('getPlaybackGain'))!; } + + @override + Future setDscp(int sipDscp, int audioDscp, int videoDscp) async { + return (await methodChannel.invokeMethod('setDscp', { + 'sipDscp': sipDscp, + 'audioDscp': audioDscp, + 'videoDscp': videoDscp, + }))!; + } + + @override + Future getDscp() async { + final data = (await methodChannel.invokeMethod>( + 'getDscp', + ))!; + final values = DscpValues.fromJson(data); + return values; + } } diff --git a/lib/liblinphone_flutter_platform_interface.dart b/lib/liblinphone_flutter_platform_interface.dart index f747ac5..b447f94 100644 --- a/lib/liblinphone_flutter_platform_interface.dart +++ b/lib/liblinphone_flutter_platform_interface.dart @@ -2,6 +2,7 @@ import 'package:liblinphone_flutter/models/call_type.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'liblinphone_flutter_method_channel.dart'; +import 'models/dscp_values.dart'; abstract class LiblinphoneFlutterPlatform extends PlatformInterface { /// Constructs a LiblinphoneFlutterPlatform. @@ -39,7 +40,9 @@ abstract class LiblinphoneFlutterPlatform extends PlatformInterface { String serverIp, int serverPort, ) { - throw UnimplementedError('register() has not been implemented.'); + throw UnimplementedError( + 'register(String username, String password, String serverIp, int serverPort) has not been implemented.', + ); } Future unregister() { @@ -52,14 +55,18 @@ abstract class LiblinphoneFlutterPlatform extends PlatformInterface { String notificationTitle, String notificationMessage, ) { - throw UnimplementedError('makeCall() has not been implemented.'); + throw UnimplementedError( + 'makeCall(String callTo, bool isVideoEnabled, String notificationTitle, String notificationMessage) has not been implemented.', + ); } Future answerCall( String notificationTitle, String notificationMessage, ) { - throw UnimplementedError('answerCall() has not been implemented.'); + throw UnimplementedError( + 'answerCall(String notificationTitle, String notificationMessage) has not been implemented.', + ); } Future hangupCall() { @@ -91,7 +98,7 @@ abstract class LiblinphoneFlutterPlatform extends PlatformInterface { } Future sendDtmf(String tone) { - throw UnimplementedError('sendDtmf() has not been implemented.'); + throw UnimplementedError('sendDtmf(String tone) has not been implemented.'); } Future stopCallService() async { @@ -99,7 +106,9 @@ abstract class LiblinphoneFlutterPlatform extends PlatformInterface { } Future setMicGain(double level) async { - throw UnimplementedError('setMicGain() has not been implemented.'); + throw UnimplementedError( + 'setMicGain(double level) has not been implemented.', + ); } Future getMicGain() async { @@ -107,10 +116,22 @@ abstract class LiblinphoneFlutterPlatform extends PlatformInterface { } Future setPlaybackGain(double level) async { - throw UnimplementedError('setPlaybackGain() has not been implemented.'); + throw UnimplementedError( + 'setPlaybackGain(double level) has not been implemented.', + ); } Future getPlaybackGain() async { throw UnimplementedError('getPlaybackGain() has not been implemented.'); } + + Future setDscp(int sipDscp, int audioDscp, int videoDscp) async { + throw UnimplementedError( + 'setDscp(int sipDscp, int audioDscp, int videoDscp) has not been implemented.', + ); + } + + Future getDscp() async { + throw UnimplementedError('getDscp() has not been implemented.'); + } } diff --git a/lib/models/dscp_values.dart b/lib/models/dscp_values.dart new file mode 100644 index 0000000..68263d5 --- /dev/null +++ b/lib/models/dscp_values.dart @@ -0,0 +1,10 @@ +final class DscpValues { + final int sipDscp; + final int audioDscp; + final int videoDscp; + + const DscpValues(this.sipDscp, this.audioDscp, this.videoDscp); + + factory DscpValues.fromJson(Map json) => + DscpValues(json["sipDscp"], json["audioDscp"], json["videoDscp"]); +}