Skip to content

Commit 2387dc2

Browse files
authored
Merge branch 'master' into feat/transition-data
2 parents 4fd8e3f + faf0866 commit 2387dc2

17 files changed

+230
-33
lines changed

CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.16...3.25)
22

33
legacy_check()
44

5-
set(obs-websocket_VERSION 5.4.2)
5+
set(obs-websocket_VERSION 5.5.2)
66
set(OBS_WEBSOCKET_RPC_VERSION 1)
77

88
include(cmake/obs-websocket-api.cmake)
@@ -138,12 +138,14 @@ target_compile_definitions(
138138
target_compile_options(
139139
obs-websocket
140140
PRIVATE $<$<PLATFORM_ID:Windows>:/wd4267>
141+
$<$<PLATFORM_ID:Windows>:/wd4996>
141142
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wall>
142143
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=float-conversion>
143144
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=shadow>
144145
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow>
145146
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=int-conversion>
146147
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=comment>
148+
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=deprecated-declarations>
147149
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction>
148150
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=deprecated-declarations>
149151
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=implicit-int-conversion>

cmake/legacy.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
project(obs-websocket VERSION 5.4.2)
1+
project(obs-websocket VERSION 5.5.2)
22
set(OBS_WEBSOCKET_RPC_VERSION 1)
33

44
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)

data/locale/be-BY.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ OBSWebSocket.Settings.ServerPort="Порт сервера"
1313
OBSWebSocket.Settings.ShowConnectInfo="Паказаць звесткі пра злучэнне"
1414
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Увага: ідзе трансляцыя"
1515
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Выглядае, што ў бягучы момант ідзе вывад (стрым, запіс і г. д.)."
16-
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Вы ўпэўненыя, што хочаце паказаць вашы звесткі пра злучэнне?"
16+
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ці вы ўпэўненыя, што хочаце паказаць вашы звесткі пра злучэнне?"
1717
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Увага: магчымая небяспека"
1818
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket захоўвае пароль сервера ў выглядзе звычайнага тэксту. Настойліва рэкамендуецца выкарыстоўваць пароль, які згенеруе obs-websocket."
19-
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Вы ўпэўненыя, што хочаце карыстацца сваім паролем?"
19+
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ці вы ўпэўненыя, што хочаце карыстацца сваім паролем?"
2020
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Увага: памылковая канфігурацыя"
2121
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Пароль павінен утрымліваць 6 або больш сімвалаў."
2222
OBSWebSocket.SessionTable.Title="Злучаныя сеансы WebSocket"

data/locale/ro-RO.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ OBSWebSocket.Settings.GeneratePassword="Generează parola"
1212
OBSWebSocket.Settings.ServerPort="Portul serverului"
1313
OBSWebSocket.Settings.ShowConnectInfo="Afișează informațiile conexiunii"
1414
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Avertisment: În prezent în direct"
15-
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Se pare că un output (transmisiune, înregistrare etc.) este activ în prezent."
15+
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Se pare că un output (stream, înregistrare etc.) este activ în prezent."
1616
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sigur vrei să afișezi informațiile de conectare?"
1717
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avertisment: Potențială problemă de securitate"
1818
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket stochează parola serverului ca text simplu. Este foarte recomandat să folosiți o parolă generată de obs-websocket."

data/locale/ru-RU.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ OBSWebSocket.SessionTable.KickButtonColumnTitle="Выгнать?"
2828
OBSWebSocket.SessionTable.KickButtonText="Выгнать"
2929
OBSWebSocket.ConnectInfo.DialogTitle="Сведения о подключении WebSocket"
3030
OBSWebSocket.ConnectInfo.CopyText="Копировать"
31-
OBSWebSocket.ConnectInfo.ServerIp="IP сервера (лучшая догадка)"
31+
OBSWebSocket.ConnectInfo.ServerIp="IP сервера (вероятный)"
3232
OBSWebSocket.ConnectInfo.ServerPort="Порт сервера"
3333
OBSWebSocket.ConnectInfo.ServerPassword="Пароль сервера"
3434
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Вход отключён]"

