@@ -9,7 +9,7 @@ use nokhwa::utils::{
99 CameraFormat , CameraIndex , ControlValueSetter , FrameFormat , KnownCameraControl ,
1010 RequestedFormat , RequestedFormatType , Resolution ,
1111} ;
12- use std:: sync:: { Arc , Mutex } ;
12+ use std:: sync:: { Arc , Condvar , Mutex } ;
1313
1414#[ derive( Debug , Clone ) ]
1515pub struct CameraInfo {
@@ -41,6 +41,8 @@ pub enum CameraEvent {
4141 StopStream ,
4242 Config ( ImageConfig ) ,
4343 Controls ( Vec < ( KnownCameraControl , ControlValueSetter ) > ) ,
44+ Pause ,
45+ Resume ,
4446}
4547
4648struct Exit { }
@@ -75,7 +77,11 @@ impl CameraThread {
7577 #[ allow( clippy:: type_complexity) ]
7678 let controls: Arc < Mutex < Option < Vec < ( KnownCameraControl , ControlValueSetter ) > > > > =
7779 Arc :: new ( Mutex :: new ( None ) ) ;
80+
81+ let pause = Arc :: new ( ( Mutex :: new ( false ) , Condvar :: new ( ) ) ) ;
82+
7883 let mut join_handle = None ;
84+
7985 while let Ok ( event) = self . config_rx . recv ( ) {
8086 match event {
8187 CameraEvent :: StartStream { id, format } => {
@@ -86,6 +92,8 @@ impl CameraThread {
8692 let window_tx = self . window_tx . clone ( ) ;
8793 let result_tx = self . result_tx . clone ( ) ;
8894 let exit_rx = exit_rx. clone ( ) ;
95+ let pause_thread = Arc :: clone ( & pause) ;
96+
8997 let hdl = std:: thread:: spawn ( move || {
9098 let mut camera = match CallbackCamera :: new (
9199 id,
@@ -127,7 +135,15 @@ impl CameraThread {
127135
128136 let mut inner_config = None ;
129137
138+ let ( pause_lock, pause_cvar) = & * pause_thread;
139+
130140 loop {
141+ // Check pause request
142+ let guard = pause_cvar
143+ . wait_while ( pause_lock. lock ( ) . unwrap ( ) , |paused| * paused)
144+ . unwrap ( ) ;
145+ drop ( guard) ;
146+
131147 // Check exit request
132148 if exit_rx. try_recv ( ) . is_ok ( ) {
133149 return ;
@@ -208,6 +224,18 @@ impl CameraThread {
208224 CameraEvent :: Controls ( ctrls) => {
209225 * controls. lock ( ) . unwrap ( ) = Some ( ctrls) ;
210226 }
227+ CameraEvent :: Pause => {
228+ let ( pause_lock, pause_cvar) = & * pause;
229+ let mut paused = pause_lock. lock ( ) . unwrap ( ) ;
230+ * paused = true ;
231+ pause_cvar. notify_one ( ) ;
232+ }
233+ CameraEvent :: Resume => {
234+ let ( pause_lock, pause_cvar) = & * pause;
235+ let mut paused = pause_lock. lock ( ) . unwrap ( ) ;
236+ * paused = false ;
237+ pause_cvar. notify_one ( ) ;
238+ }
211239 }
212240 }
213241 log:: debug!( "Camera thread exiting" ) ;
0 commit comments