feat: (for now android only!) codec configuration and retrieval methods
This commit is contained in:
parent
32789468a3
commit
3ed93930b0
6 changed files with 117 additions and 0 deletions
|
|
@ -263,6 +263,21 @@ class LiblinphoneFlutterPlugin : FlutterPlugin, ActivityAware, MethodCallHandler
|
||||||
result.success(linphoneBridge.getCurrentCallStats()?.toMap())
|
result.success(linphoneBridge.getCurrentCallStats()?.toMap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"getAvailableAudioCodecs" -> {
|
||||||
|
result.success(linphoneBridge.getAvailableAudioCodecs())
|
||||||
|
}
|
||||||
|
|
||||||
|
"setAudioCodec" -> {
|
||||||
|
try {
|
||||||
|
val mime = call.argument<String>("mime")!!
|
||||||
|
val clockRate = call.argument<Int>("clockRate")!!
|
||||||
|
result.success(linphoneBridge.setAudioCodec(mime, clockRate))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "setAudioCodec: ${e.message}")
|
||||||
|
result.error("error", e.message, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
result.notImplemented()
|
result.notImplemented()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -549,4 +549,61 @@ class LinphoneBridge(
|
||||||
isZrtpKeyAgreementAlgoPostQuantum = stats.isZrtpKeyAgreementAlgoPostQuantum(),
|
isZrtpKeyAgreementAlgoPostQuantum = stats.isZrtpKeyAgreementAlgoPostQuantum(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class LPCodec(
|
||||||
|
val mimeType: String,
|
||||||
|
val clockRate: Int,
|
||||||
|
val enabled: Boolean,
|
||||||
|
) {
|
||||||
|
fun toMap(): Map<String, Any?> {
|
||||||
|
return mapOf(
|
||||||
|
"mimeType" to mimeType,
|
||||||
|
"clockRate" to clockRate,
|
||||||
|
"enabled" to enabled,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getAvailableAudioCodecs(): List<Map<String, Any?>> {
|
||||||
|
return core.audioPayloadTypes.map {
|
||||||
|
LPCodec(
|
||||||
|
mimeType = it.mimeType.lowercase(),
|
||||||
|
clockRate = it.clockRate,
|
||||||
|
enabled = it.enabled()
|
||||||
|
).toMap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setAudioCodec(mime: String, clockRate: Int): Boolean {
|
||||||
|
var codecFound = false
|
||||||
|
var ok = false
|
||||||
|
core.audioPayloadTypes.forEach { pt: PayloadType ->
|
||||||
|
val ptMime = pt.mimeType.lowercase()
|
||||||
|
val ptClockRate = pt.clockRate
|
||||||
|
val enable = ptMime == mime && ptClockRate == clockRate
|
||||||
|
if (enable) {
|
||||||
|
ok = pt.enable(enable) == 0
|
||||||
|
codecFound = true
|
||||||
|
Log.i(
|
||||||
|
LiblinphoneFlutterPlugin.TAG,
|
||||||
|
"setAudioCodec: preferred codec found ($ptMime @ $clockRate) switch: $ok"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
val switchedOk = pt.enable(enable) == 0
|
||||||
|
Log.i(
|
||||||
|
LiblinphoneFlutterPlugin.TAG,
|
||||||
|
"setAudioCodec: $ptMime @ $clockRate switch: $switchedOk"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!codecFound) {
|
||||||
|
Log.i(
|
||||||
|
LiblinphoneFlutterPlugin.TAG,
|
||||||
|
"setAudioCodec: could not find codec with parans $mime @ $clockRate"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'liblinphone_flutter_platform_interface.dart';
|
||||||
import 'models/call_stats.dart';
|
import 'models/call_stats.dart';
|
||||||
import 'models/call_type.dart';
|
import 'models/call_type.dart';
|
||||||
import 'models/dscp_values.dart';
|
import 'models/dscp_values.dart';
|
||||||
|
import 'models/lp_codec.dart';
|
||||||
import 'models/registration_state.dart';
|
import 'models/registration_state.dart';
|
||||||
import 'models/call_state.dart';
|
import 'models/call_state.dart';
|
||||||
|
|
||||||
|
|
@ -117,4 +118,10 @@ class LiblinphoneFlutter {
|
||||||
|
|
||||||
Future<CallStats?> getCurrentCallStats() async =>
|
Future<CallStats?> getCurrentCallStats() async =>
|
||||||
LiblinphoneFlutterPlatform.instance.getCurrentCallStats();
|
LiblinphoneFlutterPlatform.instance.getCurrentCallStats();
|
||||||
|
|
||||||
|
Future<List<LPCodec>> getAvailableAudioCodecs() async =>
|
||||||
|
LiblinphoneFlutterPlatform.instance.getAvailableAudioCodecs();
|
||||||
|
|
||||||
|
Future<bool> setAudioCodec(String mime, int clockRate) async =>
|
||||||
|
LiblinphoneFlutterPlatform.instance.setAudioCodec(mime, clockRate);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import 'liblinphone_flutter_platform_interface.dart';
|
||||||
import 'models/call_stats.dart';
|
import 'models/call_stats.dart';
|
||||||
import 'models/call_type.dart';
|
import 'models/call_type.dart';
|
||||||
import 'models/dscp_values.dart';
|
import 'models/dscp_values.dart';
|
||||||
|
import 'models/lp_codec.dart';
|
||||||
|
|
||||||
/// An implementation of [LiblinphoneFlutterPlatform] that uses method channels.
|
/// An implementation of [LiblinphoneFlutterPlatform] that uses method channels.
|
||||||
class MethodChannelLiblinphoneFlutter extends LiblinphoneFlutterPlatform {
|
class MethodChannelLiblinphoneFlutter extends LiblinphoneFlutterPlatform {
|
||||||
|
|
@ -175,4 +176,22 @@ class MethodChannelLiblinphoneFlutter extends LiblinphoneFlutterPlatform {
|
||||||
final values = CallStats.fromJson(data);
|
final values = CallStats.fromJson(data);
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<LPCodec>> getAvailableAudioCodecs() async {
|
||||||
|
final data = (await methodChannel.invokeMethod<List<Object?>>(
|
||||||
|
'getAvailableAudioCodecs',
|
||||||
|
))!.cast<Map<dynamic, dynamic>>();
|
||||||
|
|
||||||
|
final values = data.map(LPCodec.fromJson).toList(growable: true);
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> setAudioCodec(String mime, int clockRate) async {
|
||||||
|
return (await methodChannel.invokeMethod<bool>(
|
||||||
|
'setAudioCodec',
|
||||||
|
<String, dynamic>{'mime': mime, 'clockRate': clockRate},
|
||||||
|
))!;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
||||||
import 'liblinphone_flutter_method_channel.dart';
|
import 'liblinphone_flutter_method_channel.dart';
|
||||||
import 'models/call_stats.dart';
|
import 'models/call_stats.dart';
|
||||||
import 'models/dscp_values.dart';
|
import 'models/dscp_values.dart';
|
||||||
|
import 'models/lp_codec.dart';
|
||||||
|
|
||||||
abstract class LiblinphoneFlutterPlatform extends PlatformInterface {
|
abstract class LiblinphoneFlutterPlatform extends PlatformInterface {
|
||||||
/// Constructs a LiblinphoneFlutterPlatform.
|
/// Constructs a LiblinphoneFlutterPlatform.
|
||||||
|
|
@ -139,4 +140,12 @@ abstract class LiblinphoneFlutterPlatform extends PlatformInterface {
|
||||||
Future<CallStats?> getCurrentCallStats() async {
|
Future<CallStats?> getCurrentCallStats() async {
|
||||||
throw UnimplementedError('getCurrentCallStats() has not been implemented.');
|
throw UnimplementedError('getCurrentCallStats() has not been implemented.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<LPCodec>> getAvailableAudioCodecs() async {
|
||||||
|
throw UnimplementedError('getCurrentCallStats() has not been implemented.');
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> setAudioCodec(String mime, int clockRate) async {
|
||||||
|
throw UnimplementedError('getCurrentCallStats() has not been implemented.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
lib/models/lp_codec.dart
Normal file
10
lib/models/lp_codec.dart
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
final class LPCodec {
|
||||||
|
final String mimeType;
|
||||||
|
final int clockRate;
|
||||||
|
final bool enabled;
|
||||||
|
|
||||||
|
const LPCodec(this.mimeType, this.clockRate, this.enabled);
|
||||||
|
|
||||||
|
factory LPCodec.fromJson(Map<dynamic, dynamic> json) =>
|
||||||
|
LPCodec(json["mimeType"], json["clockRate"], json["enabled"]);
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue