From 9b1d9c85f32c47f57a451a0874aaa74716c20638 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Thu, 10 Nov 2016 21:44:59 +0100 Subject: [PATCH] Cleanup and bug fix Current scene was only checked before the wait time. Could cause scene switch to not be recognized during for Scene Round Trip, Pause Scenes, Ignore Scenes and Auto stop streaming/recording --- advanced-scene-switcher-win.cpp | 23 +- advanced-scene-switcher.cpp | 1358 +++++++++++++++++-------------- 2 files changed, 740 insertions(+), 641 deletions(-) diff --git a/advanced-scene-switcher-win.cpp b/advanced-scene-switcher-win.cpp index bebcd4e9..7e3b05b8 100644 --- a/advanced-scene-switcher-win.cpp +++ b/advanced-scene-switcher-win.cpp @@ -4,7 +4,7 @@ using namespace std; -static bool GetWindowTitle(HWND window, string &title) +static bool GetWindowTitle(HWND window, string& title) { size_t len = (size_t)GetWindowTextLengthW(window); wstring wtitle; @@ -32,7 +32,7 @@ static bool WindowValid(HWND window) return false; GetClientRect(window, &rect); - styles = GetWindowLongPtr(window, GWL_STYLE); + styles = GetWindowLongPtr(window, GWL_STYLE); ex_styles = GetWindowLongPtr(window, GWL_EXSTYLE); if (ex_styles & WS_EX_TOOLWINDOW) @@ -43,11 +43,12 @@ static bool WindowValid(HWND window) return true; } -void GetWindowList(vector &windows) +void GetWindowList(vector& windows) { HWND window = GetWindow(GetDesktopWindow(), GW_CHILD); - while (window) { + while (window) + { string title; if (WindowValid(window) && GetWindowTitle(window, title)) windows.emplace_back(title); @@ -55,24 +56,27 @@ void GetWindowList(vector &windows) } } -void GetCurrentWindowTitle(string &title) +void GetCurrentWindowTitle(string& title) { HWND window = GetForegroundWindow(); DWORD id; GetWindowTitle(window, title); } -pair getCursorPos() { +pair getCursorPos() +{ pair pos(0, 0); POINT cursorPos; - if (GetPhysicalCursorPos(&cursorPos)) { + if (GetPhysicalCursorPos(&cursorPos)) + { pos.first = cursorPos.x; pos.second = cursorPos.y; } return pos; } -bool isFullscreen() { +bool isFullscreen() +{ RECT appBounds; RECT rc; GetWindowRect(GetDesktopWindow(), &rc); @@ -80,7 +84,8 @@ bool isFullscreen() { if (hwnd != GetDesktopWindow() && hwnd != GetShellWindow()) { GetWindowRect(hwnd, &appBounds); - if (rc.bottom == appBounds.bottom && rc.top == appBounds.top && rc.left == appBounds.left && rc.right == appBounds.right) + if (rc.bottom == appBounds.bottom && rc.top == appBounds.top && rc.left == appBounds.left + && rc.right == appBounds.right) { return true; } diff --git a/advanced-scene-switcher.cpp b/advanced-scene-switcher.cpp index d555fae9..5f087fef 100644 --- a/advanced-scene-switcher.cpp +++ b/advanced-scene-switcher.cpp @@ -2,6 +2,7 @@ #include #include #include + #include #include #include @@ -9,7 +10,6 @@ #include #include #include -#include "advanced-scene-switcher.hpp" #include #include @@ -20,83 +20,110 @@ #include #include +#include "advanced-scene-switcher.hpp" + using namespace std; #define DEFAULT_INTERVAL 300 -struct SceneSwitch { +struct SceneSwitch +{ OBSWeakSource scene; string window; OBSWeakSource transition; bool fullscreen; - inline SceneSwitch(OBSWeakSource scene_, const char *window_, OBSWeakSource transition_, bool fullscreen_) - : scene(scene_), window(window_), transition(transition_), fullscreen(fullscreen_) + inline SceneSwitch( + OBSWeakSource scene_, const char* window_, OBSWeakSource transition_, bool fullscreen_) + : scene(scene_) + , window(window_) + , transition(transition_) + , fullscreen(fullscreen_) { } }; -struct ScreenRegionSwitch { +struct ScreenRegionSwitch +{ OBSWeakSource scene; OBSWeakSource transition; int minX, minY, maxX, maxY; string regionStr; - inline ScreenRegionSwitch(OBSWeakSource scene_, OBSWeakSource transition_, int minX_, int minY_, int maxX_, int maxY_, string regionStr_) - : scene(scene_), transition(transition_), minX(minX_), minY(minY_), maxX(maxX_), maxY(maxY_), regionStr(regionStr_) + inline ScreenRegionSwitch(OBSWeakSource scene_, OBSWeakSource transition_, int minX_, int minY_, + int maxX_, int maxY_, string regionStr_) + : scene(scene_) + , transition(transition_) + , minX(minX_) + , minY(minY_) + , maxX(maxX_) + , maxY(maxY_) + , regionStr(regionStr_) { } }; -struct SceneRoundTripSwitch { +struct SceneRoundTripSwitch +{ OBSWeakSource scene1; OBSWeakSource scene2; OBSWeakSource transition; int delay; string sceneRoundTripStr; - inline SceneRoundTripSwitch(OBSWeakSource scene1_, OBSWeakSource scene2_, OBSWeakSource transition_, int delay_, string str) - : scene1(scene1_), scene2(scene2_), transition(transition_), delay(delay_), sceneRoundTripStr(str) + inline SceneRoundTripSwitch(OBSWeakSource scene1_, OBSWeakSource scene2_, + OBSWeakSource transition_, int delay_, string str) + : scene1(scene1_) + , scene2(scene2_) + , transition(transition_) + , delay(delay_) + , sceneRoundTripStr(str) { } }; -struct SceneTransition { +struct SceneTransition +{ OBSWeakSource scene1; OBSWeakSource scene2; OBSWeakSource transition; string sceneTransitionStr; - inline SceneTransition(OBSWeakSource scene1_, OBSWeakSource scene2_, OBSWeakSource transition_, string sceneTransitionStr_) - : scene1(scene1_), scene2(scene2_), transition(transition_), sceneTransitionStr(sceneTransitionStr_) + inline SceneTransition(OBSWeakSource scene1_, OBSWeakSource scene2_, OBSWeakSource transition_, + string sceneTransitionStr_) + : scene1(scene1_) + , scene2(scene2_) + , transition(transition_) + , sceneTransitionStr(sceneTransitionStr_) { } }; -struct FileIOData { +struct FileIOData +{ bool readEnabled; string readPath; bool writeEnabled; string writePath; }; - -static inline bool WeakSourceValid(obs_weak_source_t *ws) +static inline bool WeakSourceValid(obs_weak_source_t* ws) { - obs_source_t *source = obs_weak_source_get_source(ws); + obs_source_t* source = obs_weak_source_get_source(ws); if (source) obs_source_release(source); return !!source; } -struct SwitcherData { +struct SwitcherData +{ thread th; condition_variable cv; mutex m; mutex threadEndMutex; mutex waitMutex; - //mutex transitionWaitMutex; - //mutex transitionWaitMutex2; + // mutex transitionWaitMutex; + // mutex transitionWaitMutex2; condition_variable transitionCv; bool stop = true; @@ -128,38 +155,46 @@ struct SwitcherData { void Prune() { - for (size_t i = 0; i < switches.size(); i++) { - SceneSwitch &s = switches[i]; + for (size_t i = 0; i < switches.size(); i++) + { + SceneSwitch& s = switches[i]; if (!WeakSourceValid(s.scene) || !WeakSourceValid(s.transition)) switches.erase(switches.begin() + i--); } - if (nonMatchingScene && !WeakSourceValid(nonMatchingScene)) { + if (nonMatchingScene && !WeakSourceValid(nonMatchingScene)) + { switchIfNotMatching = false; nonMatchingScene = nullptr; } - for (size_t i = 0; i < screenRegionSwitches.size(); i++) { - ScreenRegionSwitch &s = screenRegionSwitches[i]; + for (size_t i = 0; i < screenRegionSwitches.size(); i++) + { + ScreenRegionSwitch& s = screenRegionSwitches[i]; if (!WeakSourceValid(s.scene) || !WeakSourceValid(s.transition)) screenRegionSwitches.erase(screenRegionSwitches.begin() + i--); } - for (size_t i = 0; i < pauseScenesSwitches.size(); i++) { - OBSWeakSource &scene = pauseScenesSwitches[i]; + for (size_t i = 0; i < pauseScenesSwitches.size(); i++) + { + OBSWeakSource& scene = pauseScenesSwitches[i]; if (!WeakSourceValid(scene)) pauseScenesSwitches.erase(pauseScenesSwitches.begin() + i--); } - for (size_t i = 0; i < sceneRoundTripSwitches.size(); i++) { - SceneRoundTripSwitch &s = sceneRoundTripSwitches[i]; - if (!WeakSourceValid(s.scene1) || !WeakSourceValid(s.scene2) || !WeakSourceValid(s.transition)) + for (size_t i = 0; i < sceneRoundTripSwitches.size(); i++) + { + SceneRoundTripSwitch& s = sceneRoundTripSwitches[i]; + if (!WeakSourceValid(s.scene1) || !WeakSourceValid(s.scene2) + || !WeakSourceValid(s.transition)) sceneRoundTripSwitches.erase(sceneRoundTripSwitches.begin() + i--); } - for (size_t i = 0; i < sceneTransitions.size(); i++) { - SceneTransition &s = sceneTransitions[i]; - if (!WeakSourceValid(s.scene1) || !WeakSourceValid(s.scene2) || !WeakSourceValid(s.transition)) + for (size_t i = 0; i < sceneTransitions.size(); i++) + { + SceneTransition& s = sceneTransitions[i]; + if (!WeakSourceValid(s.scene1) || !WeakSourceValid(s.scene2) + || !WeakSourceValid(s.transition)) sceneTransitions.erase(sceneTransitions.begin() + i--); } } @@ -170,44 +205,48 @@ struct SwitcherData { } }; -static SwitcherData *switcher = nullptr; +static SwitcherData* switcher = nullptr; -static inline QString MakeSwitchName(const QString &scene, - const QString &value, const QString &transition, bool fullscreen) +static inline QString MakeSwitchName( + const QString& scene, const QString& value, const QString& transition, bool fullscreen) { if (!fullscreen) - return QStringLiteral("[") + scene + QStringLiteral(", ") + transition + QStringLiteral("]: ") + - value; - return QStringLiteral("[") + scene + QStringLiteral(", ") + transition + QStringLiteral("]: ") + - value + QStringLiteral(" (only if window is fullscreen)"); + return QStringLiteral("[") + scene + QStringLiteral(", ") + transition + + QStringLiteral("]: ") + value; + return QStringLiteral("[") + scene + QStringLiteral(", ") + transition + QStringLiteral("]: ") + + value + QStringLiteral(" (only if window is fullscreen)"); } -static inline QString MakeScreenRegionSwitchName(const QString &scene, const QString &transition, - int minX, int minY, int maxX, int maxY) +static inline QString MakeScreenRegionSwitchName( + const QString& scene, const QString& transition, int minX, int minY, int maxX, int maxY) { - return QStringLiteral("[") + scene + QStringLiteral(", ") + transition + QStringLiteral("]: ") + - QString::number(minX) + QStringLiteral(", ") + QString::number(minY) + QStringLiteral(" x ") + QString::number(maxX) + QStringLiteral(", ") + QString::number(maxY); + return QStringLiteral("[") + scene + QStringLiteral(", ") + transition + QStringLiteral("]: ") + + QString::number(minX) + QStringLiteral(", ") + QString::number(minY) + + QStringLiteral(" x ") + QString::number(maxX) + QStringLiteral(", ") + + QString::number(maxY); } -static inline QString MakeSceneRoundTripSwitchName(const QString &scene1, - const QString &scene2, const QString &transition, int delay) +static inline QString MakeSceneRoundTripSwitchName( + const QString& scene1, const QString& scene2, const QString& transition, int delay) { - return scene1 + QStringLiteral(" -> wait for ") + QString::number(delay) + QStringLiteral(" seconds -> ") + scene2 + QStringLiteral(" (using ") + transition + QStringLiteral(" transition)"); + return scene1 + QStringLiteral(" -> wait for ") + QString::number(delay) + + QStringLiteral(" seconds -> ") + scene2 + QStringLiteral(" (using ") + transition + + QStringLiteral(" transition)"); } -static inline QString MakeSceneTransitionName(const QString &scene1, - const QString &scene2, const QString &transition) +static inline QString MakeSceneTransitionName( + const QString& scene1, const QString& scene2, const QString& transition) { return scene1 + QStringLiteral(" --- ") + transition + QStringLiteral(" --> ") + scene2; } - -static inline string GetWeakSourceName(obs_weak_source_t *weak_source) +static inline string GetWeakSourceName(obs_weak_source_t* weak_source) { string name; - obs_source_t *source = obs_weak_source_get_source(weak_source); - if (source) { + obs_source_t* source = obs_weak_source_get_source(weak_source); + if (source) + { name = obs_source_get_name(source); obs_source_release(source); } @@ -215,11 +254,12 @@ static inline string GetWeakSourceName(obs_weak_source_t *weak_source) return name; } -static inline OBSWeakSource GetWeakSourceByName(const char *name) +static inline OBSWeakSource GetWeakSourceByName(const char* name) { OBSWeakSource weak; - obs_source_t *source = obs_get_source_by_name(name); - if (source) { + obs_source_t* source = obs_get_source_by_name(name); + if (source) + { weak = obs_source_get_weak_source(source); obs_weak_source_release(weak); obs_source_release(source); @@ -228,29 +268,32 @@ static inline OBSWeakSource GetWeakSourceByName(const char *name) return weak; } -static inline OBSWeakSource GetWeakSourceByQString(const QString &name) +static inline OBSWeakSource GetWeakSourceByQString(const QString& name) { return GetWeakSourceByName(name.toUtf8().constData()); } -static inline OBSWeakSource GetWeakTransitionByName(const char *transitionName) +static inline OBSWeakSource GetWeakTransitionByName(const char* transitionName) { OBSWeakSource weak; - obs_source_t *source; + obs_source_t* source; - if (strcmp(transitionName, "Default") == 0){ + if (strcmp(transitionName, "Default") == 0) + { source = obs_frontend_get_current_transition(); weak = obs_source_get_weak_source(source); obs_weak_source_release(weak); return weak; } - obs_frontend_source_list *transitions = new obs_frontend_source_list(); + obs_frontend_source_list* transitions = new obs_frontend_source_list(); obs_frontend_get_transitions(transitions); - for (size_t i = 0; i < transitions->sources.num; i++){ - const char *name = obs_source_get_name(transitions->sources.array[i]); - if (strcmp(transitionName, name) == 0){ + for (size_t i = 0; i < transitions->sources.num; i++) + { + const char* name = obs_source_get_name(transitions->sources.array[i]); + if (strcmp(transitionName, name) == 0) + { source = transitions->sources.array[i]; break; } @@ -264,13 +307,14 @@ static inline OBSWeakSource GetWeakTransitionByName(const char *transitionName) return weak; } -static inline OBSWeakSource GetWeakTransitionByQString(const QString &name){ +static inline OBSWeakSource GetWeakTransitionByQString(const QString& name) +{ return GetWeakTransitionByName(name.toUtf8().constData()); } -SceneSwitcher::SceneSwitcher(QWidget *parent) - : QDialog(parent), - ui(new Ui_SceneSwitcher) +SceneSwitcher::SceneSwitcher(QWidget* parent) + : QDialog(parent) + , ui(new Ui_SceneSwitcher) { ui->setupUi(this); @@ -279,9 +323,10 @@ SceneSwitcher::SceneSwitcher(QWidget *parent) switcher->Prune(); BPtr scenes = obs_frontend_get_scene_names(); - char **temp = scenes; - while (*temp) { - const char *name = *temp; + char** temp = scenes; + while (*temp) + { + const char* name = *temp; ui->scenes->addItem(name); ui->noMatchSwitchScene->addItem(name); ui->screenRegionScenes->addItem(name); @@ -294,24 +339,25 @@ SceneSwitcher::SceneSwitcher(QWidget *parent) temp++; } - obs_frontend_source_list *transitions = new obs_frontend_source_list(); + obs_frontend_source_list* transitions = new obs_frontend_source_list(); obs_frontend_get_transitions(transitions); - //ui->transitions->addItem("Default"); - //ui->screenRegionsTransitions->addItem("Default"); - //ui->sceneRoundTripTransitions->addItem("Default"); + // ui->transitions->addItem("Default"); + // ui->screenRegionsTransitions->addItem("Default"); + // ui->sceneRoundTripTransitions->addItem("Default"); - for (size_t i = 0; i < transitions->sources.num; i++){ - const char *name = obs_source_get_name(transitions->sources.array[i]); + for (size_t i = 0; i < transitions->sources.num; i++) + { + const char* name = obs_source_get_name(transitions->sources.array[i]); ui->transitions->addItem(name); ui->screenRegionsTransitions->addItem(name); ui->sceneRoundTripTransitions->addItem(name); ui->transitionsTransitions->addItem(name); } - //ui->transitions->addItem("Random"); - //ui->screenRegionsTransitions->addItem("Random"); - //ui->sceneRoundTripTransitions->addItem("Random"); + // ui->transitions->addItem("Random"); + // ui->screenRegionsTransitions->addItem("Random"); + // ui->sceneRoundTripTransitions->addItem("Random"); obs_frontend_source_list_free(transitions); @@ -320,99 +366,99 @@ SceneSwitcher::SceneSwitcher(QWidget *parent) else ui->noMatchDontSwitch->setChecked(true); - ui->noMatchSwitchScene->setCurrentText( - GetWeakSourceName(switcher->nonMatchingScene).c_str()); + ui->noMatchSwitchScene->setCurrentText(GetWeakSourceName(switcher->nonMatchingScene).c_str()); ui->checkInterval->setValue(switcher->interval); vector windows; GetWindowList(windows); - for (string &window : windows){ + for (string& window : windows) + { ui->windows->addItem(window.c_str()); ui->ignoreWindowsWindows->addItem(window.c_str()); ui->pauseWindowsWindows->addItem(window.c_str()); } - for (auto &s : switcher->switches) { + for (auto& s : switcher->switches) + { string sceneName = GetWeakSourceName(s.scene); string transitionName = GetWeakSourceName(s.transition); - QString text = MakeSwitchName(sceneName.c_str(), s.window.c_str(), - transitionName.c_str(), s.fullscreen); + QString text = MakeSwitchName( + sceneName.c_str(), s.window.c_str(), transitionName.c_str(), s.fullscreen); - QListWidgetItem *item = new QListWidgetItem(text, - ui->switches); + QListWidgetItem* item = new QListWidgetItem(text, ui->switches); item->setData(Qt::UserRole, s.window.c_str()); } - for (auto &s : switcher->screenRegionSwitches) { + for (auto& s : switcher->screenRegionSwitches) + { string sceneName = GetWeakSourceName(s.scene); string transitionName = GetWeakSourceName(s.transition); - QString text = MakeScreenRegionSwitchName(sceneName.c_str(), transitionName.c_str(), - s.minX, s.minY, s.maxX, s.maxY); + QString text = MakeScreenRegionSwitchName( + sceneName.c_str(), transitionName.c_str(), s.minX, s.minY, s.maxX, s.maxY); - QListWidgetItem *item = new QListWidgetItem(text, - ui->screenRegions); + QListWidgetItem* item = new QListWidgetItem(text, ui->screenRegions); item->setData(Qt::UserRole, s.regionStr.c_str()); } ui->autoStopSceneCheckBox->setChecked(switcher->autoStopEnable); - ui->autoStopScenes->setCurrentText( - GetWeakSourceName(switcher->autoStopScene).c_str()); + ui->autoStopScenes->setCurrentText(GetWeakSourceName(switcher->autoStopScene).c_str()); - if (ui->autoStopSceneCheckBox->checkState()){ + if (ui->autoStopSceneCheckBox->checkState()) + { ui->autoStopScenes->setDisabled(false); } - else{ + else + { ui->autoStopScenes->setDisabled(true); } - for (auto &scene : switcher->pauseScenesSwitches) { + for (auto& scene : switcher->pauseScenesSwitches) + { string sceneName = GetWeakSourceName(scene); QString text = QString::fromStdString(sceneName); - QListWidgetItem *item = new QListWidgetItem(text, - ui->pauseScenes); + QListWidgetItem* item = new QListWidgetItem(text, ui->pauseScenes); item->setData(Qt::UserRole, text); } - for (auto &window : switcher->pauseWindowsSwitches) { + for (auto& window : switcher->pauseWindowsSwitches) + { QString text = QString::fromStdString(window); - QListWidgetItem *item = new QListWidgetItem(text, - ui->pauseWindows); + QListWidgetItem* item = new QListWidgetItem(text, ui->pauseWindows); item->setData(Qt::UserRole, text); } - for (auto &window : switcher->ignoreWindowsSwitches) { + for (auto& window : switcher->ignoreWindowsSwitches) + { QString text = QString::fromStdString(window); - QListWidgetItem *item = new QListWidgetItem(text, - ui->ignoreWindows); + QListWidgetItem* item = new QListWidgetItem(text, ui->ignoreWindows); item->setData(Qt::UserRole, text); } - for (auto &s : switcher->sceneRoundTripSwitches) { + for (auto& s : switcher->sceneRoundTripSwitches) + { string sceneName1 = GetWeakSourceName(s.scene1); string sceneName2 = GetWeakSourceName(s.scene2); string transitionName = GetWeakSourceName(s.transition); - QString text = MakeSceneRoundTripSwitchName(sceneName1.c_str(), - sceneName2.c_str(), transitionName.c_str(), - s.delay); + QString text = MakeSceneRoundTripSwitchName( + sceneName1.c_str(), sceneName2.c_str(), transitionName.c_str(), s.delay); - QListWidgetItem *item = new QListWidgetItem(text, - ui->sceneRoundTrips); + QListWidgetItem* item = new QListWidgetItem(text, ui->sceneRoundTrips); item->setData(Qt::UserRole, text); } - for (auto &s : switcher->sceneTransitions) { + for (auto& s : switcher->sceneTransitions) + { string sceneName1 = GetWeakSourceName(s.scene1); string sceneName2 = GetWeakSourceName(s.scene2); string transitionName = GetWeakSourceName(s.transition); - QString text = MakeSceneTransitionName(sceneName1.c_str(), - sceneName2.c_str(), transitionName.c_str()); + QString text = MakeSceneTransitionName( + sceneName1.c_str(), sceneName2.c_str(), transitionName.c_str()); - QListWidgetItem *item = new QListWidgetItem(text, - ui->sceneTransitions); + QListWidgetItem* item = new QListWidgetItem(text, ui->sceneTransitions); item->setData(Qt::UserRole, text); } @@ -420,11 +466,13 @@ SceneSwitcher::SceneSwitcher(QWidget *parent) ui->readFileCheckBox->setChecked(switcher->fileIO.readEnabled); ui->writePathLineEdit->setText(QString::fromStdString(switcher->fileIO.writePath.c_str())); - if (ui->readFileCheckBox->checkState()){ + if (ui->readFileCheckBox->checkState()) + { ui->browseButton_2->setDisabled(false); ui->readPathLineEdit->setDisabled(false); } - else{ + else + { ui->browseButton_2->setDisabled(true); ui->readPathLineEdit->setDisabled(true); } @@ -436,8 +484,8 @@ SceneSwitcher::SceneSwitcher(QWidget *parent) loading = false; - //screen region cursor position - QTimer *screenRegionTimer = new QTimer(this); + // screen region cursor position + QTimer* screenRegionTimer = new QTimer(this); connect(screenRegionTimer, SIGNAL(timeout()), this, SLOT(updateScreenRegionCursorPos())); screenRegionTimer->start(1000); } @@ -447,17 +495,18 @@ void SceneSwitcher::closeEvent(QCloseEvent*) obs_frontend_save(); } -int SceneSwitcher::FindByData(const QString &window) +int SceneSwitcher::FindByData(const QString& window) { int count = ui->switches->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->switches->item(i); - QString itemWindow = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->switches->item(i); + QString itemWindow = item->data(Qt::UserRole).toString(); - if (itemWindow == window) { + if (itemWindow == window) + { idx = i; break; } @@ -466,17 +515,18 @@ int SceneSwitcher::FindByData(const QString &window) return idx; } -int SceneSwitcher::ScreenRegionFindByData(const QString ®ion) +int SceneSwitcher::ScreenRegionFindByData(const QString& region) { int count = ui->screenRegions->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->screenRegions->item(i); - QString itemRegion = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->screenRegions->item(i); + QString itemRegion = item->data(Qt::UserRole).toString(); - if (itemRegion == region) { + if (itemRegion == region) + { idx = i; break; } @@ -485,17 +535,18 @@ int SceneSwitcher::ScreenRegionFindByData(const QString ®ion) return idx; } -int SceneSwitcher::PauseScenesFindByData(const QString ®ion) +int SceneSwitcher::PauseScenesFindByData(const QString& region) { int count = ui->pauseScenes->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->pauseScenes->item(i); - QString itemRegion = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->pauseScenes->item(i); + QString itemRegion = item->data(Qt::UserRole).toString(); - if (itemRegion == region) { + if (itemRegion == region) + { idx = i; break; } @@ -504,17 +555,18 @@ int SceneSwitcher::PauseScenesFindByData(const QString ®ion) return idx; } -int SceneSwitcher::PauseWindowsFindByData(const QString ®ion) +int SceneSwitcher::PauseWindowsFindByData(const QString& region) { int count = ui->pauseWindows->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->pauseWindows->item(i); - QString itemRegion = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->pauseWindows->item(i); + QString itemRegion = item->data(Qt::UserRole).toString(); - if (itemRegion == region) { + if (itemRegion == region) + { idx = i; break; } @@ -523,17 +575,18 @@ int SceneSwitcher::PauseWindowsFindByData(const QString ®ion) return idx; } -int SceneSwitcher::IgnoreWindowsFindByData(const QString ®ion) +int SceneSwitcher::IgnoreWindowsFindByData(const QString& region) { int count = ui->ignoreWindows->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->ignoreWindows->item(i); - QString itemRegion = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->ignoreWindows->item(i); + QString itemRegion = item->data(Qt::UserRole).toString(); - if (itemRegion == region) { + if (itemRegion == region) + { idx = i; break; } @@ -542,18 +595,19 @@ int SceneSwitcher::IgnoreWindowsFindByData(const QString ®ion) return idx; } -int SceneSwitcher::SceneRoundTripFindByData(const QString &scene1) +int SceneSwitcher::SceneRoundTripFindByData(const QString& scene1) { QRegExp rx(scene1 + " -> wait for [0-9]* seconds -> .*"); int count = ui->sceneRoundTrips->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->sceneRoundTrips->item(i); - QString itemString = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->sceneRoundTrips->item(i); + QString itemString = item->data(Qt::UserRole).toString(); - if (rx.exactMatch(itemString)) { + if (rx.exactMatch(itemString)) + { idx = i; break; } @@ -562,18 +616,19 @@ int SceneSwitcher::SceneRoundTripFindByData(const QString &scene1) return idx; } -int SceneSwitcher::SceneTransitionsFindByData(const QString &scene1, const QString &scene2) +int SceneSwitcher::SceneTransitionsFindByData(const QString& scene1, const QString& scene2) { QRegExp rx(scene1 + " --- .* --> " + scene2); int count = ui->sceneTransitions->count(); int idx = -1; - for (int i = 0; i < count; i++) { - QListWidgetItem *item = ui->sceneTransitions->item(i); - QString itemString = - item->data(Qt::UserRole).toString(); + for (int i = 0; i < count; i++) + { + QListWidgetItem* item = ui->sceneTransitions->item(i); + QString itemString = item->data(Qt::UserRole).toString(); - if (rx.exactMatch(itemString)) { + if (rx.exactMatch(itemString)) + { idx = i; break; } @@ -589,13 +644,15 @@ void SceneSwitcher::on_switches_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->switches->item(idx); + QListWidgetItem* item = ui->switches->item(idx); QString window = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->switches) { - if (window.compare(s.window.c_str()) == 0) { + for (auto& s : switcher->switches) + { + if (window.compare(s.window.c_str()) == 0) + { string name = GetWeakSourceName(s.scene); string transitionName = GetWeakSourceName(s.transition); ui->scenes->setCurrentText(name.c_str()); @@ -614,13 +671,15 @@ void SceneSwitcher::on_screenRegions_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->screenRegions->item(idx); + QListWidgetItem* item = ui->screenRegions->item(idx); QString region = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->screenRegionSwitches) { - if (region.compare(s.regionStr.c_str()) == 0) { + for (auto& s : switcher->screenRegionSwitches) + { + if (region.compare(s.regionStr.c_str()) == 0) + { string name = GetWeakSourceName(s.scene); string transitionName = GetWeakSourceName(s.transition); ui->screenRegionScenes->setCurrentText(name.c_str()); @@ -641,14 +700,16 @@ void SceneSwitcher::on_pauseScenes_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->pauseScenes->item(idx); + QListWidgetItem* item = ui->pauseScenes->item(idx); QString scene = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->pauseScenesSwitches) { + for (auto& s : switcher->pauseScenesSwitches) + { string name = GetWeakSourceName(s); - if (scene.compare(name.c_str()) == 0) { + if (scene.compare(name.c_str()) == 0) + { ui->pauseScenesScenes->setCurrentText(name.c_str()); break; } @@ -662,13 +723,15 @@ void SceneSwitcher::on_pauseWindows_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->pauseWindows->item(idx); + QListWidgetItem* item = ui->pauseWindows->item(idx); QString window = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->pauseWindowsSwitches) { - if (window.compare(s.c_str()) == 0) { + for (auto& s : switcher->pauseWindowsSwitches) + { + if (window.compare(s.c_str()) == 0) + { ui->pauseWindowsWindows->setCurrentText(s.c_str()); break; } @@ -682,13 +745,15 @@ void SceneSwitcher::on_ignoreWindows_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->ignoreWindows->item(idx); + QListWidgetItem* item = ui->ignoreWindows->item(idx); QString window = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->ignoreWindowsSwitches) { - if (window.compare(s.c_str()) == 0) { + for (auto& s : switcher->ignoreWindowsSwitches) + { + if (window.compare(s.c_str()) == 0) + { ui->ignoreWindowsWindows->setCurrentText(s.c_str()); break; } @@ -702,13 +767,15 @@ void SceneSwitcher::on_sceneRoundTrips_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->sceneRoundTrips->item(idx); + QListWidgetItem* item = ui->sceneRoundTrips->item(idx); QString sceneRoundTrip = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->sceneRoundTripSwitches) { - if (sceneRoundTrip.compare(s.sceneRoundTripStr.c_str()) == 0) { + for (auto& s : switcher->sceneRoundTripSwitches) + { + if (sceneRoundTrip.compare(s.sceneRoundTripStr.c_str()) == 0) + { string scene1 = GetWeakSourceName(s.scene1); string scene2 = GetWeakSourceName(s.scene2); string transitionName = GetWeakSourceName(s.transition); @@ -729,13 +796,15 @@ void SceneSwitcher::on_sceneTransitions_currentRowChanged(int idx) if (idx == -1) return; - QListWidgetItem *item = ui->sceneTransitions->item(idx); + QListWidgetItem* item = ui->sceneTransitions->item(idx); QString sceneTransition = item->data(Qt::UserRole).toString(); lock_guard lock(switcher->m); - for (auto &s : switcher->sceneTransitions) { - if (sceneTransition.compare(s.sceneTransitionStr.c_str()) == 0) { + for (auto& s : switcher->sceneTransitions) + { + if (sceneTransition.compare(s.sceneTransitionStr.c_str()) == 0) + { string scene1 = GetWeakSourceName(s.scene1); string scene2 = GetWeakSourceName(s.scene2); string transitionName = GetWeakSourceName(s.transition); @@ -770,25 +839,28 @@ void SceneSwitcher::on_add_clicked() int idx = FindByData(windowName); - if (idx == -1) { + if (idx == -1) + { lock_guard lock(switcher->m); - switcher->switches.emplace_back(source, - windowName.toUtf8().constData(), transition, fullscreen); + switcher->switches.emplace_back( + source, windowName.toUtf8().constData(), transition, fullscreen); - QListWidgetItem *item = new QListWidgetItem(text, - ui->switches); + QListWidgetItem* item = new QListWidgetItem(text, ui->switches); item->setData(Qt::UserRole, v); } - else { - QListWidgetItem *item = ui->switches->item(idx); + else + { + QListWidgetItem* item = ui->switches->item(idx); item->setText(text); string window = windowName.toUtf8().constData(); { lock_guard lock(switcher->m); - for (auto &s : switcher->switches) { - if (s.window == window) { + for (auto& s : switcher->switches) + { + if (s.window == window) + { s.scene = source; s.transition = transition; s.fullscreen = fullscreen; @@ -803,21 +875,22 @@ void SceneSwitcher::on_add_clicked() void SceneSwitcher::on_remove_clicked() { - QListWidgetItem *item = ui->switches->currentItem(); + QListWidgetItem* item = ui->switches->currentItem(); if (!item) return; - string window = - item->data(Qt::UserRole).toString().toUtf8().constData(); + string window = item->data(Qt::UserRole).toString().toUtf8().constData(); { lock_guard lock(switcher->m); - auto &switches = switcher->switches; + auto& switches = switcher->switches; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s.window == window) { + if (s.window == window) + { switches.erase(it); break; } @@ -827,7 +900,6 @@ void SceneSwitcher::on_remove_clicked() delete item; } - void SceneSwitcher::on_screenRegionAdd_clicked() { QString sceneName = ui->screenRegionScenes->currentText(); @@ -841,7 +913,8 @@ void SceneSwitcher::on_screenRegionAdd_clicked() int maxX = ui->screenRegionMaxX->value(); int maxY = ui->screenRegionMaxY->value(); - string regionStr = to_string(minX) + ", " + to_string(minY) + " x " + to_string(maxX) + ", " + to_string(maxY); + string regionStr = to_string(minX) + ", " + to_string(minY) + " x " + to_string(maxX) + ", " + + to_string(maxY); QString region = QString::fromStdString(regionStr); OBSWeakSource source = GetWeakSourceByQString(sceneName); @@ -852,25 +925,28 @@ void SceneSwitcher::on_screenRegionAdd_clicked() int idx = ScreenRegionFindByData(region); - if (idx == -1) { - QListWidgetItem *item = new QListWidgetItem(text, - ui->screenRegions); + if (idx == -1) + { + QListWidgetItem* item = new QListWidgetItem(text, ui->screenRegions); item->setData(Qt::UserRole, v); lock_guard lock(switcher->m); - switcher->screenRegionSwitches.emplace_back(source, transition, - minX, minY, maxX, maxY, regionStr); + switcher->screenRegionSwitches.emplace_back( + source, transition, minX, minY, maxX, maxY, regionStr); } - else { - QListWidgetItem *item = ui->screenRegions->item(idx); + else + { + QListWidgetItem* item = ui->screenRegions->item(idx); item->setText(text); string curRegion = region.toUtf8().constData(); { lock_guard lock(switcher->m); - for (auto &s : switcher->screenRegionSwitches) { - if (s.regionStr == curRegion) { + for (auto& s : switcher->screenRegionSwitches) + { + if (s.regionStr == curRegion) + { s.scene = source; s.transition = transition; break; @@ -884,21 +960,22 @@ void SceneSwitcher::on_screenRegionAdd_clicked() void SceneSwitcher::on_screenRegionRemove_clicked() { - QListWidgetItem *item = ui->screenRegions->currentItem(); + QListWidgetItem* item = ui->screenRegions->currentItem(); if (!item) return; - string region = - item->data(Qt::UserRole).toString().toUtf8().constData(); + string region = item->data(Qt::UserRole).toString().toUtf8().constData(); { lock_guard lock(switcher->m); - auto &switches = switcher->screenRegionSwitches; + auto& switches = switcher->screenRegionSwitches; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s.regionStr == region) { + if (s.regionStr == region) + { switches.erase(it); break; } @@ -918,11 +995,11 @@ void SceneSwitcher::on_pauseScenesAdd_clicked() OBSWeakSource source = GetWeakSourceByQString(sceneName); QVariant v = QVariant::fromValue(sceneName); - QList items = ui->pauseScenes->findItems(sceneName, Qt::MatchExactly); + QList items = ui->pauseScenes->findItems(sceneName, Qt::MatchExactly); - if (items.size() == 0) { - QListWidgetItem *item = new QListWidgetItem(sceneName, - ui->pauseScenes); + if (items.size() == 0) + { + QListWidgetItem* item = new QListWidgetItem(sceneName, ui->pauseScenes); item->setData(Qt::UserRole, v); lock_guard lock(switcher->m); @@ -933,21 +1010,22 @@ void SceneSwitcher::on_pauseScenesAdd_clicked() void SceneSwitcher::on_pauseScenesRemove_clicked() { - QListWidgetItem *item = ui->pauseScenes->currentItem(); + QListWidgetItem* item = ui->pauseScenes->currentItem(); if (!item) return; - QString pauseScene = - item->data(Qt::UserRole).toString(); + QString pauseScene = item->data(Qt::UserRole).toString(); { lock_guard lock(switcher->m); - auto &switches = switcher->pauseScenesSwitches; + auto& switches = switcher->pauseScenesSwitches; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s == GetWeakSourceByQString(pauseScene)) { + if (s == GetWeakSourceByQString(pauseScene)) + { switches.erase(it); break; } @@ -966,11 +1044,11 @@ void SceneSwitcher::on_pauseWindowsAdd_clicked() QVariant v = QVariant::fromValue(windowName); - QList items = ui->pauseWindows->findItems(windowName, Qt::MatchExactly); + QList items = ui->pauseWindows->findItems(windowName, Qt::MatchExactly); - if (items.size() == 0) { - QListWidgetItem *item = new QListWidgetItem(windowName, - ui->pauseWindows); + if (items.size() == 0) + { + QListWidgetItem* item = new QListWidgetItem(windowName, ui->pauseWindows); item->setData(Qt::UserRole, v); lock_guard lock(switcher->m); @@ -981,21 +1059,22 @@ void SceneSwitcher::on_pauseWindowsAdd_clicked() void SceneSwitcher::on_pauseWindowsRemove_clicked() { - QListWidgetItem *item = ui->pauseWindows->currentItem(); + QListWidgetItem* item = ui->pauseWindows->currentItem(); if (!item) return; - QString windowName = - item->data(Qt::UserRole).toString(); + QString windowName = item->data(Qt::UserRole).toString(); { lock_guard lock(switcher->m); - auto &switches = switcher->pauseWindowsSwitches; + auto& switches = switcher->pauseWindowsSwitches; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s == windowName.toUtf8().constData()) { + if (s == windowName.toUtf8().constData()) + { switches.erase(it); break; } @@ -1014,11 +1093,11 @@ void SceneSwitcher::on_ignoreWindowsAdd_clicked() QVariant v = QVariant::fromValue(windowName); - QList items = ui->ignoreWindows->findItems(windowName, Qt::MatchExactly); + QList items = ui->ignoreWindows->findItems(windowName, Qt::MatchExactly); - if (items.size() == 0) { - QListWidgetItem *item = new QListWidgetItem(windowName, - ui->ignoreWindows); + if (items.size() == 0) + { + QListWidgetItem* item = new QListWidgetItem(windowName, ui->ignoreWindows); item->setData(Qt::UserRole, v); lock_guard lock(switcher->m); @@ -1029,21 +1108,22 @@ void SceneSwitcher::on_ignoreWindowsAdd_clicked() void SceneSwitcher::on_ignoreWindowsRemove_clicked() { - QListWidgetItem *item = ui->ignoreWindows->currentItem(); + QListWidgetItem* item = ui->ignoreWindows->currentItem(); if (!item) return; - QString windowName = - item->data(Qt::UserRole).toString(); + QString windowName = item->data(Qt::UserRole).toString(); { lock_guard lock(switcher->m); - auto &switches = switcher->ignoreWindowsSwitches; + auto& switches = switcher->ignoreWindowsSwitches; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s == windowName.toUtf8().constData()) { + if (s == windowName.toUtf8().constData()) + { switches.erase(it); break; } @@ -1076,22 +1156,26 @@ void SceneSwitcher::on_sceneRoundTripAdd_clicked() int idx = SceneRoundTripFindByData(scene1Name); - if (idx == -1) { - QListWidgetItem *item = new QListWidgetItem(text, - ui->sceneRoundTrips); + if (idx == -1) + { + QListWidgetItem* item = new QListWidgetItem(text, ui->sceneRoundTrips); item->setData(Qt::UserRole, v); lock_guard lock(switcher->m); - switcher->sceneRoundTripSwitches.emplace_back(source1, source2, transition, delay, text.toUtf8().constData()); + switcher->sceneRoundTripSwitches.emplace_back( + source1, source2, transition, delay, text.toUtf8().constData()); } - else { - QListWidgetItem *item = ui->sceneRoundTrips->item(idx); + else + { + QListWidgetItem* item = ui->sceneRoundTrips->item(idx); item->setText(text); { lock_guard lock(switcher->m); - for (auto &s : switcher->sceneRoundTripSwitches) { - if (s.scene1 == source1 && s.scene2 == source2) { + for (auto& s : switcher->sceneRoundTripSwitches) + { + if (s.scene1 == source1 && s.scene2 == source2) + { s.delay = delay; s.transition = transition; s.sceneRoundTripStr = text.toUtf8().constData(); @@ -1106,21 +1190,22 @@ void SceneSwitcher::on_sceneRoundTripAdd_clicked() void SceneSwitcher::on_sceneRoundTripRemove_clicked() { - QListWidgetItem *item = ui->sceneRoundTrips->currentItem(); + QListWidgetItem* item = ui->sceneRoundTrips->currentItem(); if (!item) return; - string text = - item->data(Qt::UserRole).toString().toUtf8().constData(); + string text = item->data(Qt::UserRole).toString().toUtf8().constData(); { lock_guard lock(switcher->m); - auto &switches = switcher->sceneRoundTripSwitches; + auto& switches = switcher->sceneRoundTripSwitches; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s.sceneRoundTripStr == text) { + if (s.sceneRoundTripStr == text) + { switches.erase(it); break; } @@ -1136,21 +1221,22 @@ void SceneSwitcher::on_autoStopSceneCheckBox_stateChanged(int state) return; lock_guard lock(switcher->m); - if (!state){ + if (!state) + { ui->autoStopScenes->setDisabled(true); switcher->autoStopEnable = false; } - else{ + else + { ui->autoStopScenes->setDisabled(false); switcher->autoStopEnable = true; } } -void SceneSwitcher::UpdateAutoStopScene(const QString &name) +void SceneSwitcher::UpdateAutoStopScene(const QString& name) { - obs_source_t *scene = obs_get_source_by_name( - name.toUtf8().constData()); - obs_weak_source_t *ws = obs_source_get_weak_source(scene); + obs_source_t* scene = obs_get_source_by_name(name.toUtf8().constData()); + obs_weak_source_t* ws = obs_source_get_weak_source(scene); switcher->autoStopScene = ws; @@ -1158,8 +1244,7 @@ void SceneSwitcher::UpdateAutoStopScene(const QString &name) obs_source_release(scene); } -void SceneSwitcher::on_autoStopScenes_currentTextChanged( - const QString &text) +void SceneSwitcher::on_autoStopScenes_currentTextChanged(const QString& text) { if (loading) return; @@ -1189,22 +1274,26 @@ void SceneSwitcher::on_transitionsAdd_clicked() int idx = SceneTransitionsFindByData(scene1Name, scene2Name); - if (idx == -1) { - QListWidgetItem *item = new QListWidgetItem(text, - ui->sceneTransitions); + if (idx == -1) + { + QListWidgetItem* item = new QListWidgetItem(text, ui->sceneTransitions); item->setData(Qt::UserRole, v); lock_guard lock(switcher->m); - switcher->sceneTransitions.emplace_back(source1, source2, transition, text.toUtf8().constData()); + switcher->sceneTransitions.emplace_back( + source1, source2, transition, text.toUtf8().constData()); } - else { - QListWidgetItem *item = ui->sceneTransitions->item(idx); + else + { + QListWidgetItem* item = ui->sceneTransitions->item(idx); item->setText(text); { lock_guard lock(switcher->m); - for (auto &s : switcher->sceneTransitions) { - if (s.scene1 == source1 && s.scene2 == source2) { + for (auto& s : switcher->sceneTransitions) + { + if (s.scene1 == source1 && s.scene2 == source2) + { s.transition = transition; s.sceneTransitionStr = text.toUtf8().constData(); break; @@ -1218,21 +1307,22 @@ void SceneSwitcher::on_transitionsAdd_clicked() void SceneSwitcher::on_transitionsRemove_clicked() { - QListWidgetItem *item = ui->sceneTransitions->currentItem(); + QListWidgetItem* item = ui->sceneTransitions->currentItem(); if (!item) return; - string text = - item->data(Qt::UserRole).toString().toUtf8().constData(); + string text = item->data(Qt::UserRole).toString().toUtf8().constData(); { lock_guard lock(switcher->m); - auto &switches = switcher->sceneTransitions; + auto& switches = switcher->sceneTransitions; - for (auto it = switches.begin(); it != switches.end(); ++it) { - auto &s = *it; + for (auto it = switches.begin(); it != switches.end(); ++it) + { + auto& s = *it; - if (s.sceneTransitionStr == text) { + if (s.sceneTransitionStr == text) + { switches.erase(it); break; } @@ -1244,8 +1334,8 @@ void SceneSwitcher::on_transitionsRemove_clicked() void SceneSwitcher::on_browseButton_clicked() { - QString directory = QFileDialog::getOpenFileName(this, - tr("Select a file to write to ..."), QDir::currentPath(), tr("Text files (*.txt)")); + QString directory = QFileDialog::getOpenFileName( + this, tr("Select a file to write to ..."), QDir::currentPath(), tr("Text files (*.txt)")); if (!directory.isEmpty()) ui->writePathLineEdit->setText(directory); } @@ -1256,25 +1346,28 @@ void SceneSwitcher::on_readFileCheckBox_stateChanged(int state) return; lock_guard lock(switcher->m); - if (!state){ + if (!state) + { ui->browseButton_2->setDisabled(true); ui->readPathLineEdit->setDisabled(true); switcher->fileIO.readEnabled = false; } - else{ + else + { ui->browseButton_2->setDisabled(false); ui->readPathLineEdit->setDisabled(false); switcher->fileIO.readEnabled = true; } } -void SceneSwitcher::on_readPathLineEdit_textChanged(const QString & text) +void SceneSwitcher::on_readPathLineEdit_textChanged(const QString& text) { if (loading) return; lock_guard lock(switcher->m); - if (text.isEmpty()){ + if (text.isEmpty()) + { switcher->fileIO.readEnabled = false; return; } @@ -1282,13 +1375,14 @@ void SceneSwitcher::on_readPathLineEdit_textChanged(const QString & text) switcher->fileIO.readPath = text.toUtf8().constData(); } -void SceneSwitcher::on_writePathLineEdit_textChanged(const QString & text) +void SceneSwitcher::on_writePathLineEdit_textChanged(const QString& text) { if (loading) return; lock_guard lock(switcher->m); - if (text.isEmpty()){ + if (text.isEmpty()) + { switcher->fileIO.writeEnabled = false; return; } @@ -1298,8 +1392,8 @@ void SceneSwitcher::on_writePathLineEdit_textChanged(const QString & text) void SceneSwitcher::on_browseButton_2_clicked() { - QString directory = QFileDialog::getOpenFileName(this, - tr("Select a file to read from ..."), QDir::currentPath(), tr("Text files (*.txt)")); + QString directory = QFileDialog::getOpenFileName( + this, tr("Select a file to read from ..."), QDir::currentPath(), tr("Text files (*.txt)")); if (!directory.isEmpty()) ui->readPathLineEdit->setText(directory); } @@ -1313,11 +1407,10 @@ void SceneSwitcher::on_startAtLaunch_toggled(bool value) switcher->startAtLaunch = value; } -void SceneSwitcher::UpdateNonMatchingScene(const QString &name) +void SceneSwitcher::UpdateNonMatchingScene(const QString& name) { - obs_source_t *scene = obs_get_source_by_name( - name.toUtf8().constData()); - obs_weak_source_t *ws = obs_source_get_weak_source(scene); + obs_source_t* scene = obs_get_source_by_name(name.toUtf8().constData()); + obs_weak_source_t* ws = obs_source_get_weak_source(scene); switcher->nonMatchingScene = ws; @@ -1344,8 +1437,7 @@ void SceneSwitcher::on_noMatchSwitch_clicked() UpdateNonMatchingScene(ui->noMatchSwitchScene->currentText()); } -void SceneSwitcher::on_noMatchSwitchScene_currentTextChanged( - const QString &text) +void SceneSwitcher::on_noMatchSwitchScene_currentTextChanged(const QString& text) { if (loading) return; @@ -1377,55 +1469,57 @@ void SceneSwitcher::SetStopped() void SceneSwitcher::on_toggleStartButton_clicked() { - if (switcher->th.joinable()) { + if (switcher->th.joinable()) + { switcher->Stop(); SetStopped(); } - else if (switcher->stop){ + else if (switcher->stop) + { switcher->Start(); SetStarted(); } } -void SceneSwitcher::updateScreenRegionCursorPos(){ - pairposition = getCursorPos(); - ui->cursorXPosition->setText(QString::number(position.first));; +void SceneSwitcher::updateScreenRegionCursorPos() +{ + pair position = getCursorPos(); + ui->cursorXPosition->setText(QString::number(position.first)); + ; ui->cursorYPosition->setText(QString::number(position.second)); } -//TODO rename the save values (clears settings!) -static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) +// TODO rename the save values (clears settings!) +static void SaveSceneSwitcher(obs_data_t* save_data, bool saving, void*) { - if (saving) { + if (saving) + { lock_guard lock(switcher->m); - obs_data_t *obj = obs_data_create(); - obs_data_array_t *array = obs_data_array_create(); - obs_data_array_t *screenRegionArray = obs_data_array_create(); - obs_data_array_t *pauseScenesArray = obs_data_array_create(); - obs_data_array_t *pauseWindowsArray = obs_data_array_create(); - obs_data_array_t *ignoreWindowsArray = obs_data_array_create(); - obs_data_array_t *sceneRoundTripArray = obs_data_array_create(); - obs_data_array_t *sceneTransitionsArray = obs_data_array_create(); + obs_data_t* obj = obs_data_create(); + obs_data_array_t* array = obs_data_array_create(); + obs_data_array_t* screenRegionArray = obs_data_array_create(); + obs_data_array_t* pauseScenesArray = obs_data_array_create(); + obs_data_array_t* pauseWindowsArray = obs_data_array_create(); + obs_data_array_t* ignoreWindowsArray = obs_data_array_create(); + obs_data_array_t* sceneRoundTripArray = obs_data_array_create(); + obs_data_array_t* sceneTransitionsArray = obs_data_array_create(); switcher->Prune(); - for (SceneSwitch &s : switcher->switches) { - obs_data_t *array_obj = obs_data_create(); + for (SceneSwitch& s : switcher->switches) + { + obs_data_t* array_obj = obs_data_create(); - obs_source_t *source = obs_weak_source_get_source( - s.scene); - obs_source_t *transition = obs_weak_source_get_source( - s.transition); - if (source) { - const char *sceneName = obs_source_get_name(source); - const char *transitionName = obs_source_get_name(transition); + obs_source_t* source = obs_weak_source_get_source(s.scene); + obs_source_t* transition = obs_weak_source_get_source(s.transition); + if (source) + { + const char* sceneName = obs_source_get_name(source); + const char* transitionName = obs_source_get_name(transition); obs_data_set_string(array_obj, "scene", sceneName); - obs_data_set_string(array_obj, "transition", - transitionName); - obs_data_set_string(array_obj, "window_title", - s.window.c_str()); - obs_data_set_bool(array_obj, "fullscreen", - s.fullscreen); + obs_data_set_string(array_obj, "transition", transitionName); + obs_data_set_string(array_obj, "window_title", s.window.c_str()); + obs_data_set_bool(array_obj, "fullscreen", s.fullscreen); obs_data_array_push_back(array, array_obj); obs_source_release(source); obs_source_release(transition); @@ -1434,29 +1528,23 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_release(array_obj); } - for (ScreenRegionSwitch &s : switcher->screenRegionSwitches) { - obs_data_t *array_obj = obs_data_create(); + for (ScreenRegionSwitch& s : switcher->screenRegionSwitches) + { + obs_data_t* array_obj = obs_data_create(); - obs_source_t *source = obs_weak_source_get_source( - s.scene); - obs_source_t *transition = obs_weak_source_get_source( - s.transition); - if (source) { - const char *sceneName = obs_source_get_name(source); - const char *transitionName = obs_source_get_name(transition); + obs_source_t* source = obs_weak_source_get_source(s.scene); + obs_source_t* transition = obs_weak_source_get_source(s.transition); + if (source) + { + const char* sceneName = obs_source_get_name(source); + const char* transitionName = obs_source_get_name(transition); obs_data_set_string(array_obj, "screenRegionScene", sceneName); - obs_data_set_string(array_obj, "transition", - transitionName); - obs_data_set_int(array_obj, "minX", - s.minX); - obs_data_set_int(array_obj, "minY", - s.minY); - obs_data_set_int(array_obj, "maxX", - s.maxX); - obs_data_set_int(array_obj, "maxY", - s.maxY); - obs_data_set_string(array_obj, "screenRegionStr", - s.regionStr.c_str()); + obs_data_set_string(array_obj, "transition", transitionName); + obs_data_set_int(array_obj, "minX", s.minX); + obs_data_set_int(array_obj, "minY", s.minY); + obs_data_set_int(array_obj, "maxX", s.maxX); + obs_data_set_int(array_obj, "maxY", s.maxY); + obs_data_set_string(array_obj, "screenRegionStr", s.regionStr.c_str()); obs_data_array_push_back(screenRegionArray, array_obj); obs_source_release(source); obs_source_release(transition); @@ -1465,13 +1553,14 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_release(array_obj); } - for (OBSWeakSource &scene : switcher->pauseScenesSwitches) { - obs_data_t *array_obj = obs_data_create(); + for (OBSWeakSource& scene : switcher->pauseScenesSwitches) + { + obs_data_t* array_obj = obs_data_create(); - obs_source_t *source = obs_weak_source_get_source( - scene); - if (source) { - const char *n = obs_source_get_name(source); + obs_source_t* source = obs_weak_source_get_source(scene); + if (source) + { + const char* n = obs_source_get_name(source); obs_data_set_string(array_obj, "pauseScene", n); obs_data_array_push_back(pauseScenesArray, array_obj); obs_source_release(source); @@ -1480,39 +1569,38 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_release(array_obj); } - for (string &window : switcher->pauseWindowsSwitches) { - obs_data_t *array_obj = obs_data_create(); + for (string& window : switcher->pauseWindowsSwitches) + { + obs_data_t* array_obj = obs_data_create(); obs_data_set_string(array_obj, "pauseWindow", window.c_str()); obs_data_array_push_back(pauseWindowsArray, array_obj); obs_data_release(array_obj); } - for (string &window : switcher->ignoreWindowsSwitches) { - obs_data_t *array_obj = obs_data_create(); + for (string& window : switcher->ignoreWindowsSwitches) + { + obs_data_t* array_obj = obs_data_create(); obs_data_set_string(array_obj, "ignoreWindow", window.c_str()); obs_data_array_push_back(ignoreWindowsArray, array_obj); obs_data_release(array_obj); } - for (SceneRoundTripSwitch &s : switcher->sceneRoundTripSwitches) { - obs_data_t *array_obj = obs_data_create(); + for (SceneRoundTripSwitch& s : switcher->sceneRoundTripSwitches) + { + obs_data_t* array_obj = obs_data_create(); - obs_source_t *source1 = obs_weak_source_get_source( - s.scene1); - obs_source_t *source2 = obs_weak_source_get_source( - s.scene2); - obs_source_t *transition = obs_weak_source_get_source( - s.transition); - if (source1 && source2) { - const char *sceneName1 = obs_source_get_name(source1); - const char *sceneName2 = obs_source_get_name(source2); - const char *transitionName = obs_source_get_name(transition); + obs_source_t* source1 = obs_weak_source_get_source(s.scene1); + obs_source_t* source2 = obs_weak_source_get_source(s.scene2); + obs_source_t* transition = obs_weak_source_get_source(s.transition); + if (source1 && source2) + { + const char* sceneName1 = obs_source_get_name(source1); + const char* sceneName2 = obs_source_get_name(source2); + const char* transitionName = obs_source_get_name(transition); obs_data_set_string(array_obj, "sceneRoundTripScene1", sceneName1); obs_data_set_string(array_obj, "sceneRoundTripScene2", sceneName2); - obs_data_set_string(array_obj, "transition", - transitionName); - obs_data_set_int(array_obj, "sceneRoundTripDelay", - s.delay); + obs_data_set_string(array_obj, "transition", transitionName); + obs_data_set_int(array_obj, "sceneRoundTripDelay", s.delay); obs_data_set_string(array_obj, "sceneRoundTripStr", s.sceneRoundTripStr.c_str()); obs_data_array_push_back(sceneRoundTripArray, array_obj); obs_source_release(source1); @@ -1523,23 +1611,21 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_release(array_obj); } - for (SceneTransition &s : switcher->sceneTransitions) { - obs_data_t *array_obj = obs_data_create(); + for (SceneTransition& s : switcher->sceneTransitions) + { + obs_data_t* array_obj = obs_data_create(); - obs_source_t *source1 = obs_weak_source_get_source( - s.scene1); - obs_source_t *source2 = obs_weak_source_get_source( - s.scene2); - obs_source_t *transition = obs_weak_source_get_source( - s.transition); - if (source1 && source2) { - const char *sceneName1 = obs_source_get_name(source1); - const char *sceneName2 = obs_source_get_name(source2); - const char *transitionName = obs_source_get_name(transition); + obs_source_t* source1 = obs_weak_source_get_source(s.scene1); + obs_source_t* source2 = obs_weak_source_get_source(s.scene2); + obs_source_t* transition = obs_weak_source_get_source(s.transition); + if (source1 && source2) + { + const char* sceneName1 = obs_source_get_name(source1); + const char* sceneName2 = obs_source_get_name(source2); + const char* transitionName = obs_source_get_name(transition); obs_data_set_string(array_obj, "Scene1", sceneName1); obs_data_set_string(array_obj, "Scene2", sceneName2); - obs_data_set_string(array_obj, "transition", - transitionName); + obs_data_set_string(array_obj, "transition", transitionName); obs_data_set_string(array_obj, "Str", s.sceneTransitionStr.c_str()); obs_data_array_push_back(sceneTransitionsArray, array_obj); obs_source_release(source1); @@ -1550,14 +1636,11 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_release(array_obj); } - string nonMatchingSceneName = - GetWeakSourceName(switcher->nonMatchingScene); + string nonMatchingSceneName = GetWeakSourceName(switcher->nonMatchingScene); obs_data_set_int(obj, "interval", switcher->interval); - obs_data_set_string(obj, "non_matching_scene", - nonMatchingSceneName.c_str()); - obs_data_set_bool(obj, "switch_if_not_matching", - switcher->switchIfNotMatching); + obs_data_set_string(obj, "non_matching_scene", nonMatchingSceneName.c_str()); + obs_data_set_bool(obj, "switch_if_not_matching", switcher->switchIfNotMatching); obs_data_set_bool(obj, "active", switcher->th.joinable()); obs_data_set_array(obj, "switches", array); @@ -1568,8 +1651,7 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_set_array(obj, "sceneRoundTrip", sceneRoundTripArray); obs_data_set_array(obj, "sceneTransitions", sceneTransitionsArray); - string autoStopSceneName = - GetWeakSourceName(switcher->autoStopScene); + string autoStopSceneName = GetWeakSourceName(switcher->autoStopScene); obs_data_set_bool(obj, "autoStopEnable", switcher->autoStopEnable); obs_data_set_string(obj, "autoStopSceneName", autoStopSceneName.c_str()); @@ -1590,18 +1672,18 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_release(obj); } - else { + else + { switcher->m.lock(); - obs_data_t *obj = obs_data_get_obj(save_data, - "advanced-scene-switcher"); - obs_data_array_t *array = obs_data_get_array(obj, "switches"); - obs_data_array_t *screenRegionArray = obs_data_get_array(obj, "screenRegion"); - obs_data_array_t *pauseScenesArray = obs_data_get_array(obj, "pauseScenes"); - obs_data_array_t *pauseWindowsArray = obs_data_get_array(obj, "pauseWindows"); - obs_data_array_t *ignoreWindowsArray = obs_data_get_array(obj, "ignoreWindows"); - obs_data_array_t *sceneRoundTripArray = obs_data_get_array(obj, "sceneRoundTrip"); - obs_data_array_t *sceneTransitionsArray = obs_data_get_array(obj, "sceneTransitions"); + obs_data_t* obj = obs_data_get_obj(save_data, "advanced-scene-switcher"); + obs_data_array_t* array = obs_data_get_array(obj, "switches"); + obs_data_array_t* screenRegionArray = obs_data_get_array(obj, "screenRegion"); + obs_data_array_t* pauseScenesArray = obs_data_get_array(obj, "pauseScenes"); + obs_data_array_t* pauseWindowsArray = obs_data_get_array(obj, "pauseWindows"); + obs_data_array_t* ignoreWindowsArray = obs_data_get_array(obj, "ignoreWindows"); + obs_data_array_t* sceneRoundTripArray = obs_data_get_array(obj, "sceneRoundTrip"); + obs_data_array_t* sceneTransitionsArray = obs_data_get_array(obj, "sceneTransitions"); if (!obj) obj = obs_data_create(); @@ -1609,33 +1691,26 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) obs_data_set_default_int(obj, "interval", DEFAULT_INTERVAL); switcher->interval = obs_data_get_int(obj, "interval"); - switcher->switchIfNotMatching = - obs_data_get_bool(obj, "switch_if_not_matching"); - string nonMatchingScene = - obs_data_get_string(obj, "non_matching_scene"); + switcher->switchIfNotMatching = obs_data_get_bool(obj, "switch_if_not_matching"); + string nonMatchingScene = obs_data_get_string(obj, "non_matching_scene"); bool active = obs_data_get_bool(obj, "active"); - switcher->nonMatchingScene = - GetWeakSourceByName(nonMatchingScene.c_str()); + switcher->nonMatchingScene = GetWeakSourceByName(nonMatchingScene.c_str()); switcher->switches.clear(); size_t count = obs_data_array_count(array); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(array, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(array, i); - const char *scene = - obs_data_get_string(array_obj, "scene"); - const char *transition = - obs_data_get_string(array_obj, "transition"); - const char *window = - obs_data_get_string(array_obj, "window_title"); - bool fullscreen = - obs_data_get_bool(array_obj, "fullscreen"); + const char* scene = obs_data_get_string(array_obj, "scene"); + const char* transition = obs_data_get_string(array_obj, "transition"); + const char* window = obs_data_get_string(array_obj, "window_title"); + bool fullscreen = obs_data_get_bool(array_obj, "fullscreen"); - switcher->switches.emplace_back( - GetWeakSourceByName(scene), - window, GetWeakTransitionByName(transition), fullscreen); + switcher->switches.emplace_back(GetWeakSourceByName(scene), window, + GetWeakTransitionByName(transition), fullscreen); obs_data_release(array_obj); } @@ -1643,24 +1718,20 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->screenRegionSwitches.clear(); count = obs_data_array_count(screenRegionArray); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(screenRegionArray, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(screenRegionArray, i); - const char *scene = - obs_data_get_string(array_obj, "screenRegionScene"); - const char *transition = - obs_data_get_string(array_obj, "transition"); + const char* scene = obs_data_get_string(array_obj, "screenRegionScene"); + const char* transition = obs_data_get_string(array_obj, "transition"); int minX = obs_data_get_int(array_obj, "minX"); int minY = obs_data_get_int(array_obj, "minY"); int maxX = obs_data_get_int(array_obj, "maxX"); int maxY = obs_data_get_int(array_obj, "maxY"); - string regionStr = - obs_data_get_string(array_obj, "screenRegionStr"); + string regionStr = obs_data_get_string(array_obj, "screenRegionStr"); - switcher->screenRegionSwitches.emplace_back( - GetWeakSourceByName(scene), - GetWeakTransitionByName(transition), - minX, minY, maxX, maxY, regionStr); + switcher->screenRegionSwitches.emplace_back(GetWeakSourceByName(scene), + GetWeakTransitionByName(transition), minX, minY, maxX, maxY, regionStr); obs_data_release(array_obj); } @@ -1668,11 +1739,11 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->pauseScenesSwitches.clear(); count = obs_data_array_count(pauseScenesArray); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(pauseScenesArray, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(pauseScenesArray, i); - const char *scene = - obs_data_get_string(array_obj, "pauseScene"); + const char* scene = obs_data_get_string(array_obj, "pauseScene"); switcher->pauseScenesSwitches.emplace_back(GetWeakSourceByName(scene)); @@ -1682,11 +1753,11 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->pauseWindowsSwitches.clear(); count = obs_data_array_count(pauseWindowsArray); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(pauseWindowsArray, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(pauseWindowsArray, i); - const char *window = - obs_data_get_string(array_obj, "pauseWindow"); + const char* window = obs_data_get_string(array_obj, "pauseWindow"); switcher->pauseWindowsSwitches.emplace_back(window); @@ -1698,11 +1769,11 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->ignoreWindowsSwitches.clear(); count = obs_data_array_count(ignoreWindowsArray); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(ignoreWindowsArray, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(ignoreWindowsArray, i); - const char *window = - obs_data_get_string(array_obj, "ignoreWindow"); + const char* window = obs_data_get_string(array_obj, "ignoreWindow"); switcher->ignoreWindowsSwitches.emplace_back(window); @@ -1712,24 +1783,18 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->sceneRoundTripSwitches.clear(); count = obs_data_array_count(sceneRoundTripArray); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(sceneRoundTripArray, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(sceneRoundTripArray, i); - const char *scene1 = - obs_data_get_string(array_obj, "sceneRoundTripScene1"); - const char *scene2 = - obs_data_get_string(array_obj, "sceneRoundTripScene2"); - const char *transition = - obs_data_get_string(array_obj, "transition"); + const char* scene1 = obs_data_get_string(array_obj, "sceneRoundTripScene1"); + const char* scene2 = obs_data_get_string(array_obj, "sceneRoundTripScene2"); + const char* transition = obs_data_get_string(array_obj, "transition"); int delay = obs_data_get_int(array_obj, "sceneRoundTripDelay"); - const char *sceneRoundTripStr = - obs_data_get_string(array_obj, "sceneRoundTripStr"); + const char* sceneRoundTripStr = obs_data_get_string(array_obj, "sceneRoundTripStr"); - switcher->sceneRoundTripSwitches.emplace_back( - GetWeakSourceByName(scene1), - GetWeakSourceByName(scene2), - GetWeakTransitionByName(transition), - delay, + switcher->sceneRoundTripSwitches.emplace_back(GetWeakSourceByName(scene1), + GetWeakSourceByName(scene2), GetWeakTransitionByName(transition), delay, sceneRoundTripStr); obs_data_release(array_obj); @@ -1738,30 +1803,24 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->sceneTransitions.clear(); count = obs_data_array_count(sceneTransitionsArray); - for (size_t i = 0; i < count; i++) { - obs_data_t *array_obj = obs_data_array_item(sceneTransitionsArray, i); + for (size_t i = 0; i < count; i++) + { + obs_data_t* array_obj = obs_data_array_item(sceneTransitionsArray, i); - const char *scene1 = - obs_data_get_string(array_obj, "Scene1"); - const char *scene2 = - obs_data_get_string(array_obj, "Scene2"); - const char *transition = - obs_data_get_string(array_obj, "transition"); - const char *sceneTransitionsStr = - obs_data_get_string(array_obj, "Str"); + const char* scene1 = obs_data_get_string(array_obj, "Scene1"); + const char* scene2 = obs_data_get_string(array_obj, "Scene2"); + const char* transition = obs_data_get_string(array_obj, "transition"); + const char* sceneTransitionsStr = obs_data_get_string(array_obj, "Str"); - switcher->sceneTransitions.emplace_back( - GetWeakSourceByName(scene1), - GetWeakSourceByName(scene2), - GetWeakTransitionByName(transition), + switcher->sceneTransitions.emplace_back(GetWeakSourceByName(scene1), + GetWeakSourceByName(scene2), GetWeakTransitionByName(transition), sceneTransitionsStr); obs_data_release(array_obj); } string autoStopScene = obs_data_get_string(obj, "autoStopSceneName"); - switcher->autoStopEnable = obs_data_get_bool(obj,"autoStopEnable"); - switcher->autoStopScene = GetWeakSourceByName( - autoStopScene.c_str()); + switcher->autoStopEnable = obs_data_get_bool(obj, "autoStopEnable"); + switcher->autoStopScene = GetWeakSourceByName(autoStopScene.c_str()); switcher->fileIO.readEnabled = obs_data_get_bool(obj, "readEnabled"); switcher->fileIO.readPath = obs_data_get_string(obj, "readPath"); @@ -1789,69 +1848,71 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) static inline OBSWeakSource getNextTransition(OBSWeakSource scene1, OBSWeakSource scene2) { OBSWeakSource ws; - for (SceneTransition &t : switcher->sceneTransitions){ - if (t.scene1 == scene1 && t.scene2 == scene2) ws = t.transition; + for (SceneTransition& t : switcher->sceneTransitions) + { + if (t.scene1 == scene1 && t.scene2 == scene2) + ws = t.transition; } return ws; } void SwitcherData::Thread() { - chrono::duration duration = - chrono::milliseconds(interval); + chrono::duration duration = chrono::milliseconds(interval); string lastTitle; string title; - while (true) { + while (true) + { unique_lock lock(waitMutex); - //unique_lock transitionLock(transitionWaitMutex); + // unique_lock transitionLock(transitionWaitMutex); OBSWeakSource scene; OBSWeakSource transition; - //obs_source_t *oldTransition = obs_frontend_get_current_transition(); + // obs_source_t *oldTransition = obs_frontend_get_current_transition(); bool match = false; bool fullscreen = false; bool pause = false; bool sceneRoundTripActive = false; - obs_source_t *currentSource = - obs_frontend_get_current_scene(); + // Files + // TODO add transitions to output file / read them in the input file + obs_source_t* currentSource = obs_frontend_get_current_scene(); - //Files - //TODO add transitions to output file / read them in the input file - if (fileIO.writeEnabled){ + if (fileIO.writeEnabled) + { QFile file(QString::fromStdString(fileIO.writePath)); - if (file.open(QIODevice::WriteOnly)){ - const char *msg = obs_source_get_name(currentSource); + if (file.open(QIODevice::WriteOnly)) + { + const char* msg = obs_source_get_name(currentSource); file.write(msg, qstrlen(msg)); file.close(); } } + obs_source_release(currentSource); + cv.wait_for(lock, duration); { lock_guard lock(threadEndMutex); - if (stop) { - obs_source_release(currentSource); + if (stop) + { break; } } - //threadEndMutex.lock(); - //if (stop) { - // threadEndMutex.unlock(); - // break; - //} - //else threadEndMutex.unlock(); - if (fileIO.readEnabled){ + currentSource = obs_frontend_get_current_scene(); + + if (fileIO.readEnabled) + { QFile file(QString::fromStdString(fileIO.readPath)); - if (file.open(QIODevice::ReadOnly)){ + if (file.open(QIODevice::ReadOnly)) + { QTextStream in(&file); QString sceneStr = in.readLine(); - obs_source_t *scene = - obs_get_source_by_name(sceneStr.toUtf8().constData()); + obs_source_t* scene = obs_get_source_by_name(sceneStr.toUtf8().constData()); if (scene && scene != currentSource) - //add transitions check here too + // add transitions check here too obs_frontend_set_current_scene(scene); file.close(); obs_source_release(scene); @@ -1860,12 +1921,13 @@ void SwitcherData::Thread() continue; } - //End Files + // End Files - //Auto stop streaming/recording + // Auto stop streaming/recording OBSWeakSource ws = obs_source_get_weak_source(currentSource); - if (autoStopScene == ws) { + if (autoStopScene == ws) + { if (obs_frontend_streaming_active()) obs_frontend_streaming_stop(); if (obs_frontend_recording_active()) @@ -1873,13 +1935,15 @@ void SwitcherData::Thread() } obs_weak_source_release(ws); - //End auto stop streaming/recording + // End auto stop streaming/recording - //Pause + // Pause - for (OBSWeakSource &s : pauseScenesSwitches) { + for (OBSWeakSource& s : pauseScenesSwitches) + { OBSWeakSource ws = obs_source_get_weak_source(currentSource); - if (s == ws) { + if (s == ws) + { pause = true; obs_weak_source_release(ws); break; @@ -1887,45 +1951,55 @@ void SwitcherData::Thread() obs_weak_source_release(ws); } - if (!pause){ + if (!pause) + { GetCurrentWindowTitle(title); - for (string &window : pauseWindowsSwitches) { - if (window == title) { + for (string& window : pauseWindowsSwitches) + { + if (window == title) + { pause = true; break; } } } - if (!pause){ + if (!pause) + { GetCurrentWindowTitle(title); - for (string &window : pauseWindowsSwitches) { - try { - bool matches = regex_match( - title, regex(window)); - if (matches) { + for (string& window : pauseWindowsSwitches) + { + try + { + bool matches = regex_match(title, regex(window)); + if (matches) + { pause = true; break; } } - catch (const regex_error &) {} + catch (const regex_error&) + { + } } } - if (pause){ + if (pause) + { obs_source_release(currentSource); continue; } - //End Pause + // End Pause - //Scene Round Trip + // Scene Round Trip - for (SceneRoundTripSwitch &s : sceneRoundTripSwitches) + for (SceneRoundTripSwitch& s : sceneRoundTripSwitches) { OBSWeakSource ws = obs_source_get_weak_source(currentSource); - if (s.scene1 == ws) { + if (s.scene1 == ws) + { sceneRoundTripActive = true; int dur = s.delay * 1000 - interval; if (dur > 30) @@ -1933,14 +2007,13 @@ void SwitcherData::Thread() else cv.wait_for(lock, chrono::milliseconds(30)); - obs_source_t *source = - obs_weak_source_get_source(s.scene2); - obs_source_t *currentSource2 = - obs_frontend_get_current_scene(); + obs_source_t* source = obs_weak_source_get_source(s.scene2); + obs_source_t* currentSource2 = obs_frontend_get_current_scene(); - //don't switch if user changed scene manually - if (currentSource == currentSource2){ - obs_source_t *transition; + // don't switch if user changed scene manually + if (currentSource == currentSource2) + { + obs_source_t* transition; OBSWeakSource transitionWs = getNextTransition(s.scene1, s.scene2); if (transitionWs) @@ -1949,12 +2022,12 @@ void SwitcherData::Thread() transition = obs_weak_source_get_source(s.transition); obs_frontend_set_current_transition(transition); - //transitionWaitMutex2.lock(); + // transitionWaitMutex2.lock(); obs_frontend_set_current_scene(source); - //transitionWaitMutex2.unlock(); - //longest transition duration 10s - //transitionCv.wait_for(transitionLock,chrono::seconds(10)); - //obs_frontend_set_current_transition(oldTransition); + // transitionWaitMutex2.unlock(); + // longest transition duration 10s + // transitionCv.wait_for(transitionLock,chrono::seconds(10)); + // obs_frontend_set_current_transition(oldTransition); obs_source_release(transition); } @@ -1970,21 +2043,24 @@ void SwitcherData::Thread() obs_source_release(currentSource); - if (sceneRoundTripActive){ - //obs_source_release(oldTransition); + if (sceneRoundTripActive) + { + // obs_source_release(oldTransition); continue; } - //End Scene Round Trip + // End Scene Round Trip duration = chrono::milliseconds(interval); GetCurrentWindowTitle(title); - //Ignore Windows + // Ignore Windows - for (auto &window : ignoreWindowsSwitches){ - if (window == title){ + for (auto& window : ignoreWindowsSwitches) + { + if (window == title) + { title = lastTitle; break; } @@ -1992,14 +2068,16 @@ void SwitcherData::Thread() lastTitle = title; - //End Ignore Windows + // End Ignore Windows - //Regular switch + // Regular switch switcher->Prune(); - for (SceneSwitch &s : switches) { - if (s.window == title) { + for (SceneSwitch& s : switches) + { + if (s.window == title) + { match = true; scene = s.scene; transition = s.transition; @@ -2009,13 +2087,15 @@ void SwitcherData::Thread() } /* try regex */ - if (!match) { - for (SceneSwitch &s : switches) { - try { - - bool matches = regex_match( - title, regex(s.window)); - if (matches) { + if (!match) + { + for (SceneSwitch& s : switches) + { + try + { + bool matches = regex_match(title, regex(s.window)); + if (matches) + { match = true; scene = s.scene; transition = s.transition; @@ -2023,20 +2103,25 @@ void SwitcherData::Thread() break; } } - catch (const regex_error &) {} + catch (const regex_error&) + { + } } } - //End regular switch + // End regular switch - //Screen Region + // Screen Region - if (!match){ + if (!match) + { pair cursorPos = getCursorPos(); int minRegionSize = 99999; - for (auto &s : screenRegionSwitches){ - if (cursorPos.first >= s.minX && cursorPos.second >= s.minY && cursorPos.first <= s.maxX && cursorPos.second <= s.maxY) + for (auto& s : screenRegionSwitches) + { + if (cursorPos.first >= s.minX && cursorPos.second >= s.minY + && cursorPos.first <= s.maxX && cursorPos.second <= s.maxY) { int regionSize = (s.maxX - s.minX) + (s.maxY - s.minY); if (regionSize < minRegionSize) @@ -2050,75 +2135,79 @@ void SwitcherData::Thread() } } - //End Screen Region + // End Screen Region - //Fullscreen + // Fullscreen match = match && (!fullscreen || (fullscreen && isFullscreen())); - //End fullscreen + // End fullscreen - //Backup Scene + // Backup Scene - if (!match && switchIfNotMatching && - nonMatchingScene) { + if (!match && switchIfNotMatching && nonMatchingScene) + { match = true; scene = nonMatchingScene; } - //End Backup Scene + // End Backup Scene - //Switch scene + // Switch scene - if (match) { - obs_source_t *source = - obs_weak_source_get_source(scene); - obs_source_t *currentSource = - obs_frontend_get_current_scene(); + if (match) + { + obs_source_t* source = obs_weak_source_get_source(scene); + obs_source_t* currentSource = obs_frontend_get_current_scene(); - if (source && source != currentSource){ - obs_source_t *nextTransition; + if (source && source != currentSource) + { + obs_source_t* nextTransition; OBSWeakSource currentScene = obs_source_get_weak_source(currentSource); obs_weak_source_release(currentScene); OBSWeakSource nextTransitionWs = getNextTransition(currentScene, scene); - if (nextTransitionWs){ - obs_source_t *nextTransition = obs_weak_source_get_source(nextTransitionWs); + if (nextTransitionWs) + { + obs_source_t* nextTransition = obs_weak_source_get_source(nextTransitionWs); obs_frontend_set_current_transition(nextTransition); obs_source_release(nextTransition); } - else if (transition){ - obs_source_t *nextTransition = obs_weak_source_get_source(transition); + else if (transition) + { + obs_source_t* nextTransition = obs_weak_source_get_source(transition); obs_frontend_set_current_transition(nextTransition); obs_source_release(nextTransition); } - //transitionWaitMutex2.lock(); + // transitionWaitMutex2.lock(); obs_frontend_set_current_scene(source); - //transitionWaitMutex2.unlock(); - //longest transition duration 10s - //transitionCv.wait_for(transitionLock, chrono::seconds(10)); - //obs_frontend_set_current_transition(oldTransition); - + // transitionWaitMutex2.unlock(); + // longest transition duration 10s + // transitionCv.wait_for(transitionLock, chrono::seconds(10)); + // obs_frontend_set_current_transition(oldTransition); } obs_source_release(currentSource); obs_source_release(source); } - //End switch scene - - //obs_source_release(oldTransition); + // End switch scene + // obs_source_release(oldTransition); } } void SwitcherData::Start() { - if (!th.joinable()){ + if (!th.joinable()) + { threadEndMutex.lock(); stop = false; threadEndMutex.unlock(); - switcher->th = thread([]() {switcher->Thread(); }); + switcher->th = thread([]() + { + switcher->Thread(); + }); } } @@ -2132,9 +2221,9 @@ void SwitcherData::Stop() th.join(); } -//HOTKEY +// HOTKEY -void startStopHotkeyFunc(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, bool pressed) +void startStopHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed) { UNUSED_PARAMETER(data); UNUSED_PARAMETER(hotkey); @@ -2147,16 +2236,19 @@ void startStopHotkeyFunc(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, boo switcher->Start(); } - obs_data_array *hotkeyData = obs_hotkey_save(id); + obs_data_array* hotkeyData = obs_hotkey_save(id); - if (hotkeyData != NULL) { - char *path = obs_module_config_path(""); + if (hotkeyData != NULL) + { + char* path = obs_module_config_path(""); ofstream file; file.open(string(path).append("hotkey.txt"), ofstream::trunc); - if (file.is_open()) { + if (file.is_open()) + { size_t num = obs_data_array_count(hotkeyData); - for (size_t i = 0; i < num; i++) { - obs_data_t *data = obs_data_array_item(hotkeyData, i); + for (size_t i = 0; i < num; i++) + { + obs_data_t* data = obs_data_array_item(hotkeyData, i); string temp = obs_data_get_json(data); obs_data_release(data); file << temp; @@ -2168,10 +2260,10 @@ void startStopHotkeyFunc(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, boo obs_data_array_release(hotkeyData); } -string loadConfigFile(string filename) +string loadConfigFile(string filename) { ifstream settingsFile; - char *path = obs_module_config_path(""); + char* path = obs_module_config_path(""); string value; settingsFile.open(string(path).append(filename)); @@ -2187,13 +2279,13 @@ string loadConfigFile(string filename) return value; } -void loadKeybinding(obs_hotkey_id hotkeyId) +void loadKeybinding(obs_hotkey_id hotkeyId) { string bindings = loadConfigFile("hotkey.txt"); if (!bindings.empty()) { - obs_data_array_t *hotkeyData = obs_data_array_create(); - obs_data_t *data = obs_data_create_from_json(bindings.c_str()); + obs_data_array_t* hotkeyData = obs_data_array_create(); + obs_data_t* data = obs_data_create_from_json(bindings.c_str()); obs_data_array_insert(hotkeyData, 0, data); obs_data_release(data); obs_hotkey_load(hotkeyId, hotkeyData); @@ -2201,7 +2293,7 @@ void loadKeybinding(obs_hotkey_id hotkeyId) } } -//END HOTKEY +// END HOTKEY extern "C" void FreeSceneSwitcher() { @@ -2209,28 +2301,29 @@ extern "C" void FreeSceneSwitcher() switcher = nullptr; } -static void OBSEvent(enum obs_frontend_event event, void * switcher) +static void OBSEvent(enum obs_frontend_event event, void* switcher) { - if (event == OBS_FRONTEND_EVENT_EXIT){ + if (event == OBS_FRONTEND_EVENT_EXIT) + { FreeSceneSwitcher(); } - //needed to reset the transition, but buggy now - //if (event == OBS_FRONTEND_EVENT_TRANSITION_STOPPED){ + // needed to reset the transition, but buggy now + // if (event == OBS_FRONTEND_EVENT_TRANSITION_STOPPED){ // SwitcherData *test = (SwitcherData*)switcher; // test->transitionWaitMutex2.lock(); - // this_thread::sleep_for(chrono::milliseconds(100)); //seems necesssary since the transition is not always done + // this_thread::sleep_for(chrono::milliseconds(100)); //seems necesssary + // since the transition is not always done // test->transitionCv.notify_one(); // test->transitionWaitMutex2.unlock(); - // + // //} } extern "C" void InitSceneSwitcher() { - QAction *action = (QAction*)obs_frontend_add_tools_menu_qaction( - obs_module_text("Advanced Scene Switcher")); - + QAction* action + = (QAction*)obs_frontend_add_tools_menu_qaction(obs_module_text("Advanced Scene Switcher")); switcher = new SwitcherData; @@ -2238,8 +2331,7 @@ extern "C" void InitSceneSwitcher() { obs_frontend_push_ui_translation(obs_module_get_string); - QMainWindow *window = - (QMainWindow*)obs_frontend_get_main_window(); + QMainWindow* window = (QMainWindow*)obs_frontend_get_main_window(); SceneSwitcher ss(window); ss.exec(); @@ -2252,13 +2344,15 @@ extern "C" void InitSceneSwitcher() action->connect(action, &QAction::triggered, cb); - char *path = obs_module_config_path(""); + char* path = obs_module_config_path(""); QDir dir(path); - if (!dir.exists()){ + if (!dir.exists()) + { dir.mkpath("."); } bfree(path); - obs_hotkey_id pauseHotkeyId = obs_hotkey_register_frontend("startStopSwitcherHotkey", "Toggle Start/Stop for the Advanced Scene Switcher", startStopHotkeyFunc, NULL); + obs_hotkey_id pauseHotkeyId = obs_hotkey_register_frontend("startStopSwitcherHotkey", + "Toggle Start/Stop for the Advanced Scene Switcher", startStopHotkeyFunc, NULL); loadKeybinding(pauseHotkeyId); } \ No newline at end of file