@@ -5,10 +5,12 @@ use crate::audio::validator::{AudioValidator, AudioValidationResult};
55use crate :: commands:: license:: check_license_status_internal;
66use crate :: license:: LicenseState ;
77use crate :: utils:: logger:: * ;
8+ #[ cfg( debug_assertions) ]
9+ use crate :: utils:: system_monitor;
810use crate :: whisper:: cache:: TranscriberCache ;
911use crate :: whisper:: languages:: validate_language;
1012use crate :: whisper:: manager:: WhisperManager ;
11- use crate :: { emit_to_window, log_context , update_recording_state, AppState , RecordingState } ;
13+ use crate :: { emit_to_window, update_recording_state, AppState , RecordingState } ;
1214use cpal:: traits:: { DeviceTrait , HostTrait } ;
1315use serde_json;
1416use std:: sync:: Mutex ;
@@ -115,10 +117,11 @@ pub async fn start_recording(
115117) -> Result < ( ) , String > {
116118 let recording_start = Instant :: now ( ) ;
117119
118- log_operation_start ( "RECORDING_START" , & log_context ! {
119- "command" => "start_recording" ,
120- "timestamp" => & chrono:: Utc :: now( ) . to_rfc3339( )
121- } ) ;
120+ log_start ( "RECORDING_START" ) ;
121+ log_with_context ( log:: Level :: Debug , "Recording command started" , & [
122+ ( "command" , "start_recording" ) ,
123+ ( "timestamp" , & chrono:: Utc :: now ( ) . to_rfc3339 ( ) )
124+ ] ) ;
122125
123126 // Validate all requirements upfront
124127 let validation_start = Instant :: now ( ) ;
@@ -128,10 +131,11 @@ pub async fn start_recording(
128131 Some ( "validation_passed" ) ) ;
129132 }
130133 Err ( e) => {
131- log_operation_failed ( "RECORDING_START" , & e, & log_context ! {
132- "stage" => "validation" ,
133- "validation_time_ms" => & validation_start. elapsed( ) . as_millis( ) . to_string( )
134- } ) ;
134+ log_failed ( "RECORDING_START" , & e) ;
135+ log_with_context ( log:: Level :: Debug , "Validation failed" , & [
136+ ( "stage" , "validation" ) ,
137+ ( "validation_time_ms" , & validation_start. elapsed ( ) . as_millis ( ) . to_string ( ) . as_str ( ) )
138+ ] ) ;
135139 return Err ( e) ;
136140 }
137141 }
@@ -179,32 +183,31 @@ pub async fn start_recording(
179183 }
180184
181185 // Log the current audio device before starting
182- log_operation_start ( "AUDIO_DEVICE_CHECK" , & log_context ! {
183- "stage" => "pre_recording"
184- } ) ;
186+ log_start ( "AUDIO_DEVICE_CHECK" ) ;
187+ log_with_context ( log:: Level :: Debug , "Checking audio device" , & [
188+ ( "stage" , "pre_recording" )
189+ ] ) ;
185190
186191 if let Ok ( host) = std:: panic:: catch_unwind ( || cpal:: default_host ( ) ) {
187192 if let Some ( device) = host. default_input_device ( ) {
188193 if let Ok ( name) = device. name ( ) {
189194 log:: info!( "🎙️ Audio device available: {}" , name) ;
190- log_hardware_info ( " MICROPHONE", & log_context ! {
191- "device_name" => & name,
192- "status" => "available"
193- } ) ;
195+ log_with_context ( log :: Level :: Info , "🎮 MICROPHONE", & [
196+ ( "device_name" , & name) ,
197+ ( "status" , "available" )
198+ ] ) ;
194199 } else {
195200 log:: warn!( "⚠️ Could not get device name, but device is available" ) ;
196- log_hardware_info ( " MICROPHONE", & log_context ! {
197- "status" => "available_unnamed"
198- } ) ;
201+ log_with_context ( log :: Level :: Info , "🎮 MICROPHONE", & [
202+ ( "status" , "available_unnamed" )
203+ ] ) ;
199204 }
200205 } else {
201- log_error_with_context (
202- "No default input device found" ,
203- & log_context ! {
204- "component" => "audio_device" ,
205- "stage" => "device_detection"
206- }
207- ) ;
206+ log_failed ( "AUDIO_DEVICE" , "No default input device found" ) ;
207+ log_with_context ( log:: Level :: Debug , "Device detection failed" , & [
208+ ( "component" , "audio_device" ) ,
209+ ( "stage" , "device_detection" )
210+ ] ) ;
208211 }
209212 }
210213
@@ -220,13 +223,11 @@ pub async fn start_recording(
220223 Ok ( _) => {
221224 // Verify recording actually started
222225 if !recorder. is_recording ( ) {
223- log_error_with_context (
224- "Recording failed to start after initialization" ,
225- & log_context ! {
226- "audio_path" => audio_path_str,
227- "init_time_ms" => & recorder_init_start. elapsed( ) . as_millis( ) . to_string( )
228- }
229- ) ;
226+ log_failed ( "RECORDER_INIT" , "Recording failed to start after initialization" ) ;
227+ log_with_context ( log:: Level :: Debug , "Recorder initialization failed" , & [
228+ ( "audio_path" , audio_path_str) ,
229+ ( "init_time_ms" , & recorder_init_start. elapsed ( ) . as_millis ( ) . to_string ( ) . as_str ( ) )
230+ ] ) ;
230231
231232 update_recording_state (
232233 & app,
@@ -244,13 +245,18 @@ pub async fn start_recording(
244245 recorder_init_start. elapsed ( ) . as_millis ( ) as u64 ,
245246 Some ( & format ! ( "file={}" , audio_path_str) ) ) ;
246247 log:: info!( "✅ Recording started successfully" ) ;
248+
249+ // Monitor system resources at recording start
250+ #[ cfg( debug_assertions) ]
251+ system_monitor:: log_resources_before_operation ( "RECORDING_START" ) ;
247252 }
248253 }
249254 Err ( e) => {
250- log_operation_failed ( "RECORDER_START" , & e, & log_context ! {
251- "audio_path" => audio_path_str,
252- "init_time_ms" => & recorder_init_start. elapsed( ) . as_millis( ) . to_string( )
253- } ) ;
255+ log_failed ( "RECORDER_START" , & e) ;
256+ log_with_context ( log:: Level :: Debug , "Recorder start failed" , & [
257+ ( "audio_path" , audio_path_str) ,
258+ ( "init_time_ms" , & recorder_init_start. elapsed ( ) . as_millis ( ) . to_string ( ) . as_str ( ) )
259+ ] ) ;
254260
255261 update_recording_state ( & app, RecordingState :: Error , Some ( e. to_string ( ) ) ) ;
256262
@@ -343,13 +349,11 @@ pub async fn start_recording(
343349 let _ = emit_to_window ( & app, "pill" , "recording-started" , ( ) ) ;
344350
345351 // Log successful recording start
346- log_operation_complete ( "RECORDING_START" ,
347- recording_start. elapsed ( ) . as_millis ( ) as u64 ,
348- & log_context ! {
349- "audio_path" => & format!( "{:?}" , audio_path) ,
350- "state" => "recording"
351- }
352- ) ;
352+ log_complete ( "RECORDING_START" , recording_start. elapsed ( ) . as_millis ( ) as u64 ) ;
353+ log_with_context ( log:: Level :: Debug , "Recording started successfully" , & [
354+ ( "audio_path" , & format ! ( "{:?}" , audio_path) . as_str ( ) ) ,
355+ ( "state" , "recording" )
356+ ] ) ;
353357
354358 // Register global ESC key for cancellation
355359 let app_state = app. state :: < AppState > ( ) ;
@@ -391,12 +395,13 @@ pub async fn stop_recording(
391395 app : AppHandle ,
392396 state : State < ' _ , RecorderState > ,
393397) -> Result < String , String > {
394- let _stop_start = Instant :: now ( ) ;
398+ let stop_start = Instant :: now ( ) ;
395399
396- log_operation_start ( "RECORDING_STOP" , & log_context ! {
397- "command" => "stop_recording" ,
398- "timestamp" => & chrono:: Utc :: now( ) . to_rfc3339( )
399- } ) ;
400+ log_start ( "RECORDING_STOP" ) ;
401+ log_with_context ( log:: Level :: Debug , "Stop recording command" , & [
402+ ( "command" , "stop_recording" ) ,
403+ ( "timestamp" , & chrono:: Utc :: now ( ) . to_rfc3339 ( ) . as_str ( ) )
404+ ] ) ;
400405
401406 // Update state to stopping
402407 log_state_transition ( "RECORDING" , "recording" , "stopping" , true , None ) ;
@@ -426,6 +431,10 @@ pub async fn stop_recording(
426431 . stop_recording ( )
427432 . map_err ( |e| format ! ( "Failed to stop recording: {}" , e) ) ?;
428433 log:: info!( "{}" , stop_message) ;
434+
435+ // Monitor system resources after recording stop
436+ #[ cfg( debug_assertions) ]
437+ system_monitor:: log_resources_after_operation ( "RECORDING_STOP" , stop_start. elapsed ( ) . as_millis ( ) as u64 ) ;
429438
430439 // Emit event if recording was stopped due to silence
431440 if stop_message. contains ( "silence" ) {
@@ -518,19 +527,29 @@ pub async fn stop_recording(
518527
519528 // === AUDIO VALIDATION - Check quality before transcription ===
520529 let validation_start = Instant :: now ( ) ;
521- log_operation_start ( "AUDIO_VALIDATION" , & log_context ! {
522- "audio_path" => & format!( "{:?}" , audio_path) ,
523- "stage" => "pre_transcription"
524- } ) ;
530+ log_start ( "AUDIO_VALIDATION" ) ;
531+ log_with_context ( log:: Level :: Debug , "Validating audio" , & [
532+ ( "audio_path" , & format ! ( "{:?}" , audio_path) . as_str ( ) ) ,
533+ ( "stage" , "pre_transcription" )
534+ ] ) ;
525535
526536 let validator = AudioValidator :: new ( ) ;
527537
528538 match validator. validate_audio_file ( & audio_path) {
529539 Ok ( AudioValidationResult :: Valid { energy, duration, peak, .. } ) => {
530540 log_audio_metrics ( "VALIDATION_PASSED" , energy as f64 , peak as f64 , duration,
531- Some ( & log_context ! {
532- "validation_time_ms" => & validation_start. elapsed( ) . as_millis( ) . to_string( )
541+ Some ( & {
542+ let mut ctx = std:: collections:: HashMap :: new ( ) ;
543+ ctx. insert ( "validation_time_ms" . to_string ( ) , validation_start. elapsed ( ) . as_millis ( ) . to_string ( ) ) ;
544+ ctx
533545 } ) ) ;
546+ log_with_context ( log:: Level :: Info , "Audio validation passed" , & [
547+ ( "operation" , "AUDIO_VALIDATION" ) ,
548+ ( "result" , "valid" ) ,
549+ ( "energy" , & energy. to_string ( ) . as_str ( ) ) ,
550+ ( "duration" , & format ! ( "{:.2}" , duration) . as_str ( ) ) ,
551+ ( "peak" , & peak. to_string ( ) . as_str ( ) )
552+ ] ) ;
534553 // Continue with transcription
535554 }
536555 Ok ( AudioValidationResult :: Silent ) => {
@@ -729,9 +748,10 @@ pub async fn stop_recording(
729748 }
730749
731750 // Smart model selection with graceful degradation
732- log_operation_start ( "MODEL_SELECTION" , & log_context ! {
733- "available_count" => & downloaded_models. len( ) . to_string( )
734- } ) ;
751+ log_start ( "MODEL_SELECTION" ) ;
752+ log_with_context ( log:: Level :: Debug , "Selecting model" , & [
753+ ( "available_count" , & downloaded_models. len ( ) . to_string ( ) . as_str ( ) )
754+ ] ) ;
735755
736756 let configured_model = store
737757 . get ( "current_model" )
@@ -745,20 +765,23 @@ pub async fn stop_recording(
745765 configured_model
746766 } else if downloaded_models. is_empty ( ) {
747767 // This should never happen since we check earlier, but just in case
748- log_error_with_context ( "No models available for fallback" , & log_context ! {
749- "configured_model" => & configured_model,
750- "downloaded_count" => "0"
751- } ) ;
768+ log_failed ( "MODEL_SELECTION" , "No models available for fallback" ) ;
769+ log_with_context ( log:: Level :: Debug , "Model fallback failed" , & [
770+ ( "configured_model" , & configured_model) ,
771+ ( "downloaded_count" , "0" )
772+ ] ) ;
752773 return Err ( "No models available" . to_string ( ) ) ;
753774 } else {
754775 // Fallback to best available model
755776 let models_by_size = whisper_manager. read ( ) . await . get_models_by_size ( ) ;
756777 let fallback_model =
757778 select_best_fallback_model ( & downloaded_models, & configured_model, & models_by_size) ;
758779
759- log_model_operation ( "FALLBACK" , & fallback_model, "SELECTED" , Some ( & log_context ! {
760- "requested" => & configured_model,
761- "reason" => "configured_not_available"
780+ log_model_operation ( "FALLBACK" , & fallback_model, "SELECTED" , Some ( & {
781+ let mut ctx = std:: collections:: HashMap :: new ( ) ;
782+ ctx. insert ( "requested" . to_string ( ) , configured_model. clone ( ) ) ;
783+ ctx. insert ( "reason" . to_string ( ) , "configured_not_available" . to_string ( ) ) ;
784+ ctx
762785 } ) ) ;
763786
764787 // Notify user about fallback
@@ -780,9 +803,11 @@ pub async fn stop_recording(
780803 let models_by_size = whisper_manager. read ( ) . await . get_models_by_size ( ) ;
781804 let best_model = select_best_fallback_model ( & downloaded_models, "" , & models_by_size) ;
782805
783- log_model_operation ( "AUTO_SELECTION" , & best_model, "SELECTED" , Some ( & log_context ! {
784- "reason" => "no_model_configured" ,
785- "strategy" => "best_available"
806+ log_model_operation ( "AUTO_SELECTION" , & best_model, "SELECTED" , Some ( & {
807+ let mut ctx = std:: collections:: HashMap :: new ( ) ;
808+ ctx. insert ( "reason" . to_string ( ) , "no_model_configured" . to_string ( ) ) ;
809+ ctx. insert ( "strategy" . to_string ( ) , "best_available" . to_string ( ) ) ;
810+ ctx
786811 } ) ) ;
787812
788813 best_model
0 commit comments