OBS二次开发 | 源码解读(二) | 添加来源

本文详细介绍了OBS28.1.0版本的源码,涉及清理场景来源、音频通道设置(包括场景过渡和音频输出输入)、降噪处理以及视频源的设置。通过函数声明与调用来解析实现过程,如清理场景时的函数使用,以及音频通道中对视频源、系统声音和麦克风的管理。
摘要由CSDN通过智能技术生成

!!!注意:不同版本的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(&params, "channel", channel);
	calldata_set_ptr(&params, "prev_source", prev_source);
	calldata_set_ptr(&params, "source", source);
	signal_handler_signal(obs->signals, "channel_change", &params);
	calldata_get_ptr(&params, "source", &source);
	calldata_free(&params);
	view->channels[channel] = source;
	pthread_mutex_unlock(&view->channels_mutex);
	if (source)
		obs_source_activate(source, MAIN_VIEW)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值