From 8a236e1b67a60907423cf8b9d17604d0036cc26d Mon Sep 17 00:00:00 2001
From: Carlos Santos <4a.santos@gmail.com>
Date: Sat, 23 Aug 2025 11:31:28 +0200
Subject: [PATCH] ov-components: update audio device change handling and
improve track retrieval logic
---
.../pre-join/pre-join.component.html | 2 +-
.../components/pre-join/pre-join.component.ts | 26 ++++++++++++++++---
.../lib/services/openvidu/openvidu.service.ts | 9 +++----
3 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/openvidu-components-angular/projects/openvidu-components-angular/src/lib/components/pre-join/pre-join.component.html b/openvidu-components-angular/projects/openvidu-components-angular/src/lib/components/pre-join/pre-join.component.html
index 1ee1ac1a..ee8ebab8 100644
--- a/openvidu-components-angular/projects/openvidu-components-angular/src/lib/components/pre-join/pre-join.component.html
+++ b/openvidu-components-angular/projects/openvidu-components-angular/src/lib/components/pre-join/pre-join.component.html
@@ -49,7 +49,7 @@
track.kind === 'video');
+ const newVideoTrack = updatedTracks.find((track) => track.kind === Track.Kind.Video);
// if (newVideoTrack && newVideoTrack !== this.videoTrack) {
this.tracks = updatedTracks;
@@ -260,6 +260,26 @@ export class PreJoinComponent implements OnInit, OnDestroy {
this.hasVideoDevices = devices.length > 0;
}
+ audioDeviceChanged(device: CustomDevice) {
+ try {
+ this.log.d('Audio device changed to:', device);
+
+ // Get the updated tracks from the service
+ const updatedTracks = this.openviduService.getLocalTracks();
+
+ // Find the new audio track
+ const newAudioTrack = updatedTracks.find((track) => track.kind === Track.Kind.Audio);
+
+ this.tracks = updatedTracks;
+ this.audioTrack = newAudioTrack;
+
+ this.onAudioDeviceChanged.emit(device);
+ } catch (error) {
+ this.log.e('Error handling audio device change:', error);
+ this.handleError(error);
+ }
+ }
+
async audioEnabledChanged(enabled: boolean) {
if (enabled && !this.audioTrack) {
const newAudioTrack = await this.openviduService.createLocalTracks(false, true);
@@ -316,8 +336,8 @@ export class PreJoinComponent implements OnInit, OnDestroy {
try {
this.tracks = await this.openviduService.createLocalTracks();
this.openviduService.setLocalTracks(this.tracks);
- this.videoTrack = this.tracks.find((track) => track.kind === 'video');
- this.audioTrack = this.tracks.find((track) => track.kind === 'audio');
+ this.videoTrack = this.tracks.find((track) => track.kind === Track.Kind.Video);
+ this.audioTrack = this.tracks.find((track) => track.kind === Track.Kind.Audio);
this.isVideoEnabled = this.openviduService.isVideoTrackEnabled();
return; // Success, exit retry loop
diff --git a/openvidu-components-angular/projects/openvidu-components-angular/src/lib/services/openvidu/openvidu.service.ts b/openvidu-components-angular/projects/openvidu-components-angular/src/lib/services/openvidu/openvidu.service.ts
index 1174c84b..793fd31e 100644
--- a/openvidu-components-angular/projects/openvidu-components-angular/src/lib/services/openvidu/openvidu.service.ts
+++ b/openvidu-components-angular/projects/openvidu-components-angular/src/lib/services/openvidu/openvidu.service.ts
@@ -402,11 +402,11 @@ export class OpenViduService {
const existingTrack = this.localTracks.find((track) => track.kind === Track.Kind.Video) as LocalVideoTrack;
if (existingTrack) {
- //TODO: SHould use replace track using restartTrack
+ //TODO: Should use replace track using restartTrack
// Try to restart existing track
this.removeVideoTrack();
// try {
- // await existingTrack.restartTrack({ deviceId: deviceId });
+ // await existingTrack.restartTrack({ deviceId: deviceId });
// this.log.d('Camera switched successfully using existing track');
// return;
// } catch (error) {
@@ -424,7 +424,6 @@ export class OpenViduService {
const videoTrack = newVideoTracks.find((t) => t.kind === Track.Kind.Video);
if (videoTrack) {
-
// Mute if camera is disabled in settings
if (!this.deviceService.isCameraEnabled()) {
await videoTrack.mute();
@@ -448,8 +447,8 @@ export class OpenViduService {
const existingTrack = this.localTracks?.find((track) => track.kind === Track.Kind.Audio) as LocalAudioTrack;
if (existingTrack) {
- this.removeAudioTrack();
- //TODO: SHould use replace track using restartTrack
+ this.removeAudioTrack();
+ //TODO: Should use replace track using restartTrack
// Try to restart existing track
// try {
// await existingTrack.restartTrack({ deviceId: deviceId });