Skip to content

Commit c589930

Browse files
committed
Add recording pause functions
1 parent 9062c0d commit c589930

File tree

6 files changed

+164
-0
lines changed

6 files changed

+164
-0
lines changed

obs-studio-client/source/nodeobs_service.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,38 @@ Napi::Value service::OBS_service_stopReplayBuffer(const Napi::CallbackInfo& info
164164
return info.Env().Undefined();
165165
}
166166

167+
Napi::Value service::OBS_service_canPauseRecording(const Napi::CallbackInfo& info)
168+
{
169+
auto conn = GetConnection(info);
170+
if (!conn)
171+
return info.Env().Undefined();
172+
173+
std::vector<ipc::value> response = conn->call_synchronous_helper("NodeOBS_Service", "OBS_service_canPauseRecording", {});
174+
return Napi::Boolean::New(info.Env(), (bool)response[1].value_union.i32);
175+
}
176+
177+
Napi::Value service::OBS_service_pauseRecording(const Napi::CallbackInfo& info)
178+
{
179+
bool shouldPause = info[0].ToBoolean().Value();
180+
181+
auto conn = GetConnection(info);
182+
if (!conn)
183+
return info.Env().Undefined();
184+
185+
std::vector<ipc::value> response = conn->call_synchronous_helper("NodeOBS_Service", "OBS_service_pauseRecording", {ipc::value(shouldPause)});
186+
return Napi::Boolean::New(info.Env(), (bool)response[1].value_union.i32);
187+
}
188+
189+
Napi::Value service::OBS_service_isPausedRecording(const Napi::CallbackInfo& info)
190+
{
191+
auto conn = GetConnection(info);
192+
if (!conn)
193+
return info.Env().Undefined();
194+
195+
std::vector<ipc::value> response = conn->call_synchronous_helper("NodeOBS_Service", "OBS_service_isPausedRecording", {});
196+
return Napi::Boolean::New(info.Env(), (bool)response[1].value_union.i32);
197+
}
198+
167199
static v8::Persistent<v8::Object> serviceCallbackObject;
168200

169201
Napi::Value service::OBS_service_connectOutputSignals(const Napi::CallbackInfo& info)
@@ -464,6 +496,15 @@ void service::Init(Napi::Env env, Napi::Object exports)
464496
exports.Set(
465497
Napi::String::New(env, "OBS_service_stopReplayBuffer"),
466498
Napi::Function::New(env, service::OBS_service_stopReplayBuffer));
499+
exports.Set(
500+
Napi::String::New(env, "OBS_service_canPauseRecording"),
501+
Napi::Function::New(env, service::OBS_service_canPauseRecording));
502+
exports.Set(
503+
Napi::String::New(env, "OBS_service_pauseRecording"),
504+
Napi::Function::New(env, service::OBS_service_pauseRecording));
505+
exports.Set(
506+
Napi::String::New(env, "OBS_service_isPausedRecording"),
507+
Napi::Function::New(env, service::OBS_service_isPausedRecording));
467508
exports.Set(
468509
Napi::String::New(env, "OBS_service_connectOutputSignals"),
469510
Napi::Function::New(env, service::OBS_service_connectOutputSignals));

obs-studio-client/source/nodeobs_service.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ namespace service
5757
Napi::Value OBS_service_stopRecording(const Napi::CallbackInfo& info);
5858
Napi::Value OBS_service_stopReplayBuffer(const Napi::CallbackInfo& info);
5959

60+
Napi::Value OBS_service_canPauseRecording(const Napi::CallbackInfo& info);
61+
Napi::Value OBS_service_pauseRecording(const Napi::CallbackInfo& info);
62+
Napi::Value OBS_service_isPausedRecording(const Napi::CallbackInfo& info);
63+
6064
Napi::Value OBS_service_connectOutputSignals(const Napi::CallbackInfo& info);
6165
Napi::Value OBS_service_removeCallback(const Napi::CallbackInfo& info);
6266
Napi::Value OBS_service_processReplayBufferHotkey(const Napi::CallbackInfo& info);

