openvidu-browser: Publisher.replaceTrack method refactoring

pull/621/head
pabloFuente 2021-03-25 13:58:56 +01:00
parent eb914b5418
commit eae032405d
1 changed files with 51 additions and 22 deletions

View File

@ -304,26 +304,28 @@ export class Publisher extends StreamManager {
*/ */
replaceTrack(track: MediaStreamTrack): Promise<void> { replaceTrack(track: MediaStreamTrack): Promise<void> {
const replaceMediaStreamTrack = () => { const replaceTrackInMediaStream = (): Promise<void> => {
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote! : this.stream.getMediaStream(); return new Promise((resolve, reject) => {
let removedTrack: MediaStreamTrack; const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote! : this.stream.getMediaStream();
if (track.kind === 'video') { let removedTrack: MediaStreamTrack;
removedTrack = mediaStream.getVideoTracks()[0]; if (track.kind === 'video') {
} else { removedTrack = mediaStream.getVideoTracks()[0];
removedTrack = mediaStream.getAudioTracks()[0]; } else {
} removedTrack = mediaStream.getAudioTracks()[0];
mediaStream.removeTrack(removedTrack); }
removedTrack.stop(); mediaStream.removeTrack(removedTrack);
mediaStream.addTrack(track); removedTrack.stop();
if (this.stream.isLocalStreamPublished) { mediaStream.addTrack(track);
this.openvidu.sendNewVideoDimensionsIfRequired(this, 'trackReplaced', 50, 30); if (track.kind === 'video' && this.stream.isLocalStreamPublished) {
this.session.sendVideoData(this.stream.streamManager, 5, true, 5); this.openvidu.sendNewVideoDimensionsIfRequired(this, 'trackReplaced', 50, 30);
} this.session.sendVideoData(this.stream.streamManager, 5, true, 5);
}
resolve();
});
} }
return new Promise((resolve, reject) => { const replaceTrackInRtcRtpSender = (): Promise<void> => {
if (this.stream.isLocalStreamPublished) { return new Promise((resolve, reject) => {
// Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack
const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders(); const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders();
let sender: RTCRtpSender | undefined; let sender: RTCRtpSender | undefined;
if (track.kind === 'video') { if (track.kind === 'video') {
@ -343,17 +345,44 @@ export class Publisher extends StreamManager {
return; return;
} }
(sender as RTCRtpSender).replaceTrack(track).then(() => { (sender as RTCRtpSender).replaceTrack(track).then(() => {
replaceMediaStreamTrack();
resolve(); resolve();
}).catch(error => { }).catch(error => {
reject(error); reject(error);
}); });
});
}
return new Promise(async (resolve, reject) => {
// Set field "enabled" of the new track to the previous value
const trackOriginalEnabledValue: boolean = track.enabled;
if (track.kind === 'video') {
track.enabled = this.stream.videoActive;
} else if (track.kind === 'audio') {
track.enabled = this.stream.audioActive;
}
if (this.stream.isLocalStreamPublished) {
// Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack
// If it has not been published yet, replacing it on the MediaStream object is enough
try {
await replaceTrackInRtcRtpSender();
await replaceTrackInMediaStream();
resolve();
} catch (error) {
track.enabled = trackOriginalEnabledValue;
reject(error);
}
} else { } else {
// Publisher not published. Simply modify local MediaStream tracks // Publisher not published. Simply replace the track on the local MediaStream
replaceMediaStreamTrack(); try {
resolve(); await replaceTrackInMediaStream();
resolve();
} catch (error) {
track.enabled = trackOriginalEnabledValue;
reject(error);
}
} }
}); });
} }
/* Hidden methods */ /* Hidden methods */