8000 added stop sending · coder-wuyan/flutter-webrtc@0a0bcb6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0a0bcb6

Browse files
committed
added stop sending
1 parent 2fa10ee commit 0a0bcb6

File tree

6 files changed

+69
-5
lines changed

6 files changed

+69
-5
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/FlutterWebRTCPlugin.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,10 @@ public void onMethodCall(MethodCall call, Result notSafeResult) {
409409
String kind = call.argument("kind");
410410
String streamId = call.argument("streamId");
411411
createSender(peerConnectionId, kind, streamId, result);
412+
} else if (call.method.equals("closeSender")) {
413+
String peerConnectionId = call.argument("peerConnectionId");
414+
String senderId = call.argument("senderId");
415+
stopSender(peerConnectionId, senderId, result);
412416
} else if (call.method.equals("addTrack")) {
413417
String peerConnectionId = call.argument("peerConnectionId");
414418
String trackId = call.argument("trackId");
@@ -939,7 +943,7 @@ private void mediaStreamTrackStop(final String id) {
939943
private void mediaStreamTrackSetEnabled(final String id, final boolean enabled) {
940944
MediaStreamTrack track = getTrackForId(id);
941945
if (track == null) {
942-
Log.d(TAG, "mediaStreamTrackSetEnabled() track is null");
946+
Log.d(TAG, "mediaStreamTrackSetEnabled() track is null " + id);
943947
return;
944948
} else if (track.enabled() == enabled) {
945949
return;
@@ -1309,6 +1313,18 @@ private void createSender(String peerConnectionId, String kind, String streamId,
13091313
}
13101314
}
13111315

1316+
1317+
private void stopSender(String peerConnectionId, String senderId, Result result) {
1318+
PeerConnectionObserver pco
1319+
= mPeerConnectionObservers.get(peerConnectionId);
1320+
if (pco == null || pco.getPeerConnection() == null) {
1321+
Log.d(TAG, "removeTrack() peerConnection is null");
1322+
result.error("removeTrack", "removeTrack() peerConnection is null", null);
1323+
} else {
1324+
pco.closeSender(senderId, result);
1325+
}
1326+
}
1327+
13121328
private void addTrack(String peerConnectionId, String trackId, List<String> streamIds, Result result){
13131329
PeerConnectionObserver pco
13141330
= mPeerConnectionObservers.get(peerConnectionId);

android/src/main/java/com/cloudwebrtc/webrtc/GetUserMediaImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@ private void getUserMedia(
573573
}
574574

575575
String id = track.id();
576+
Log.d(TAG, "MediaStream Track id: " + id);
576577

577578
if (track instanceof AudioTrack) {
578579
mediaStream.addTrack((AudioTrack) track);

android/src/main/java/com/cloudwebrtc/webrtc/PeerConnectionObserver.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ void close() {
9292
remoteTracks.clear();
9393
dataChannels.clear();
9494
transceivers.clear();
95-
senders.clear();;
96-
receivers.clear();;
95+
senders.clear();
96+
receivers.clear();
9797
}
9898
void dispose(){
9999
this.close();
@@ -640,6 +640,14 @@ public void createSender(String kind, String streamId, Result result){
640640
result.success(rtpSenderToMap(sender));
641641
}
642642

643+
public void closeSender(String senderId, Result result) {
644+
RtpSender sender = senders.get(senderId);
645+
sender.dispose();
646+
Map<String, Object> params = new HashMap<>();
647+
params.put("result", true);
648+
result.success(params);
649+
}
650+
643651
public void addTrack(MediaStreamTrack track, List<String> streamIds, Result result){
644652
RtpSender sender = peerConnection.addTrack(track, streamIds);
645653
senders.put(sender.id(),sender);
@@ -653,8 +661,8 @@ public void removeTrack(String senderId, Result result){
653661
return;
654662
}
655663
boolean res = peerConnection.removeTrack(sender);
656-
ConstraintsMap params = new ConstraintsMap();
657-
params.putBoolean("result", res);
664+
Map<String, Object> params = new HashMap<>();
665+
params.put("result", res);
658666
result.success(params);
659667
}
660668

ios/Classes/FlutterWebRTCPlugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
@property (nonatomic, strong) RTCPeerConnectionFactory *peerConnectionFactory;
1616
@property (nonatomic, strong) NSMutableDictionary<NSString *, RTCPeerConnection *> *peerConnections;
1717
@property (nonatomic, strong) NSMutableDictionary<NSString *, RTCMediaStream *> *localStreams;
18+
@property (nonatomic, strong) NSMutableDictionary<NSString *, RTCRtpSender *> *localSenders;
1819
@property (nonatomic, strong) NSMutableDictionary<NSString *, RTCMediaStreamTrack *> *localTracks;
1920
@property (nonatomic, strong) NSMutableDictionary<NSNumber *, FlutterRTCVideoRenderer *> *renders;
2021
@property (nonatomic, retain) UIViewController *viewController;/*for broadcast or ReplayKit */

ios/Classes/FlutterWebRTCPlugin.m

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ - (instancetype)initWithChannel:(FlutterMethodChannel *)channel
6262
self.peerConnections = [NSMutableDictionary new];
6363
self.localStreams = [NSMutableDictionary new];
6464
self.localTracks = [NSMutableDictionary new];
65+
self.localSenders = [NSMutableDictionary new];
6566
self.renders = [[NSMutableDictionary alloc] init];
6667
return self;
6768
}
@@ -164,6 +165,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
164165

165166
if (peerConnection && track) {
166167
RTCRtpSender* sender = [peerConnection addTrack:track streamIds:streamIds];
168+
self.localSenders[sender.senderId] = sender;
167169

168170
// TODO: properly map sender
169171
result(@{
@@ -194,6 +196,23 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
194196
message:[NSString stringWithFormat:@"Error: peerConnection or track not found!"]
195197
details:nil]);
196198
}
199+
} else if ([@"removeTrack" isEqualToString:call.method]) {
200+
NSDictionary* argsMap = call.arguments;
201+
202+
NSString* senderId = ((NSString*)argsMap[@"senderId"]);
203+
RTCRtpSender *sender = self.localSenders[senderId];
204+
205+
NSString* peerConnectionId = argsMap[@"peerConnectionId"];
206+
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
207+
208+
if(peerConnection && sender){
209+
[peerConnection removeTrack:sender];
210+
result(@{ @"result": @(YES) });
211+
}else{
212+
result([FlutterError errorWithCode:[NSString stringWithFormat:@"%@Failed",call.method]
213+
message:[NSString stringWithFormat:@"Error: peerConnection or mediaStream not found!"]
214+
details:nil]);
215+
}
197216
} else if ([@"removeStream" isEqualToString:call.method]) {
198217
NSDictionary* argsMap = call.arguments;
199218

@@ -507,6 +526,8 @@ - (void)dealloc
507526
_localTracks = nil;
508527
[_localStreams removeAllObjects];
509528
_localStreams = nil;
529+
[_localSenders removeAllObjects];
530+
_localSenders = nil;
510531

511532
for (NSString *peerConnectionId in _peerConnections) {
512533
RTCPeerConnection *peerConnection = _peerConnections[peerConnectionId];

lib/rtc_peerconnection.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,23 @@ class RTCPeerConnection {
451451
}
452452
}
453453

454+
Future<bool> closeSender(RTCRtpSender sender) async {
455+
try {
456+
final Map<dynamic, dynamic> response = await _methodChannel.invokeMethod(
457+
'closeSender', <String, dynamic>{
458+
'peerConnectionId': this._peerConnectionId,
459+
'senderId': sender.senderId
460+
});
461+
bool result = response["result"];
462+
_senders.removeWhere((item) {
463+
return sender.senderId == item.senderId;
464+
});
465+
return result;
466+
} on PlatformException catch (e) {
467+
throw 'Unable to RTCPeerConnection::removeTrack: ${e.message}';
468+
}
469+
}
470+
454471
Future<RTCRtpTransceiver> addTransceiver(MediaStreamTrack track,
455472
[RTCRtpTransceiverInit init]) async {
456473
try {

0 commit comments

Comments
 (0)
0