-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiris_event.dart
71 lines (57 loc) · 1.99 KB
/
iris_event.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import 'dart:ffi' as ffi;
import 'dart:io';
import 'dart:isolate';
import 'dart:typed_data';
import 'package:iris_event/src/native_iris_event_bindings.dart';
abstract class IrisEventHandler {
void onEvent(String event, String data, List<Uint8List> buffers);
}
class IrisEvent {
IrisEvent() {
_nativeIrisEventBinding = NativeIrisEventBinding(_loadAgoraRtcWrapperLib());
}
static ffi.DynamicLibrary _loadAgoraRtcWrapperLib() {
if (Platform.isWindows) {
return ffi.DynamicLibrary.open('iris_event_handler.dll');
}
return Platform.isAndroid
? ffi.DynamicLibrary.open("libiris_event_handler.so")
: ffi.DynamicLibrary.process();
}
late final NativeIrisEventBinding _nativeIrisEventBinding;
static IrisEventHandler? _irisEventHandler;
ReceivePort? _dartNativeReceivePort;
int _dartNativePort = -1;
static void _onEventHandle(dynamic data) {
if (_irisEventHandler == null) {
return;
}
final dataList = List.from(data);
final event = dataList[0];
String res = dataList[1] as String;
if (res.isEmpty) {
res = "{}";
}
final buffers = dataList.length == 3
? List<Uint8List>.from(dataList[2])
: <Uint8List>[];
_irisEventHandler?.onEvent(event, res, buffers);
}
void setEventHandler(IrisEventHandler eventHandler) {
if (_irisEventHandler != null) return;
_irisEventHandler = eventHandler;
_dartNativeReceivePort = ReceivePort()..listen(_onEventHandle);
_dartNativePort = _dartNativeReceivePort!.sendPort.nativePort;
_nativeIrisEventBinding.InitDartApiDL(ffi.NativeApi.initializeApiDLData);
_nativeIrisEventBinding.SetDartSendPort(_dartNativePort);
}
void dispose() {
_nativeIrisEventBinding.Dispose();
_irisEventHandler = null;
_dartNativeReceivePort?.close();
_dartNativeReceivePort = null;
_dartNativePort = -1;
}
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<EventParam>)>>
get onEventPtr => _nativeIrisEventBinding.addresses.OnEvent;
}