data/locale/sv-SE.ini

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
OBSWebSocket.Plugin.Description="Fjärrkontroll av OBS Studio via WebSocket"
22
OBSWebSocket.Settings.DialogTitle="WebSocket-serverinställningar"
3-
OBSWebSocket.Settings.PluginSettingsTitle="Insticksmodulsinställningar"
3+
OBSWebSocket.Settings.PluginSettingsTitle="Insticksprogramsinställningar"
44
OBSWebSocket.Settings.ServerEnable="Aktivera WebSocket-server"
55
OBSWebSocket.Settings.AlertsEnable="Aktivera systemfältsmeddelanden"
66
OBSWebSocket.Settings.DebugEnable="Aktivera felsökningsloggning"
@@ -11,7 +11,7 @@ OBSWebSocket.Settings.Password="Serverlösenord"
1111
OBSWebSocket.Settings.GeneratePassword="Generera lösenord"
1212
OBSWebSocket.Settings.ServerPort="Serverport"
1313
OBSWebSocket.Settings.ShowConnectInfo="Visa anslutningsinformation"
14-
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Varning: Sänder för närvarande"
14+
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Varning: Direktsändning pågår"
1515
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Det verkar som om en utmatning (ström, inspelning, etc.) är för närvarande aktiv."
1616
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Är du säker på att du vill visa din anslutningsinformation?"
1717
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Varning: Potentiellt säkerhetsproblem"

data/locale/tt-RU.ini

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
OBSWebSocket.Settings.ServerSettingsTitle="Сервер көйләүләре"
2+
OBSWebSocket.Settings.Password="Сервер серсүзе"
3+
OBSWebSocket.Settings.GeneratePassword="Серсүзне ясау"
4+
OBSWebSocket.Settings.ServerPort="Сервер порты"
5+
OBSWebSocket.SessionTable.KickButtonColumnTitle="Чыгарыргамы?"
6+
OBSWebSocket.SessionTable.KickButtonText="Чыгару"
7+
OBSWebSocket.ConnectInfo.CopyText="Күчермә алу"
8+
OBSWebSocket.ConnectInfo.ServerPort="Сервер порты"
9+
OBSWebSocket.ConnectInfo.ServerPassword="Сервер серсүзе"

docs/generated/protocol.json

