@@ -285,7 +285,25 @@ const updateTrack = (type, tracks) => {
285285 else if ( type === 'video' ) user ?. profile ?. shareVideo ? track . unmute ( ) : track . mute ( )
286286}
287287
288- const onLocalTracks = ( template , tracks ) => {
288+ const replaceLocalTrack = ( template , newTrack ) => {
289+ const localTracks = template . localTracks . get ( )
290+
291+ if ( localTracks ) {
292+ template . localTracks . set (
293+ localTracks . map ( ( track ) => {
294+ if ( track . getType ( ) === newTrack . getType ( ) ) {
295+ // Replace old tracks by the new one
296+ template . room . replaceTrack ( track , newTrack )
297+ return newTrack
298+ }
299+ return track
300+ } )
301+ )
302+ attachLocalTracks ( [ newTrack ] )
303+ }
304+ }
305+
306+ const attachLocalTracks = ( tracks ) => {
289307 tracks . forEach ( ( track ) => {
290308 if ( track . getType ( ) === 'video' ) {
291309 let videoNode = document . querySelector ( '#video-stream-me' )
@@ -295,25 +313,30 @@ const onLocalTracks = (template, tracks) => {
295313 // tracks[i].attach(audioNode)
296314 }
297315 } )
298-
299- template . localTracks . set ( tracks )
300316}
301317
302318const connect = async ( template ) => {
303319 console . log ( 'Connection started' )
304320
305321 if ( ! template . connection . get ( ) ) {
306322 const options = getOptions ( template . roomName )
323+ const user = Meteor . user ( { fields : { 'profile.audioRecorder' : 1 , 'profile.videoRecorder' : 1 } } )
307324
308325 meetJs . init ( options )
309326 meetJs . setLogLevel ( meetJs . logLevels . ERROR )
310327
311- await meetJs . createLocalTracks ( { devices : [ 'audio' , 'video' ] } ) . then ( ( tracks ) => {
312- updateTrack ( 'video' , tracks )
313- updateTrack ( 'audio' , tracks )
314-
315- onLocalTracks ( template , tracks )
316- } )
328+ await meetJs
329+ . createLocalTracks ( {
330+ devices : [ 'audio' , 'video' ] ,
331+ cameraDeviceId : user ?. profile ?. videoRecorder ,
332+ micDeviceId : user ?. profile ?. audioRecorder ,
333+ } )
334+ . then ( ( tracks ) => {
335+ updateTrack ( 'video' , tracks )
336+ updateTrack ( 'audio' , tracks )
337+ attachLocalTracks ( tracks )
338+ template . localTracks . set ( tracks )
339+ } )
317340
318341 template . connection . set ( new meetJs . JitsiConnection ( null , null , options ) )
319342
@@ -375,6 +398,30 @@ Template.meetLowLevel.onCreated(function () {
375398 if ( user ) this . avatarURL . set ( generateRandomAvatarURLForUser ( user ) )
376399 } )
377400
401+ this . autorun ( ( ) => {
402+ const user = Meteor . user ( { fields : { 'profile.videoRecorder' : 1 } } )
403+
404+ if ( ! user ) return
405+ meetJs
406+ . createLocalTracks ( {
407+ devices : [ 'video' ] ,
408+ cameraDeviceId : user ?. profile ?. videoRecorder ,
409+ } )
410+ . then ( ( tracks ) => replaceLocalTrack ( this , tracks [ 0 ] ) )
411+ } )
412+
413+ this . autorun ( ( ) => {
414+ const user = Meteor . user ( { fields : { 'profile.audioRecorder' : 1 } } )
415+
416+ if ( ! user ) return
417+ meetJs
418+ . createLocalTracks ( {
419+ devices : [ 'audio' ] ,
420+ micDeviceId : user ?. profile ?. audioRecorder ,
421+ } )
422+ . then ( ( tracks ) => replaceLocalTrack ( this , tracks [ 0 ] ) )
423+ } )
424+
378425 window . addEventListener ( eventTypes . onUsersComeCloser , ( e ) => {
379426 const { users } = e . detail
380427
0 commit comments