void OBSBasicSourceSelect::SourceAdded(OBSSource source)
{
	const char *name     = obs_source_get_name(source);
	const char *sourceId = obs_source_get_id(source);

	if (strcmp(sourceId, id) != 0)
		return;

	ui->sourceList->addItem(name);
}
bool OBSBasicSourceSelect::EnumSources(void *data, obs_source_t source)
{
	OBSBasicSourceSelect *window = static_cast<OBSBasicSourceSelect*>(data);
	const char *name = obs_source_get_name(source);
	const char *id   = obs_source_get_id(source);

	if (strcmp(id, window->id) == 0)
		window->ui->sourceList->addItem(QT_UTF8(name));

	return true;
}
void OBSBasicSourceSelect::SourceRemoved(OBSSource source)
{
	const char *name     = obs_source_get_name(source);
	const char *sourceId = obs_source_get_id(source);

	if (strcmp(sourceId, id) != 0)
		return;

	QList<QListWidgetItem*> items =
		ui->sourceList->findItems(name, Qt::MatchFixedString);

	if (!items.count())
		return;

	delete items[0];
}
obs_data_array_t *BiLiOBSMainWid::mSaveSceneListOrder() {

	obs_data_array_t *sceneOrder = obs_data_array_create();

#if 1
	obs_source_t* currentScene = obs_get_output_source(0);
	std::list<std::string> tmpSceneOrder;

	//获取所有场景
	for (OBSSource& src : OBSEnumSources())
	{
		if (strcmp(obs_source_get_id(src), "scene") == 0)
			tmpSceneOrder.push_back(obs_source_get_name(src));
	}

	//当前场景放在第一个
	if (currentScene)
	{
		std::string currentSceneName = obs_source_get_name(currentScene);
		auto x = std::find(tmpSceneOrder.begin(), tmpSceneOrder.end(), currentSceneName);
		assert(x != tmpSceneOrder.end());
		tmpSceneOrder.erase(x);
		tmpSceneOrder.push_front(obs_source_get_name(currentScene));
	}

	//保存场景顺序
	for (auto& x : tmpSceneOrder) {
		obs_data_t *data = obs_data_create();
		obs_data_set_string(data, "name", x.c_str());
		obs_data_array_push_back(sceneOrder, data);
		obs_data_release(data);
	}

	obs_source_release(currentScene);
#else
	for (int i = 0; i < ui->scenes->count(); i++) {
		obs_data_t *data = obs_data_create();
		obs_data_set_string(data, "name",
				QT_TO_UTF8(ui->scenes->item(i)->text()));
		obs_data_array_push_back(sceneOrder, data);
		obs_data_release(data);
	}
#endif

	return sceneOrder;
}
bool OBSBasicSourceSelect::EnumGroups(void *data, obs_source_t *source)
{
	OBSBasicSourceSelect *window = static_cast<OBSBasicSourceSelect*>(data);
	const char *name = obs_source_get_name(source);
	const char *id   = obs_source_get_id(source);

	if (strcmp(id, window->id) == 0) {
		OBSBasic *main = reinterpret_cast<OBSBasic*>(
				App()->GetMainWindow());
		OBSScene scene = main->GetCurrentScene();

		obs_sceneitem_t *existing = obs_scene_get_group(scene, name);
		if (!existing)
			window->ui->sourceList->addItem(QT_UTF8(name));
	}

	return true;
}
Exemple #6
0
obs_data_t *obs_save_source(obs_source_t *source)
{
	obs_data_t *source_data = obs_data_create();
	obs_data_t *settings    = obs_source_get_settings(source);
	float      volume      = obs_source_get_volume(source);
	const char *name       = obs_source_get_name(source);
	const char *id         = obs_source_get_id(source);

	obs_source_save(source);

	obs_data_set_string(source_data, "name",     name);
	obs_data_set_string(source_data, "id",       id);
	obs_data_set_obj   (source_data, "settings", settings);
	obs_data_set_double(source_data, "volume",   volume);

	obs_data_release(settings);

	return source_data;
}
void BiLiOBSMainWid::LoadScene()
{
	obs_data_t* sceneData = BiliConfigFile::LoadSceneData();
	if (sceneData)
	{
		BiliSceneConfig::Set(sceneData);
		obs_data_release(sceneData);
	}

	//如果加载进来的场景不够3个,就补到三个
	std::string firstAddedScene;
	int sceneCount = 0;
	for (OBSSource& src : OBSEnumSources())
	{
		if (strcmp(obs_source_get_id(src), "scene") == 0)
		{
			++sceneCount;
		}
	}

	int nextSceneIndex = 1;
	for (; sceneCount < 3; ++sceneCount)
	{
	restartByNewName:
		std::string sceneName = tr("Scene %1").arg(nextSceneIndex).toUtf8().data();

		obs_source_t* existedSource = obs_get_source_by_name(sceneName.c_str());
		if (existedSource != 0)
		{
			obs_source_release(existedSource);
			++nextSceneIndex;
			goto restartByNewName;
		}

		if (firstAddedScene.empty())
		{
			firstAddedScene = sceneName;
		}

		obs_scene_t* scene = obs_scene_create(sceneName.c_str());
		obs_source_t* sceneSource = obs_scene_get_source(scene);
		obs_add_source(sceneSource);
		obs_scene_release(scene);
	}

	obs_source_t* currentOutputSource = obs_get_output_source(0);
	if (!currentOutputSource)
	{
		if (!firstAddedScene.empty())
		{
			currentOutputSource = obs_get_source_by_name(firstAddedScene.c_str());
			if (currentOutputSource)
			{
				obs_set_output_source(0, currentOutputSource);
				obs_source_release(currentOutputSource);
			}
		}
	}
	else
	{
		obs_source_release(currentOutputSource);
	}

	//更新列表控件
	sceneListWidgetOperator->NotifyCurrentSceneChanged();
}