diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index 947e017600f480c96e937149ee8e2417ee455827..67c66afa76853dbc128f4c2d5d8caf663a657208 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 88c0ee2270e4f76c2311cdd69291a490af1a5a66..0304a10575a632a164f33b5eb62795f146a7a2ee 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 bee32ee4c53bce728854212b4c718bb906b23494..b0b7c341821125342b08b7fa051ec909b6aa3756 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 64ecf9b15d0e90fce4aac81e2333a55fce6d3621..fe4c8c76aa3e17a757fb6fbbf55218be20c536ba 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 2f25a33ed86058d87878c5b1db1b3be0dbb186b2..f8845a7af227e8111040fbb6a24332aa62ba639d 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 fdb719d39c60bbe3e1de8268cb4f21a82de1e027..00b07fccdd4f50d418b3b380de71b9e2c0ae9889 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.