From 19375921d3cf64d99f3aac22d5dfc9db9fb2fabf Mon Sep 17 00:00:00 2001 From: tt2468 Date: Mon, 31 May 2021 21:44:03 -0700 Subject: [PATCH] EventHandler: Add media input events --- src/eventhandler/EventHandler.cpp | 18 ++- src/eventhandler/EventHandler.h | 20 +++ src/eventhandler/EventHandler_MediaInputs.cpp | 138 ++++++++++++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) diff --git a/src/eventhandler/EventHandler.cpp b/src/eventhandler/EventHandler.cpp index c68f5772..483cc7c0 100644 --- a/src/eventhandler/EventHandler.cpp +++ b/src/eventhandler/EventHandler.cpp @@ -72,6 +72,14 @@ void EventHandler::ConnectSourceSignals(obs_source_t *source) // These signals a signal_handler_connect(sh, "volume", HandleInputVolumeChanged, this); signal_handler_connect(sh, "audio_sync", HandleInputAudioSyncOffsetChanged, this); signal_handler_connect(sh, "audio_mixers", HandleInputAudioTracksChanged, this); + signal_handler_connect(sh, "media_started", HandleMediaInputPlaybackStarted, this); + signal_handler_connect(sh, "media_ended", HandleMediaInputPlaybackEnded, this); + signal_handler_connect(sh, "media_pause", SourceMediaPauseMultiHandler, this); + signal_handler_connect(sh, "media_play", SourceMediaPlayMultiHandler, this); + signal_handler_connect(sh, "media_restart", SourceMediaRestartMultiHandler, this); + signal_handler_connect(sh, "media_stopped", SourceMediaStopMultiHandler, this); + signal_handler_connect(sh, "media_next", SourceMediaNextMultiHandler, this); + signal_handler_connect(sh, "media_previous", SourceMediaPreviousMultiHandler, this); } void EventHandler::DisconnectSourceSignals(obs_source_t *source) @@ -90,6 +98,14 @@ void EventHandler::DisconnectSourceSignals(obs_source_t *source) signal_handler_disconnect(sh, "volume", HandleInputVolumeChanged, this); signal_handler_disconnect(sh, "audio_sync", HandleInputAudioSyncOffsetChanged, this); signal_handler_disconnect(sh, "audio_mixers", HandleInputAudioTracksChanged, this); + signal_handler_disconnect(sh, "media_started", HandleMediaInputPlaybackStarted, this); + signal_handler_disconnect(sh, "media_ended", HandleMediaInputPlaybackEnded, this); + signal_handler_disconnect(sh, "media_pause", SourceMediaPauseMultiHandler, this); + signal_handler_disconnect(sh, "media_play", SourceMediaPlayMultiHandler, this); + signal_handler_disconnect(sh, "media_restart", SourceMediaRestartMultiHandler, this); + signal_handler_disconnect(sh, "media_stopped", SourceMediaStopMultiHandler, this); + signal_handler_disconnect(sh, "media_next", SourceMediaNextMultiHandler, this); + signal_handler_disconnect(sh, "media_previous", SourceMediaPreviousMultiHandler, this); } void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_data) @@ -230,7 +246,7 @@ void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data) if (!source) return; - // Connect all signals from the source + // Connect all signals to the source eventHandler->ConnectSourceSignals(source); switch (obs_source_get_type(source)) { diff --git a/src/eventhandler/EventHandler.h b/src/eventhandler/EventHandler.h index 775f6521..54bdde13 100644 --- a/src/eventhandler/EventHandler.h +++ b/src/eventhandler/EventHandler.h @@ -17,6 +17,15 @@ enum ObsOutputState { OBS_WEBSOCKET_OUTPUT_RESUMED }; +enum ObsMediaInputAction { + OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE, + OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY, + OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART, + OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP, + OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT, + OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS +}; + template T* GetCalldataPointer(const calldata_t *data, const char* name) { void* ptr = nullptr; calldata_get_ptr(data, name, &ptr); @@ -50,6 +59,12 @@ class EventHandler // Signal handler: source static void SourceRenamedMultiHandler(void *param, calldata_t *data); + static void SourceMediaPauseMultiHandler(void *param, calldata_t *data); + static void SourceMediaPlayMultiHandler(void *param, calldata_t *data); + static void SourceMediaRestartMultiHandler(void *param, calldata_t *data); + static void SourceMediaStopMultiHandler(void *param, calldata_t *data); + static void SourceMediaNextMultiHandler(void *param, calldata_t *data); + static void SourceMediaPreviousMultiHandler(void *param, calldata_t *data); // General @@ -91,4 +106,9 @@ class EventHandler void HandleRecordStateChanged(ObsOutputState state); void HandleReplayBufferStateChanged(ObsOutputState state); void HandleVirtualcamStateChanged(ObsOutputState state); + + // Media Inputs + static void HandleMediaInputPlaybackStarted(void *param, calldata_t *data); // Direct callback + static void HandleMediaInputPlaybackEnded(void *param, calldata_t *data); // Direct callback + void HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action); }; diff --git a/src/eventhandler/EventHandler_MediaInputs.cpp b/src/eventhandler/EventHandler_MediaInputs.cpp index 1f7f02f6..46666f45 100644 --- a/src/eventhandler/EventHandler_MediaInputs.cpp +++ b/src/eventhandler/EventHandler_MediaInputs.cpp @@ -1,3 +1,141 @@ #include "EventHandler.h" #include "../plugin-macros.generated.h" + +#define CASE(x) case x: return #x; + +std::string GetMediaInputActionString(ObsMediaInputAction action) { + switch (action) { + default: + CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE) + CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY) + CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART) + CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP) + CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT) + CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS) + } +} + +void EventHandler::SourceMediaPauseMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + eventHandler->HandleMediaInputActionTriggered(source, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE); +} + +void EventHandler::SourceMediaPlayMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + eventHandler->HandleMediaInputActionTriggered(source, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY); +} + +void EventHandler::SourceMediaRestartMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + eventHandler->HandleMediaInputActionTriggered(source, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART); +} + +void EventHandler::SourceMediaStopMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + eventHandler->HandleMediaInputActionTriggered(source, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP); +} + +void EventHandler::SourceMediaNextMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + eventHandler->HandleMediaInputActionTriggered(source, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT); +} + +void EventHandler::SourceMediaPreviousMultiHandler(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + eventHandler->HandleMediaInputActionTriggered(source, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS); +} + +void EventHandler::HandleMediaInputPlaybackStarted(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + json eventData; + eventData["inputName"] = obs_source_get_name(source); + eventHandler->_webSocketServer->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputPlaybackStarted", eventData); +} + +void EventHandler::HandleMediaInputPlaybackEnded(void *param, calldata_t *data) +{ + auto eventHandler = reinterpret_cast(param); + + OBSSource source = GetCalldataPointer(data, "source"); + if (!source) + return; + + if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT) + return; + + json eventData; + eventData["inputName"] = obs_source_get_name(source); + eventHandler->_webSocketServer->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputPlaybackEnded", eventData); +} + +void EventHandler::HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action) +{ + json eventData; + eventData["inputName"] = obs_source_get_name(source); + eventData["mediaAction"] = GetMediaInputActionString(action); + _webSocketServer->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputActionTriggered", eventData); +} \ No newline at end of file