From 22fdda311d7b8630421f1601a6aef2f8de3fa570 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Tue, 25 Sep 2018 17:52:31 -0500 Subject: [PATCH] Decklink: add UI to control output --- UI/frontend-plugins/CMakeLists.txt | 1 + .../decklink-output-ui/CMakeLists.txt | 55 +++++++++++ .../decklink-output-ui/DecklinkOutputUI.cpp | 75 +++++++++++++++ .../decklink-output-ui/DecklinkOutputUI.h | 25 +++++ .../decklink-output-ui/data/.keepme | 0 .../decklink-output-ui/decklink-ui-main.cpp | 93 +++++++++++++++++++ .../decklink-output-ui/decklink-ui-main.h | 3 + .../decklink-output-ui/forms/output.ui | 56 +++++++++++ 8 files changed, 308 insertions(+) create mode 100644 UI/frontend-plugins/decklink-output-ui/CMakeLists.txt create mode 100644 UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp create mode 100644 UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h create mode 100644 UI/frontend-plugins/decklink-output-ui/data/.keepme create mode 100644 UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp create mode 100644 UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h create mode 100644 UI/frontend-plugins/decklink-output-ui/forms/output.ui diff --git a/UI/frontend-plugins/CMakeLists.txt b/UI/frontend-plugins/CMakeLists.txt index bd2d33681..908b5c768 100644 --- a/UI/frontend-plugins/CMakeLists.txt +++ b/UI/frontend-plugins/CMakeLists.txt @@ -1 +1,2 @@ +add_subdirectory(decklink-output-ui) add_subdirectory(frontend-tools) diff --git a/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt b/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt new file mode 100644 index 000000000..784c80841 --- /dev/null +++ b/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt @@ -0,0 +1,55 @@ +project(decklink-output-ui) + +if(APPLE) + find_library(COCOA Cocoa) + include_directories(${COCOA}) +endif() + +if(UNIX AND NOT APPLE) + find_package(X11 REQUIRED) + link_libraries(${X11_LIBRARIES}) + include_directories(${X11_INCLUDE_DIR}) +endif() + +set(decklink-ouput-ui_HEADERS + ${decklink-ouput-ui_HEADERS} + ../../properties-view.hpp + ../../properties-view.moc.hpp + ../../vertical-scroll-area.hpp + ../../double-slider.hpp + ./DecklinkOutputUI.h + decklink-ui-main.h + ) +set(decklink-ouput-ui_SOURCES + ${decklink-ouput-ui_SOURCES} + ../../properties-view.cpp + ../../vertical-scroll-area.cpp + ../../double-slider.cpp + ./DecklinkOutputUI.cpp + decklink-ui-main.cpp + ) +set(decklink-ouput-ui_UI + ${decklink-ouput-ui_UI} + forms/output.ui + ) + +if(APPLE) + set(decklink-ouput-ui_PLATFORM_LIBS + ${COCOA}) +endif() + +qt5_wrap_ui(decklink-ouput-ui_UI_HEADERS + ${decklink-ouput-ui_UI}) + +add_library(decklink-ouput-ui MODULE + ${decklink-ouput-ui_HEADERS} + ${decklink-ouput-ui_SOURCES} + ${decklink-ouput-ui_UI_HEADERS} + ) +target_link_libraries(decklink-ouput-ui + ${frontend-tools_PLATFORM_LIBS} + obs-frontend-api + Qt5::Widgets + libobs) + +install_obs_plugin_with_data(decklink-ouput-ui data) diff --git a/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp new file mode 100644 index 000000000..89afbf99d --- /dev/null +++ b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.cpp @@ -0,0 +1,75 @@ +#include "DecklinkOutputUI.h" +#include +#include +#include "decklink-ui-main.h" + +DecklinkOutputUI::DecklinkOutputUI(QWidget *parent) + : QDialog(parent), + ui(new Ui_Output) +{ + ui->setupUi(this); + + propertiesView = nullptr; + + connect(ui->startOutput, SIGNAL(released()), this, SLOT(StartOutput())); + connect(ui->stopOutput, SIGNAL(released()), this, SLOT(StopOutput())); +} + +void DecklinkOutputUI::ShowHideDialog() +{ + SetupPropertiesView(); + + setVisible(!isVisible()); +} + +void DecklinkOutputUI::SetupPropertiesView() +{ + if (propertiesView) + delete propertiesView; + + obs_data_t *settings = obs_data_create(); + + OBSData data = load_settings(); + if (data) + obs_data_apply(settings, data); + + propertiesView = new OBSPropertiesView(settings, + "decklink_output", + (PropertiesReloadCallback) obs_get_output_properties, + 170); + + ui->propertiesLayout->addWidget(propertiesView); + obs_data_release(settings); + + connect(propertiesView, SIGNAL(Changed()), this, SLOT(PropertiesChanged())); +} + +void DecklinkOutputUI::SaveSettings() +{ + char *modulePath = obs_module_get_config_path(obs_current_module(), ""); + + os_mkdirs(modulePath); + + char *path = obs_module_get_config_path(obs_current_module(), + "decklinkOutputProps.json"); + + obs_data_t *settings = propertiesView->GetSettings(); + if (settings) + obs_data_save_json_safe(settings, path, "tmp", "bak"); +} + +void DecklinkOutputUI::StartOutput() +{ + SaveSettings(); + output_start(); +} + +void DecklinkOutputUI::StopOutput() +{ + output_stop(); +} + +void DecklinkOutputUI::PropertiesChanged() +{ + SaveSettings(); +} diff --git a/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h new file mode 100644 index 000000000..778b80773 --- /dev/null +++ b/UI/frontend-plugins/decklink-output-ui/DecklinkOutputUI.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include "ui_output.h" +#include "../../UI/properties-view.hpp" + +class DecklinkOutputUI : public QDialog { +Q_OBJECT +private: + OBSPropertiesView *propertiesView; + +public slots: + void StartOutput(); + void StopOutput(); + void PropertiesChanged(); + +public: + std::unique_ptr ui; + DecklinkOutputUI(QWidget *parent); + + void ShowHideDialog(); + void SetupPropertiesView(); + void SaveSettings(); +}; diff --git a/UI/frontend-plugins/decklink-output-ui/data/.keepme b/UI/frontend-plugins/decklink-output-ui/data/.keepme new file mode 100644 index 000000000..e69de29bb diff --git a/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp new file mode 100644 index 000000000..5f7b84fd7 --- /dev/null +++ b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.cpp @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include "DecklinkOutputUI.h" + +OBS_DECLARE_MODULE() +OBS_MODULE_USE_DEFAULT_LOCALE("decklink-output-ui", "en-US") + +DecklinkOutputUI *doUI; + +bool main_output_running = false; + +obs_output_t *output; + +OBSData load_settings() +{ + char *path = obs_module_get_config_path(obs_current_module(), + "decklinkOutputProps.json"); + BPtr jsonData = os_quick_read_utf8_file(path); + if (!!jsonData) { + obs_data_t *data = obs_data_create_from_json(jsonData); + OBSData dataRet(data); + obs_data_release(data); + + return dataRet; + } + + return nullptr; +} + +void output_start() +{ + if (!main_output_running) { + OBSData settings = load_settings(); + + if (settings != nullptr) { + output = obs_output_create("decklink_output", + "decklink_output", settings, NULL); + + obs_output_start(output); + obs_data_release(settings); + + main_output_running = true; + } + } +} + +void output_stop() +{ + if (main_output_running) { + obs_output_stop(output); + obs_output_release(output); + main_output_running = false; + } +} + +void addOutputUI(void) +{ + QAction *action = (QAction*)obs_frontend_add_tools_menu_qaction( + obs_module_text("Decklink Output")); + + QMainWindow *window = (QMainWindow*)obs_frontend_get_main_window(); + + doUI = new DecklinkOutputUI(window); + + auto cb = []() { + doUI->ShowHideDialog(); + }; + + action->connect(action, &QAction::triggered, cb); +} + +static void OBSEvent(enum obs_frontend_event event, void *) +{ + if (event == OBS_FRONTEND_EVENT_FINISHED_LOADING) { + OBSData settings = load_settings(); + + if (settings && obs_data_get_bool(settings, "auto_start")) + output_start(); + } +} + +bool obs_module_load(void) +{ + addOutputUI(); + + obs_frontend_add_event_callback(OBSEvent, nullptr); + + return true; +} diff --git a/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h new file mode 100644 index 000000000..85ce556a1 --- /dev/null +++ b/UI/frontend-plugins/decklink-output-ui/decklink-ui-main.h @@ -0,0 +1,3 @@ +void output_start(); +void output_stop(); +OBSData load_settings(); diff --git a/UI/frontend-plugins/decklink-output-ui/forms/output.ui b/UI/frontend-plugins/decklink-output-ui/forms/output.ui new file mode 100644 index 000000000..6f8c69841 --- /dev/null +++ b/UI/frontend-plugins/decklink-output-ui/forms/output.ui @@ -0,0 +1,56 @@ + + + Output + + + + 0 + 0 + 793 + 292 + + + + Decklink Output + + + + + 20 + 10 + 751 + 221 + + + + + + + + 520 + 250 + 113 + 32 + + + + Start + + + + + + 650 + 250 + 113 + 32 + + + + Stop + + + + + +