From b979fc85bbc69d0b1d71cfa1e0e38cfd68d43e27 Mon Sep 17 00:00:00 2001 From: Timo <16718859+toger5@users.noreply.github.com> Date: Mon, 18 Sep 2023 12:43:03 +0200 Subject: [PATCH] Check for existing track before creating one. (#1459) Signed-off-by: Timo K --- src/livekit/useECConnectionState.ts | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/livekit/useECConnectionState.ts b/src/livekit/useECConnectionState.ts index 3e635e8d..1b881729 100644 --- a/src/livekit/useECConnectionState.ts +++ b/src/livekit/useECConnectionState.ts @@ -17,8 +17,10 @@ limitations under the License. import { AudioCaptureOptions, ConnectionState, + LocalTrackPublication, Room, RoomEvent, + Track, } from "livekit-client"; import { useCallback, useEffect, useRef, useState } from "react"; import { logger } from "matrix-js-sdk/src/logger"; @@ -54,16 +56,24 @@ async function doConnect( audioOptions: AudioCaptureOptions ): Promise { await livekitRoom!.connect(sfuConfig!.url, sfuConfig!.jwt); - const audioTracks = await livekitRoom!.localParticipant.createTracks({ - audio: audioOptions, + const hasMicrophoneTrack = Array.from( + livekitRoom?.localParticipant.audioTracks.values() + ).some((track: LocalTrackPublication) => { + return track.source == Track.Source.Microphone; }); - if (audioTracks.length < 1) { - logger.info("Tried to pre-create local audio track but got no tracks"); - return; - } - if (!audioEnabled) await audioTracks[0].mute(); + // We create a track in case there isn't any. + if (!hasMicrophoneTrack) { + const audioTracks = await livekitRoom!.localParticipant.createTracks({ + audio: audioOptions, + }); + if (audioTracks.length < 1) { + logger.info("Tried to pre-create local audio track but got no tracks"); + return; + } + if (!audioEnabled) await audioTracks[0].mute(); - await livekitRoom?.localParticipant.publishTrack(audioTracks[0]); + await livekitRoom?.localParticipant.publishTrack(audioTracks[0]); + } } export function useECConnectionState(