Skip to content

Commit ff746c0

Browse files
committed
Handle locked camera state changes on reconnect
1 parent b2a9d8e commit ff746c0

File tree

1 file changed

+46
-13
lines changed

1 file changed

+46
-13
lines changed

crates/recording/src/feeds/camera.rs

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

664693
impl 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

Comments
 (0)