+48
Original file line numberDiff line numberDiff line change
@@ -3472,6 +3472,37 @@
34723472
"requestFields": [],
34733473
"responseFields": []
34743474
},
3475+
{
3476+
"description": "Splits the current file being recorded into a new file.",
3477+
"requestType": "SplitRecordFile",
3478+
"complexity": 2,
3479+
"rpcVersion": "1",
3480+
"deprecated": false,
3481+
"initialVersion": "5.5.0",
3482+
"category": "record",
3483+
"requestFields": [],
3484+
"responseFields": []
3485+
},
3486+
{
3487+
"description": "Adds a new chapter marker to the file currently being recorded.\n\nNote: As of OBS 30.2.0, the only file format supporting this feature is Hybrid MP4.",
3488+
"requestType": "CreateRecordChapter",
3489+
"complexity": 2,
3490+
"rpcVersion": "1",
3491+
"deprecated": false,
3492+
"initialVersion": "5.5.0",
3493+
"category": "record",
3494+
"requestFields": [
3495+
{
3496+
"valueName": "chapterName",
3497+
"valueType": "String",
3498+
"valueDescription": "Name of the new chapter",
3499+
"valueRestrictions": null,
3500+
"valueOptional": true,
3501+
"valueOptionalBehavior": "Unknown"
3502+
}
3503+
],
3504+
"responseFields": []
3505+
},
34753506
{
34763507
"description": "Gets a list of all scene items in a scene.\n\nScenes only",
34773508
"requestType": "GetSceneItemList",
@@ -6046,6 +6077,23 @@
60466077
}
60476078
]
60486079
},
6080+
{
6081+
"description": "The record output has started writing to a new file. For example, when a file split happens.",
6082+
"eventType": "RecordFileChanged",
6083+
"eventSubscription": "Outputs",
6084+
"complexity": 2,
6085+
"rpcVersion": "1",
6086+
"deprecated": false,
6087+
"initialVersion": "5.5.0",
6088+
"category": "outputs",
6089+
"dataFields": [
6090+
{
6091+
"valueName": "newOutputPath",
6092+
"valueType": "String",
6093+
"valueDescription": "File name that the output has begun writing to"
6094+
}
6095+
]
6096+
},
60496097
{
60506098
"description": "The state of the replay buffer output has changed.",
60516099
"eventType": "ReplayBufferStateChanged",

docs/generated/protocol.md

+47
Original file line numberDiff line numberDiff line change
@@ -1548,6 +1548,7 @@ The output has been resumed (unpaused).
15481548
- [Outputs Events](#outputs-events)
15491549
- [StreamStateChanged](#streamstatechanged)
15501550
- [RecordStateChanged](#recordstatechanged)
1551+
- [RecordFileChanged](#recordfilechanged)
15511552
- [ReplayBufferStateChanged](#replaybufferstatechanged)
15521553
- [VirtualcamStateChanged](#virtualcamstatechanged)
15531554
- [ReplayBufferSaved](#replaybuffersaved)
@@ -2433,6 +2434,22 @@ The state of the record output has changed.
24332434

24342435
---
24352436

2437+
### RecordFileChanged
2438+
2439+
The record output has started writing to a new file. For example, when a file split happens.
2440+
2441+
- Complexity Rating: `2/5`
2442+
- Latest Supported RPC Version: `1`
2443+
- Added in v5.5.0
2444+
2445+
**Data Fields:**
2446+
2447+
| Name | Type | Description |
2448+
| ---- | :---: | ----------- |
2449+
| newOutputPath | String | File name that the output has begun writing to |
2450+
2451+
---
2452+
24362453
### ReplayBufferStateChanged
24372454

24382455
The state of the replay buffer output has changed.
@@ -2712,6 +2729,8 @@ communication is desired.
27122729
- [ToggleRecordPause](#togglerecordpause)
27132730
- [PauseRecord](#pauserecord)
27142731
- [ResumeRecord](#resumerecord)
2732+
- [SplitRecordFile](#splitrecordfile)
2733+
- [CreateRecordChapter](#createrecordchapter)
27152734
- [Media Inputs Requests](#media-inputs-1-requests)
27162735
- [GetMediaInputStatus](#getmediainputstatus)
27172736
- [SetMediaInputCursor](#setmediainputcursor)
@@ -5265,6 +5284,34 @@ Resumes the record output.
52655284
- Latest Supported RPC Version: `1`
52665285
- Added in v5.0.0
52675286

5287+
---
5288+
5289+
### SplitRecordFile
5290+
5291+
Splits the current file being recorded into a new file.
5292+
5293+
- Complexity Rating: `2/5`
5294+
- Latest Supported RPC Version: `1`
5295+
- Added in v5.5.0
5296+
5297+
---
5298+
5299+
### CreateRecordChapter
5300+
5301+
Adds a new chapter marker to the file currently being recorded.
5302+
5303+
Note: As of OBS 30.2.0, the only file format supporting this feature is Hybrid MP4.
5304+
5305+
- Complexity Rating: `2/5`
5306+
- Latest Supported RPC Version: `1`
5307+
- Added in v5.5.0
5308+
5309+
**Request Fields:**
5310+
5311+
| Name | Type | Description | Value Restrictions | ?Default Behavior |
5312+
| ---- | :---: | ----------- | :----------------: | ----------------- |
5313+
| ?chapterName | String | Name of the new chapter | None | Unknown |
5314+
52685315
## Media Inputs Requests
52695316

52705317
### GetMediaInputStatus

src/Config.cpp

+12-5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ void Config::Load(json config)
8787
Save();
8888
}
8989

90+
// If there are migrated settings, write them to disk before processing arguments.
91+
if (!config.empty())
92+
Save();
93+
9094
// Process `--websocket_port` override
9195
QString portArgument = Utils::Platform::GetCommandLineArgument(CMDLINE_WEBSOCKET_PORT);
9296
if (portArgument != "") {
@@ -141,7 +145,9 @@ void Config::Save()
141145
config[PARAM_PASSWORD] = ServerPassword;
142146
}
143147

144-
if (!Utils::Json::SetJsonFileContent(configFilePath, config))
148+
if (Utils::Json::SetJsonFileContent(configFilePath, config))
149+
blog(LOG_DEBUG, "[Config::Save] Saved config.");
150+
else
145151
blog(LOG_ERROR, "[Config::Save] Failed to write config file!");
146152
}
147153

@@ -193,7 +199,7 @@ bool MigratePersistentData()
193199
std::error_code ec;
194200

195201
// Ensure module config directory exists
196-
std::string moduleConfigDirectory = Utils::Obs::StringHelper::GetModuleConfigPath("");
202+
auto moduleConfigDirectory = std::filesystem::u8path(Utils::Obs::StringHelper::GetModuleConfigPath(""));
197203
if (!std::filesystem::exists(moduleConfigDirectory, ec))
198204
std::filesystem::create_directories(moduleConfigDirectory, ec);
199205
if (ec) {
@@ -203,10 +209,11 @@ bool MigratePersistentData()
203209
}
204210

205211
// Move any existing persistent data to module config directory, then delete old file
206-
std::string oldPersistentDataPath =
207-
Utils::Obs::StringHelper::GetCurrentProfilePath() + "/../../../obsWebSocketPersistentData.json";
212+
auto oldPersistentDataPath = std::filesystem::u8path(Utils::Obs::StringHelper::GetCurrentProfilePath() +
213+
"/../../../obsWebSocketPersistentData.json");
208214
if (std::filesystem::exists(oldPersistentDataPath, ec)) {
209-
std::string persistentDataPath = Utils::Obs::StringHelper::GetModuleConfigPath("persistent_data.json");
215+
auto persistentDataPath =
216+
std::filesystem::u8path(Utils::Obs::StringHelper::GetModuleConfigPath("persistent_data.json"));
210217
std::filesystem::copy_file(oldPersistentDataPath, persistentDataPath, ec);
211218
std::filesystem::remove(oldPersistentDataPath, ec);
212219
blog(LOG_INFO, "[MigratePersistentData] Persistent data migrated to new path");

src/eventhandler/EventHandler.cpp

+15-15
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

+4
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

+22
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
*

src/requesthandler/RequestHandler.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
177177
{"ToggleRecordPause", &RequestHandler::ToggleRecordPause},
178178
{"PauseRecord", &RequestHandler::PauseRecord},
179179
{"ResumeRecord", &RequestHandler::ResumeRecord},
180+
{"SplitRecordFile", &RequestHandler::SplitRecordFile},
181+
{"CreateRecordChapter", &RequestHandler::CreateRecordChapter},
180182

181183
// Media Inputs
182184
{"GetMediaInputStatus", &RequestHandler::GetMediaInputStatus},

src/requesthandler/RequestHandler.h

+2
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ class RequestHandler {
196196
RequestResult ToggleRecordPause(const Request &);
197197
RequestResult PauseRecord(const Request &);
198198
RequestResult ResumeRecord(const Request &);
199+
RequestResult SplitRecordFile(const Request &);
200+
RequestResult CreateRecordChapter(const Request &);
199201

200202
// Media Inputs
201203
RequestResult GetMediaInputStatus(const Request &);

0 commit comments

Comments
 (0)