From 7918438747d4aa555d8415a012b7fd09c5058b00 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Sat, 16 May 2020 12:56:42 -0700 Subject: [PATCH] Events: Add media events Adds the following events: - `MediaPlaying` - `MediaPaused` - `MediaRestarted` - `MediaStopped` - `MediaNext` - `MediaPrevious` - `MediaStarted` - `MediaEnded` --- src/WSEvents.cpp | 208 +++++++++++++++++++++++++++++++++++++++++++++++ src/WSEvents.h | 9 ++ 2 files changed, 217 insertions(+) diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 37ada8ee..166f424a 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -275,6 +275,15 @@ void WSEvents::connectSourceSignals(obs_source_t* source) { signal_handler_connect(sh, "filter_add", OnSourceFilterAdded, this); signal_handler_connect(sh, "filter_remove", OnSourceFilterRemoved, this); signal_handler_connect(sh, "reorder_filters", OnSourceFilterOrderChanged, this); + + signal_handler_connect(sh, "media_play", OnMediaPlaying, this); + signal_handler_connect(sh, "media_pause", OnMediaPaused, this); + signal_handler_connect(sh, "media_restart", OnMediaRestarted, this); + signal_handler_connect(sh, "media_stopped", OnMediaStopped, this); + signal_handler_connect(sh, "media_next", OnMediaNext, this); + signal_handler_connect(sh, "media_previous", OnMediaPrevious, this); + signal_handler_connect(sh, "media_started", OnMediaStarted, this); + signal_handler_connect(sh, "media_ended", OnMediaEnded, this); if (sourceType == OBS_SOURCE_TYPE_SCENE) { signal_handler_connect(sh, "reorder", OnSceneReordered, this); @@ -322,6 +331,15 @@ void WSEvents::disconnectSourceSignals(obs_source_t* source) { signal_handler_disconnect(sh, "transition_start", OnTransitionBegin, this); signal_handler_disconnect(sh, "transition_stop", OnTransitionEnd, this); signal_handler_disconnect(sh, "transition_video_stop", OnTransitionVideoEnd, this); + + signal_handler_disconnect(sh, "media_play", OnMediaPlaying, this); + signal_handler_disconnect(sh, "media_pause", OnMediaPaused, this); + signal_handler_disconnect(sh, "media_restart", OnMediaRestarted, this); + signal_handler_disconnect(sh, "media_stopped", OnMediaStopped, this); + signal_handler_disconnect(sh, "media_next", OnMediaNext, this); + signal_handler_disconnect(sh, "media_previous", OnMediaPrevious, this); + signal_handler_disconnect(sh, "media_started", OnMediaStarted, this); + signal_handler_disconnect(sh, "media_ended", OnMediaEnded, this); } void WSEvents::connectFilterSignals(obs_source_t* filter) { @@ -1335,6 +1353,196 @@ void WSEvents::OnSourceFilterOrderChanged(void* param, calldata_t* data) { self->broadcastUpdate("SourceFiltersReordered", fields); } +/** + * A media source has started playing. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaPlaying + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaPlaying(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaPlaying", fields); +} + +/** + * A media source has been paused. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaPaused + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaPaused(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaPaused", fields); +} + +/** + * A media source has been restarted. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaRestarted + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaRestarted(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaRestarted", fields); +} + +/** + * A media source has been stopped. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaStopped + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaStopped(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaStopped", fields); +} + +/** + * A media source has gone to the next item in the playlist. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaNext + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaNext(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaNext", fields); +} + +/** + * A media source has gone to the previous item in the playlist. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaPrevious + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaPrevious(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaPrevious", fields); +} + +/** + * A media source has been started. (Does not mean that it is playing. See [`MediaPlaying`](#mediaplaying)) + * + * Note: For VLC, this means that the source and therefore playlist has started. + * For the normal Media Source, this just means that the source has been started. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaStarted + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaStarted(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaStarted", fields); +} + +/** + * A media source has ended. + * + * Note: For VLC, this means that the source and therefore playlist has ended. + * For the normal Media Source, this just means that the source has been stopped/ended. + * + * @return {String} `sourceName` Source name + * + * @api events + * @name MediaEnded + * @category media + * @since 4.9.0 + */ +void WSEvents::OnMediaEnded(void* param, calldata_t* data) { + auto self = reinterpret_cast(param); + + OBSSource source = calldata_get_pointer(data, "source"); + if (!source) { + return; + } + + OBSDataAutoRelease fields = obs_data_create(); + obs_data_set_string(fields, "sourceName", obs_source_get_name(source)); + self->broadcastUpdate("MediaEnded", fields); +} + /** * Scene items have been reordered. * diff --git a/src/WSEvents.h b/src/WSEvents.h index 06ce7f2c..0d3a04cb 100644 --- a/src/WSEvents.h +++ b/src/WSEvents.h @@ -133,6 +133,15 @@ private: static void OnSourceFilterRemoved(void* param, calldata_t* data); static void OnSourceFilterVisibilityChanged(void* param, calldata_t* data); static void OnSourceFilterOrderChanged(void* param, calldata_t* data); + + static void OnMediaPlaying(void* param, calldata_t* data); + static void OnMediaPaused(void* param, calldata_t* data); + static void OnMediaRestarted(void* param, calldata_t* data); + static void OnMediaStopped(void* param, calldata_t* data); + static void OnMediaNext(void* param, calldata_t* data); + static void OnMediaPrevious(void* param, calldata_t* data); + static void OnMediaStarted(void* param, calldata_t* data); + static void OnMediaEnded(void* param, calldata_t* data); static void OnSceneReordered(void* param, calldata_t* data); static void OnSceneItemAdd(void* param, calldata_t* data);