@@ -305,13 +305,6 @@ pub async fn start_recording(
305305 state. set_pending_recording ( ) ;
306306 }
307307
308- if let Some ( window) = CapWindowId :: Main . get ( & app) {
309- let _ = general_settings
310- . map ( |v| v. main_window_recording_start_behaviour )
311- . unwrap_or_default ( )
312- . perform ( & window) ;
313- }
314-
315308 let countdown = general_settings. and_then ( |v| v. recording_countdown ) ;
316309 let _ = ShowCapWindow :: InProgressRecording { countdown }
317310 . show ( & app)
@@ -343,86 +336,121 @@ pub async fn start_recording(
343336
344337 println ! ( "spawning actor" ) ;
345338
346- // done in spawn to catch panics just in case
347- let actor_done_rx = spawn_actor ( {
348- let state_mtx = Arc :: clone ( & state_mtx) ;
349- let general_settings = general_settings. cloned ( ) ;
350- let capture_target = inputs. capture_target . clone ( ) ;
351- async move {
352- fail ! ( "recording::spawn_actor" ) ;
353- let mut state = state_mtx. write ( ) . await ;
354-
355- let base_inputs = cap_recording:: RecordingBaseInputs {
356- capture_target,
357- capture_system_audio : inputs. capture_system_audio ,
358- mic_feed : & state. mic_feed ,
359- } ;
360-
361- let ( actor, actor_done_rx) = match inputs. mode {
362- RecordingMode :: Studio => {
363- let ( handle, actor_done_rx) = cap_recording:: spawn_studio_recording_actor (
364- id. clone ( ) ,
365- recording_dir. clone ( ) ,
366- base_inputs,
367- state. camera_feed . clone ( ) ,
368- general_settings
369- . map ( |s| s. custom_cursor_capture )
370- . unwrap_or_default ( ) ,
371- )
372- . await
373- . map_err ( |e| {
374- error ! ( "Failed to spawn studio recording actor: {e}" ) ;
375- e. to_string ( )
376- } ) ?;
377-
378- (
379- InProgressRecording :: Studio {
380- handle,
381- target_name,
382- inputs,
383- recording_dir : recording_dir. clone ( ) ,
384- } ,
385- actor_done_rx,
386- )
387- }
388- RecordingMode :: Instant => {
389- let Some ( video_upload_info) = video_upload_info. clone ( ) else {
390- return Err ( "Video upload info not found" . to_string ( ) ) ;
391- } ;
339+ if let Some ( window) = CapWindowId :: Main . get ( & app) {
340+ let _ = general_settings
341+ . map ( |v| v. main_window_recording_start_behaviour )
342+ . unwrap_or_default ( )
343+ . perform ( & window) ;
344+ }
392345
393- let ( handle, actor_done_rx) =
394- cap_recording:: instant_recording:: spawn_instant_recording_actor (
346+ // done in spawn to catch panics just in case
347+ let spawn_actor_res = async {
348+ spawn_actor ( {
349+ let state_mtx = Arc :: clone ( & state_mtx) ;
350+ let general_settings = general_settings. cloned ( ) ;
351+ let capture_target = inputs. capture_target . clone ( ) ;
352+ async move {
353+ fail ! ( "recording::spawn_actor" ) ;
354+ let mut state = state_mtx. write ( ) . await ;
355+
356+ let base_inputs = cap_recording:: RecordingBaseInputs {
357+ capture_target,
358+ capture_system_audio : inputs. capture_system_audio ,
359+ mic_feed : & state. mic_feed ,
360+ } ;
361+
362+ let ( actor, actor_done_rx) = match inputs. mode {
363+ RecordingMode :: Studio => {
364+ let ( handle, actor_done_rx) = cap_recording:: spawn_studio_recording_actor (
395365 id. clone ( ) ,
396366 recording_dir. clone ( ) ,
397367 base_inputs,
368+ state. camera_feed . clone ( ) ,
369+ general_settings
370+ . map ( |s| s. custom_cursor_capture )
371+ . unwrap_or_default ( ) ,
398372 )
399373 . await
400374 . map_err ( |e| {
401375 error ! ( "Failed to spawn studio recording actor: {e}" ) ;
402376 e. to_string ( )
403377 } ) ?;
404378
405- (
406- InProgressRecording :: Instant {
407- handle,
408- progressive_upload,
409- video_upload_info,
410- target_name,
411- inputs,
412- recording_dir : recording_dir. clone ( ) ,
413- } ,
414- actor_done_rx,
415- )
416- }
417- } ;
379+ (
380+ InProgressRecording :: Studio {
381+ handle,
382+ target_name,
383+ inputs,
384+ recording_dir : recording_dir. clone ( ) ,
385+ } ,
386+ actor_done_rx,
387+ )
388+ }
389+ RecordingMode :: Instant => {
390+ let Some ( video_upload_info) = video_upload_info. clone ( ) else {
391+ return Err ( "Video upload info not found" . to_string ( ) ) ;
392+ } ;
418393
419- state. set_current_recording ( actor) ;
394+ let ( handle, actor_done_rx) =
395+ cap_recording:: instant_recording:: spawn_instant_recording_actor (
396+ id. clone ( ) ,
397+ recording_dir. clone ( ) ,
398+ base_inputs,
399+ )
400+ . await
401+ . map_err ( |e| {
402+ error ! ( "Failed to spawn studio recording actor: {e}" ) ;
403+ e. to_string ( )
404+ } ) ?;
405+
406+ (
407+ InProgressRecording :: Instant {
408+ handle,
409+ progressive_upload,
410+ video_upload_info,
411+ target_name,
412+ inputs,
413+ recording_dir : recording_dir. clone ( ) ,
414+ } ,
415+ actor_done_rx,
416+ )
417+ }
418+ } ;
420419
421- Ok :: < _ , String > ( actor_done_rx)
420+ state. set_current_recording ( actor) ;
421+
422+ Ok :: < _ , String > ( actor_done_rx)
423+ }
424+ } )
425+ . await
426+ . map_err ( |e| format ! ( "Failed to spawn recording actor: {e}" ) ) ?
427+ }
428+ . await ;
429+
430+ let actor_done_rx = match spawn_actor_res {
431+ Ok ( rx) => rx,
432+ Err ( e) => {
433+ let _ = RecordingEvent :: Failed { error : e. clone ( ) } . emit ( & app) ;
434+
435+ let mut dialog = MessageDialogBuilder :: new (
436+ app. dialog ( ) . clone ( ) ,
437+ "An error occurred" . to_string ( ) ,
438+ e. clone ( ) ,
439+ )
440+ . kind ( tauri_plugin_dialog:: MessageDialogKind :: Error ) ;
441+
442+ if let Some ( window) = CapWindowId :: InProgressRecording . get ( & app) {
443+ dialog = dialog. parent ( & window) ;
444+ }
445+
446+ dialog. blocking_show ( ) ;
447+
448+ let mut state = state_mtx. write ( ) . await ;
449+ let _ = handle_recording_end ( app, None , & mut state) . await ;
450+
451+ return Err ( e) ;
422452 }
423- } )
424- . await
425- . map_err ( |e| format ! ( "Failed to spawn recording actor: {e}" ) ) ??;
453+ } ;
426454
427455 let _ = RecordingEvent :: Started . emit ( & app) ;
428456
0 commit comments