diff --git a/obs-studio-client/source/nodeobs_service.cpp b/obs-studio-client/source/nodeobs_service.cpp index a2d9a2b69..f6df77585 100644 --- a/obs-studio-client/source/nodeobs_service.cpp +++ b/obs-studio-client/source/nodeobs_service.cpp @@ -186,6 +186,16 @@ Napi::Value service::OBS_service_stopRecording(const Napi::CallbackInfo &info) return info.Env().Undefined(); } +Napi::Value service::OBS_service_stopRecordingForce(const Napi::CallbackInfo &info) +{ + auto conn = GetConnection(info); + if (!conn) + return info.Env().Undefined(); + + conn->call("NodeOBS_Service", "OBS_service_stopRecordingForce", {}); + return info.Env().Undefined(); +} + Napi::Value service::OBS_service_stopReplayBuffer(const Napi::CallbackInfo &info) { bool forceStop = info[0].ToBoolean().Value(); @@ -555,6 +565,7 @@ void service::Init(Napi::Env env, Napi::Object exports) exports.Set(Napi::String::New(env, "OBS_service_startRecording"), Napi::Function::New(env, service::OBS_service_startRecording)); exports.Set(Napi::String::New(env, "OBS_service_startReplayBuffer"), Napi::Function::New(env, service::OBS_service_startReplayBuffer)); exports.Set(Napi::String::New(env, "OBS_service_stopRecording"), Napi::Function::New(env, service::OBS_service_stopRecording)); + exports.Set(Napi::String::New(env, "OBS_service_stopRecordingForce"), Napi::Function::New(env, service::OBS_service_stopRecordingForce)); exports.Set(Napi::String::New(env, "OBS_service_stopStreaming"), Napi::Function::New(env, service::OBS_service_stopStreaming)); exports.Set(Napi::String::New(env, "OBS_service_stopReplayBuffer"), Napi::Function::New(env, service::OBS_service_stopReplayBuffer)); exports.Set(Napi::String::New(env, "OBS_service_connectOutputSignals"), Napi::Function::New(env, service::OBS_service_connectOutputSignals)); @@ -569,6 +580,5 @@ void service::Init(Napi::Env env, Napi::Object exports) exports.Set(Napi::String::New(env, "OBS_service_updateVirtualCam"), Napi::Function::New(env, service::OBS_service_updateVirtualCam)); exports.Set(Napi::String::New(env, "OBS_service_installVirtualCamPlugin"), Napi::Function::New(env, service::OBS_service_installVirtualCamPlugin)); exports.Set(Napi::String::New(env, "OBS_service_uninstallVirtualCamPlugin"), Napi::Function::New(env, service::OBS_service_uninstallVirtualCamPlugin)); - exports.Set(Napi::String::New(env, "OBS_service_isVirtualCamPluginInstalled"), - Napi::Function::New(env, service::OBS_service_isVirtualCamPluginInstalled)); + exports.Set(Napi::String::New(env, "OBS_service_isVirtualCamPluginInstalled"), Napi::Function::New(env, service::OBS_service_isVirtualCamPluginInstalled)); } diff --git a/obs-studio-client/source/nodeobs_service.hpp b/obs-studio-client/source/nodeobs_service.hpp index b42c0a1a7..0422a622b 100644 --- a/obs-studio-client/source/nodeobs_service.hpp +++ b/obs-studio-client/source/nodeobs_service.hpp @@ -60,6 +60,7 @@ Napi::Value OBS_service_startRecording(const Napi::CallbackInfo &info); Napi::Value OBS_service_startReplayBuffer(const Napi::CallbackInfo &info); Napi::Value OBS_service_stopStreaming(const Napi::CallbackInfo &info); Napi::Value OBS_service_stopRecording(const Napi::CallbackInfo &info); +Napi::Value OBS_service_stopRecordingForce(const Napi::CallbackInfo &info); Napi::Value OBS_service_stopReplayBuffer(const Napi::CallbackInfo &info); Napi::Value OBS_service_connectOutputSignals(const Napi::CallbackInfo &info); diff --git a/obs-studio-server/source/nodeobs_service.cpp b/obs-studio-server/source/nodeobs_service.cpp index 8f30ddfcd..38c596b61 100644 --- a/obs-studio-server/source/nodeobs_service.cpp +++ b/obs-studio-server/source/nodeobs_service.cpp @@ -137,15 +137,13 @@ void OBS_service::Register(ipc::server &srv) cls->register_function(std::make_shared("OBS_service_startStreaming", std::vector{}, OBS_service_startStreaming)); cls->register_function(std::make_shared("OBS_service_startRecording", std::vector{}, OBS_service_startRecording)); cls->register_function(std::make_shared("OBS_service_startReplayBuffer", std::vector{}, OBS_service_startReplayBuffer)); - cls->register_function( - std::make_shared("OBS_service_stopStreaming", std::vector{ipc::type::Int32}, OBS_service_stopStreaming)); + cls->register_function(std::make_shared("OBS_service_stopStreaming", std::vector{ipc::type::Int32}, OBS_service_stopStreaming)); cls->register_function(std::make_shared("OBS_service_stopRecording", std::vector{}, OBS_service_stopRecording)); - cls->register_function( - std::make_shared("OBS_service_stopReplayBuffer", std::vector{ipc::type::Int32}, OBS_service_stopReplayBuffer)); + cls->register_function(std::make_shared("OBS_service_stopRecordingForce", std::vector{}, OBS_service_stopRecordingForce)); + cls->register_function(std::make_shared("OBS_service_stopReplayBuffer", std::vector{ipc::type::Int32}, OBS_service_stopReplayBuffer)); cls->register_function(std::make_shared("OBS_service_connectOutputSignals", std::vector{}, OBS_service_connectOutputSignals)); cls->register_function(std::make_shared("Query", std::vector{}, Query)); - cls->register_function( - std::make_shared("OBS_service_processReplayBufferHotkey", std::vector{}, OBS_service_processReplayBufferHotkey)); + cls->register_function(std::make_shared("OBS_service_processReplayBufferHotkey", std::vector{}, OBS_service_processReplayBufferHotkey)); cls->register_function(std::make_shared("OBS_service_splitFile", std::vector{}, OBS_service_splitFile)); cls->register_function(std::make_shared("OBS_service_getLastReplay", std::vector{}, OBS_service_getLastReplay)); cls->register_function(std::make_shared("OBS_service_getLastRecording", std::vector{}, OBS_service_getLastRecording)); @@ -153,8 +151,7 @@ void OBS_service::Register(ipc::server &srv) cls->register_function(std::make_shared("OBS_service_createVirtualCam", std::vector{}, OBS_service_createVirtualCam)); cls->register_function(std::make_shared("OBS_service_startVirtualCam", std::vector{}, OBS_service_startVirtualCam)); cls->register_function(std::make_shared("OBS_service_stopVirtualCam", std::vector{}, OBS_service_stopVirtualCam)); - cls->register_function(std::make_shared("OBS_service_updateVirtualCam", std::vector{ipc::type::Int32, ipc::type::String}, - OBS_service_updateVirtualCam)); + cls->register_function(std::make_shared("OBS_service_updateVirtualCam", std::vector{ipc::type::Int32, ipc::type::String}, OBS_service_updateVirtualCam)); srv.register_collection(cls); } @@ -279,6 +276,18 @@ void OBS_service::OBS_service_stopRecording(void *data, const int64_t id, const AUTO_DEBUG; } +void OBS_service::OBS_service_stopRecordingForce(void *data, const int64_t id, const std::vector &args, std::vector &rval) +{ + stopRecordingForce(); + rval.push_back(ipc::value((uint64_t)ErrorCode::Ok)); + +#if !defined(_WIN32) + util::CrashManager::UpdateBriefCrashInfoAppState(); +#endif + + AUTO_DEBUG; +} + void OBS_service::OBS_service_stopReplayBuffer(void *data, const int64_t id, const std::vector &args, std::vector &rval) { stopReplayBuffer((bool)args[0].value_union.i32); @@ -1763,6 +1772,16 @@ void OBS_service::stopRecording(void) isRecording = false; } +void OBS_service::stopRecordingForce(void) +{ + blog(LOG_WARNING, "stopRecordingForce called"); + + if (recordingOutput && obs_output_active(recordingOutput)) + obs_output_force_stop(recordingOutput); + + isRecording = false; +} + void OBS_service::updateReplayBufferOutput(bool isSimpleMode, bool useStreamEncoder) { blog(LOG_INFO, "updateReplayBufferOutput - isSimpleMode: %d, useStreamEncoder: %d", (int)isSimpleMode, (int)useStreamEncoder); diff --git a/obs-studio-server/source/nodeobs_service.h b/obs-studio-server/source/nodeobs_service.h index 3b27946e4..064611bf9 100644 --- a/obs-studio-server/source/nodeobs_service.h +++ b/obs-studio-server/source/nodeobs_service.h @@ -137,6 +137,7 @@ class OBS_service { static void OBS_service_startReplayBuffer(void *data, const int64_t id, const std::vector &args, std::vector &rval); static void OBS_service_stopStreaming(void *data, const int64_t id, const std::vector &args, std::vector &rval); static void OBS_service_stopRecording(void *data, const int64_t id, const std::vector &args, std::vector &rval); + static void OBS_service_stopRecordingForce(void *data, const int64_t id, const std::vector &args, std::vector &rval); static void OBS_service_stopReplayBuffer(void *data, const int64_t id, const std::vector &args, std::vector &rval); static void OBS_service_connectOutputSignals(void *data, const int64_t id, const std::vector &args, std::vector &rval); static void OBS_service_processReplayBufferHotkey(void *data, const int64_t id, const std::vector &args, std::vector &rval); @@ -159,6 +160,7 @@ class OBS_service { static bool startReplayBuffer(void); static void stopReplayBuffer(bool forceStop); static void stopRecording(void); + static void stopRecordingForce(void); static void releaseStreamingOutput(StreamServiceId serviceId);