From 3bc4e8ecbab768b3a700aba2d34fc2364179f6f2 Mon Sep 17 00:00:00 2001 From: Clayton Groeneveld Date: Mon, 7 Dec 2020 14:39:02 -0600 Subject: [PATCH] obs-frontend-api: Add frontend api functions for the virtual camera This adds functions to the frontend api to start/stop the virtual camera, to check if it is active and adds function to get the output reference. It also adds api events for when the virtual camera is started or stopped. --- UI/api-interface.cpp | 23 +++++++++++++ UI/obs-frontend-api/obs-frontend-api.cpp | 24 ++++++++++++++ UI/obs-frontend-api/obs-frontend-api.h | 8 +++++ UI/obs-frontend-api/obs-frontend-internal.hpp | 5 +++ UI/window-basic-main.cpp | 6 ++++ docs/sphinx/reference-frontend-api.rst | 33 +++++++++++++++++++ 6 files changed, 99 insertions(+) diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index 947e01760..67c66afa7 100644 --- a/UI/api-interface.cpp +++ b/UI/api-interface.cpp @@ -23,6 +23,7 @@ extern volatile bool streaming_active; extern volatile bool recording_active; extern volatile bool recording_paused; extern volatile bool replaybuf_active; +extern volatile bool virtualcam_active; /* ------------------------------------------------------------------------- */ @@ -548,6 +549,28 @@ struct OBSStudioAPI : obs_frontend_callbacks { Q_ARG(OBSSource, OBSSource(source))); } + obs_output_t *obs_frontend_get_virtualcam_output(void) override + { + OBSOutput output = main->outputHandler->virtualCam; + obs_output_addref(output); + return output; + } + + void obs_frontend_start_virtualcam(void) override + { + QMetaObject::invokeMethod(main, "StartVirtualCam"); + } + + void obs_frontend_stop_virtualcam(void) override + { + QMetaObject::invokeMethod(main, "StopVirtualCam"); + } + + bool obs_frontend_virtualcam_active(void) override + { + return os_atomic_load_bool(&virtualcam_active); + } + void on_load(obs_data_t *settings) override { for (size_t i = saveCallbacks.size(); i > 0; i--) { diff --git a/UI/obs-frontend-api/obs-frontend-api.cpp b/UI/obs-frontend-api/obs-frontend-api.cpp index 88c0ee227..0304a1057 100644 --- a/UI/obs-frontend-api/obs-frontend-api.cpp +++ b/UI/obs-frontend-api/obs-frontend-api.cpp @@ -475,3 +475,27 @@ void obs_frontend_take_source_screenshot(obs_source_t *source) if (callbacks_valid()) c->obs_frontend_take_source_screenshot(source); } + +obs_output_t *obs_frontend_get_virtualcam_output(void) +{ + return !!callbacks_valid() ? c->obs_frontend_get_virtualcam_output() + : nullptr; +} + +void obs_frontend_start_virtualcam(void) +{ + if (callbacks_valid()) + c->obs_frontend_start_virtualcam(); +} + +void obs_frontend_stop_virtualcam(void) +{ + if (callbacks_valid()) + c->obs_frontend_stop_virtualcam(); +} + +bool obs_frontend_virtualcam_active(void) +{ + return !!callbacks_valid() ? c->obs_frontend_virtualcam_active() + : false; +} diff --git a/UI/obs-frontend-api/obs-frontend-api.h b/UI/obs-frontend-api/obs-frontend-api.h index bee32ee4c..b0b7c3418 100644 --- a/UI/obs-frontend-api/obs-frontend-api.h +++ b/UI/obs-frontend-api/obs-frontend-api.h @@ -50,6 +50,9 @@ enum obs_frontend_event { OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED, OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED, + + OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED, + OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED, }; /* ------------------------------------------------------------------------- */ @@ -198,6 +201,11 @@ EXPORT void obs_frontend_set_current_preview_scene(obs_source_t *scene); EXPORT void obs_frontend_take_screenshot(void); EXPORT void obs_frontend_take_source_screenshot(obs_source_t *source); +EXPORT obs_output_t *obs_frontend_get_virtualcam_output(void); +EXPORT void obs_frontend_start_virtualcam(void); +EXPORT void obs_frontend_stop_virtualcam(void); +EXPORT bool obs_frontend_virtualcam_active(void); + /* ------------------------------------------------------------------------- */ #ifdef __cplusplus diff --git a/UI/obs-frontend-api/obs-frontend-internal.hpp b/UI/obs-frontend-api/obs-frontend-internal.hpp index 64ecf9b15..fe4c8c76a 100644 --- a/UI/obs-frontend-api/obs-frontend-internal.hpp +++ b/UI/obs-frontend-api/obs-frontend-internal.hpp @@ -122,6 +122,11 @@ struct obs_frontend_callbacks { virtual void obs_frontend_take_screenshot() = 0; virtual void obs_frontend_take_source_screenshot(obs_source_t *source) = 0; + + virtual obs_output_t *obs_frontend_get_virtualcam_output(void) = 0; + virtual void obs_frontend_start_virtualcam(void) = 0; + virtual void obs_frontend_stop_virtualcam(void) = 0; + virtual bool obs_frontend_virtualcam_active(void) = 0; }; EXPORT void diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 2f25a33ed..f8845a7af 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -6300,6 +6300,9 @@ void OBSBasic::OnVirtualCamStart() vcamButton->setText(QTStr("Basic.Main.StopVirtualCam")); vcamButton->setChecked(true); + if (api) + api->on_event(OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED); + OnActivate(); blog(LOG_INFO, VIRTUAL_CAM_START); @@ -6313,6 +6316,9 @@ void OBSBasic::OnVirtualCamStop(int) vcamButton->setText(QTStr("Basic.Main.StartVirtualCam")); vcamButton->setChecked(false); + if (api) + api->on_event(OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED); + blog(LOG_INFO, VIRTUAL_CAM_STOP); OnDeactivate(); diff --git a/docs/sphinx/reference-frontend-api.rst b/docs/sphinx/reference-frontend-api.rst index fdb719d39..00b07fccd 100644 --- a/docs/sphinx/reference-frontend-api.rst +++ b/docs/sphinx/reference-frontend-api.rst @@ -140,6 +140,15 @@ Structures/Enumerations Triggered when the recording has been unpaused. + - **OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED** + + Triggered when the virtual camera is started. + + - **OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED** + + Triggered when the virtual camera is stopped. + + .. type:: struct obs_frontend_source_list - DARRAY(obs_source_t*) **sources** @@ -556,3 +565,27 @@ Functions Takes a screenshot of the specified source. :param source: The source to take screenshot of. + +--------------------------------------- + +.. function:: obs_output_t *obs_frontend_get_virtualcam_output(void) + + :return: A new reference to the current virtual camera output. + +--------------------------------------- + +.. function:: void obs_frontend_start_virtualcam(void) + + Starts the virtual camera. + +--------------------------------------- + +.. function:: void obs_frontend_stop_virtualcam(void) + + Stops the virtual camera. + +--------------------------------------- + +.. function:: bool obs_frontend_virtualcam_active(void) + + :return: *true* if virtual camera is active, *false* otherwise.