diff --git a/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/audio-devices/audio-devices.component.ts b/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/audio-devices/audio-devices.component.ts index 6221d4a4..51f9d7ec 100644 --- a/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/audio-devices/audio-devices.component.ts +++ b/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/audio-devices/audio-devices.component.ts @@ -3,7 +3,6 @@ import { PublisherProperties } from 'openvidu-browser'; import { Subscription } from 'rxjs'; import { CustomDevice } from '../../../models/device.model'; import { ParticipantAbstractModel } from '../../../models/participant.model'; -import { VideoType } from '../../../models/video-type.model'; import { DeviceService } from '../../../services/device/device.service'; import { OpenViduService } from '../../../services/openvidu/openvidu.service'; import { ParticipantService } from '../../../services/participant/participant.service'; @@ -66,7 +65,8 @@ export class AudioDevicesComponent implements OnInit, OnDestroy { const audioSource = event?.value; if (this.deviceSrv.needUpdateAudioTrack(audioSource)) { 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.microphoneSelected = this.deviceSrv.getMicrophoneSelected(); } diff --git a/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/video-devices/video-devices.component.ts b/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/video-devices/video-devices.component.ts index 701b4ef0..91fbf958 100644 --- a/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/video-devices/video-devices.component.ts +++ b/openvidu-components-angular/projects/openvidu-angular/src/lib/components/settings/video-devices/video-devices.component.ts @@ -4,7 +4,6 @@ import { Subscription } from 'rxjs'; import { CustomDevice } from '../../../models/device.model'; import { PanelType } from '../../../models/panel.model'; import { ParticipantAbstractModel } from '../../../models/participant.model'; -import { VideoType } from '../../../models/video-type.model'; import { DeviceService } from '../../../services/device/device.service'; import { OpenViduService } from '../../../services/openvidu/openvidu.service'; import { PanelService } from '../../../services/panel/panel.service'; @@ -88,7 +87,8 @@ export class VideoDevicesComponent implements OnInit, OnDestroy { await this.backgroundService.removeBackground(); } 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) { const bgSelected = this.backgroundService.backgrounds.find((b) => b.id === backgroundSelected); diff --git a/openvidu-components-angular/projects/openvidu-angular/src/lib/components/stream/stream.component.ts b/openvidu-components-angular/projects/openvidu-angular/src/lib/components/stream/stream.component.ts index 3f25df87..23eac42b 100644 --- a/openvidu-components-angular/projects/openvidu-angular/src/lib/components/stream/stream.component.ts +++ b/openvidu-components-angular/projects/openvidu-angular/src/lib/components/stream/stream.component.ts @@ -252,7 +252,8 @@ export class StreamComponent implements OnInit { publishAudio: !this.participantService.isMyCameraActive(), mirror: false }; - await this.openviduService.replaceTrack(VideoType.SCREEN, properties); + const publisher = this.participantService.getMyScreenPublisher(); + await this.openviduService.replaceScreenTrack(publisher, properties); } private checkVideoEnlarged() { diff --git a/openvidu-components-angular/projects/openvidu-angular/src/lib/services/openvidu/openvidu.service.ts b/openvidu-components-angular/projects/openvidu-angular/src/lib/services/openvidu/openvidu.service.ts index f3fddb80..d902b8eb 100644 --- a/openvidu-components-angular/projects/openvidu-angular/src/lib/services/openvidu/openvidu.service.ts +++ b/openvidu-components-angular/projects/openvidu-angular/src/lib/services/openvidu/openvidu.service.ts @@ -411,45 +411,49 @@ export class OpenViduService { /** * @internal + * @param cameraPublisher + * @param props */ - async replaceTrack(videoType: VideoType, props: PublisherProperties) { - const participantService = this.injector.get(ParticipantService); - const screenPublisher = participantService.getMyScreenPublisher(); - const cameraPublisher = participantService.getMyCameraPublisher(); + async replaceCameraTrack(cameraPublisher: Publisher, props: PublisherProperties) { + const isReplacingAudio = !!props.audioSource; + const isReplacingVideo = !!props.videoSource; + let mediaStream: MediaStream | undefined; + let track: MediaStreamTrack | undefined; try { - this.log.d(`Replacing ${videoType} track`, props); + if (isReplacingVideo || isReplacingAudio) { + mediaStream = await this.createMediaStream(props); + } - if (videoType === VideoType.CAMERA) { - let mediaStream: MediaStream; - const isReplacingAudio = !!props.audioSource; - const isReplacingVideo = !!props.videoSource; + if (isReplacingVideo) { + track = mediaStream?.getVideoTracks()[0]; + } else if (isReplacingAudio) { + track = mediaStream?.getAudioTracks()[0]; + } - if (isReplacingVideo) { - mediaStream = await this.createMediaStream(props); - // Replace video track - const videoTrack: MediaStreamTrack = mediaStream.getVideoTracks()[0]; - await cameraPublisher.replaceTrack(videoTrack); - } else if (isReplacingAudio) { - mediaStream = await this.createMediaStream(props); - // Replace audio track - const audioTrack: MediaStreamTrack = mediaStream.getAudioTracks()[0]; - await cameraPublisher.replaceTrack(audioTrack); - } - } else if (videoType === VideoType.SCREEN) { - try { - let newScreenMediaStream = await this.OVScreen.getUserMedia(props); - screenPublisher.stream.getMediaStream().getVideoTracks()[0].stop(); - await screenPublisher.replaceTrack(newScreenMediaStream.getVideoTracks()[0]); - } catch (error) { - this.log.w('Cannot create the new MediaStream', error); - } + 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 { + let newScreenMediaStream = await this.OVScreen.getUserMedia(props); + screenPublisher.stream.getMediaStream().getVideoTracks()[0].stop(); + await screenPublisher.replaceTrack(newScreenMediaStream.getVideoTracks()[0]); + } catch (error) { + this.log.w('Cannot create the new MediaStream', error); + } + } + /** * @internal * Subscribe all `CAMERA` stream types to speech-to-text