1- #include "source-clone.h"
2- #include "audio-wrapper.h"
31#include <obs-module.h>
42#include <obs-frontend-api.h>
3+ #include "util/dstr.h"
4+ #include "source-clone.h"
5+ #include "audio-wrapper.h"
56
67const char * source_clone_get_name (void * type_data )
78{
@@ -216,20 +217,68 @@ bool source_clone_list_add_source(void *data, obs_source_t *source)
216217 return true;
217218}
218219
219- bool source_clone_type_changed (void * priv , obs_properties_t * props ,
220- obs_property_t * property , obs_data_t * settings )
220+ struct same_clones {
221+ obs_data_t * settings ;
222+ DARRAY (const char * ) clones ;
223+ };
224+
225+ bool find_clones (void * data , obs_source_t * source )
221226{
222- UNUSED_PARAMETER (priv );
223- UNUSED_PARAMETER (property );
224- obs_property_t * clone = obs_properties_get (props , "clone" );
225- obs_property_set_visible (clone ,
226- obs_data_get_int (settings , "clone_type" ) ==
227- CLONE_SOURCE );
227+ if (strcmp (obs_source_get_unversioned_id (source ), "source-clone" ) !=
228+ 0 ) {
229+
230+ return true;
231+ }
232+ obs_data_t * settings = obs_source_get_settings (source );
233+ if (!settings )
234+ return true;
235+ struct same_clones * sc = data ;
236+ if (settings == sc -> settings ) {
237+ obs_data_release (settings );
238+ return true;
239+ }
240+ if (obs_data_get_int (sc -> settings , "clone_type" ) == CLONE_SOURCE ) {
241+ if (obs_data_get_int (settings , "clone_type" ) == CLONE_SOURCE &&
242+ strcmp (obs_data_get_string (sc -> settings , "clone" ),
243+ obs_data_get_string (settings , "clone" )) == 0 ) {
244+ const char * name = obs_source_get_name (source );
245+ da_push_back (sc -> clones , & name );
246+ }
247+ } else if (obs_data_get_int (sc -> settings , "clone_type" ) ==
248+ obs_data_get_int (settings , "clone_type" )) {
249+ const char * name = obs_source_get_name (source );
250+ da_push_back (sc -> clones , & name );
251+ }
252+ obs_data_release (settings );
228253 return true;
229254}
230255
256+ void find_same_clones (obs_properties_t * props , obs_data_t * settings )
257+ {
258+ struct same_clones sc ;
259+ sc .settings = settings ;
260+ da_init (sc .clones );
261+ obs_enum_sources (find_clones , & sc );
262+ obs_property_t * prop = obs_properties_get (props , "same_clones" );
263+ if (sc .clones .num ) {
264+ struct dstr names ;
265+ dstr_init_copy (& names , sc .clones .array [0 ]);
266+ for (size_t i = 1 ; i < sc .clones .num ; i ++ ) {
267+ dstr_cat (& names , "\n" );
268+ dstr_cat (& names , sc .clones .array [i ]);
269+ }
270+ obs_data_set_string (settings , "same_clones" , names .array );
271+ dstr_free (& names );
272+ obs_property_set_visible (prop , true);
273+ } else {
274+ obs_data_unset_user_value (settings , "same_clones" );
275+ obs_property_set_visible (prop , false);
276+ }
277+ da_free (sc .clones );
278+ }
279+
231280bool source_clone_source_changed (void * priv , obs_properties_t * props ,
232- obs_property_t * property , obs_data_t * settings )
281+ obs_property_t * property , obs_data_t * settings )
233282{
234283 UNUSED_PARAMETER (property );
235284 struct source_clone * context = priv ;
@@ -248,6 +297,25 @@ bool source_clone_source_changed(void *priv, obs_properties_t *props,
248297
249298 obs_property_t * no_filters = obs_properties_get (props , "no_filters" );
250299 obs_property_set_visible (no_filters , !async );
300+
301+ find_same_clones (props , settings );
302+ return true;
303+ }
304+
305+ bool source_clone_type_changed (void * priv , obs_properties_t * props ,
306+ obs_property_t * property , obs_data_t * settings )
307+ {
308+ UNUSED_PARAMETER (priv );
309+ UNUSED_PARAMETER (property );
310+ obs_property_t * clone = obs_properties_get (props , "clone" );
311+ const bool clone_source = obs_data_get_int (settings , "clone_type" ) ==
312+ CLONE_SOURCE ;
313+ obs_property_set_visible (clone , clone_source );
314+ if (clone_source ) {
315+ source_clone_source_changed (priv , props , NULL , settings );
316+ } else {
317+ find_same_clones (props , settings );
318+ }
251319 return true;
252320}
253321
@@ -279,7 +347,9 @@ obs_properties_t *source_clone_properties(void *data)
279347 source_clone_list_add_source (p , s );
280348 obs_source_release (s );
281349 }
282- obs_property_set_modified_callback2 (p , source_clone_source_changed , data );
350+ obs_property_set_modified_callback2 (p , source_clone_source_changed ,
351+ data );
352+
283353 obs_properties_add_bool (props , "audio" , obs_module_text ("Audio" ));
284354 p = obs_properties_add_list (props , "buffer_frame" ,
285355 obs_module_text ("VideoBuffer" ),
@@ -296,6 +366,11 @@ obs_properties_t *source_clone_properties(void *data)
296366 obs_properties_add_bool (props , "no_filters" ,
297367 obs_module_text ("NoFilters" ));
298368
369+ p = obs_properties_add_text (props , "same_clones" ,
370+ obs_module_text ("SameClones" ),
371+ OBS_TEXT_INFO );
372+ obs_property_set_visible (p , false);
373+
299374 obs_properties_add_text (
300375 props , "plugin_info" ,
301376 "<a href=\"https://obsproject.com/forum/resources/source-clone.1632/\">Source Clone</a> (" PROJECT_VERSION
0 commit comments