@@ -22,6 +22,7 @@ struct source_clone {
2222 uint32_t source_cy ;
2323 enum gs_color_space space ;
2424 bool rendering ;
25+ bool active_clone ;
2526};
2627
2728const char * source_clone_get_name (void * type_data )
@@ -91,11 +92,12 @@ static void source_clone_destroy(void *data)
9192 source_clone_audio_activate , data );
9293 signal_handler_disconnect (sh , "audio_deactivate" ,
9394 source_clone_audio_deactivate , data );
94-
9595 obs_source_remove_audio_capture_callback (
9696 source , source_clone_audio_callback , data );
9797 if (obs_source_showing (context -> source ))
9898 obs_source_dec_showing (source );
99+ if (context -> active_clone && obs_source_active (context -> source ))
100+ obs_source_dec_active (source );
99101 obs_source_release (source );
100102 }
101103 obs_weak_source_release (context -> clone );
@@ -117,6 +119,7 @@ void source_clone_update(void *data, obs_data_t *settings)
117119{
118120 struct source_clone * context = data ;
119121 bool audio_enabled = obs_data_get_bool (settings , "audio" );
122+ bool active_clone = obs_data_get_bool (settings , "active_clone" );
120123 const char * source_name = obs_data_get_string (settings , "clone" );
121124 obs_source_t * source = obs_get_source_by_name (source_name );
122125 if (source == context -> source ) {
@@ -126,7 +129,8 @@ void source_clone_update(void *data, obs_data_t *settings)
126129 if (source ) {
127130 if (!obs_weak_source_references_source (context -> clone ,
128131 source ) ||
129- context -> audio_enabled != audio_enabled ) {
132+ context -> audio_enabled != audio_enabled ||
133+ context -> active_clone != active_clone ) {
130134 obs_source_t * prev_source =
131135 obs_weak_source_get_source (context -> clone );
132136 if (prev_source ) {
@@ -144,6 +148,9 @@ void source_clone_update(void *data, obs_data_t *settings)
144148 source_clone_audio_callback , data );
145149 if (obs_source_showing (context -> source ))
146150 obs_source_dec_showing (prev_source );
151+ if (context -> active_clone &&
152+ obs_source_active (context -> source ))
153+ obs_source_dec_active (source );
147154 obs_source_release (prev_source );
148155 }
149156 obs_weak_source_release (context -> clone );
@@ -171,10 +178,13 @@ void source_clone_update(void *data, obs_data_t *settings)
171178 }
172179 if (obs_source_showing (context -> source ))
173180 obs_source_inc_showing (source );
181+ if (active_clone && obs_source_active (context -> source ))
182+ obs_source_inc_active (source );
174183 }
175184 obs_source_release (source );
176185 }
177186 context -> audio_enabled = audio_enabled ;
187+ context -> active_clone = active_clone ;
178188 context -> num_channels = audio_output_get_channels (obs_get_audio ());
179189 context -> buffer_frame =
180190 (uint8_t )obs_data_get_int (settings , "buffer_frame" );
@@ -228,6 +238,9 @@ obs_properties_t *source_clone_properties(void *data)
228238 obs_property_list_add_int (p , obs_module_text ("Third" ), 3 );
229239 obs_property_list_add_int (p , obs_module_text ("Quarter" ), 4 );
230240
241+ obs_properties_add_bool (props , "active_clone" ,
242+ obs_module_text ("ActiveClone" ));
243+
231244 obs_properties_add_text (
232245 props , "plugin_info" ,
233246 "<a href=\"https://obsproject.com/forum/resources/source-clone.1632/\">Source Clone</a> (" PROJECT_VERSION
@@ -453,6 +466,30 @@ void source_clone_hide(void *data)
453466 obs_source_release (source );
454467}
455468
469+ void source_clone_activate (void * data )
470+ {
471+ struct source_clone * context = data ;
472+ if (!context -> clone || !context -> active_clone )
473+ return ;
474+ obs_source_t * source = obs_weak_source_get_source (context -> clone );
475+ if (!source )
476+ return ;
477+ obs_source_inc_active (source );
478+ obs_source_release (source );
479+ }
480+
481+ void source_clone_deactivate (void * data )
482+ {
483+ struct source_clone * context = data ;
484+ if (!context -> clone || !context -> active_clone )
485+ return ;
486+ obs_source_t * source = obs_weak_source_get_source (context -> clone );
487+ if (!source )
488+ return ;
489+ obs_source_dec_active (source );
490+ obs_source_release (source );
491+ }
492+
456493void source_clone_save (void * data , obs_data_t * settings )
457494{
458495 struct source_clone * context = data ;
@@ -542,6 +579,8 @@ struct obs_source_info source_clone_info = {
542579 .video_tick = source_clone_video_tick ,
543580 .show = source_clone_show ,
544581 .hide = source_clone_hide ,
582+ .activate = source_clone_activate ,
583+ .deactivate = source_clone_deactivate ,
545584 .get_defaults = source_clone_defaults ,
546585 .get_properties = source_clone_properties ,
547586};
0 commit comments