1
- #include "source-clone.h"
2
- #include "audio-wrapper.h"
3
1
#include <obs-module.h>
4
2
#include <obs-frontend-api.h>
3
+ #include "util/dstr.h"
4
+ #include "source-clone.h"
5
+ #include "audio-wrapper.h"
5
6
6
7
const char * source_clone_get_name (void * type_data )
7
8
{
@@ -216,20 +217,68 @@ bool source_clone_list_add_source(void *data, obs_source_t *source)
216
217
return true;
217
218
}
218
219
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 )
221
226
{
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 );
228
253
return true;
229
254
}
230
255
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
+
231
280
bool 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 )
233
282
{
234
283
UNUSED_PARAMETER (property );
235
284
struct source_clone * context = priv ;
@@ -248,6 +297,25 @@ bool source_clone_source_changed(void *priv, obs_properties_t *props,
248
297
249
298
obs_property_t * no_filters = obs_properties_get (props , "no_filters" );
250
299
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
+ }
251
319
return true;
252
320
}
253
321
@@ -279,7 +347,9 @@ obs_properties_t *source_clone_properties(void *data)
279
347
source_clone_list_add_source (p , s );
280
348
obs_source_release (s );
281
349
}
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
+
283
353
obs_properties_add_bool (props , "audio" , obs_module_text ("Audio" ));
284
354
p = obs_properties_add_list (props , "buffer_frame" ,
285
355
obs_module_text ("VideoBuffer" ),
@@ -296,6 +366,11 @@ obs_properties_t *source_clone_properties(void *data)
296
366
obs_properties_add_bool (props , "no_filters" ,
297
367
obs_module_text ("NoFilters" ));
298
368
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
+
299
374
obs_properties_add_text (
300
375
props , "plugin_info" ,
301
376
"<a href=\"https://obsproject.com/forum/resources/source-clone.1632/\">Source Clone</a> (" PROJECT_VERSION
0 commit comments