@@ -32,7 +32,7 @@ pub(crate) struct RenderThread {
3232 buffer_offset : Option < ( usize , AudioRenderQuantum ) > ,
3333 load_value_sender : Option < Sender < AudioRenderCapacityLoad > > ,
3434 event_sender : Option < Sender < EventDispatch > > ,
35- garbage_collector : llq:: Producer < Box < dyn Any + Send > > ,
35+ garbage_collector : Option < llq:: Producer < Box < dyn Any + Send > > > ,
3636}
3737
3838// SAFETY:
@@ -52,21 +52,34 @@ impl RenderThread {
5252 number_of_channels : usize ,
5353 receiver : Receiver < ControlMessage > ,
5454 frames_played : Arc < AtomicU64 > ,
55- load_value_sender : Option < Sender < AudioRenderCapacityLoad > > ,
56- event_sender : Option < Sender < EventDispatch > > ,
5755 ) -> Self {
58- let ( gc_producer, gc_consumer) = llq:: Queue :: new ( ) . split ( ) ;
59- spawn_garbage_collector_thread ( gc_consumer) ;
6056 Self {
6157 graph : None ,
6258 sample_rate,
6359 number_of_channels,
6460 frames_played,
6561 receiver : Some ( receiver) ,
6662 buffer_offset : None ,
67- load_value_sender,
68- event_sender,
69- garbage_collector : gc_producer,
63+ load_value_sender : None ,
64+ event_sender : None ,
65+ garbage_collector : None ,
66+ }
67+ }
68+
69+ pub ( crate ) fn set_event_channels (
70+ & mut self ,
71+ load_value_sender : Sender < AudioRenderCapacityLoad > ,
72+ event_sender : Sender < EventDispatch > ,
73+ ) {
74+ self . load_value_sender = Some ( load_value_sender) ;
75+ self . event_sender = Some ( event_sender) ;
76+ }
77+
78+ pub ( crate ) fn spawn_garbage_collector_thread ( & mut self ) {
79+ if self . garbage_collector . is_none ( ) {
80+ let ( gc_producer, gc_consumer) = llq:: Queue :: new ( ) . split ( ) ;
81+ spawn_garbage_collector_thread ( gc_consumer) ;
82+ self . garbage_collector = Some ( gc_producer) ;
7083 }
7184 }
7285
@@ -129,7 +142,9 @@ impl RenderThread {
129142 }
130143 NodeMessage { id, mut msg } => {
131144 self . graph . as_mut ( ) . unwrap ( ) . route_message ( id, msg. as_mut ( ) ) ;
132- self . garbage_collector . push ( msg) ;
145+ if let Some ( gc) = self . garbage_collector . as_mut ( ) {
146+ gc. push ( msg)
147+ }
133148 }
134149 }
135150 }
@@ -312,8 +327,9 @@ impl RenderThread {
312327
313328impl Drop for RenderThread {
314329 fn drop ( & mut self ) {
315- self . garbage_collector
316- . push ( llq:: Node :: new ( Box :: new ( TerminateGarbageCollectorThread ) ) ) ;
330+ if let Some ( gc) = self . garbage_collector . as_mut ( ) {
331+ gc. push ( llq:: Node :: new ( Box :: new ( TerminateGarbageCollectorThread ) ) )
332+ }
317333 log:: info!( "Audio render thread has been dropped" ) ;
318334 }
319335}
0 commit comments