提交 2877f1d5 编写于 作者: J jp9000

libobs: Add func to enum active and inactive child tree

上级 c30d4f50
......@@ -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);
}
......
......@@ -400,6 +400,21 @@ struct obs_source_info {
bool (*audio_render)(void *data, uint64_t *ts_out,
struct obs_source_audio_mix *audio_output,
uint32_t mixers, size_t channels, size_t sample_rate);
/**
* Called to enumerate all active and inactive sources being used
* within this source. If this callback isn't implemented,
* enum_active_sources will be called instead.
*
* This is typically used if a source can have inactive child sources.
*
* @param data Filter data
* @param enum_callback Enumeration callback
* @param param User data to pass to callback
*/
void (*enum_all_sources)(void *data,
obs_source_enum_proc_t enum_callback,
void *param);
};
EXPORT void obs_register_source_s(const struct obs_source_info *info,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册