@@ -420,29 +420,58 @@ impl Message<SetInput> for CameraFeed {
420420 let actor_ref = ctx. actor_ref ( ) ;
421421 let new_frame_recipient = actor_ref. clone ( ) . recipient ( ) ;
422422
423- let _ = inner. done_tx . send ( ( ) ) ;
424-
425423 let rt = Runtime :: new ( ) . expect ( "Failed to get Tokio runtime!" ) ;
426424 std:: thread:: spawn ( move || {
427425 LocalSet :: new ( ) . block_on ( & rt, async move {
428426 let handle = match setup_camera ( & id, new_frame_recipient) . await {
429427 Ok ( r) => {
430- let _ = ready_tx. send ( Ok ( InputConnected {
431- camera_info : r. camera_info . clone ( ) ,
432- video_info : r. video_info ,
428+ let SetupCameraResult {
429+ handle,
430+ camera_info,
431+ video_info,
432+ } = r;
433+
434+ let ready_payload = InputConnected {
435+ camera_info : camera_info. clone ( ) ,
436+ video_info,
433437 done_tx : done_tx. clone ( ) ,
434- } ) ) ;
438+ } ;
435439
436- let _ = actor_ref
437- . tell ( LockedCameraInputReconnected {
440+ let reconnect_result = actor_ref
441+ . ask ( LockedCameraInputReconnected {
438442 id : id. clone ( ) ,
439- camera_info : r . camera_info . clone ( ) ,
440- video_info : r . video_info ,
443+ camera_info,
444+ video_info,
441445 done_tx : done_tx. clone ( ) ,
442446 } )
443447 . await ;
444448
445- r. handle
449+ match reconnect_result {
450+ Ok ( true ) => {
451+ let _ = ready_tx. send ( Ok ( ready_payload) ) ;
452+ handle
453+ }
454+ Ok ( false ) => {
455+ warn ! (
456+ "Locked camera state changed before reconnecting {:?}" ,
457+ id
458+ ) ;
459+ let _ =
460+ ready_tx. send ( Err ( SetInputError :: BuildStreamCrashed ) ) ;
461+ let _ = handle. stop_capturing ( ) ;
462+ return ;
463+ }
464+ Err ( err) => {
465+ error ! (
466+ ?err,
467+ "Failed to update locked camera state for {:?}" , id
468+ ) ;
469+ let _ =
470+ ready_tx. send ( Err ( SetInputError :: BuildStreamCrashed ) ) ;
471+ let _ = handle. stop_capturing ( ) ;
472+ return ;
473+ }
474+ }
446475 }
447476 Err ( e) => {
448477 let _ = ready_tx. send ( Err ( e. clone ( ) ) ) ;
@@ -662,7 +691,7 @@ impl Message<InputConnectFailed> for CameraFeed {
662691}
663692
664693impl Message < LockedCameraInputReconnected > for CameraFeed {
665- type Reply = ( ) ;
694+ type Reply = bool ;
666695
667696 async fn handle (
668697 & mut self ,
@@ -674,7 +703,11 @@ impl Message<LockedCameraInputReconnected> for CameraFeed {
674703 {
675704 inner. camera_info = msg. camera_info ;
676705 inner. video_info = msg. video_info ;
677- inner. done_tx = msg. done_tx ;
706+ let previous_done_tx = std:: mem:: replace ( & mut inner. done_tx , msg. done_tx ) ;
707+ let _ = previous_done_tx. send ( ( ) ) ;
708+ true
709+ } else {
710+ false
678711 }
679712 }
680713}
0 commit comments