Add files via upload

This commit is contained in:
WarmUpTill 2016-05-19 15:58:38 +02:00
parent 8862f66d21
commit b4df4febac
5 changed files with 293 additions and 0 deletions

62
ObsSceneSwitcher.cpp Normal file
View 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
View 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
View 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
View 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
View 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);