openvidu-components: Disposed MediaStream when component is destroyed

pull/721/head
csantosm 2022-05-09 13:20:33 +02:00
parent 56ce32729d
commit e3340171a0
4 changed files with 17 additions and 27 deletions

View File

@ -98,15 +98,9 @@ export class PreJoinComponent implements OnInit, OnDestroy {
this.isLoading = false; this.isLoading = false;
} }
ngOnDestroy() { async ngOnDestroy() {
if (this.localParticipantSubscription) { if (this.localParticipantSubscription) this.localParticipantSubscription.unsubscribe();
this.localParticipantSubscription.unsubscribe(); if (this.screenShareStateSubscription) this.screenShareStateSubscription.unsubscribe();
}
if (this.screenShareStateSubscription) {
this.screenShareStateSubscription.unsubscribe();
}
if (this.backgroundEffectsButtonSub) this.backgroundEffectsButtonSub.unsubscribe(); if (this.backgroundEffectsButtonSub) this.backgroundEffectsButtonSub.unsubscribe();
if (this.minimalSub) this.minimalSub.unsubscribe(); if (this.minimalSub) this.minimalSub.unsubscribe();
} }
@ -124,12 +118,11 @@ export class PreJoinComponent implements OnInit, OnDestroy {
// Reapply Virtual Background to new Publisher if necessary // Reapply Virtual Background to new Publisher if necessary
const backgroundSelected = this.backgroundService.backgroundSelected.getValue(); const backgroundSelected = this.backgroundService.backgroundSelected.getValue();
const backgroundWasApplied = !!backgroundSelected && backgroundSelected !== 'no_effect'; if (this.backgroundService.isBackgroundApplied()) {
if (backgroundWasApplied) {
await this.backgroundService.removeBackground(); await this.backgroundService.removeBackground();
} }
await this.openviduService.republishTrack(pp); await this.openviduService.republishTrack(pp);
if (backgroundWasApplied) { if (this.backgroundService.isBackgroundApplied()) {
await this.backgroundService.applyBackground(this.backgroundService.backgrounds.find(b => b.id === backgroundSelected)); await this.backgroundService.applyBackground(this.backgroundService.backgrounds.find(b => b.id === backgroundSelected));
} }

View File

@ -414,11 +414,11 @@ export class VideoconferenceComponent implements OnInit, OnDestroy, AfterViewIni
} }
} }
ngOnDestroy(): void { async ngOnDestroy() {
if (this.prejoinSub) this.prejoinSub.unsubscribe(); if (this.prejoinSub) this.prejoinSub.unsubscribe();
if (this.participantNameSub) this.participantNameSub.unsubscribe(); if (this.participantNameSub) this.participantNameSub.unsubscribe();
this.deviceSrv.clear(); this.deviceSrv.clear();
this.openviduService.clear(); await this.openviduService.clear();
} }
/** /**

View File

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Connection, OpenVidu, Publisher, PublisherProperties, Session, SignalOptions } from 'openvidu-browser'; import { Connection, OpenVidu, Publisher, PublisherProperties, Session, SignalOptions, Stream } from 'openvidu-browser';
import { LoggerService } from '../logger/logger.service'; import { LoggerService } from '../logger/logger.service';
@ -84,11 +84,11 @@ export class OpenViduService {
/** /**
* @internal * @internal
*/ */
clear() { async clear() {
this.videoSource = undefined; this.videoSource = undefined;
this.audioSource = undefined; this.audioSource = undefined;
this.stopTracks(this.participantService.getMyCameraPublisher()?.stream?.getMediaStream()); await this.participantService.getMyCameraPublisher()?.stream?.disposeMediaStream();
this.stopTracks(this.participantService.getMyScreenPublisher()?.stream?.getMediaStream()); await this.participantService.getMyScreenPublisher()?.stream?.disposeMediaStream();
} }
/** /**
@ -592,12 +592,4 @@ export class OpenViduService {
} }
} }
} }
private stopTracks(mediaStream: MediaStream) {
if (mediaStream) {
mediaStream?.getAudioTracks().forEach((track) => track.stop());
mediaStream?.getVideoTracks().forEach((track) => track.stop());
// this.webcamMediaStream?.getAudioTracks().forEach((track) => track.stop());
}
}
} }

View File

@ -42,6 +42,11 @@ export class VirtualBackgroundService {
return this.backgrounds; return this.backgrounds;
} }
isBackgroundApplied(): boolean {
const bgSelected = this.backgroundSelected.getValue();
return !!bgSelected && bgSelected !== 'no_effect';
}
async applyBackground(effect: BackgroundEffect) { async applyBackground(effect: BackgroundEffect) {
if (effect.id !== this.backgroundSelected.getValue()) { if (effect.id !== this.backgroundSelected.getValue()) {
const filter = this.participantService.getMyCameraPublisher().stream.filter; const filter = this.participantService.getMyCameraPublisher().stream.filter;
@ -62,7 +67,7 @@ export class VirtualBackgroundService {
} }
async removeBackground() { async removeBackground() {
if (!!this.backgroundSelected.getValue() && this.backgroundSelected.getValue() !== 'no_effect') { if (!!this.isBackgroundApplied()) {
this.backgroundSelected.next('no_effect'); this.backgroundSelected.next('no_effect');
await this.participantService.getMyCameraPublisher().stream.removeFilter(); await this.participantService.getMyCameraPublisher().stream.removeFilter();
} }