添加来源 | 源码解读
!!!注意:不同版本的OBS源码,函数、参数等有细节性差别…
前期回顾:
OBS二次开发 | 构建、编译
OBS二次开发 | 源码解读(一) | 初始化流程
OBS28.1.0源码
一、清理场景下所有的来源
1.函数声明/定义
//所有引用的源应该被释放
EXPORT void obs_source_remove(obs_source_t *source);
void obs_source_remove(obs_source_t *source)
{
if (!obs_source_valid(source, "obs_source_remove"))
return;
if (!source->removed) {
obs_source_t *s = obs_source_get_ref(source);
if (s) {
s->removed = true;
obs_source_dosignal(s, "source_remove", "remove");
obs_source_release(s); //释放
}
}
}
2.函数调用
清理场景下所有的来源。
void clearScene()
{
auto cb = [](void *unused, obs_source_t *source) {
obs_source_remove(source);
UNUSED_PARAMETER(unused);
return true;
};
//枚举所有输入源。回调函数返回true以继续枚举,返回false以结束枚举。
//如果您希望在obs_enum_sources结束后保留引用,请使用obs_source_get_ref或obs_source_get_weak_source
obs_enum_sources(cb, nullptr);
}
二、清理音频通道
1.函数声明/定义
设置通道的主要输出源。
EXPORT void obs_set_output_source(uint32_t channel, obs_source_t *source);
void obs_set_output_source(uint32_t channel, obs_source_t *source)
{
//MAX_CHANNELS(64) 最大数量的源通道输出和每个显示。有6个默认的通道。
assert(channel < MAX_CHANNELS);
if (channel >= MAX_CHANNELS)
return;
struct obs_source *prev_source;
struct obs_view *view = &obs->data.main_view;
struct calldata params = {
0};
pthread_mutex_lock(&view->channels_mutex);
source = obs_source_get_ref(source);
prev_source = view->channels[channel];
calldata_set_int(¶ms, "channel", channel);
calldata_set_ptr(¶ms, "prev_source", prev_source);
calldata_set_ptr(¶ms, "source", source);
signal_handler_signal(obs->signals, "channel_change", ¶ms);
calldata_get_ptr(¶ms, "source", &source);
calldata_free(¶ms);
view->channels[channel] = source;
pthread_mutex_unlock(&view->channels_mutex);
if (source)
obs_source_activate(source, MAIN_VIEW)