Skip to content

Commit

Permalink
pc: make removeTrack a blocking method
Browse files Browse the repository at this point in the history
Matches the web API and we already implement addTrack as a blocking
method.
  • Loading branch information
saghul committed Oct 20, 2022
1 parent ad808c9 commit 4c2e297
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 86 deletions.
51 changes: 20 additions & 31 deletions android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -591,38 +591,27 @@ public WritableMap peerConnectionAddTrack(int id,
}
}

@ReactMethod
public void peerConnectionRemoveTrack(int id, String senderId) {
ThreadUtils.runOnExecutor(() -> {
WritableMap params = Arguments.createMap();
params.putInt("pcId", id);

try {
PeerConnectionObserver pco = mPeerConnectionObservers.get(id);
if (pco == null) {
Log.d(TAG, "peerConnectionRemoveTrack() peerConnection is null");
sendError("peerConnectionOnError", "removeTrack", "Peer Connection is not initialized", null);
return;
}
RtpSender sender = pco.getSender(senderId);
if (sender == null) {
Log.w(TAG, "peerConnectionRemoveTrack() sender is null");
sendError("peerConnectionOnError", "removeTrack", "Sender is null", null);
return;
}

boolean successful = pco.getPeerConnection().removeTrack(sender);
if (successful) {
params.putString("senderId", senderId);
sendEvent("peerConnectionOnRemoveTrackSuccessful", params);
return;
}
sendError("peerConnectionOnError", "removeTrack", "Internal Error", params);
} catch (Exception e) {
Log.d(TAG, "peerConnectionRemoveTrack() " + e.getMessage());
sendError("peerConnectionOnError", "removeTrack", e.getMessage(), params);
@ReactMethod(isBlockingSynchronousMethod = true)
public boolean peerConnectionRemoveTrack(int id, String senderId) {
try {
return (boolean) ThreadUtils.submitToExecutor((Callable<Object>) () -> {
PeerConnectionObserver pco = mPeerConnectionObservers.get(id);
if (pco == null) {
Log.d(TAG, "peerConnectionRemoveTrack() peerConnection is null");
return false;
}
});
RtpSender sender = pco.getSender(senderId);
if (sender == null) {
Log.w(TAG, "peerConnectionRemoveTrack() sender is null");
return false;
}

return pco.getPeerConnection().removeTrack(sender);
}).get();
} catch (InterruptedException | ExecutionException e) {
Log.d(TAG, "peerConnectionRemoveTrack() " + e.getMessage());
return false;
}
}

@ReactMethod
Expand Down
48 changes: 19 additions & 29 deletions ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m
Original file line number Diff line number Diff line change
Expand Up @@ -482,46 +482,36 @@ @implementation WebRTCModule (RTCPeerConnection)
return params;
}

RCT_EXPORT_METHOD(peerConnectionRemoveTrack:(nonnull NSNumber *)objectID
senderId:(nonnull NSString *)senderId)
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(peerConnectionRemoveTrack:(nonnull NSNumber *)objectID
senderId:(nonnull NSString *)senderId)
{
__block BOOL ret = NO;

dispatch_sync(self.workerQueue, ^{
RTCPeerConnection *peerConnection = self.peerConnections[objectID];
if (!peerConnection) {
RCTLogWarn(@"PeerConnection %@ not found in peerConnectionRemoveTrack()", objectID);
[self sendErrorWithEventName: kEventPeerConnectionOnError
funcName: @"removeTrack"
message: @"Peer Connection is not initialized"
info: nil];
return;
}
RTCRtpTransceiver *transceiver = nil;
for (RTCRtpTransceiver *t in peerConnection.transceivers) {
if ([t.sender.senderId isEqual: senderId]) {
transceiver = t;

RTCRtpSender *sender = nil;

for (RTCRtpSender *s in peerConnection.senders) {
if ([s.senderId isEqual: senderId]) {
sender = s;
break;
}
}
if (!transceiver) {
RCTLogWarn(@"Transceiver not found in peerConnectionRemoveTrack()");

if (!sender) {
RCTLogWarn(@"Sender not found in peerConnectionRemoveTrack()");
return;
}

NSMutableDictionary *identifier = [NSMutableDictionary new];
identifier[@"peerConnectionId"] = objectID;
identifier[@"senderId"] = senderId;

if ([peerConnection removeTrack: transceiver.sender]) {
[self sendEventWithName: kEventPeerConnectionOnRemoveTrackSuccessful
body: identifier];
} else {
[self sendErrorWithEventName: kEventPeerConnectionOnError
funcName: @"removeTrack"
message: @"Cannot remove track"
info: identifier];
}

ret = [peerConnection removeTrack: sender];
});

return ret;
}

// TODO: move these below to some SerializeUrils file
Expand Down
1 change: 0 additions & 1 deletion ios/RCTWebRTC/WebRTCModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ static NSString *const kEventMediaStreamTrackMuteChanged = @"mediaStreamTrackMut
static NSString *const kEventTransceiverStopSuccessful = @"transceiverStopSuccessful";
static NSString *const kEventTransceiverOnError = @"transceiverOnError";
static NSString *const kEventPeerConnectionOnRemoveTrack = @"peerConnectionOnRemoveTrack";
static NSString *const kEventPeerConnectionOnRemoveTrackSuccessful = @"peerConnectionOnRemoveTrackSuccessful";
static NSString *const kEventPeerConnectionOnTrack = @"peerConnectionOnTrack";
static NSString *const kEventPeerConnectionOnError = @"peerConnectionOnError";

Expand Down
1 change: 0 additions & 1 deletion ios/RCTWebRTC/WebRTCModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ - (dispatch_queue_t)methodQueue
kEventTransceiverStopSuccessful,
kEventTransceiverOnError,
kEventPeerConnectionOnRemoveTrack,
kEventPeerConnectionOnRemoveTrackSuccessful,
kEventPeerConnectionOnTrack,
kEventPeerConnectionOnError
];
Expand Down
39 changes: 15 additions & 24 deletions src/RTCPeerConnection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,22 @@ export default class RTCPeerConnection extends defineCustomEventTarget(...PEER_C
return;
}

// Blocking!
WebRTCModule.peerConnectionRemoveTrack(this._pcId, sender.id);

const oldTrack = existingSender._track;

if (oldTrack) {
oldTrack._muted = true;
}

existingSender._track = null;

const [ existingTransceiver ] = this
.getTransceivers()
.filter(t => t.sender.id === existingSender.id);

existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive';
}

getStats() {
Expand Down Expand Up @@ -550,30 +565,6 @@ export default class RTCPeerConnection extends defineCustomEventTarget(...PEER_C
}
});

addListener(this, 'peerConnectionOnRemoveTrackSuccessful', (ev: any) => {
if (ev.pcId !== this._pcId) {
return;
}

const [ existingSender ] = this
.getSenders()
.filter(s => s.id === ev.senderId);

const oldTrack = existingSender._track;

if (oldTrack) {
oldTrack._muted = true;
}

existingSender._track = null;

const [ existingTransceiver ] = this
.getTransceivers()
.filter(t => t.sender.id === existingSender.id);

existingTransceiver._direction = existingTransceiver.direction === 'sendrecv' ? 'recvonly' : 'inactive';
});

addListener(this, 'peerConnectionGotICECandidate', (ev: any) => {
if (ev.pcId !== this._pcId) {
return;
Expand Down

0 comments on commit 4c2e297

Please sign in to comment.