diff --git a/src/eventhandler/EventHandler.cpp b/src/eventhandler/EventHandler.cpp index 0eed6b8a..ac8e4f5c 100644 --- a/src/eventhandler/EventHandler.cpp +++ b/src/eventhandler/EventHandler.cpp @@ -340,12 +340,31 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_ // Outputs case OBS_FRONTEND_EVENT_STREAMING_STARTING: eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STARTING); + { + // Connect signals for stream output reconnects (hacky) + OBSOutputAutoRelease streamOutput = obs_frontend_get_streaming_output(); + if (streamOutput) { + signal_handler_t *sh = obs_output_get_signal_handler(streamOutput); + signal_handler_connect(sh, "reconnect", StreamOutputReconnectHandler, private_data); + signal_handler_connect(sh, "reconnect_success", StreamOutputReconnectSuccessHandler, private_data); + } + } break; case OBS_FRONTEND_EVENT_STREAMING_STARTED: eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STARTED); break; case OBS_FRONTEND_EVENT_STREAMING_STOPPING: eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPING); + { + // Disconnect signals for stream output reconnects + OBSOutputAutoRelease streamOutput = obs_frontend_get_streaming_output(); + if (streamOutput) { + signal_handler_t *sh = obs_output_get_signal_handler(streamOutput); + signal_handler_disconnect(sh, "reconnect", StreamOutputReconnectHandler, private_data); + signal_handler_disconnect(sh, "reconnect_success", StreamOutputReconnectSuccessHandler, + private_data); + } + } break; case OBS_FRONTEND_EVENT_STREAMING_STOPPED: eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPED); @@ -611,3 +630,17 @@ void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data) break; } } + +void EventHandler::StreamOutputReconnectHandler(void *param, calldata_t *) +{ + auto eventHandler = static_cast(param); + + eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_RECONNECTING); +} + +void EventHandler::StreamOutputReconnectSuccessHandler(void *param, calldata_t *) +{ + auto eventHandler = static_cast(param); + + eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_RECONNECTED); +} diff --git a/src/eventhandler/EventHandler.h b/src/eventhandler/EventHandler.h index 3c044990..4355a22a 100644 --- a/src/eventhandler/EventHandler.h +++ b/src/eventhandler/EventHandler.h @@ -78,6 +78,10 @@ private: static void SourceMediaNextMultiHandler(void *param, calldata_t *data); static void SourceMediaPreviousMultiHandler(void *param, calldata_t *data); + // Signal handler: output + static void StreamOutputReconnectHandler(void *param, calldata_t *data); + static void StreamOutputReconnectSuccessHandler(void *param, calldata_t *data); + // General void HandleExitStarted();