Skip to content

Commit 71920c4

Browse files
committed
eventhandler: Add RecordFileChanged event
When a file split happens, this will fire with the new file name
1 parent 0eda8f9 commit 71920c4

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

src/eventhandler/EventHandler.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ EventHandler::EventHandler()
2727

2828
signal_handler_t *coreSignalHandler = obs_get_signal_handler();
2929
if (coreSignalHandler) {
30-
signal_handler_connect(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
31-
signal_handler_connect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
32-
signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
33-
signal_handler_connect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
34-
signal_handler_connect(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this);
30+
coreSignals.emplace_back(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
31+
coreSignals.emplace_back(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
32+
coreSignals.emplace_back(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
33+
coreSignals.emplace_back(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
34+
coreSignals.emplace_back(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this);
3535
} else {
3636
blog(LOG_ERROR, "[EventHandler::EventHandler] Unable to get libobs signal handler!");
3737
}
@@ -45,16 +45,7 @@ EventHandler::~EventHandler()
4545

4646
obs_frontend_remove_event_callback(OnFrontendEvent, this);
4747

48-
signal_handler_t *coreSignalHandler = obs_get_signal_handler();
49-
if (coreSignalHandler) {
50-
signal_handler_disconnect(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
51-
signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
52-
signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
53-
signal_handler_disconnect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
54-
signal_handler_disconnect(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this);
55-
} else {
56-
blog(LOG_ERROR, "[EventHandler::~EventHandler] Unable to get libobs signal handler!");
57-
}
48+
coreSignals.clear();
5849

5950
// Revoke callbacks of all inputs and scenes, in case some still have our callbacks attached
6051
auto enumInputs = [](void *param, obs_source_t *source) {
@@ -378,12 +369,21 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
378369
break;
379370
case OBS_FRONTEND_EVENT_RECORDING_STARTED:
380371
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STARTED);
372+
{
373+
OBSOutputAutoRelease recordOutput = obs_frontend_get_recording_output();
374+
if (recordOutput) {
375+
signal_handler_t *sh = obs_output_get_signal_handler(recordOutput);
376+
eventHandler->recordFileChangedSignal.Connect(sh, "file_changed", HandleRecordFileChanged,
377+
private_data);
378+
}
379+
}
381380
break;
382381
case OBS_FRONTEND_EVENT_RECORDING_STOPPING:
383382
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPING);
384383
break;
385384
case OBS_FRONTEND_EVENT_RECORDING_STOPPED:
386385
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPED);
386+
eventHandler->recordFileChangedSignal.Disconnect();
387387
break;
388388
case OBS_FRONTEND_EVENT_RECORDING_PAUSED:
389389
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_PAUSED);

src/eventhandler/EventHandler.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class EventHandler {
5151

5252
std::atomic<bool> _obsReady = false;
5353

54+
std::vector<OBSSignal> coreSignals;
55+
OBSSignal recordFileChangedSignal;
56+
5457
std::unique_ptr<Utils::Obs::VolumeMeter::Handler> _inputVolumeMetersHandler;
5558
std::atomic<uint64_t> _inputVolumeMetersRef = 0;
5659
std::atomic<uint64_t> _inputActiveStateChangedRef = 0;
@@ -155,6 +158,7 @@ class EventHandler {
155158
// Outputs
156159
void HandleStreamStateChanged(ObsOutputState state);
157160
void HandleRecordStateChanged(ObsOutputState state);
161+
static void HandleRecordFileChanged(void *param, calldata_t *data); // Direct callback
158162
void HandleReplayBufferStateChanged(ObsOutputState state);
159163
void HandleVirtualcamStateChanged(ObsOutputState state);
160164
void HandleReplayBufferSaved();

src/eventhandler/EventHandler_Outputs.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,28 @@ void EventHandler::HandleRecordStateChanged(ObsOutputState state)
8787
BroadcastEvent(EventSubscription::Outputs, "RecordStateChanged", eventData);
8888
}
8989

90+
/**
91+
* The record output has started writing to a new file. For example, when a file split happens.
92+
*
93+
* @dataField newOutputPath | String | File name that the output has begun writing to
94+
*
95+
* @eventType RecordFileChanged
96+
* @eventSubscription Outputs
97+
* @complexity 2
98+
* @rpcVersion -1
99+
* @initialVersion 5.5.0
100+
* @api events
101+
* @category outputs
102+
*/
103+
void EventHandler::HandleRecordFileChanged(void *param, calldata_t *data)
104+
{
105+
auto eventHandler = static_cast<EventHandler *>(param);
106+
107+
json eventData;
108+
eventData["newOutputPath"] = calldata_string(data, "next_file");
109+
eventHandler->BroadcastEvent(EventSubscription::Outputs, "RecordFileChanged", eventData);
110+
}
111+
90112
/**
91113
* The state of the replay buffer output has changed.
92114
*

0 commit comments

Comments
 (0)