-
-
Notifications
You must be signed in to change notification settings - Fork 339
/
PluginMediaStreamTrack.swift
129 lines (106 loc) · 3.33 KB
/
PluginMediaStreamTrack.swift
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import Foundation
class PluginMediaStreamTrack : NSObject {
var rtcMediaStreamTrack: RTCMediaStreamTrack
var streamId: String
var id: String
var kind: String
var eventListener: ((_ data: NSDictionary) -> Void)?
var eventListenerForEnded: (() -> Void)?
var lostStates = Array<String>()
var renders: [String : PluginMediaStreamRenderer]
init(rtcMediaStreamTrack: RTCMediaStreamTrack, streamId: String) {
NSLog("PluginMediaStreamTrack#init()")
self.rtcMediaStreamTrack = rtcMediaStreamTrack
// Handle possible duplicate remote trackId with janus name
// See: https://github.com/cordova-rtc/cordova-plugin-iosrtc/issues/432
if (rtcMediaStreamTrack.trackId.starts(with: "janus")) {
self.id = rtcMediaStreamTrack.trackId + "_" + UUID().uuidString;
} else {
self.id = rtcMediaStreamTrack.trackId;
}
self.kind = rtcMediaStreamTrack.kind
self.renders = [:]
self.streamId = streamId;
}
deinit {
NSLog("PluginMediaStreamTrack#deinit()")
}
func run() {
NSLog("PluginMediaStreamTrack#run() [kind:%@, id:%@]", String(self.kind), String(self.id))
}
func getReadyState() -> String {
switch self.rtcMediaStreamTrack.readyState {
case RTCMediaStreamTrackState.live:
return "live"
case RTCMediaStreamTrackState.ended:
return "ended"
default:
return "ended"
}
}
func getJSON() -> NSDictionary {
return [
"id": self.id,
"kind": self.kind,
"trackId": self.rtcMediaStreamTrack.trackId,
"enabled": self.rtcMediaStreamTrack.isEnabled ? true : false,
"readyState": self.getReadyState()
]
}
func setListener(
_ eventListener: @escaping (_ data: NSDictionary) -> Void,
eventListenerForEnded: @escaping () -> Void
) {
NSLog("PluginMediaStreamTrack#setListener() [kind:%@, id:%@]", String(self.kind), String(self.id))
self.eventListener = eventListener
self.eventListenerForEnded = eventListenerForEnded
for readyState in self.lostStates {
self.eventListener!([
"type": "statechange",
"readyState": readyState,
"enabled": self.rtcMediaStreamTrack.isEnabled ? true : false
])
if readyState == "ended" {
if(self.eventListenerForEnded != nil) {
self.eventListenerForEnded!()
}
}
}
self.lostStates.removeAll()
}
func setEnabled(_ value: Bool) {
NSLog("PluginMediaStreamTrack#setEnabled() [kind:%@, id:%@, value:%@]",
String(self.kind), String(self.id), String(value))
if (self.rtcMediaStreamTrack.isEnabled != value) {
self.rtcMediaStreamTrack.isEnabled = value
if (value) {
self.rtcMediaStreamTrack.videoCaptureController?.startCapture()
}else {
self.rtcMediaStreamTrack.videoCaptureController?.stopCapture()
}
}
}
func switchCamera() {
self.rtcMediaStreamTrack.videoCaptureController?.switchCamera()
}
func registerRender(render: PluginMediaStreamRenderer) {
if let exist = self.renders[render.id] {
_ = exist
} else {
self.renders[render.id] = render
}
}
func unregisterRender(render: PluginMediaStreamRenderer) {
self.renders.removeValue(forKey: render.id);
}
func stop() {
NSLog("PluginMediaStreamTrack#stop() [kind:%@, id:%@]", String(self.kind), String(self.id))
self.rtcMediaStreamTrack.videoCaptureController?.stopCapture();
// Let's try setEnabled(false), but it also fails.
self.rtcMediaStreamTrack.isEnabled = false
for (_, render) in self.renders {
render.stop()
}
self.renders.removeAll();
}
}