New upstream version 21.0.2+dfsg1
This commit is contained in:
parent
1f1bbb3518
commit
baafb6325b
706 changed files with 49633 additions and 5044 deletions
|
|
@ -110,7 +110,7 @@ void OBSBasic::TriggerQuickTransition(int id)
|
|||
if (GetCurrentTransition() != qt->source)
|
||||
SetTransition(qt->source);
|
||||
|
||||
TransitionToScene(source);
|
||||
TransitionToScene(source, false, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -127,9 +127,17 @@ void OBSBasic::InitTransition(obs_source_t *transition)
|
|||
Qt::QueuedConnection);
|
||||
};
|
||||
|
||||
auto onTransitionFullStop = [] (void *data, calldata_t*) {
|
||||
OBSBasic *window = (OBSBasic*)data;
|
||||
QMetaObject::invokeMethod(window, "TransitionFullyStopped",
|
||||
Qt::QueuedConnection);
|
||||
};
|
||||
|
||||
signal_handler_t *handler = obs_source_get_signal_handler(transition);
|
||||
signal_handler_connect(handler, "transition_video_stop",
|
||||
onTransitionStop, this);
|
||||
signal_handler_connect(handler, "transition_stop",
|
||||
onTransitionFullStop, this);
|
||||
}
|
||||
|
||||
static inline OBSSource GetTransitionComboItem(QComboBox *combo, int idx)
|
||||
|
|
@ -220,10 +228,10 @@ obs_source_t *OBSBasic::FindTransition(const char *name)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void OBSBasic::TransitionToScene(OBSScene scene, bool force)
|
||||
void OBSBasic::TransitionToScene(OBSScene scene, bool force, bool direct)
|
||||
{
|
||||
obs_source_t *source = obs_scene_get_source(scene);
|
||||
TransitionToScene(source, force);
|
||||
TransitionToScene(source, force, direct);
|
||||
}
|
||||
|
||||
void OBSBasic::TransitionStopped()
|
||||
|
|
@ -242,7 +250,29 @@ void OBSBasic::TransitionStopped()
|
|||
swapScene = nullptr;
|
||||
}
|
||||
|
||||
void OBSBasic::TransitionToScene(OBSSource source, bool force)
|
||||
static void OverrideTransition(OBSSource transition)
|
||||
{
|
||||
obs_source_t *oldTransition = obs_get_output_source(0);
|
||||
|
||||
if (transition != oldTransition) {
|
||||
obs_transition_swap_begin(transition, oldTransition);
|
||||
obs_set_output_source(0, transition);
|
||||
obs_transition_swap_end(transition, oldTransition);
|
||||
}
|
||||
|
||||
obs_source_release(oldTransition);
|
||||
}
|
||||
|
||||
void OBSBasic::TransitionFullyStopped()
|
||||
{
|
||||
if (overridingTransition) {
|
||||
OverrideTransition(GetCurrentTransition());
|
||||
overridingTransition = false;
|
||||
}
|
||||
}
|
||||
|
||||
void OBSBasic::TransitionToScene(OBSSource source, bool force, bool direct,
|
||||
bool quickTransition)
|
||||
{
|
||||
obs_scene_t *scene = obs_scene_from_source(source);
|
||||
bool usingPreviewProgram = IsPreviewProgramMode();
|
||||
|
|
@ -255,7 +285,7 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force)
|
|||
lastProgramScene = programScene;
|
||||
programScene = OBSGetWeakRef(source);
|
||||
|
||||
if (swapScenesMode && !force) {
|
||||
if (swapScenesMode && !force && !direct) {
|
||||
OBSSource newScene = OBSGetStrongRef(lastProgramScene);
|
||||
|
||||
if (!sceneDuplicationMode && newScene == source)
|
||||
|
|
@ -274,21 +304,45 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force)
|
|||
source = obs_scene_get_source(scene);
|
||||
}
|
||||
|
||||
obs_source_t *transition = obs_get_output_source(0);
|
||||
OBSSource transition = obs_get_output_source(0);
|
||||
obs_source_release(transition);
|
||||
|
||||
if (force) {
|
||||
obs_transition_set(transition, source);
|
||||
if (api)
|
||||
api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED);
|
||||
} else {
|
||||
obs_transition_start(transition, OBS_TRANSITION_MODE_AUTO,
|
||||
ui->transitionDuration->value(), source);
|
||||
/* check for scene override */
|
||||
OBSData data = obs_source_get_private_settings(source);
|
||||
obs_data_release(data);
|
||||
|
||||
const char *trOverrideName = obs_data_get_string(data,
|
||||
"transition");
|
||||
int duration = ui->transitionDuration->value();
|
||||
|
||||
if (trOverrideName && *trOverrideName && !quickTransition) {
|
||||
OBSSource trOverride = FindTransition(trOverrideName);
|
||||
if (trOverride) {
|
||||
transition = trOverride;
|
||||
|
||||
obs_data_set_default_int(data,
|
||||
"transition_duration", 300);
|
||||
|
||||
duration = (int)obs_data_get_int(data,
|
||||
"transition_duration");
|
||||
OverrideTransition(trOverride);
|
||||
overridingTransition = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool success = obs_transition_start(transition,
|
||||
OBS_TRANSITION_MODE_AUTO, duration, source);
|
||||
if (!success)
|
||||
TransitionFullyStopped();
|
||||
}
|
||||
|
||||
if (usingPreviewProgram && sceneDuplicationMode)
|
||||
obs_scene_release(scene);
|
||||
|
||||
obs_source_release(transition);
|
||||
}
|
||||
|
||||
static inline void SetComboTransition(QComboBox *combo, obs_source_t *tr)
|
||||
|
|
@ -544,10 +598,10 @@ int OBSBasic::GetQuickTransitionIdx(int id)
|
|||
return -1;
|
||||
}
|
||||
|
||||
void OBSBasic::SetCurrentScene(obs_scene_t *scene, bool force)
|
||||
void OBSBasic::SetCurrentScene(obs_scene_t *scene, bool force, bool direct)
|
||||
{
|
||||
obs_source_t *source = obs_scene_get_source(scene);
|
||||
SetCurrentScene(source, force);
|
||||
SetCurrentScene(source, force, direct);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
|
@ -556,10 +610,13 @@ static T GetOBSRef(QListWidgetItem *item)
|
|||
return item->data(static_cast<int>(QtDataRole::OBSRef)).value<T>();
|
||||
}
|
||||
|
||||
void OBSBasic::SetCurrentScene(OBSSource scene, bool force)
|
||||
void OBSBasic::SetCurrentScene(OBSSource scene, bool force, bool direct)
|
||||
{
|
||||
if (!IsPreviewProgramMode()) {
|
||||
TransitionToScene(scene, force);
|
||||
if (!IsPreviewProgramMode() && !direct) {
|
||||
TransitionToScene(scene, force, false);
|
||||
|
||||
} else if (IsPreviewProgramMode() && direct) {
|
||||
TransitionToScene(scene, force, true);
|
||||
|
||||
} else {
|
||||
OBSSource actualLastScene = OBSGetStrongRef(lastScene);
|
||||
|
|
@ -585,6 +642,9 @@ void OBSBasic::SetCurrentScene(OBSSource scene, bool force)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (api && IsPreviewProgramMode())
|
||||
api->on_event(OBS_FRONTEND_EVENT_PREVIEW_SCENE_CHANGED);
|
||||
}
|
||||
|
||||
UpdateSceneSelection(scene);
|
||||
|
|
@ -598,6 +658,9 @@ void OBSBasic::SetCurrentScene(OBSSource scene, bool force)
|
|||
void OBSBasic::CreateProgramDisplay()
|
||||
{
|
||||
program = new OBSQTDisplay();
|
||||
program->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(program.data(), &QWidget::customContextMenuRequested,
|
||||
this, &OBSBasic::on_program_customContextMenuRequested);
|
||||
|
||||
auto displayResize = [this]() {
|
||||
struct obs_video_info ovi;
|
||||
|
|
@ -745,6 +808,88 @@ static inline void ResetQuickTransitionText(QuickTransition *qt)
|
|||
qt->button->setText(MakeQuickTransitionText(qt));
|
||||
}
|
||||
|
||||
QMenu *OBSBasic::CreatePerSceneTransitionMenu()
|
||||
{
|
||||
OBSSource scene = GetCurrentSceneSource();
|
||||
QMenu *menu = new QMenu(QTStr("TransitionOverride"));
|
||||
QAction *action;
|
||||
|
||||
OBSData data = obs_source_get_private_settings(scene);
|
||||
obs_data_release(data);
|
||||
|
||||
obs_data_set_default_int(data, "transition_duration", 300);
|
||||
|
||||
const char *curTransition = obs_data_get_string(data, "transition");
|
||||
int curDuration = (int)obs_data_get_int(data, "transition_duration");
|
||||
|
||||
QSpinBox *duration = new QSpinBox(menu);
|
||||
duration->setMinimum(50);
|
||||
duration->setSuffix("ms");
|
||||
duration->setMaximum(20000);
|
||||
duration->setSingleStep(50);
|
||||
duration->setValue(curDuration);
|
||||
|
||||
auto setTransition = [this] (QAction *action)
|
||||
{
|
||||
int idx = action->property("transition_index").toInt();
|
||||
OBSSource scene = GetCurrentSceneSource();
|
||||
OBSData data = obs_source_get_private_settings(scene);
|
||||
obs_data_release(data);
|
||||
|
||||
if (idx == -1) {
|
||||
obs_data_set_string(data, "transition", "");
|
||||
return;
|
||||
}
|
||||
|
||||
OBSSource tr = GetTransitionComboItem(ui->transitions, idx);
|
||||
const char *name = obs_source_get_name(tr);
|
||||
|
||||
obs_data_set_string(data, "transition", name);
|
||||
};
|
||||
|
||||
auto setDuration = [this] (int duration)
|
||||
{
|
||||
OBSSource scene = GetCurrentSceneSource();
|
||||
OBSData data = obs_source_get_private_settings(scene);
|
||||
obs_data_release(data);
|
||||
|
||||
obs_data_set_int(data, "transition_duration", duration);
|
||||
};
|
||||
|
||||
connect(duration, (void (QSpinBox::*)(int))&QSpinBox::valueChanged,
|
||||
setDuration);
|
||||
|
||||
for (int i = -1; i < ui->transitions->count(); i++) {
|
||||
const char *name = "";
|
||||
|
||||
if (i >= 0) {
|
||||
OBSSource tr;
|
||||
tr = GetTransitionComboItem(ui->transitions, i);
|
||||
name = obs_source_get_name(tr);
|
||||
}
|
||||
|
||||
bool match = (name && strcmp(name, curTransition) == 0);
|
||||
|
||||
if (!name || !*name)
|
||||
name = Str("None");
|
||||
|
||||
action = menu->addAction(QT_UTF8(name));
|
||||
action->setProperty("transition_index", i);
|
||||
action->setCheckable(true);
|
||||
action->setChecked(match);
|
||||
|
||||
connect(action, &QAction::triggered,
|
||||
std::bind(setTransition, action));
|
||||
}
|
||||
|
||||
QWidgetAction *durationAction = new QWidgetAction(menu);
|
||||
durationAction->setDefaultWidget(duration);
|
||||
|
||||
menu->addSeparator();
|
||||
menu->addAction(durationAction);
|
||||
return menu;
|
||||
}
|
||||
|
||||
QMenu *OBSBasic::CreateTransitionMenu(QWidget *parent, QuickTransition *qt)
|
||||
{
|
||||
QMenu *menu = new QMenu(parent);
|
||||
|
|
@ -1007,8 +1152,12 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
|
|||
|
||||
ui->previewLayout->addWidget(programOptions);
|
||||
ui->previewLayout->addWidget(program);
|
||||
ui->previewLayout->setAlignment(programOptions, Qt::AlignCenter);
|
||||
program->show();
|
||||
|
||||
if (api)
|
||||
api->on_event(OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED);
|
||||
|
||||
blog(LOG_INFO, "Switched to Preview/Program mode");
|
||||
blog(LOG_INFO, "-----------------------------"
|
||||
"-------------------");
|
||||
|
|
@ -1017,7 +1166,7 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
|
|||
if (!actualProgramScene)
|
||||
actualProgramScene = GetCurrentSceneSource();
|
||||
else
|
||||
SetCurrentScene(actualProgramScene);
|
||||
SetCurrentScene(actualProgramScene, true);
|
||||
TransitionToScene(actualProgramScene, true);
|
||||
|
||||
delete programOptions;
|
||||
|
|
@ -1039,11 +1188,15 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
|
|||
if (!previewEnabled)
|
||||
EnablePreviewDisplay(false);
|
||||
|
||||
if (api)
|
||||
api->on_event(OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED);
|
||||
|
||||
blog(LOG_INFO, "Switched to regular Preview mode");
|
||||
blog(LOG_INFO, "-----------------------------"
|
||||
"-------------------");
|
||||
}
|
||||
|
||||
ResetUI();
|
||||
UpdateTitleBar();
|
||||
}
|
||||
|
||||
|
|
@ -1069,7 +1222,7 @@ void OBSBasic::RenderProgram(void *data, uint32_t cx, uint32_t cy)
|
|||
|
||||
window->DrawBackdrop(float(ovi.base_width), float(ovi.base_height));
|
||||
|
||||
obs_render_main_view();
|
||||
obs_render_main_texture();
|
||||
gs_load_vertexbuffer(nullptr);
|
||||
|
||||
/* --------------------------------------- */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue