openvidu-components: Decoupled replaceTrack from participant service

- Refactored replace track method avoiding to use participant service 
- Split method in two replaceScreenTrack and replaceCameraTrack
pull/809/head
Carlos Santos 2023-03-10 13:05:57 +01:00
parent c52f632d7c
commit 197b46f212
4 changed files with 38 additions and 33 deletions

View File

@ -3,7 +3,6 @@ import { PublisherProperties } from 'openvidu-browser';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { CustomDevice } from '../../../models/device.model'; import { CustomDevice } from '../../../models/device.model';
import { ParticipantAbstractModel } from '../../../models/participant.model'; import { ParticipantAbstractModel } from '../../../models/participant.model';
import { VideoType } from '../../../models/video-type.model';
import { DeviceService } from '../../../services/device/device.service'; import { DeviceService } from '../../../services/device/device.service';
import { OpenViduService } from '../../../services/openvidu/openvidu.service'; import { OpenViduService } from '../../../services/openvidu/openvidu.service';
import { ParticipantService } from '../../../services/participant/participant.service'; import { ParticipantService } from '../../../services/participant/participant.service';
@ -66,7 +65,8 @@ export class AudioDevicesComponent implements OnInit, OnDestroy {
const audioSource = event?.value; const audioSource = event?.value;
if (this.deviceSrv.needUpdateAudioTrack(audioSource)) { if (this.deviceSrv.needUpdateAudioTrack(audioSource)) {
const pp: PublisherProperties = { audioSource, videoSource: false }; const pp: PublisherProperties = { audioSource, videoSource: false };
await this.openviduService.replaceTrack(VideoType.CAMERA, pp); const publisher = this.participantService.getMyCameraPublisher();
await this.openviduService.replaceCameraTrack(publisher, pp);
this.deviceSrv.setMicSelected(audioSource); this.deviceSrv.setMicSelected(audioSource);
this.microphoneSelected = this.deviceSrv.getMicrophoneSelected(); this.microphoneSelected = this.deviceSrv.getMicrophoneSelected();
} }

View File

@ -4,7 +4,6 @@ import { Subscription } from 'rxjs';
import { CustomDevice } from '../../../models/device.model'; import { CustomDevice } from '../../../models/device.model';
import { PanelType } from '../../../models/panel.model'; import { PanelType } from '../../../models/panel.model';
import { ParticipantAbstractModel } from '../../../models/participant.model'; import { ParticipantAbstractModel } from '../../../models/participant.model';
import { VideoType } from '../../../models/video-type.model';
import { DeviceService } from '../../../services/device/device.service'; import { DeviceService } from '../../../services/device/device.service';
import { OpenViduService } from '../../../services/openvidu/openvidu.service'; import { OpenViduService } from '../../../services/openvidu/openvidu.service';
import { PanelService } from '../../../services/panel/panel.service'; import { PanelService } from '../../../services/panel/panel.service';
@ -88,7 +87,8 @@ export class VideoDevicesComponent implements OnInit, OnDestroy {
await this.backgroundService.removeBackground(); await this.backgroundService.removeBackground();
} }
const pp: PublisherProperties = { videoSource: device.device, audioSource: false, mirror }; const pp: PublisherProperties = { videoSource: device.device, audioSource: false, mirror };
await this.openviduService.replaceTrack(VideoType.CAMERA, pp); const publisher = this.participantService.getMyCameraPublisher();
await this.openviduService.replaceCameraTrack(publisher, pp);
if (isBackgroundApplied) { if (isBackgroundApplied) {
const bgSelected = this.backgroundService.backgrounds.find((b) => b.id === backgroundSelected); const bgSelected = this.backgroundService.backgrounds.find((b) => b.id === backgroundSelected);

View File

@ -252,7 +252,8 @@ export class StreamComponent implements OnInit {
publishAudio: !this.participantService.isMyCameraActive(), publishAudio: !this.participantService.isMyCameraActive(),
mirror: false mirror: false
}; };
await this.openviduService.replaceTrack(VideoType.SCREEN, properties); const publisher = this.participantService.getMyScreenPublisher();
await this.openviduService.replaceScreenTrack(publisher, properties);
} }
private checkVideoEnlarged() { private checkVideoEnlarged() {

View File

@ -411,32 +411,40 @@ export class OpenViduService {
/** /**
* @internal * @internal
* @param cameraPublisher
* @param props
*/ */
async replaceTrack(videoType: VideoType, props: PublisherProperties) { async replaceCameraTrack(cameraPublisher: Publisher, props: PublisherProperties) {
const participantService = this.injector.get(ParticipantService);
const screenPublisher = participantService.getMyScreenPublisher();
const cameraPublisher = participantService.getMyCameraPublisher();
try {
this.log.d(`Replacing ${videoType} track`, props);
if (videoType === VideoType.CAMERA) {
let mediaStream: MediaStream;
const isReplacingAudio = !!props.audioSource; const isReplacingAudio = !!props.audioSource;
const isReplacingVideo = !!props.videoSource; const isReplacingVideo = !!props.videoSource;
let mediaStream: MediaStream | undefined;
let track: MediaStreamTrack | undefined;
try {
if (isReplacingVideo || isReplacingAudio) {
mediaStream = await this.createMediaStream(props);
}
if (isReplacingVideo) { if (isReplacingVideo) {
mediaStream = await this.createMediaStream(props); track = mediaStream?.getVideoTracks()[0];
// Replace video track
const videoTrack: MediaStreamTrack = mediaStream.getVideoTracks()[0];
await cameraPublisher.replaceTrack(videoTrack);
} else if (isReplacingAudio) { } else if (isReplacingAudio) {
mediaStream = await this.createMediaStream(props); track = mediaStream?.getAudioTracks()[0];
// Replace audio track
const audioTrack: MediaStreamTrack = mediaStream.getAudioTracks()[0];
await cameraPublisher.replaceTrack(audioTrack);
} }
} else if (videoType === VideoType.SCREEN) {
if (track) {
await cameraPublisher.replaceTrack(track);
}
} catch (error) {
this.log.e('Error replacing track ', error);
}
}
/**
* @internal
* @param screenPublisher
* @param props
*/
async replaceScreenTrack(screenPublisher: Publisher, props: PublisherProperties) {
try { try {
let newScreenMediaStream = await this.OVScreen.getUserMedia(props); let newScreenMediaStream = await this.OVScreen.getUserMedia(props);
screenPublisher.stream.getMediaStream().getVideoTracks()[0].stop(); screenPublisher.stream.getMediaStream().getVideoTracks()[0].stop();
@ -445,10 +453,6 @@ export class OpenViduService {
this.log.w('Cannot create the new MediaStream', error); this.log.w('Cannot create the new MediaStream', error);
} }
} }
} catch (error) {
this.log.e('Error replacing track ', error);
}
}
/** /**
* @internal * @internal