From 9dcd8d73ae7ae1b4c45f62db27e814e5558daf34 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Wed, 1 Apr 2020 17:48:22 +0200 Subject: [PATCH] openvidu-browser: Publiser.replaceTrack may be used without publishing to Session --- openvidu-browser/src/OpenVidu/Publisher.ts | 62 +++++++++++++--------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/openvidu-browser/src/OpenVidu/Publisher.ts b/openvidu-browser/src/OpenVidu/Publisher.ts index 150a00e6..5d0e251b 100644 --- a/openvidu-browser/src/OpenVidu/Publisher.ts +++ b/openvidu-browser/src/OpenVidu/Publisher.ts @@ -290,37 +290,49 @@ export class Publisher extends StreamManager { * @returns A Promise (to which you can optionally subscribe to) that is resolved if the track was successfully replaced and rejected with an Error object in other case */ replaceTrack(track: MediaStreamTrack): Promise { - return new Promise((resolve, reject) => { - const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders(); - let sender: RTCRtpSender | undefined; + + const replaceMediaStreamTrack = () => { + const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote : this.stream.getMediaStream(); + let removedTrack: MediaStreamTrack; if (track.kind === 'video') { - sender = senders.find(s => !!s.track && s.track.kind === 'video'); - if (!sender) { - reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object')) - } - } else if (track.kind === 'audio') { - sender = senders.find(s => !!s.track && s.track.kind === 'audio'); - if (!sender) { - reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object')) - } + removedTrack = mediaStream.getVideoTracks()[0]; } else { - reject(new Error('Unknown track kind ' + track.kind)); + removedTrack = mediaStream.getAudioTracks()[0]; } - (sender).replaceTrack(track).then(() => { - const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote : this.stream.getMediaStream(); - let removedTrack: MediaStreamTrack; + mediaStream.removeTrack(removedTrack); + removedTrack.stop(); + mediaStream.addTrack(track); + } + + return new Promise((resolve, reject) => { + if (this.stream.isLocalStreamPublished) { + // Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack + const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders(); + let sender: RTCRtpSender | undefined; if (track.kind === 'video') { - removedTrack = mediaStream.getVideoTracks()[0]; + sender = senders.find(s => !!s.track && s.track.kind === 'video'); + if (!sender) { + reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object')) + } + } else if (track.kind === 'audio') { + sender = senders.find(s => !!s.track && s.track.kind === 'audio'); + if (!sender) { + reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object')) + } } else { - removedTrack = mediaStream.getAudioTracks()[0]; + reject(new Error('Unknown track kind ' + track.kind)); } - mediaStream.removeTrack(removedTrack); - removedTrack.stop(); - mediaStream.addTrack(track); + (sender).replaceTrack(track).then(() => { + replaceMediaStreamTrack(); + resolve(); + }).catch(error => { + reject(error); + }); + } else { + // Publisher not published. Simply modify local MediaStream tracks + replaceMediaStreamTrack(); resolve(); - }).catch(error => { - reject(error); - }); + } }); } @@ -672,4 +684,4 @@ export class Publisher extends StreamManager { } } -} \ No newline at end of file +}