mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-21 17:34:57 -05:00
Add files via upload
This commit is contained in:
parent
8862f66d21
commit
b4df4febac
62
ObsSceneSwitcher.cpp
Normal file
62
ObsSceneSwitcher.cpp
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
// DexterSceneSwitcher.cpp : Defines the exported functions for the DLL application.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "switcher.h"
|
||||
#include <obs-module.h>
|
||||
#include <thread>
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
OBS_DECLARE_MODULE()
|
||||
|
||||
bool running = false;
|
||||
Switcher switcher;
|
||||
thread switcherThread;
|
||||
|
||||
bool obs_module_load(void)
|
||||
{
|
||||
//maybe do some UI stuff?
|
||||
|
||||
//void obs_register_modeless_ui(const struct obs_modeless_ui *info);
|
||||
|
||||
//create thread
|
||||
running = true;
|
||||
map<string,string> s = switcher.load();
|
||||
switcherThread = thread(switcherThreadFunc, s);
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void obs_module_unload(void)
|
||||
{
|
||||
if(running)
|
||||
{
|
||||
//tell the thread to stop working
|
||||
switcher.stop();
|
||||
switcherThread.join();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const char *obs_module_author(void)
|
||||
{
|
||||
return "WarmUpTill";
|
||||
}
|
||||
|
||||
const char *obs_module_name(void)
|
||||
{
|
||||
return "DexterSceneSwitcher";
|
||||
}
|
||||
|
||||
const char *obs_module_description(void)
|
||||
{
|
||||
return "SceneSwitching for Dexter";
|
||||
}
|
||||
|
||||
|
||||
78
settings.cpp
Normal file
78
settings.cpp
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
#pragma once
|
||||
|
||||
#include "stdafx.h"
|
||||
#include <map>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
#include <tchar.h>
|
||||
#include <shlwapi.h>
|
||||
#pragma comment(lib,"shlwapi.lib")
|
||||
#include "shlobj.h"
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
//possible settings:
|
||||
//
|
||||
//file path
|
||||
//transition delay / type
|
||||
//...
|
||||
|
||||
class Settings {
|
||||
map<string, string> settings;
|
||||
public:
|
||||
void load(string);
|
||||
map<string, string> getMap();
|
||||
private :
|
||||
void addToMap(string, string);
|
||||
|
||||
};
|
||||
|
||||
void Settings::load(string filepath) {
|
||||
|
||||
|
||||
//read the settings file (csv like, each line is assignment of window -> scene)
|
||||
std::vector<std::string> settingsElements;
|
||||
int numValues = 0;
|
||||
ifstream infile(filepath);
|
||||
string value;
|
||||
string line;
|
||||
|
||||
while (infile.good())
|
||||
{
|
||||
getline(infile, line);
|
||||
stringstream lineStream = stringstream(line);
|
||||
while (lineStream.good()) {
|
||||
getline(lineStream, value, ',');
|
||||
settingsElements.push_back(value);
|
||||
}
|
||||
|
||||
|
||||
numValues++;
|
||||
}
|
||||
|
||||
//create settings map containgin windowname and desired scene
|
||||
for (int i = 0; i < numValues; ) {
|
||||
string s2 = settingsElements.back();
|
||||
settingsElements.pop_back();
|
||||
i++;
|
||||
string s1 = settingsElements.back();
|
||||
settingsElements.pop_back();
|
||||
i++;
|
||||
//window name , scene
|
||||
Settings::addToMap(s1, s2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Settings::addToMap(string s1, string s2) {
|
||||
settings.insert(pair<string, string>(s1, s2));
|
||||
}
|
||||
|
||||
map<string, string> Settings::getMap() {
|
||||
return settings;
|
||||
}
|
||||
|
||||
19
settings.h
Normal file
19
settings.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#pragma once
|
||||
#include <map>
|
||||
|
||||
|
||||
#ifndef SETTINGS_H
|
||||
#define SETTINGS_H
|
||||
|
||||
using namespace std;
|
||||
class Settings {
|
||||
map<string, string> settings;
|
||||
public:
|
||||
void load(string);
|
||||
map<string, string> getMap();
|
||||
private:
|
||||
void addToMap(string, string);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
111
switcher.cpp
Normal file
111
switcher.cpp
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
#pragma once
|
||||
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "settings.h"
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
#include <obs.h>
|
||||
|
||||
|
||||
|
||||
using namespace std;
|
||||
|
||||
//is the thread running? see below :D
|
||||
static bool isRunning = true;
|
||||
string GetActiveWindowTitle();
|
||||
|
||||
class Switcher {
|
||||
public:
|
||||
map<string, string> load();
|
||||
void stop();
|
||||
private:
|
||||
Settings settings;
|
||||
map<string, string> settingsMap;
|
||||
};
|
||||
|
||||
//scene switching is done in here
|
||||
void switcherThreadFunc(map<string, string> settingsMap) {
|
||||
|
||||
string windowname = "";
|
||||
|
||||
while (isRunning) {
|
||||
|
||||
//get active window title
|
||||
windowname = GetActiveWindowTitle();
|
||||
|
||||
//do we know the window title?
|
||||
if (!(settingsMap.find(windowname) == settingsMap.end())) {
|
||||
|
||||
//check if current scene is already the desired scene
|
||||
const char * name = settingsMap.find(windowname)->second.c_str();
|
||||
|
||||
//remember to release all sources
|
||||
obs_source_t * transitionUsed = obs_get_output_source(0);
|
||||
obs_source_t * sceneUsed = obs_transition_get_active_source(transitionUsed);
|
||||
const char * sceneUsedName = obs_source_get_name(sceneUsed);
|
||||
|
||||
//NOTE: transitions seem to be scenes and will be canceled unless we check if the current scene is a transition
|
||||
if ((sceneUsedName) && strcmp(sceneUsedName,name) != 0) {
|
||||
//switch scene
|
||||
obs_source_t *source = obs_get_source_by_name(name);
|
||||
if (source == NULL)
|
||||
{
|
||||
//warn("Source not found: \"%s\"", name);
|
||||
;
|
||||
}
|
||||
else if (obs_scene_from_source(source) == NULL)
|
||||
{
|
||||
//warn("\"%s\" is not a scene", name);
|
||||
;
|
||||
}
|
||||
else {
|
||||
//create transition to new scene (otherwise UI wont work anymore)
|
||||
//OBS_TRANSITION_MODE_AUTO uses the obs user settings for transitions
|
||||
obs_transition_start(transitionUsed, OBS_TRANSITION_MODE_AUTO, 300, source);
|
||||
}
|
||||
obs_source_release(source);
|
||||
}
|
||||
obs_source_release(sceneUsed);
|
||||
obs_source_release(transitionUsed);
|
||||
}
|
||||
//sleep for a bit
|
||||
this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//load the settings needed to start the thread
|
||||
map<string, string> Switcher::load() {
|
||||
//settings file in
|
||||
string settingsFilePath = "..\\..\\data\\obs-plugins\\DexterSceneSwitcher\\settings.txt"; //"..\\..\\data\\obs-plugins\\DexterSceneSwitcher\\settings.txt";
|
||||
settings.load(settingsFilePath);
|
||||
map<string,string> settingsMap = settings.getMap();
|
||||
isRunning = true;
|
||||
string message = "The following settings were found for Scene Switcher:\n";
|
||||
for (auto it = settingsMap.cbegin(); it != settingsMap.cend(); ++it)
|
||||
{
|
||||
message += (it->first) + " -> " + it->second + "\n";
|
||||
}
|
||||
MessageBox(0, message.c_str(), "Scene Switcher", 0);
|
||||
return settingsMap;
|
||||
|
||||
}
|
||||
|
||||
//reads the title of the currently active window
|
||||
string GetActiveWindowTitle()
|
||||
{
|
||||
char wnd_title[256];
|
||||
HWND hwnd = GetForegroundWindow(); // get handle of currently active window
|
||||
GetWindowTextA(hwnd, wnd_title, sizeof(wnd_title));
|
||||
return wnd_title;
|
||||
}
|
||||
|
||||
//tell the thread to stop
|
||||
void Switcher::stop() {
|
||||
isRunning = false; //isRunning seems to be called randomly and disables the plugin (?)
|
||||
return;
|
||||
}
|
||||
23
switcher.h
Normal file
23
switcher.h
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#pragma once
|
||||
#include "settings.h"
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Switcher {
|
||||
public:
|
||||
map<string, string> load();
|
||||
void stop();
|
||||
private:
|
||||
Settings settings;
|
||||
map<string, string> settingsMap;
|
||||
};
|
||||
|
||||
|
||||
string GetActiveWindowTitle();
|
||||
void switcherThreadFunc(map<string, string> settingsMap);
|
||||
Loading…
Reference in New Issue
Block a user