|
@@ -2968,19 +2968,19 @@ struct source_enum_data {
|
|
|
void *param;
|
|
|
};
|
|
|
|
|
|
-static void enum_source_tree_callback(obs_source_t *parent, obs_source_t *child,
|
|
|
- void *param)
|
|
|
+static void enum_source_active_tree_callback(obs_source_t *parent,
|
|
|
+ obs_source_t *child, void *param)
|
|
|
{
|
|
|
struct source_enum_data *data = param;
|
|
|
bool is_transition = child->info.type == OBS_SOURCE_TYPE_TRANSITION;
|
|
|
|
|
|
if (is_transition)
|
|
|
obs_transition_enum_sources(child,
|
|
|
- enum_source_tree_callback, param);
|
|
|
+ enum_source_active_tree_callback, param);
|
|
|
if (child->info.enum_active_sources) {
|
|
|
if (child->context.data) {
|
|
|
child->info.enum_active_sources(child->context.data,
|
|
|
- enum_source_tree_callback, data);
|
|
|
+ enum_source_active_tree_callback, data);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3027,11 +3027,67 @@ void obs_source_enum_active_tree(obs_source_t *source,
|
|
|
obs_source_addref(source);
|
|
|
|
|
|
if (source->info.type == OBS_SOURCE_TYPE_TRANSITION)
|
|
|
- obs_transition_enum_sources(source, enum_source_tree_callback,
|
|
|
- &data);
|
|
|
+ obs_transition_enum_sources(source,
|
|
|
+ enum_source_active_tree_callback, &data);
|
|
|
if (source->info.enum_active_sources)
|
|
|
source->info.enum_active_sources(source->context.data,
|
|
|
- enum_source_tree_callback, &data);
|
|
|
+ enum_source_active_tree_callback, &data);
|
|
|
+
|
|
|
+ obs_source_release(source);
|
|
|
+}
|
|
|
+
|
|
|
+static void enum_source_full_tree_callback(obs_source_t *parent,
|
|
|
+ obs_source_t *child, void *param)
|
|
|
+{
|
|
|
+ struct source_enum_data *data = param;
|
|
|
+ bool is_transition = child->info.type == OBS_SOURCE_TYPE_TRANSITION;
|
|
|
+
|
|
|
+ if (is_transition)
|
|
|
+ obs_transition_enum_sources(child,
|
|
|
+ enum_source_full_tree_callback, param);
|
|
|
+ if (child->info.enum_all_sources) {
|
|
|
+ if (child->context.data) {
|
|
|
+ child->info.enum_active_sources(child->context.data,
|
|
|
+ enum_source_full_tree_callback, data);
|
|
|
+ }
|
|
|
+ } else if (child->info.enum_active_sources) {
|
|
|
+ if (child->context.data) {
|
|
|
+ child->info.enum_active_sources(child->context.data,
|
|
|
+ enum_source_full_tree_callback, data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ data->enum_callback(parent, child, data->param);
|
|
|
+}
|
|
|
+
|
|
|
+static void obs_source_enum_full_tree(obs_source_t *source,
|
|
|
+ obs_source_enum_proc_t enum_callback,
|
|
|
+ void *param)
|
|
|
+{
|
|
|
+ struct source_enum_data data = {enum_callback, param};
|
|
|
+ bool is_transition;
|
|
|
+
|
|
|
+ if (!data_valid(source, "obs_source_enum_active_tree"))
|
|
|
+ return;
|
|
|
+
|
|
|
+ is_transition = source->info.type == OBS_SOURCE_TYPE_TRANSITION;
|
|
|
+ if (!is_transition && !source->info.enum_active_sources)
|
|
|
+ return;
|
|
|
+
|
|
|
+ obs_source_addref(source);
|
|
|
+
|
|
|
+ if (source->info.type == OBS_SOURCE_TYPE_TRANSITION)
|
|
|
+ obs_transition_enum_sources(source,
|
|
|
+ enum_source_full_tree_callback, &data);
|
|
|
+
|
|
|
+ if (source->info.enum_all_sources) {
|
|
|
+ source->info.enum_all_sources(source->context.data,
|
|
|
+ enum_source_full_tree_callback, &data);
|
|
|
+
|
|
|
+ } else if (source->info.enum_active_sources) {
|
|
|
+ source->info.enum_active_sources(source->context.data,
|
|
|
+ enum_source_full_tree_callback, &data);
|
|
|
+ }
|
|
|
|
|
|
obs_source_release(source);
|
|
|
}
|