Skip to content

Commit e8c8339

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

File tree

6 files changed

+161
-0
lines changed

6 files changed

+161
-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: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ 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>("OBS_service_canPauseRecording", std::vector<ipc::type>{}, OBS_service_canPauseRecording));
99+
cls->register_function(std::make_shared<ipc::function>("OBS_service_pauseRecording", std::vector<ipc::type>{ipc::type::Int32}, OBS_service_pauseRecording));
100+
cls->register_function(std::make_shared<ipc::function>("OBS_service_isPausedRecording", std::vector<ipc::type>{}, OBS_service_isPausedRecording));
98101
cls->register_function(std::make_shared<ipc::function>(
99102
"OBS_service_connectOutputSignals", std::vector<ipc::type>{}, OBS_service_connectOutputSignals));
100103
cls->register_function(std::make_shared<ipc::function>("Query", std::vector<ipc::type>{}, Query));
@@ -244,6 +247,42 @@ void OBS_service::OBS_service_stopReplayBuffer(
244247
AUTO_DEBUG;
245248
}
246249

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

1405+
bool OBS_service::canPauseRecording(void)
1406+
{
1407+
return obs_output_can_pause(recordingOutput);
1408+
}
1409+
1410+
bool OBS_service::pauseRecording(bool shouldPause)
1411+
{
1412+
return obs_output_pause(recordingOutput, shouldPause);
1413+
}
1414+
1415+
bool OBS_service::isPausedRecording(void)
1416+
{
1417+
return obs_output_paused(recordingOutput);
1418+
}
1419+
13661420
void OBS_service::updateReplayBufferOutput(bool isSimpleMode, bool useStreamEncoder)
13671421
{
13681422
const char* path;
@@ -2317,6 +2371,8 @@ void OBS_service::OBS_service_connectOutputSignals(
23172371
recordingSignals.push_back(SignalInfo("recording", "stop"));
23182372
recordingSignals.push_back(SignalInfo("recording", "stopping"));
23192373
recordingSignals.push_back(SignalInfo("recording", "wrote"));
2374+
recordingSignals.push_back(SignalInfo("recording", "pause"));
2375+
recordingSignals.push_back(SignalInfo("recording", "unpause"));
23202376

23212377
replayBufferSignals.push_back(SignalInfo("replay-buffer", "start"));
23222378
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)