Dwayne Harris 2 years ago
parent
commit
ffeffa1008
  1. 26
      main-window.cpp
  2. 6
      main-window.hpp
  3. 87
      obs-manager.cpp
  4. 41
      obs-manager.hpp
  5. 3
      preview-window.cpp
  6. 2
      settings-manager.cpp
  7. 10
      settings-window.cpp
  8. 1
      settings-window.hpp

26
main-window.cpp

@ -9,6 +9,7 @@ using namespace std;
MainWindow::MainWindow(OBSManager *obs) MainWindow::MainWindow(OBSManager *obs)
: mBoxMain(Gtk::Orientation::ORIENTATION_VERTICAL, 2), : mBoxMain(Gtk::Orientation::ORIENTATION_VERTICAL, 2),
mButtonPreview("Start Preview"),
mButtonStart("Start Recording"), mButtonStart("Start Recording"),
mButtonSettings("Settings"), mButtonSettings("Settings"),
mButtonExit("Exit"), mButtonExit("Exit"),
@ -21,7 +22,11 @@ MainWindow::MainWindow(OBSManager *obs)
set_border_width(10); set_border_width(10);
mOBS = obs; mOBS = obs;
mOBS->startRecording.connect(sigc::mem_fun(*this, &MainWindow::recordingStarted));
mOBS->stopRecording.connect(sigc::mem_fun(*this, &MainWindow::recordingStopped));
mButtonPreview.signal_clicked().connect(
sigc::mem_fun(*this, &MainWindow::onPreviewClicked));
mButtonStart.signal_clicked().connect( mButtonStart.signal_clicked().connect(
sigc::mem_fun(*this, &MainWindow::onStartClicked)); sigc::mem_fun(*this, &MainWindow::onStartClicked));
mButtonSettings.signal_clicked().connect( mButtonSettings.signal_clicked().connect(
@ -29,6 +34,7 @@ MainWindow::MainWindow(OBSManager *obs)
mButtonExit.signal_clicked().connect( mButtonExit.signal_clicked().connect(
sigc::mem_fun(*this, &MainWindow::onExitClicked)); sigc::mem_fun(*this, &MainWindow::onExitClicked));
mBoxMain.add(mButtonPreview);
mBoxMain.add(mButtonStart); mBoxMain.add(mButtonStart);
mBoxMain.add(mButtonSettings); mBoxMain.add(mButtonSettings);
mBoxMain.add(mButtonExit); mBoxMain.add(mButtonExit);
@ -50,11 +56,19 @@ MainWindow::~MainWindow()
mOBS->Cleanup(); mOBS->Cleanup();
} }
void MainWindow::onStartClicked()
void MainWindow::onPreviewClicked()
{ {
mPreviewWindow.show(); mPreviewWindow.show();
} }
void MainWindow::onStartClicked()
{
if (mOBS->IsRecording())
mOBS->StopRecording();
else
mOBS->StartRecording();
}
void MainWindow::onSettingsClicked() void MainWindow::onSettingsClicked()
{ {
mSettingsWindow.set_transient_for(*this); mSettingsWindow.set_transient_for(*this);
@ -67,5 +81,15 @@ void MainWindow::onExitClicked()
Gtk::Main::quit(); Gtk::Main::quit();
} }
void MainWindow::recordingStarted()
{
mButtonStart.set_label("Stop Recording");
}
void MainWindow::recordingStopped()
{
mButtonStart.set_label("Start Recording");
}

6
main-window.hpp

@ -14,16 +14,22 @@ public:
virtual ~MainWindow(); virtual ~MainWindow();
private: private:
OBSManager *mOBS; OBSManager *mOBS;
void onPreviewClicked();
void onStartClicked(); void onStartClicked();
void onSettingsClicked(); void onSettingsClicked();
void onExitClicked(); void onExitClicked();
Gtk::Box mBoxMain; Gtk::Box mBoxMain;
Gtk::Button mButtonPreview;
Gtk::Button mButtonStart; Gtk::Button mButtonStart;
Gtk::Button mButtonSettings; Gtk::Button mButtonSettings;
Gtk::Button mButtonExit; Gtk::Button mButtonExit;
Gtk::Label mLabelVersion; Gtk::Label mLabelVersion;
SettingsWindow mSettingsWindow; SettingsWindow mSettingsWindow;
PreviewWindow mPreviewWindow; PreviewWindow mPreviewWindow;
// Signals
void recordingStarted();
void recordingStopped();
}; };
#endif #endif

