bool AddNew(QWidget *parent, const char *id, const char *name) { obs_source_t source = obs_get_output_source(0); obs_scene_t scene = obs_scene_from_source(source); bool success = false; if (!source) return false; source = obs_get_source_by_name(name); if (source) { QMessageBox::information(parent, QTStr("NameExists.Title"), QTStr("NameExists.Text")); } else { source = obs_source_create(OBS_SOURCE_TYPE_INPUT, id, name, NULL); if (source) { obs_add_source(source); obs_scene_add(scene, source); success = true; } } obs_source_release(source); obs_scene_release(scene); return success; }
static void AddExisting(const char *name, bool visible, bool duplicate) { OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow()); OBSScene scene = main->GetCurrentScene(); if (!scene) return; obs_source_t *source = obs_get_source_by_name(name); if (source) { if (duplicate) { obs_source_t *from = source; char *new_name = get_new_source_name(name); source = obs_source_duplicate(from, new_name, false); bfree(new_name); obs_source_release(from); if (!source) return; } AddSourceData data; data.source = source; data.visible = visible; obs_enter_graphics(); obs_scene_atomic_update(scene, AddSource, &data); obs_leave_graphics(); obs_source_release(source); } }
OBSBasicSourceSelect::OBSBasicSourceSelect(OBSBasic *parent, const char *id_) : QDialog (parent), ui (new Ui::OBSBasicSourceSelect), id (id_) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); ui->setupUi(this); ui->sourceList->setAttribute(Qt::WA_MacShowFocusRect, false); QString placeHolderText{QT_UTF8(GetSourceDisplayName(id))}; QString text{placeHolderText}; int i = 2; obs_source_t *source = nullptr; while ((source = obs_get_source_by_name(QT_TO_UTF8(text)))) { obs_source_release(source); text = QString("%1 %2").arg(placeHolderText).arg(i++); } ui->sourceName->setText(text); ui->sourceName->setFocus(); //Fixes deselect of text. ui->sourceName->selectAll(); installEventFilter(CreateShortcutFilter()); if (strcmp(id_, "scene") == 0) { OBSBasic *main = reinterpret_cast<OBSBasic*>( App()->GetMainWindow()); OBSSource curSceneSource = main->GetCurrentSceneSource(); ui->selectExisting->setChecked(true); ui->createNew->setChecked(false); ui->createNew->setEnabled(false); ui->sourceName->setEnabled(false); int count = main->ui->scenes->count(); for (int i = 0; i < count; i++) { QListWidgetItem *item = main->ui->scenes->item(i); OBSScene scene = GetOBSRef<OBSScene>(item); OBSSource sceneSource = obs_scene_get_source(scene); if (curSceneSource == sceneSource) continue; const char *name = obs_source_get_name(sceneSource); ui->sourceList->addItem(QT_UTF8(name)); } } else if (strcmp(id_, "group") == 0) { obs_enum_sources(EnumGroups, this); } else { obs_enum_sources(EnumSources, this); } }
void OBSBasic::CurrentTabSceneChanged(int idx) { QString sceneName = ui->sceneTabBar->tabText(idx); obs_source_t * source = obs_get_source_by_name(QT_TO_UTF8(sceneName)); if ( source ) { SetCurrentScene(source); CurrentTabSceneUpdateControls(); obs_source_release(source); } }
static void AddExisting(const char *name) { obs_source_t source = obs_get_output_source(0); obs_scene_t scene = obs_scene_from_source(source); if (!scene) return; source = obs_get_source_by_name(name); if (source) { obs_scene_add(scene, source); obs_source_release(source); } obs_scene_release(scene); }
static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) { const char *name = obs_data_get_string(item_data, "name"); obs_source_t *source = obs_get_source_by_name(name); struct obs_scene_item *item; bool visible; if (!source) { blog(LOG_WARNING, "[scene_load_item] Source %s not found!", name); return; } item = obs_scene_add(scene, source); if (!item) { blog(LOG_WARNING, "[scene_load_item] Could not add source '%s' " "to scene '%s'!", name, obs_source_get_name(scene->source)); obs_source_release(source); return; } obs_data_set_default_int(item_data, "align", OBS_ALIGN_TOP | OBS_ALIGN_LEFT); item->rot = (float)obs_data_get_double(item_data, "rot"); item->align = (uint32_t)obs_data_get_int(item_data, "align"); visible = obs_data_get_bool(item_data, "visible"); obs_data_get_vec2(item_data, "pos", &item->pos); obs_data_get_vec2(item_data, "scale", &item->scale); set_visibility(item, visible); item->bounds_type = (enum obs_bounds_type)obs_data_get_int(item_data, "bounds_type"); item->bounds_align = (uint32_t)obs_data_get_int(item_data, "bounds_align"); obs_data_get_vec2(item_data, "bounds", &item->bounds); obs_source_release(source); update_item_transform(item); }
static char *get_new_source_name(const char *name) { struct dstr new_name = {0}; int inc = 0; dstr_copy(&new_name, name); for (;;) { obs_source_t *existing_source = obs_get_source_by_name( new_name.array); if (!existing_source) break; obs_source_release(existing_source); dstr_printf(&new_name, "%s %d", name, ++inc + 1); } return new_name.array; }
void obs_transition_load(obs_source_t *tr, obs_data_t *data) { const char *name = obs_data_get_string(data, "transition_source_a"); int64_t alignment = obs_data_get_int(data, "transition_alignment"); int64_t mode = obs_data_get_int(data, "transition_mode"); int64_t scale_type = obs_data_get_int(data, "transition_scale_type"); int64_t cx = obs_data_get_int(data, "transition_cx"); int64_t cy = obs_data_get_int(data, "transition_cy"); obs_source_t *source = NULL; if (name) { source = obs_get_source_by_name(name); if (source) { if (!obs_source_add_active_child(tr, source)) { blog(LOG_WARNING, "Cannot set transition '%s' " "to source '%s' due to " "infinite recursion", tr->context.name, name); obs_source_release(source); source = NULL; } } else { blog(LOG_WARNING, "Failed to find source '%s' for " "transition '%s'", name, tr->context.name); } } lock_transition(tr); tr->transition_sources[0] = source; tr->transition_source_active[0] = true; tr->transition_alignment = (uint32_t)alignment; tr->transition_mode = (enum obs_transition_mode)mode; tr->transition_scale_type = (enum obs_transition_scale_type)scale_type; tr->transition_cx = (uint32_t)cx; tr->transition_cy = (uint32_t)cy; unlock_transition(tr); recalculate_transition_size(tr); recalculate_transition_matrices(tr); }
void OBSBasic::RemoveSceneItemFromSource(const char* name) { std::string str_name = name; auto delayDelete = [=](){ obs_source_t * source = obs_get_source_by_name(str_name.c_str()); for (int i = 0; i < ui->sources->count(); i++) { QListWidgetItem *listItem = ui->sources->item(i); OBSSceneItem item = GetOBSRef<OBSSceneItem>(listItem); obs_source_t * item_source = obs_sceneitem_get_source(item); if (source == item_source) { DeleteListItem(ui->sources, listItem); obs_source_release(source); obs_sceneitem_remove(item); return; } } obs_source_release(source); }; base::GetUIMessageLoop()->PostTask(FROM_HERE, base::Lambda(delayDelete)); }
OBSBasicSourceSelect::OBSBasicSourceSelect(OBSBasic *parent, const char *id_) : QDialog (parent), ui (new Ui::OBSBasicSourceSelect), id (id_) { ui->setupUi(this); QString placeHolderText{QT_UTF8(obs_source_get_display_name( OBS_SOURCE_TYPE_INPUT, id))}; QString text{placeHolderText}; int i = 1; obs_source_t source = nullptr; while ((source = obs_get_source_by_name(QT_TO_UTF8(text)))) { obs_source_release(source); text = QString("%1 %2").arg(placeHolderText).arg(i++); } ui->sourceName->setText(text); ui->sourceName->setFocus(); //Fixes deselect of text. ui->sourceName->selectAll(); obs_enum_sources(EnumSources, this); }
bool AddNew(QWidget *parent, const char *id, const char *name, const bool visible, OBSSource &newSource) { OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow()); OBSScene scene = main->GetCurrentScene(); bool success = false; if (!scene) return false; obs_source_t *source = obs_get_source_by_name(name); if (source) { OBSMessageBox::information(parent, QTStr("NameExists.Title"), QTStr("NameExists.Text")); } else { source = obs_source_create(id, name, NULL, nullptr); if (source) { AddSourceData data; data.source = source; data.visible = visible; obs_enter_graphics(); obs_scene_atomic_update(scene, AddSource, &data); obs_leave_graphics(); newSource = source; success = true; } } obs_source_release(source); return success; }
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(); }
void BiLiOBSMainWid::mLoad(const char *file) { LoadScene(); LoadAudioDeviceConfig(); LoadFrontendHotkeys(); #if 0 if (!file || !os_file_exists(file)) { blog(LOG_INFO, "No scene file found, creating default scene"); mCreateDefaultScene(true); mSaveProject(); return; } mDisableSaving++; obs_data_t *data = obs_data_create_from_json_file_safe(file, "bak"); if (!data) { mDisableSaving--; blog(LOG_ERROR, "Failed to load '%s', creating default scene", file); mCreateDefaultScene(true); mSaveProject(); return; } mClearSceneData(); obs_data_array_t *sceneOrder = obs_data_get_array(data, "scene_order"); obs_data_array_t *sources = obs_data_get_array(data, "sources"); const char *sceneName = obs_data_get_string(data, "current_scene"); const char *curSceneCollection = config_get_string( App()->mGetGlobalConfig(), "Basic", "SceneCollection"); obs_data_set_default_string(data, "name", curSceneCollection); const char *name = obs_data_get_string(data, "name"); obs_source_t *curScene; if (!name || !*name) name = curSceneCollection; LoadAudioDevice(DESKTOP_AUDIO_1, 1, data); LoadAudioDevice(DESKTOP_AUDIO_2, 2, data); LoadAudioDevice(AUX_AUDIO_1, 3, data); LoadAudioDevice(AUX_AUDIO_2, 4, data); LoadAudioDevice(AUX_AUDIO_3, 5, data); obs_load_sources(sources); if (sceneOrder) mLoadSceneListOrder(sceneOrder); curScene = obs_get_source_by_name(sceneName); obs_set_output_source(0, curScene); obs_source_release(curScene); obs_data_array_release(sources); obs_data_array_release(sceneOrder); std::string file_base = strrchr(file, '/') + 1; file_base.erase(file_base.size() - 5, 5); config_set_string(App()->mGetGlobalConfig(), "Basic", "SceneCollection", name); config_set_string(App()->mGetGlobalConfig(), "Basic", "SceneCollectionFile", file_base.c_str()); obs_data_release(data); mCleanupUnusedSources(); mDisableSaving--; #endif }
static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) { const char *name = obs_data_get_string(item_data, "name"); obs_source_t *source = obs_get_source_by_name(name); const char *scale_filter_str; struct obs_scene_item *item; bool visible; if (!source) { blog(LOG_WARNING, "[scene_load_item] Source %s not found!", name); return; } item = obs_scene_add(scene, source); if (!item) { blog(LOG_WARNING, "[scene_load_item] Could not add source '%s' " "to scene '%s'!", name, obs_source_get_name(scene->source)); obs_source_release(source); return; } obs_data_set_default_int(item_data, "align", OBS_ALIGN_TOP | OBS_ALIGN_LEFT); item->rot = (float)obs_data_get_double(item_data, "rot"); item->align = (uint32_t)obs_data_get_int(item_data, "align"); visible = obs_data_get_bool(item_data, "visible"); obs_data_get_vec2(item_data, "pos", &item->pos); obs_data_get_vec2(item_data, "scale", &item->scale); set_visibility(item, visible); item->bounds_type = (enum obs_bounds_type)obs_data_get_int(item_data, "bounds_type"); item->bounds_align = (uint32_t)obs_data_get_int(item_data, "bounds_align"); obs_data_get_vec2(item_data, "bounds", &item->bounds); item->crop.left = (uint32_t)obs_data_get_int(item_data, "crop_left"); item->crop.top = (uint32_t)obs_data_get_int(item_data, "crop_top"); item->crop.right = (uint32_t)obs_data_get_int(item_data, "crop_right"); item->crop.bottom = (uint32_t)obs_data_get_int(item_data, "crop_bottom"); scale_filter_str = obs_data_get_string(item_data, "scale_filter"); item->scale_filter = OBS_SCALE_DISABLE; if (scale_filter_str) { if (astrcmpi(scale_filter_str, "point") == 0) item->scale_filter = OBS_SCALE_POINT; else if (astrcmpi(scale_filter_str, "bilinear") == 0) item->scale_filter = OBS_SCALE_BILINEAR; else if (astrcmpi(scale_filter_str, "bicubic") == 0) item->scale_filter = OBS_SCALE_BICUBIC; else if (astrcmpi(scale_filter_str, "lanczos") == 0) item->scale_filter = OBS_SCALE_LANCZOS; } if (item->item_render && !item_texture_enabled(item)) { obs_enter_graphics(); gs_texrender_destroy(item->item_render); item->item_render = NULL; obs_leave_graphics(); } else if (!item->item_render && item_texture_enabled(item)) { obs_enter_graphics(); item->item_render = gs_texrender_create(GS_RGBA, GS_ZS_NONE); obs_leave_graphics(); } obs_source_release(source); update_item_transform(item); }