obs-studio-server/source/nodeobs_service.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ void OBS_service::Register(ipc::server& srv)
9595
"OBS_service_stopRecording", std::vector<ipc::type>{}, OBS_service_stopRecording));
9696
cls->register_function(std::make_shared<ipc::function>(
9797
"OBS_service_stopReplayBuffer", std::vector<ipc::type>{ipc::type::Int32}, OBS_service_stopReplayBuffer));
98+
cls->register_function(std::make_shared<ipc::function>(
99+
"OBS_service_canPauseRecording", std::vector<ipc::type>{}, OBS_service_canPauseRecording));
100+
cls->register_function(std::make_shared<ipc::function>(
101+
"OBS_service_pauseRecording", std::vector<ipc::type>{ipc::type::Int32}, OBS_service_pauseRecording));
102+
cls->register_function(std::make_shared<ipc::function>(
103+
"OBS_service_isPausedRecording", std::vector<ipc::type>{}, OBS_service_isPausedRecording));
98104
cls->register_function(std::make_shared<ipc::function>(
99105
"OBS_service_connectOutputSignals", std::vector<ipc::type>{}, OBS_service_connectOutputSignals));
100106
cls->register_function(std::make_shared<ipc::function>("Query", std::vector<ipc::type>{}, Query));
@@ -244,6 +250,42 @@ void OBS_service::OBS_service_stopReplayBuffer(
244250
AUTO_DEBUG;
245251
}
246252

253+
void OBS_service::OBS_service_canPauseRecording(
254+
void* data,
255+
const int64_t id,
256+
const std::vector<ipc::value>& args,
257+
std::vector<ipc::value>& rval)
258+
{
259+
bool result = canPauseRecording();
260+
rval.push_back(ipc::value((uint64_t)ErrorCode::Ok));
261+
rval.push_back(ipc::value(result));
262+
AUTO_DEBUG;
263+
}
264+
265+
void OBS_service::OBS_service_pauseRecording(
266+
void* data,
267+
const int64_t id,
268+
const std::vector<ipc::value>& args,
269+
std::vector<ipc::value>& rval)
270+
{
271+
bool result = pauseRecording((bool)args[0].value_union.i32);
272+
rval.push_back(ipc::value((uint64_t)ErrorCode::Ok));
273+
rval.push_back(ipc::value(result));
274+
AUTO_DEBUG;
275+
}
276+
277+
void OBS_service::OBS_service_isPausedRecording(
278+
void* data,
279+
const int64_t id,
280+
const std::vector<ipc::value>& args,
281+
std::vector<ipc::value>& rval)
282+
{
283+
bool result = isPausedRecording();
284+
rval.push_back(ipc::value((uint64_t)ErrorCode::Ok));
285+
rval.push_back(ipc::value(result));
286+
AUTO_DEBUG;
287+
}
288+
247289
bool OBS_service::resetAudioContext(bool reload)
248290
{
249291
struct obs_audio_info ai;
@@ -1363,6 +1405,21 @@ void OBS_service::stopRecording(void)
13631405
isRecording = false;
13641406
}
13651407