87
obs-manager.cpp

@ -1,24 +1,30 @@
#include "obs-manager.hpp" #include "obs-manager.hpp"
#include "settings-manager.hpp" #include "settings-manager.hpp"
#include <obs/obs.h>
#include <gdkmm/display.h>
#include <glibmm/ustring.h>
#include <gdk/gdkx.h>
#include <X11/X.h>
#include <ctime> #include <ctime>
#include <list> #include <list>
#include <filesystem> #include <filesystem>
#include <stdexcept> #include <stdexcept>
using namespace std; using namespace std;
using namespace Glib;
static void obs_render(void *param, uint32_t cx, uint32_t cy) static void obs_render(void *param, uint32_t cx, uint32_t cy)
{ {
obs_render_main_texture(); obs_render_main_texture();
} }
static void OBSStartRecording(void *data, calldata_t *params)
{
OBSManager *o = static_cast<OBSManager*>(data);
o->startRecording.emit();
}
static void OBSStopRecording(void *data, calldata_t *params)
{
OBSManager *o = static_cast<OBSManager*>(data);
o->stopRecording.emit();
}
OBSManager::OBSManager() OBSManager::OBSManager()
{ {
mPlugins = { mPlugins = {
@ -35,9 +41,9 @@ OBSManager::~OBSManager()
Cleanup(); Cleanup();
} }
ustring OBSManager::GetVersion()
string OBSManager::GetVersion()
{ {
return ustring(obs_get_version_string());
return string(obs_get_version_string());
} }
void OBSManager::Initialize() void OBSManager::Initialize()
@ -45,7 +51,7 @@ void OBSManager::Initialize()
if (isInitialized) if (isInitialized)
return; return;
sources = list<obs_source_t*>();
mSources = list<OBSSource>();
auto settings = new SettingsManager(); auto settings = new SettingsManager();
LoadSettings(settings); LoadSettings(settings);
@ -53,7 +59,6 @@ void OBSManager::Initialize()
throw runtime_error("Failed to initialize OBS"); throw runtime_error("Failed to initialize OBS");
loadPlugins(); loadPlugins();
printTypes();
obs_video_info v = {}; obs_video_info v = {};
v.graphics_module = "libobs-opengl.so.0"; v.graphics_module = "libobs-opengl.so.0";
@ -92,13 +97,13 @@ void OBSManager::SetPreviewWindow(XID wid, Display *wdisplay)
init.window.id = wid; init.window.id = wid;
init.window.display = (void*)wdisplay; init.window.display = (void*)wdisplay;
display = obs_display_create(&init, 0);
if (display == nullptr)
mDisplay = obs_display_create(&init, 0);
if (mDisplay == nullptr)
throw runtime_error("Failed to create display"); throw runtime_error("Failed to create display");
obs_display_add_draw_callback(display, obs_render, nullptr);
obs_display_add_draw_callback(mDisplay, obs_render, nullptr);
obs_scene_t *scene = obs_scene_create("scene1");
OBSScene scene = obs_scene_create("scene1");
if (scene == NULL) if (scene == NULL)
throw runtime_error("Couldn't create scene\n"); throw runtime_error("Couldn't create scene\n");
@ -106,7 +111,7 @@ void OBSManager::SetPreviewWindow(XID wid, Display *wdisplay)
{ {
auto source = CreateScreenSource(); auto source = CreateScreenSource();
obs_scene_add(scene, source); obs_scene_add(scene, source);
sources.push_back(source);
mSources.push_back(source);
} }
if (settings->GetBool(SETTINGS_KEY_WEBCAM_ENABLED)) if (settings->GetBool(SETTINGS_KEY_WEBCAM_ENABLED))
@ -117,14 +122,14 @@ void OBSManager::SetPreviewWindow(XID wid, Display *wdisplay)
auto source = CreateWebcamSource(); auto source = CreateWebcamSource();
auto item = obs_scene_add(scene, source); auto item = obs_scene_add(scene, source);
obs_sceneitem_set_scale(item, &scale); obs_sceneitem_set_scale(item, &scale);
sources.push_back(source);
mSources.push_back(source);
} }
if (settings->GetBool(SETTINGS_KEY_AUDIO_ENABLED)) if (settings->GetBool(SETTINGS_KEY_AUDIO_ENABLED))
{ {
auto source = CreateAudioSource(); auto source = CreateAudioSource();
obs_scene_add(scene, source); obs_scene_add(scene, source);
sources.push_back(source);
mSources.push_back(source);
} }
obs_set_output_source(0, obs_scene_get_source(scene)); obs_set_output_source(0, obs_scene_get_source(scene));
@ -153,31 +158,34 @@ void OBSManager::StartRecording()
obs_data_set_string(settings, "directory", path.c_str()); obs_data_set_string(settings, "directory", path.c_str());
obs_data_set_string(settings, "url", fileName.c_str()); obs_data_set_string(settings, "url", fileName.c_str());
output = obs_output_create("ffmpeg_output", "ffmpeg_output", nullptr, nullptr);
obs_output_set_video_encoder(output, venc);
obs_output_set_audio_encoder(output, aenc, 0);
obs_output_update(output, settings);
obs_output_set_media(output, obs_get_video(), obs_get_audio());
mOutput = obs_output_create("ffmpeg_output", "ffmpeg_output", nullptr, nullptr);
obs_output_set_video_encoder(mOutput, venc);
obs_output_set_audio_encoder(mOutput, aenc, 0);
obs_output_update(mOutput, settings);
obs_output_set_media(mOutput, obs_get_video(), obs_get_audio());
obs_data_release(settings); obs_data_release(settings);
if (!obs_output_start(output))
if (!obs_output_start(mOutput))
throw runtime_error("Failed to start recording"); throw runtime_error("Failed to start recording");
obsStartRecording.Connect(obs_output_get_signal_handler(mOutput), "start", OBSStartRecording, this);
obsStopRecording.Connect(obs_output_get_signal_handler(mOutput), "stop", OBSStopRecording, this);
isRecording = true; isRecording = true;
} }
void OBSManager::StopRecording() void OBSManager::StopRecording()
{ {
if (isRecording && output != nullptr)
obs_output_stop(output);
if (isRecording && mOutput != nullptr)
obs_output_stop(mOutput);
isRecording = false; isRecording = false;
} }
obs_source_t *OBSManager::CreateScreenSource()
OBSSource OBSManager::CreateScreenSource()
{ {
obs_data_t *settings = obs_data_create(); obs_data_t *settings = obs_data_create();
obs_source_t *source = obs_source_create("xshm_input", "Screen Source", settings, NULL);
OBSSource source = obs_source_create("xshm_input", "Screen Source", settings, NULL);
if (source == NULL) if (source == NULL)
throw runtime_error("Couldn't create screen source"); throw runtime_error("Couldn't create screen source");
@ -185,12 +193,12 @@ obs_source_t *OBSManager::CreateScreenSource()
return source; return source;
} }
obs_source_t *OBSManager::CreateWebcamSource()
OBSSource OBSManager::CreateWebcamSource()
{ {
obs_data_t *settings = obs_data_create(); obs_data_t *settings = obs_data_create();
obs_data_set_string(settings, "device_id", mWebcamDeviceID.c_str()); obs_data_set_string(settings, "device_id", mWebcamDeviceID.c_str());
obs_source_t *source = obs_source_create("v4l2_input", "Webcam Source", settings, NULL);
OBSSource source = obs_source_create("v4l2_input", "Webcam Source", settings, NULL);
if (source == NULL) if (source == NULL)
throw runtime_error("Couldn't create webcam source"); throw runtime_error("Couldn't create webcam source");
@ -198,10 +206,10 @@ obs_source_t *OBSManager::CreateWebcamSource()
return source; return source;
} }
obs_source_t *OBSManager::CreateAudioSource()
OBSSource OBSManager::CreateAudioSource()
{ {
obs_data_t *settings = obs_data_create(); obs_data_t *settings = obs_data_create();
obs_source_t *source = obs_source_create("audio_line", "Audio Source", settings, NULL);
OBSSource source = obs_source_create("audio_line", "Audio Source", settings, NULL);
if (source == NULL) if (source == NULL)
throw runtime_error("Couldn't create screen source"); throw runtime_error("Couldn't create screen source");
@ -216,13 +224,13 @@ void OBSManager::Cleanup()
StopRecording(); StopRecording();
for (auto source : sources)
for (auto source : mSources)
{ {
obs_source_remove(source); obs_source_remove(source);
} }
if (display != nullptr)
obs_display_destroy(display);
if (mDisplay != nullptr)
obs_display_destroy(mDisplay);
obs_shutdown(); obs_shutdown();
isInitialized = false; isInitialized = false;
@ -235,11 +243,16 @@ void OBSManager::LoadSettings(SettingsManager *settings)
mWebcamDeviceID = settings->Get(SETTINGS_KEY_VIDEO_DEVICE_ID); mWebcamDeviceID = settings->Get(SETTINGS_KEY_VIDEO_DEVICE_ID);
} }
void OBSManager::loadPlugin(ustring name)
bool OBSManager::IsRecording()
{
return isRecording;
}
void OBSManager::loadPlugin(string name)
{ {
obs_module_t *module; obs_module_t *module;
ustring path;
string path;
path.append(mPluginDir); path.append(mPluginDir);
path.append(name); path.append(name);
@ -253,7 +266,7 @@ void OBSManager::loadPlugin(ustring name)
void OBSManager::loadPlugins() void OBSManager::loadPlugins()
{ {
for (ustring plugin : mPlugins)
for (string plugin : mPlugins)
{ {
loadPlugin(plugin); loadPlugin(plugin);
} }

41
obs-manager.hpp

@ -1,15 +1,14 @@
#ifndef SCREEN_RECORDER_OBS_MANAGER_HPP #ifndef SCREEN_RECORDER_OBS_MANAGER_HPP
#define SCREEN_RECORDER_OBS_MANAGER_HPP #define SCREEN_RECORDER_OBS_MANAGER_HPP
#include "settings-manager.hpp"
#include <list> #include <list>
#include <gdkmm/display.h> #include <gdkmm/display.h>
#include <glibmm/ustring.h>
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#include <X11/X.h> #include <X11/X.h>
#include <obs/obs.h>
#include "settings-manager.hpp"
#include <obs/obs.hpp>
using namespace Glib;
using namespace std; using namespace std;
class OBSManager class OBSManager
@ -17,34 +16,42 @@ class OBSManager
public: public:
OBSManager(); OBSManager();
virtual ~OBSManager(); virtual ~OBSManager();
ustring GetVersion();
string GetVersion();
void Initialize(); void Initialize();
void SetPreviewWindow(XID wid, Display *wdisplay); void SetPreviewWindow(XID wid, Display *wdisplay);
void StartRecording(); void StartRecording();
void StopRecording(); void StopRecording();
obs_source_t *CreateScreenSource();
obs_source_t *CreateWebcamSource();
obs_source_t *CreateAudioSource();
OBSSource CreateScreenSource();
OBSSource CreateWebcamSource();
OBSSource CreateAudioSource();
void Cleanup(); void Cleanup();
void LoadSettings(SettingsManager *settings); void LoadSettings(SettingsManager *settings);
bool IsRecording();
int PreviewWidth = 1280; int PreviewWidth = 1280;
int PreviewHeight = 720; int PreviewHeight = 720;
// Signals
sigc::signal<void()> startRecording;
sigc::signal<void()> stopRecording;
private: private:
void printTypes();
bool isInitialized = false; bool isInitialized = false;
bool isRecording = false; bool isRecording = false;
obs_display_t *display;
obs_output_t *output;
list<obs_source_t*> sources;
ustring mPluginDir;
ustring mOutputDir;
ustring mWebcamDeviceID;
void printTypes();
OBSDisplay mDisplay;
OBSOutput mOutput;
OBSSignal obsStartRecording;
OBSSignal obsStopRecording;
list<OBSSource> mSources;
string mPluginDir;
string mOutputDir;
string mWebcamDeviceID;
// Plugins // Plugins
list<ustring> mPlugins;
void loadPlugin(ustring name);
void loadPlugin(string name);
void loadPlugins(); void loadPlugins();
list<string> mPlugins;
}; };
#endif #endif

3
preview-window.cpp

@ -11,7 +11,6 @@ PreviewWindow::PreviewWindow(OBSManager *obs)
PreviewWindow::~PreviewWindow() PreviewWindow::~PreviewWindow()
{ {
std::cout << "PreviewWindow::~PreviewWindow" << std::endl;
} }
void PreviewWindow::on_realize() void PreviewWindow::on_realize()
@ -28,11 +27,9 @@ void PreviewWindow::on_realize()
void PreviewWindow::on_show() void PreviewWindow::on_show()
{ {
Gtk::Widget::on_show(); Gtk::Widget::on_show();
mOBS->StartRecording();
} }
void PreviewWindow::on_hide() void PreviewWindow::on_hide()
{ {
Gtk::Widget::on_hide(); Gtk::Widget::on_hide();
mOBS->StopRecording();
} }

2
settings-manager.cpp

@ -102,7 +102,7 @@ void SettingsManager::readAll()
while (getline(fin, line)) while (getline(fin, line))
{ {
if (line.find("=") != -1)
if (line.find("=") != std::string::npos)
{ {
settings.push_back(new SettingsEntry{ settings.push_back(new SettingsEntry{
.key = line.substr(0, line.find("=")), .key = line.substr(0, line.find("=")),

10
settings-window.cpp

@ -33,8 +33,6 @@ SettingsWindow::SettingsWindow(OBSManager* obs)
settings = new SettingsManager(); settings = new SettingsManager();
populateVideoDevices();
signal_key_press_event().connect( signal_key_press_event().connect(
sigc::mem_fun(*this, &SettingsWindow::onKeyPressed)); sigc::mem_fun(*this, &SettingsWindow::onKeyPressed));
@ -104,6 +102,12 @@ SettingsWindow::~SettingsWindow()
{ {
} }
void SettingsWindow::on_show()
{
Gtk::Window::on_show();
populateVideoDevices();
}
bool SettingsWindow::onKeyPressed(GdkEventKey *event) bool SettingsWindow::onKeyPressed(GdkEventKey *event)
{ {
if (event->keyval == GDK_KEY_Escape) if (event->keyval == GDK_KEY_Escape)
@ -148,7 +152,7 @@ void SettingsWindow::populateVideoDevices()
continue; continue;
auto name = string(dp->d_name); auto name = string(dp->d_name);
if (name.find("video") == -1)
if (name.find("video") == string::npos)
continue; continue;
auto device = "/dev/" + name; auto device = "/dev/" + name;

1
settings-window.hpp

@ -38,6 +38,7 @@ private:
Gtk::Button mButtonClose; Gtk::Button mButtonClose;
Gtk::Button mButtonSave; Gtk::Button mButtonSave;
void on_show();
void populateVideoDevices(); void populateVideoDevices();
bool onKeyPressed(GdkEventKey* event); bool onKeyPressed(GdkEventKey* event);
void onClosePressed(); void onClosePressed();

Loading…
Cancel
Save