@@ -407,11 +407,35 @@ fn audio_task_run(
407407 rx : & mut tokio:: sync:: mpsc:: UnboundedReceiver < AudioEvent > ,
408408 fn_read : & mut dyn FnMut ( & mut [ i16 ] ) -> Result < usize , esp_idf_svc:: sys:: EspError > ,
409409 fn_write : & mut dyn FnMut ( & [ i16 ] ) -> Result < usize , esp_idf_svc:: sys:: EspError > ,
410- afe_handle : & AFE ,
410+ afe_handle : Arc < AFE > ,
411411) -> anyhow:: Result < ( ) > {
412+ let mut conf =
413+ esp_idf_svc:: hal:: task:: thread:: ThreadSpawnConfiguration :: get ( ) . unwrap_or_default ( ) ;
414+ conf. pin_to_core = Some ( esp_idf_svc:: hal:: cpu:: Core :: Core1 ) ;
415+ let r = conf. set ( ) ;
416+ if let Err ( e) = r {
417+ log:: error!( "Failed to set thread stack alloc caps: {:?}" , e) ;
418+ }
419+
420+ let ( chunk_tx, chunk_rx) = std:: sync:: mpsc:: sync_channel :: < Vec < i16 > > ( 64 ) ;
421+
412422 let feed_chunksize = afe_handle. feed_chunksize ;
413423 log:: info!( "feed_chunksize: {}" , feed_chunksize) ;
414424
425+ std:: thread:: Builder :: new ( )
426+ . name ( "afe_feed" . to_string ( ) )
427+ . stack_size ( 8 * 1024 )
428+ . spawn ( move || {
429+ log:: info!(
430+ "AFE feed thread started, on core {:?}" ,
431+ esp_idf_svc:: hal:: cpu:: core( )
432+ ) ;
433+ while let Ok ( chunk) = chunk_rx. recv ( ) {
434+ afe_handle. feed_i16 ( & chunk) ;
435+ }
436+ log:: warn!( "I2S AFE feed thread exited" ) ;
437+ } ) ?;
438+
415439 let mut read_buffer = vec ! [ 0i16 ; feed_chunksize] ;
416440 let mut send_buffer = SendBuffer :: new ( feed_chunksize) ;
417441 let empty_buffer = vec ! [ 0i16 ; feed_chunksize] ;
@@ -504,7 +528,7 @@ fn audio_task_run(
504528 }
505529 }
506530
507- afe_handle . feed_i16 ( & samples_with_ref) ;
531+ chunk_tx . send ( samples_with_ref) . unwrap ( ) ;
508532 }
509533 ref_data_ = play_data_;
510534 }
@@ -589,7 +613,7 @@ impl BoxAudioWorker {
589613 }
590614 } ) ?;
591615
592- audio_task_run ( & mut rx, & mut fn_read, & mut fn_write, & afe_handle)
616+ audio_task_run ( & mut rx, & mut fn_read, & mut fn_write, afe_handle)
593617 }
594618}
595619
@@ -681,7 +705,7 @@ impl BoardsAudioWorker {
681705 . stack_size ( 8 * 1024 )
682706 . spawn ( || afe_worker ( afe_handle_, tx, TRIGGER_MEAN_VALUE ) ) ?;
683707
684- audio_task_run ( & mut rx, & mut fn_read, & mut fn_write, & afe_handle)
708+ audio_task_run ( & mut rx, & mut fn_read, & mut fn_write, afe_handle)
685709 }
686710}
687711
0 commit comments