1408+
bool OBS_service::canPauseRecording(void)
1409+
{
1410+
return obs_output_can_pause(recordingOutput);
1411+
}
1412+
1413+
bool OBS_service::pauseRecording(bool shouldPause)
1414+
{
1415+
return obs_output_pause(recordingOutput, shouldPause);
1416+
}
1417+
1418+
bool OBS_service::isPausedRecording(void)
1419+
{
1420+
return obs_output_paused(recordingOutput);
1421+
}
1422+
13661423
void OBS_service::updateReplayBufferOutput(bool isSimpleMode, bool useStreamEncoder)
13671424
{
13681425
const char* path;
@@ -2317,6 +2374,8 @@ void OBS_service::OBS_service_connectOutputSignals(
23172374
recordingSignals.push_back(SignalInfo("recording", "stop"));
23182375
recordingSignals.push_back(SignalInfo("recording", "stopping"));
23192376
recordingSignals.push_back(SignalInfo("recording", "wrote"));
2377+
recordingSignals.push_back(SignalInfo("recording", "pause"));
2378+
recordingSignals.push_back(SignalInfo("recording", "unpause"));
23202379

23212380
replayBufferSignals.push_back(SignalInfo("replay-buffer", "start"));
23222381
replayBufferSignals.push_back(SignalInfo("replay-buffer", "stop"));

obs-studio-server/source/nodeobs_service.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,21 @@ class OBS_service
161161
const int64_t id,
162162
const std::vector<ipc::value>& args,
163163
std::vector<ipc::value>& rval);
164+
static void OBS_service_canPauseRecording(
165+
void* data,
166+
const int64_t id,
167+
const std::vector<ipc::value>& args,
168+
std::vector<ipc::value>& rval);
169+
static void OBS_service_pauseRecording(
170+
void* data,
171+
const int64_t id,
172+
const std::vector<ipc::value>& args,
173+
std::vector<ipc::value>& rval);
174+
static void OBS_service_isPausedRecording(
175+
void* data,
176+
const int64_t id,
177+
const std::vector<ipc::value>& args,
178+
std::vector<ipc::value>& rval);
164179
static void OBS_service_connectOutputSignals(
165180
void* data,
166181
const int64_t id,
@@ -212,6 +227,10 @@ class OBS_service
212227
static void stopReplayBuffer(bool forceStop);
213228
static void stopRecording(void);
214229

230+
static bool canPauseRecording(void);
231+
static bool pauseRecording(bool shouldPause);
232+
static bool isPausedRecording(void);
233+
215234
static void releaseStreamingOutput(void);
216235

217236
static void LoadRecordingPreset_h264(const char* encoder);

tests/osn-tests/src/test_nodeobs_service.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,45 @@ describe(testName, function() {
148148
expect(signalInfo.signal).to.equal(EOBSOutputSignal.Wrote, GetErrorMessage(ETestErrorMsg.RecordingOutput));
149149
});
150150

151+
it('Simple mode - Pause recording and resume', async function() {
152+
// Preparing environment
153+
obs.setSetting(EOBSSettingsCategories.Output, 'Mode', 'Simple');
154+
obs.setSetting(EOBSSettingsCategories.Output, 'StreamEncoder', obs.os === 'win32' ? 'x264' : 'obs_x264');
155+
obs.setSetting(EOBSSettingsCategories.Output, 'FilePath', path.join(path.normalize(__dirname), '..', 'osnData'));
156+
157+
let signalInfo: IOBSOutputSignalInfo;
158+
159+
osn.NodeObs.OBS_service_startRecording();
160+
161+
signalInfo = await obs.getNextSignalInfo(EOBSOutputType.Recording, EOBSOutputSignal.Start);
162+
163+
if (signalInfo.signal == EOBSOutputSignal.Stop) {
164+
throw Error(GetErrorMessage(ETestErrorMsg.RecordOutputDidNotStart, signalInfo.code.toString(), signalInfo.error));
165+
}
166+
167+
expect(signalInfo.type).to.equal(EOBSOutputType.Recording, GetErrorMessage(ETestErrorMsg.RecordingOutput));
168+
expect(signalInfo.signal).to.equal(EOBSOutputSignal.Start, GetErrorMessage(ETestErrorMsg.RecordingOutput));
169+
170+
await sleep(500);
171+
172+
expect(osn.NodeObs.OBS_service_canPauseRecording()).to.equal(true)
173+
expect(osn.NodeObs.OBS_service_isPausedRecording()).to.equal(false)
174+
175+
expect(osn.NodeObs.OBS_service_pauseRecording(true)).to.equal(true);
176+
signalInfo = await obs.getNextSignalInfo(EOBSOutputType.Recording, EOBSOutputSignal.Pause);
177+
178+
expect(signalInfo.signal).to.equal(EOBSOutputSignal.Pause, GetErrorMessage(ETestErrorMsg.RecordingOutput));
179+
expect(osn.NodeObs.OBS_service_isPausedRecording()).to.equal(true);
180+
181+
expect(osn.NodeObs.OBS_service_pauseRecording(false)).to.equal(true)
182+
signalInfo = await obs.getNextSignalInfo(EOBSOutputType.Recording, EOBSOutputSignal.Unpause);
183+
184+
expect(signalInfo.signal).to.equal(EOBSOutputSignal.Unpause, GetErrorMessage(ETestErrorMsg.RecordingOutput));
185+
expect(osn.NodeObs.OBS_service_isPausedRecording()).to.equal(false)
186+
187+
osn.NodeObs.OBS_service_stopRecording();
188+
});
189+
151190
it('Simple mode - Start replay buffer, save replay and stop', async function() {
152191
// Preparing environment
153192
obs.setSetting(EOBSSettingsCategories.Output, 'Mode', 'Simple');

tests/osn-tests/util/obs_enums.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export const enum EOBSOutputSignal {
1717
Writing = 'writing',
1818
Wrote = 'wrote',
1919
WriteError = 'writing_error',
20+
Pause = 'pause',
21+
Unpause = 'unpause',
2022
}
2123

2224
export const enum EOBSInputTypes {

0 commit comments

Comments
 (0)