Merge pull request #708 from Meetsch/feature/virtualcam

Requests: support for new virtualcam related obs-frontend-api in upcoming OBS-Studio 27.0
This commit is contained in:
tt2468 2021-06-01 17:19:32 -07:00 committed by GitHub
commit a469fc539a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 146 additions and 0 deletions

View File

@ -36,6 +36,7 @@ set(obs-websocket_SOURCES
src/WSRequestHandler_SceneItems.cpp
src/WSRequestHandler_Sources.cpp
src/WSRequestHandler_Streaming.cpp
src/WSRequestHandler_VirtualCam.cpp
src/WSRequestHandler_StudioMode.cpp
src/WSRequestHandler_Transitions.cpp
src/WSRequestHandler_Outputs.cpp

View File

@ -202,6 +202,14 @@ void WSEvents::FrontendEventHandler(enum obs_frontend_event event, void* private
owner->OnRecordingResumed();
break;
case OBS_FRONTEND_EVENT_VIRTUALCAM_STARTED:
owner->OnVirtualCamStarted();
break;
case OBS_FRONTEND_EVENT_VIRTUALCAM_STOPPED:
owner->OnVirtualCamStopped();
break;
case OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTING:
owner->OnReplayStarting();
break;
@ -422,6 +430,11 @@ uint64_t WSEvents::getRecordingTime() {
return getOutputRunningTime(recordingOutput);
}
uint64_t WSEvents::getVirtualCamTime() {
OBSOutputAutoRelease virtualCamOutput = obs_frontend_get_virtualcam_output();
return getOutputRunningTime(virtualCamOutput);
}
QString WSEvents::getStreamingTimecode() {
return Utils::nsToTimestamp(getStreamingTime());
}
@ -430,6 +443,10 @@ QString WSEvents::getRecordingTimecode() {
return Utils::nsToTimestamp(getRecordingTime());
}
QString WSEvents::getVirtualCamTimecode() {
return Utils::nsToTimestamp(getVirtualCamTime());
}
OBSDataAutoRelease getMediaSourceData(calldata_t* data) {
OBSDataAutoRelease fields = obs_data_create();
OBSSource source = calldata_get_pointer<obs_source_t>(data, "source");
@ -764,6 +781,30 @@ void WSEvents::OnRecordingResumed() {
broadcastUpdate("RecordingResumed");
}
/**
* Virtual cam started successfully.
*
* @api events
* @name VirtualCamStarted
* @category virtual cam
* @since unreleased
*/
void WSEvents::OnVirtualCamStarted() {
broadcastUpdate("VirtualCamStarted");
}
/**
* Virtual cam stopped successfully.
*
* @api events
* @name VirtualCamStopped
* @category virtual cam
* @since unreleased
*/
void WSEvents::OnVirtualCamStopped() {
broadcastUpdate("VirtualCamStopped");
}
/**
* A request to start the replay buffer has been issued.
*

View File

@ -48,9 +48,11 @@ public:
uint64_t getStreamingTime();
uint64_t getRecordingTime();
uint64_t getVirtualCamTime();
QString getStreamingTimecode();
QString getRecordingTimecode();
QString getVirtualCamTimecode();
obs_data_t* GetStats();
@ -101,6 +103,9 @@ private:
void OnRecordingStopped();
void OnRecordingPaused();
void OnRecordingResumed();
void OnVirtualCamStarted();
void OnVirtualCamStopped();
void OnReplayStarting();
void OnReplayStarted();

View File

@ -163,6 +163,12 @@ const QHash<QString, RpcMethodHandler> WSRequestHandler::messageMap{
{ "GetStreamSettings", &WSRequestHandler::GetStreamSettings },
{ "SaveStreamSettings", &WSRequestHandler::SaveStreamSettings },
{ "SendCaptions", &WSRequestHandler::SendCaptions },
// Category: VirtualCam
{ "GetVirtualCamStatus", &WSRequestHandler::GetVirtualCamStatus },
{ "StartStopVirtualCam", &WSRequestHandler::StartStopVirtualCam },
{ "StartVirtualCam", &WSRequestHandler::StartVirtualCam },
{ "StopVirtualCam", &WSRequestHandler::StopVirtualCam },
// Category: Studio Mode
{ "GetStudioModeStatus", &WSRequestHandler::GetStudioModeStatus },

View File

@ -180,6 +180,12 @@ class WSRequestHandler {
RpcResponse GetStreamSettings(const RpcRequest&);
RpcResponse SaveStreamSettings(const RpcRequest&);
RpcResponse SendCaptions(const RpcRequest&);
// Category: Virtual Cam
RpcResponse GetVirtualCamStatus(const RpcRequest&);
RpcResponse StartStopVirtualCam(const RpcRequest&);
RpcResponse StartVirtualCam(const RpcRequest&);
RpcResponse StopVirtualCam(const RpcRequest&);
// Category: Studio Mode
RpcResponse GetStudioModeStatus(const RpcRequest&);

View File

@ -12,9 +12,11 @@
* @return {boolean} `streaming` Current streaming status.
* @return {boolean} `recording` Current recording status.
* @return {boolean} `recording-paused` If recording is paused.
* @return {boolean} `virtualcam` Current virtual cam status.
* @return {boolean} `preview-only` Always false. Retrocompatibility with OBSRemote.
* @return {String (optional)} `stream-timecode` Time elapsed since streaming started (only present if currently streaming).
* @return {String (optional)} `rec-timecode` Time elapsed since recording started (only present if currently recording).
* @return {String (optional)} `virtualcam-timecode` Time elapsed since virtual cam started (only present if virtual cam currently active).
*
* @api requests
* @name GetStreamingStatus
@ -28,6 +30,7 @@ RpcResponse WSRequestHandler::GetStreamingStatus(const RpcRequest& request) {
obs_data_set_bool(data, "streaming", obs_frontend_streaming_active());
obs_data_set_bool(data, "recording", obs_frontend_recording_active());
obs_data_set_bool(data, "recording-paused", obs_frontend_recording_paused());
obs_data_set_bool(data, "virtualcam", obs_frontend_virtualcam_active());
obs_data_set_bool(data, "preview-only", false);
if (obs_frontend_streaming_active()) {
@ -40,6 +43,11 @@ RpcResponse WSRequestHandler::GetStreamingStatus(const RpcRequest& request) {
obs_data_set_string(data, "rec-timecode", recordingTimecode.toUtf8().constData());
}
if (obs_frontend_virtualcam_active()) {
QString virtualCamTimecode = events->getVirtualCamTimecode();
obs_data_set_string(data, "virtualcam-timecode", virtualCamTimecode.toUtf8().constData());
}
return request.success(data);
}

View File

@ -0,0 +1,79 @@
#include "obs-websocket.h"
#include "Utils.h"
#include "WSEvents.h"
#include "WSRequestHandler.h"
/**
* Get current virtual cam status.
*
* @return {boolean} `isVirtualCam` Current virtual camera status.
* @return {String (optional)} `virtualCamTimecode` Time elapsed since virtual cam started (only present if virtual cam currently active).
*
* @api requests
* @name GetVirtualCamStatus
* @category virtual cam
* @since unreleased
*/
RpcResponse WSRequestHandler::GetVirtualCamStatus(const RpcRequest& request) {
auto events = GetEventsSystem();
OBSDataAutoRelease data = obs_data_create();
obs_data_set_bool(data, "isVirtualCam", obs_frontend_virtualcam_active());
if (obs_frontend_virtualcam_active()) {
QString virtualCamTimecode = events->getVirtualCamTimecode();
obs_data_set_string(data, "virtualCamTimecode", virtualCamTimecode.toUtf8().constData());
}
return request.success(data);
}
/**
* Toggle virtual cam on or off (depending on the current virtual cam state).
*
* @api requests
* @name StartStopVirtualCam
* @category virtual cam
* @since unreleased
*/
RpcResponse WSRequestHandler::StartStopVirtualCam(const RpcRequest& request) {
(obs_frontend_virtualcam_active() ? obs_frontend_stop_virtualcam() : obs_frontend_start_virtualcam());
return request.success();
}
/**
* Start virtual cam.
* Will return an `error` if virtual cam is already active.
*
* @api requests
* @name StartVirtualCam
* @category virtual cam
* @since unreleased
*/
RpcResponse WSRequestHandler::StartVirtualCam(const RpcRequest& request) {
if (obs_frontend_virtualcam_active()) {
return request.failed("virtual cam already active");
}
obs_frontend_start_virtualcam();
return request.success();
}
/**
* Stop virtual cam.
* Will return an `error` if virtual cam is not active.
*
* @api requests
* @name StopVirtualCam
* @category virtual cam
* @since unreleased
*/
RpcResponse WSRequestHandler::StopVirtualCam(const RpcRequest& request) {
if (!obs_frontend_virtualcam_active()) {
return request.failed("virtual cam not active");
}
obs_frontend_stop_virtualcam();
return request.success();
}