@@ -10,16 +10,22 @@ const char *source_clone_get_name(void *type_data)
1010 return obs_module_text ("SourceClone" );
1111}
1212
13- static void * source_clone_create ( obs_data_t * settings , obs_source_t * source )
13+ void source_clone_audio_activate ( void * data , calldata_t * calldata )
1414{
15- UNUSED_PARAMETER (settings );
16- struct source_clone * context = bzalloc (sizeof (struct source_clone ));
17- context -> source = source ;
18- pthread_mutex_init (& context -> audio_mutex , NULL );
19- context -> cx = 1 ;
20- context -> cy = 1 ;
21- obs_source_update (source , NULL );
22- return context ;
15+ struct source_clone * context = data ;
16+ obs_source_t * source = calldata_ptr (calldata , "source" );
17+ if (context -> audio_enabled && context -> clone && obs_weak_source_references_source (context -> clone , source )) {
18+ obs_source_set_audio_active (context -> source , true);
19+ }
20+ }
21+
22+ void source_clone_audio_deactivate (void * data , calldata_t * calldata )
23+ {
24+ struct source_clone * context = data ;
25+ obs_source_t * source = calldata_ptr (calldata , "source" );
26+ if (context -> clone && obs_weak_source_references_source (context -> clone , source )) {
27+ obs_source_set_audio_active (context -> source , false);
28+ }
2329}
2430
2531void source_clone_audio_callback (void * data , obs_source_t * source , const struct audio_data * audio_data , bool muted )
@@ -37,22 +43,43 @@ void source_clone_audio_callback(void *data, obs_source_t *source, const struct
3743 pthread_mutex_unlock (& context -> audio_mutex );
3844}
3945
40- void source_clone_audio_activate (void * data , calldata_t * calldata )
41- {
46+ static void source_clone_remove (void * data , calldata_t * cd ) {
47+ UNUSED_PARAMETER ( cd );
4248 struct source_clone * context = data ;
43- obs_source_t * source = calldata_ptr ( calldata , "source" );
44- if (context -> audio_enabled && context -> clone && obs_weak_source_references_source ( context -> clone , source )) {
45- obs_source_set_audio_active ( context -> source , true) ;
49+ if ( context -> audio_wrapper ) {
50+ audio_wrapper_remove (context -> audio_wrapper , context );
51+ context -> audio_wrapper = NULL ;
4652 }
53+ obs_source_t * source = obs_weak_source_get_source (context -> clone );
54+ if (source ) {
55+ signal_handler_t * sh = obs_source_get_signal_handler (source );
56+ signal_handler_disconnect (sh , "audio_activate" , source_clone_audio_activate , data );
57+ signal_handler_disconnect (sh , "audio_deactivate" , source_clone_audio_deactivate , data );
58+ obs_source_remove_audio_capture_callback (source , source_clone_audio_callback , data );
59+ if (obs_source_showing (context -> source ))
60+ obs_source_dec_showing (source );
61+ if (context -> active_clone && obs_source_active (context -> source ))
62+ obs_source_dec_active (source );
63+ obs_source_release (source );
64+ }
65+ obs_weak_source_release (context -> clone );
66+ context -> clone = NULL ;
67+ obs_weak_source_release (context -> current_scene );
68+ context -> current_scene = NULL ;
4769}
4870
49- void source_clone_audio_deactivate ( void * data , calldata_t * calldata )
71+ static void * source_clone_create ( obs_data_t * settings , obs_source_t * source )
5072{
51- struct source_clone * context = data ;
52- obs_source_t * source = calldata_ptr (calldata , "source" );
53- if (context -> clone && obs_weak_source_references_source (context -> clone , source )) {
54- obs_source_set_audio_active (context -> source , false);
55- }
73+ UNUSED_PARAMETER (settings );
74+ struct source_clone * context = bzalloc (sizeof (struct source_clone ));
75+ context -> source = source ;
76+ pthread_mutex_init (& context -> audio_mutex , NULL );
77+ context -> cx = 1 ;
78+ context -> cy = 1 ;
79+ obs_source_update (source , NULL );
80+ signal_handler_t * sh = obs_source_get_signal_handler (source );
81+ signal_handler_connect (sh , "remove" , source_clone_remove , context );
82+ return context ;
5683}
5784
5885static void source_clone_destroy (void * data )
0 commit comments