From 10e1c7b3a30044f61da799fc4386132e157fe9e2 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 3 Apr 2021 13:02:42 -0700 Subject: [PATCH] Resolve asio network crashes on macOS (#157) * Reenable network tab functionality for macOS * Set asio to b73dc1d and websocketpp to c6d7e29 --- deps/asio | 2 +- deps/websocketpp | 2 +- src/headers/switch-network.hpp | 89 ++++++++---------------- src/switch-network.cpp | 119 +++++++++++++++------------------ 4 files changed, 84 insertions(+), 128 deletions(-) diff --git a/deps/asio b/deps/asio index 93f87fbd..b73dc1d2 160000 --- a/deps/asio +++ b/deps/asio @@ -1 +1 @@ -Subproject commit 93f87fbdbf6111f9ef25ac56bb7e495b7ce83089 +Subproject commit b73dc1d2c0ecb9452a87c26544d7f71e24342df6 diff --git a/deps/websocketpp b/deps/websocketpp index 1b11fd30..c6d7e295 160000 --- a/deps/websocketpp +++ b/deps/websocketpp @@ -1 +1 @@ -Subproject commit 1b11fd301531e6df35a6107c1e8665b1e77a2d8e +Subproject commit c6d7e295bf5a0ab9b5f896720cc1a0e0fdc397a7 diff --git a/src/headers/switch-network.hpp b/src/headers/switch-network.hpp index 63325e8d..82c5ee52 100644 --- a/src/headers/switch-network.hpp +++ b/src/headers/switch-network.hpp @@ -4,9 +4,6 @@ Most of this code is based on https://github.com/Palakis/obs-websocket #pragma once -// Due to iussues with asio the network functionality will be disabled on macOS -#if !(__APPLE__) - #include #include #include @@ -16,16 +13,36 @@ Most of this code is based on https://github.com/Palakis/obs-websocket #include #include +#include #include #include - -#include #include using websocketpp::connection_hdl; typedef websocketpp::server server; typedef websocketpp::client client; +class NetworkConfig { +public: + NetworkConfig(); + void Load(obs_data_t *obj); + void Save(obs_data_t *obj); + void SetDefaults(obs_data_t *obj); + + std::string GetClientUri(); + + // Server + bool ServerEnabled; + uint64_t ServerPort; + bool LockToIPv4; + + // Client + bool ClientEnabled; + std::string Address; + uint64_t ClientPort; + bool SendAll; +}; + class WSServer : public QObject { Q_OBJECT @@ -52,6 +69,12 @@ private: QThreadPool _threadPool; }; +enum class ServerStatus { + NOT_RUNNING, + STARTING, + RUNNING, +}; + class WSClient : public QObject { Q_OBJECT @@ -80,62 +103,6 @@ private: std::string _failMsg; }; -#else - -class WSServer : public QObject { - Q_OBJECT - -public: - explicit WSServer(){}; - virtual ~WSServer(){}; - void start(quint16 port, bool lockToIPv4){}; - void stop(){}; - void sendMessage(OBSWeakSource scene, OBSWeakSource transition){}; -}; - -class WSClient : public QObject { - Q_OBJECT - -public: - explicit WSClient(){}; - virtual ~WSClient(){}; - void connect(std::string uri){}; - void disconnect(){}; - std::string getFail() { return _failMsg; } - -private: - std::string _failMsg; -}; - -#endif - -class NetworkConfig { -public: - NetworkConfig(); - void Load(obs_data_t *obj); - void Save(obs_data_t *obj); - void SetDefaults(obs_data_t *obj); - - std::string GetClientUri(); - - // Server - bool ServerEnabled; - uint64_t ServerPort; - bool LockToIPv4; - - // Client - bool ClientEnabled; - std::string Address; - uint64_t ClientPort; - bool SendAll; -}; - -enum class ServerStatus { - NOT_RUNNING, - STARTING, - RUNNING, -}; - enum class ClientStatus { DISCONNECTED, CONNECTING, diff --git a/src/switch-network.cpp b/src/switch-network.cpp index f743ec06..16fd9393 100644 --- a/src/switch-network.cpp +++ b/src/switch-network.cpp @@ -24,12 +24,64 @@ Most of this code is based on https://github.com/Palakis/obs-websocket #define SCENE_ENTRY "scene" #define TRANSITION_ENTRY "transition" -#if !(__APPLE__) - using websocketpp::lib::placeholders::_1; using websocketpp::lib::placeholders::_2; using websocketpp::lib::bind; +NetworkConfig::NetworkConfig() + : ServerEnabled(false), + ServerPort(55555), + LockToIPv4(false), + ClientEnabled(false), + Address(""), + ClientPort(55555), + SendAll(true) +{ +} + +void NetworkConfig::Load(obs_data_t *obj) +{ + SetDefaults(obj); + + ServerEnabled = obs_data_get_bool(obj, PARAM_SERVER_ENABLE); + ServerPort = obs_data_get_int(obj, PARAM_SERVER_PORT); + LockToIPv4 = obs_data_get_bool(obj, PARAM_LOCKTOIPV4); + + ClientEnabled = obs_data_get_bool(obj, PARAM_CLIENT_ENABLE); + Address = obs_data_get_string(obj, PARAM_ADDRESS); + ClientPort = obs_data_get_int(obj, PARAM_CLIENT_PORT); + SendAll = obs_data_get_bool(obj, PARAM_CLIENT_SENDALL); +} + +void NetworkConfig::Save(obs_data_t *obj) +{ + obs_data_set_bool(obj, PARAM_SERVER_ENABLE, ServerEnabled); + obs_data_set_int(obj, PARAM_SERVER_PORT, ServerPort); + obs_data_set_bool(obj, PARAM_LOCKTOIPV4, LockToIPv4); + + obs_data_set_bool(obj, PARAM_CLIENT_ENABLE, ClientEnabled); + obs_data_set_string(obj, PARAM_ADDRESS, Address.c_str()); + obs_data_set_int(obj, PARAM_CLIENT_PORT, ClientPort); + obs_data_set_bool(obj, PARAM_CLIENT_SENDALL, SendAll); +} + +void NetworkConfig::SetDefaults(obs_data_t *obj) +{ + obs_data_set_default_bool(obj, PARAM_SERVER_ENABLE, ServerEnabled); + obs_data_set_default_int(obj, PARAM_SERVER_PORT, ServerPort); + obs_data_set_default_bool(obj, PARAM_LOCKTOIPV4, LockToIPv4); + + obs_data_set_default_bool(obj, PARAM_CLIENT_ENABLE, ClientEnabled); + obs_data_set_default_string(obj, PARAM_ADDRESS, Address.c_str()); + obs_data_set_default_int(obj, PARAM_CLIENT_PORT, ClientPort); + obs_data_set_default_bool(obj, PARAM_CLIENT_SENDALL, SendAll); +} + +std::string NetworkConfig::GetClientUri() +{ + return "ws://" + Address + ":" + std::to_string(ClientPort); +} + WSServer::WSServer() : QObject(nullptr), _connections(), _clMutex(QMutex::Recursive) { @@ -400,62 +452,6 @@ void WSClient::onClose(connection_hdl hdl) switcher->clientStatus = ClientStatus::DISCONNECTED; } -#endif - -NetworkConfig::NetworkConfig() - : ServerEnabled(false), - ServerPort(55555), - LockToIPv4(false), - ClientEnabled(false), - Address(""), - ClientPort(55555), - SendAll(true) -{ -} - -void NetworkConfig::Load(obs_data_t *obj) -{ - SetDefaults(obj); - - ServerEnabled = obs_data_get_bool(obj, PARAM_SERVER_ENABLE); - ServerPort = obs_data_get_int(obj, PARAM_SERVER_PORT); - LockToIPv4 = obs_data_get_bool(obj, PARAM_LOCKTOIPV4); - - ClientEnabled = obs_data_get_bool(obj, PARAM_CLIENT_ENABLE); - Address = obs_data_get_string(obj, PARAM_ADDRESS); - ClientPort = obs_data_get_int(obj, PARAM_CLIENT_PORT); - SendAll = obs_data_get_bool(obj, PARAM_CLIENT_SENDALL); -} - -void NetworkConfig::Save(obs_data_t *obj) -{ - obs_data_set_bool(obj, PARAM_SERVER_ENABLE, ServerEnabled); - obs_data_set_int(obj, PARAM_SERVER_PORT, ServerPort); - obs_data_set_bool(obj, PARAM_LOCKTOIPV4, LockToIPv4); - - obs_data_set_bool(obj, PARAM_CLIENT_ENABLE, ClientEnabled); - obs_data_set_string(obj, PARAM_ADDRESS, Address.c_str()); - obs_data_set_int(obj, PARAM_CLIENT_PORT, ClientPort); - obs_data_set_bool(obj, PARAM_CLIENT_SENDALL, SendAll); -} - -void NetworkConfig::SetDefaults(obs_data_t *obj) -{ - obs_data_set_default_bool(obj, PARAM_SERVER_ENABLE, ServerEnabled); - obs_data_set_default_int(obj, PARAM_SERVER_PORT, ServerPort); - obs_data_set_default_bool(obj, PARAM_LOCKTOIPV4, LockToIPv4); - - obs_data_set_default_bool(obj, PARAM_CLIENT_ENABLE, ClientEnabled); - obs_data_set_default_string(obj, PARAM_ADDRESS, Address.c_str()); - obs_data_set_default_int(obj, PARAM_CLIENT_PORT, ClientPort); - obs_data_set_default_bool(obj, PARAM_CLIENT_SENDALL, SendAll); -} - -std::string NetworkConfig::GetClientUri() -{ - return "ws://" + Address + ":" + std::to_string(ClientPort); -} - void SwitcherData::loadNetworkSettings(obs_data_t *obj) { networkConfig.Load(obj); @@ -471,13 +467,6 @@ void SwitcherData::saveNetworkSwitches(obs_data_t *obj) void AdvSceneSwitcher::setupNetworkTab() { -#if __APPLE__ - ui->clientSettings->setDisabled(true); - ui->serverSettings->setDisabled(true); - ui->networkTabWarningLabel->setText( - obs_module_text("AdvSceneSwitcher.networkTab.DisabledWarning")); -#endif - ui->serverSettings->setChecked(switcher->networkConfig.ServerEnabled); ui->serverPort->setValue(switcher->networkConfig.ServerPort); ui->lockToIPv4->setChecked(switcher->networkConfig.LockToIPv4);