mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Compare commits
10 Commits
5.3.5
...
experiment
Author | SHA1 | Date | |
---|---|---|---|
896bacf550 | |||
81b307e5ad | |||
52733ddce7 | |||
444caeb1d7 | |||
f03e82c3f8 | |||
bbdc5bc823 | |||
9ecc9532e8 | |||
0189c3a3f5 | |||
f48fcc06ec | |||
f43ef8e2da |
@ -1259,6 +1259,23 @@
|
|||||||
],
|
],
|
||||||
"responseFields": []
|
"responseFields": []
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Gets an array of all available source filter kinds.\n\nSimilar to `GetInputKindList`",
|
||||||
|
"requestType": "GetSourceFilterKindList",
|
||||||
|
"complexity": 2,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.4.0",
|
||||||
|
"category": "filters",
|
||||||
|
"requestFields": [],
|
||||||
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "sourceFilterKinds",
|
||||||
|
"valueType": "Array<String>",
|
||||||
|
"valueDescription": "Array of source filter kinds"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "Gets an array of all of a source's filters.",
|
"description": "Gets an array of all of a source's filters.",
|
||||||
"requestType": "GetSourceFilterList",
|
"requestType": "GetSourceFilterList",
|
||||||
@ -1803,6 +1820,14 @@
|
|||||||
"valueRestrictions": null,
|
"valueRestrictions": null,
|
||||||
"valueOptional": false,
|
"valueOptional": false,
|
||||||
"valueOptionalBehavior": null
|
"valueOptionalBehavior": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "contextName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Name of context of the hotkey to trigger",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": true,
|
||||||
|
"valueOptionalBehavior": "Unknown"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"responseFields": []
|
"responseFields": []
|
||||||
@ -3117,7 +3142,13 @@
|
|||||||
"initialVersion": "5.0.0",
|
"initialVersion": "5.0.0",
|
||||||
"category": "record",
|
"category": "record",
|
||||||
"requestFields": [],
|
"requestFields": [],
|
||||||
"responseFields": []
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputActive",
|
||||||
|
"valueType": "Boolean",
|
||||||
|
"valueDescription": "The new active state of the output"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Starts the record output.",
|
"description": "Starts the record output.",
|
||||||
|
@ -2596,6 +2596,7 @@ communication is desired.
|
|||||||
- [TriggerStudioModeTransition](#triggerstudiomodetransition)
|
- [TriggerStudioModeTransition](#triggerstudiomodetransition)
|
||||||
- [SetTBarPosition](#settbarposition)
|
- [SetTBarPosition](#settbarposition)
|
||||||
- [Filters Requests](#filters-1-requests)
|
- [Filters Requests](#filters-1-requests)
|
||||||
|
- [GetSourceFilterKindList](#getsourcefilterkindlist)
|
||||||
- [GetSourceFilterList](#getsourcefilterlist)
|
- [GetSourceFilterList](#getsourcefilterlist)
|
||||||
- [GetSourceFilterDefaultSettings](#getsourcefilterdefaultsettings)
|
- [GetSourceFilterDefaultSettings](#getsourcefilterdefaultsettings)
|
||||||
- [CreateSourceFilter](#createsourcefilter)
|
- [CreateSourceFilter](#createsourcefilter)
|
||||||
@ -2793,6 +2794,7 @@ Triggers a hotkey using its name. See `GetHotkeyList`
|
|||||||
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
| hotkeyName | String | Name of the hotkey to trigger | None | N/A |
|
| hotkeyName | String | Name of the hotkey to trigger | None | N/A |
|
||||||
|
| ?contextName | String | Name of context of the hotkey to trigger | None | Unknown |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -4091,6 +4093,24 @@ Sets the position of the TBar.
|
|||||||
|
|
||||||
## Filters Requests
|
## Filters Requests
|
||||||
|
|
||||||
|
### GetSourceFilterKindList
|
||||||
|
|
||||||
|
Gets an array of all available source filter kinds.
|
||||||
|
|
||||||
|
Similar to `GetInputKindList`
|
||||||
|
|
||||||
|
- Complexity Rating: `2/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.4.0
|
||||||
|
|
||||||
|
**Response Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| sourceFilterKinds | Array<String> | Array of source filter kinds |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### GetSourceFilterList
|
### GetSourceFilterList
|
||||||
|
|
||||||
Gets an array of all of a source's filters.
|
Gets an array of all of a source's filters.
|
||||||
@ -5023,6 +5043,12 @@ Toggles the status of the record output.
|
|||||||
- Latest Supported RPC Version: `1`
|
- Latest Supported RPC Version: `1`
|
||||||
- Added in v5.0.0
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Response Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| outputActive | Boolean | The new active state of the output |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### StartRecord
|
### StartRecord
|
||||||
|
@ -31,6 +31,7 @@ EventHandler::EventHandler()
|
|||||||
signal_handler_connect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
signal_handler_connect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
||||||
signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
||||||
signal_handler_connect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
signal_handler_connect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
||||||
|
signal_handler_connect(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this);
|
||||||
} else {
|
} else {
|
||||||
blog(LOG_ERROR, "[EventHandler::EventHandler] Unable to get libobs signal handler!");
|
blog(LOG_ERROR, "[EventHandler::EventHandler] Unable to get libobs signal handler!");
|
||||||
}
|
}
|
||||||
@ -50,6 +51,7 @@ EventHandler::~EventHandler()
|
|||||||
signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
||||||
signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
||||||
signal_handler_disconnect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
signal_handler_disconnect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
||||||
|
signal_handler_disconnect(coreSignalHandler, "source_update", SourceUpdatedMultiHandler, this);
|
||||||
} else {
|
} else {
|
||||||
blog(LOG_ERROR, "[EventHandler::~EventHandler] Unable to get libobs signal handler!");
|
blog(LOG_ERROR, "[EventHandler::~EventHandler] Unable to get libobs signal handler!");
|
||||||
}
|
}
|
||||||
@ -588,6 +590,23 @@ void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EventHandler::SourceUpdatedMultiHandler(void *param, calldata_t *data)
|
||||||
|
{
|
||||||
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
|
||||||
|
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
||||||
|
if (!source)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (obs_source_get_type(source)) {
|
||||||
|
case OBS_SOURCE_TYPE_INPUT:
|
||||||
|
eventHandler->HandleInputSettingsChanged(source);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EventHandler::StreamOutputReconnectHandler(void *param, calldata_t *)
|
void EventHandler::StreamOutputReconnectHandler(void *param, calldata_t *)
|
||||||
{
|
{
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
@ -69,9 +69,10 @@ private:
|
|||||||
static void SourceCreatedMultiHandler(void *param, calldata_t *data);
|
static void SourceCreatedMultiHandler(void *param, calldata_t *data);
|
||||||
static void SourceDestroyedMultiHandler(void *param, calldata_t *data);
|
static void SourceDestroyedMultiHandler(void *param, calldata_t *data);
|
||||||
static void SourceRemovedMultiHandler(void *param, calldata_t *data);
|
static void SourceRemovedMultiHandler(void *param, calldata_t *data);
|
||||||
|
|
||||||
// Signal handler: source
|
|
||||||
static void SourceRenamedMultiHandler(void *param, calldata_t *data);
|
static void SourceRenamedMultiHandler(void *param, calldata_t *data);
|
||||||
|
static void SourceUpdatedMultiHandler(void *param, calldata_t *data);
|
||||||
|
|
||||||
|
// Signal handler: media sources
|
||||||
static void SourceMediaPauseMultiHandler(void *param, calldata_t *data);
|
static void SourceMediaPauseMultiHandler(void *param, calldata_t *data);
|
||||||
static void SourceMediaPlayMultiHandler(void *param, calldata_t *data);
|
static void SourceMediaPlayMultiHandler(void *param, calldata_t *data);
|
||||||
static void SourceMediaRestartMultiHandler(void *param, calldata_t *data);
|
static void SourceMediaRestartMultiHandler(void *param, calldata_t *data);
|
||||||
@ -106,7 +107,7 @@ private:
|
|||||||
void HandleInputCreated(obs_source_t *source);
|
void HandleInputCreated(obs_source_t *source);
|
||||||
void HandleInputRemoved(obs_source_t *source);
|
void HandleInputRemoved(obs_source_t *source);
|
||||||
void HandleInputNameChanged(obs_source_t *source, std::string oldInputName, std::string inputName);
|
void HandleInputNameChanged(obs_source_t *source, std::string oldInputName, std::string inputName);
|
||||||
void HandleInputVolumeMeters(std::vector<json> inputs); // AudioMeter::Handler callback
|
void HandleInputSettingsChanged(obs_source_t *source);
|
||||||
static void HandleInputActiveStateChanged(void *param,
|
static void HandleInputActiveStateChanged(void *param,
|
||||||
calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleInputShowStateChanged(void *param,
|
static void HandleInputShowStateChanged(void *param,
|
||||||
@ -123,6 +124,7 @@ private:
|
|||||||
calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleInputAudioMonitorTypeChanged(void *param,
|
static void HandleInputAudioMonitorTypeChanged(void *param,
|
||||||
calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
|
void HandleInputVolumeMeters(std::vector<json> inputs); // AudioMeter::Handler callback
|
||||||
|
|
||||||
// Transitions
|
// Transitions
|
||||||
void HandleCurrentSceneTransitionChanged();
|
void HandleCurrentSceneTransitionChanged();
|
||||||
|
@ -93,6 +93,32 @@ void EventHandler::HandleInputNameChanged(obs_source_t *, std::string oldInputNa
|
|||||||
BroadcastEvent(EventSubscription::Inputs, "InputNameChanged", eventData);
|
BroadcastEvent(EventSubscription::Inputs, "InputNameChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An input's settings have changed (been updated).
|
||||||
|
*
|
||||||
|
* Note: On some inputs, changing values in the properties dialog will cause an immediate update. Pressing the "Cancel" button will revert the settings, resulting in another event being fired.
|
||||||
|
*
|
||||||
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputSettings | Object | New settings object of the input
|
||||||
|
*
|
||||||
|
* @eventType InputSettingsChanged
|
||||||
|
* @eventSubscription Inputs
|
||||||
|
* @complexity 3
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @api events
|
||||||
|
* @category inputs
|
||||||
|
*/
|
||||||
|
void EventHandler::HandleInputSettingsChanged(obs_source_t *source)
|
||||||
|
{
|
||||||
|
OBSDataAutoRelease inputSettings = obs_source_get_settings(source);
|
||||||
|
|
||||||
|
json eventData;
|
||||||
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputSettings"] = Utils::Json::ObsDataToJson(inputSettings);
|
||||||
|
BroadcastEvent(EventSubscription::Inputs, "InputSettingsChanged", eventData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An input's active state has changed.
|
* An input's active state has changed.
|
||||||
*
|
*
|
||||||
|
@ -33,6 +33,8 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"TriggerHotkeyByName", &RequestHandler::TriggerHotkeyByName},
|
{"TriggerHotkeyByName", &RequestHandler::TriggerHotkeyByName},
|
||||||
{"TriggerHotkeyByKeySequence", &RequestHandler::TriggerHotkeyByKeySequence},
|
{"TriggerHotkeyByKeySequence", &RequestHandler::TriggerHotkeyByKeySequence},
|
||||||
{"Sleep", &RequestHandler::Sleep},
|
{"Sleep", &RequestHandler::Sleep},
|
||||||
|
{"Compare", &RequestHandler::Compare},
|
||||||
|
{"Assert", &RequestHandler::Assert},
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
{"GetPersistentData", &RequestHandler::GetPersistentData},
|
{"GetPersistentData", &RequestHandler::GetPersistentData},
|
||||||
@ -111,6 +113,7 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"SetTBarPosition", &RequestHandler::SetTBarPosition},
|
{"SetTBarPosition", &RequestHandler::SetTBarPosition},
|
||||||
|
|
||||||
// Filters
|
// Filters
|
||||||
|
{"GetSourceFilterKindList", &RequestHandler::GetSourceFilterKindList},
|
||||||
{"GetSourceFilterList", &RequestHandler::GetSourceFilterList},
|
{"GetSourceFilterList", &RequestHandler::GetSourceFilterList},
|
||||||
{"GetSourceFilterDefaultSettings", &RequestHandler::GetSourceFilterDefaultSettings},
|
{"GetSourceFilterDefaultSettings", &RequestHandler::GetSourceFilterDefaultSettings},
|
||||||
{"CreateSourceFilter", &RequestHandler::CreateSourceFilter},
|
{"CreateSourceFilter", &RequestHandler::CreateSourceFilter},
|
||||||
|
@ -52,6 +52,8 @@ private:
|
|||||||
RequestResult TriggerHotkeyByName(const Request &);
|
RequestResult TriggerHotkeyByName(const Request &);
|
||||||
RequestResult TriggerHotkeyByKeySequence(const Request &);
|
RequestResult TriggerHotkeyByKeySequence(const Request &);
|
||||||
RequestResult Sleep(const Request &);
|
RequestResult Sleep(const Request &);
|
||||||
|
RequestResult Compare(const Request &);
|
||||||
|
RequestResult Assert(const Request &);
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
RequestResult GetPersistentData(const Request &);
|
RequestResult GetPersistentData(const Request &);
|
||||||
@ -130,6 +132,7 @@ private:
|
|||||||
RequestResult SetTBarPosition(const Request &);
|
RequestResult SetTBarPosition(const Request &);
|
||||||
|
|
||||||
// Filters
|
// Filters
|
||||||
|
RequestResult GetSourceFilterKindList(const Request &);
|
||||||
RequestResult GetSourceFilterList(const Request &);
|
RequestResult GetSourceFilterList(const Request &);
|
||||||
RequestResult GetSourceFilterDefaultSettings(const Request &);
|
RequestResult GetSourceFilterDefaultSettings(const Request &);
|
||||||
RequestResult CreateSourceFilter(const Request &);
|
RequestResult CreateSourceFilter(const Request &);
|
||||||
|
@ -19,6 +19,27 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "RequestHandler.h"
|
#include "RequestHandler.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets an array of all available source filter kinds.
|
||||||
|
*
|
||||||
|
* Similar to `GetInputKindList`
|
||||||
|
*
|
||||||
|
* @responseField sourceFilterKinds | Array<String> | Array of source filter kinds
|
||||||
|
*
|
||||||
|
* @requestType GetSourceFilterKindList
|
||||||
|
* @complexity 2
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @api requests
|
||||||
|
* @category filters
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::GetSourceFilterKindList(const Request &)
|
||||||
|
{
|
||||||
|
json responseData;
|
||||||
|
responseData["sourceFilterKinds"] = Utils::Obs::ArrayHelper::GetFilterKindList();
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets an array of all of a source's filters.
|
* Gets an array of all of a source's filters.
|
||||||
*
|
*
|
||||||
|
@ -233,6 +233,7 @@ RequestResult RequestHandler::GetHotkeyList(const Request &)
|
|||||||
* Triggers a hotkey using its name. See `GetHotkeyList`
|
* Triggers a hotkey using its name. See `GetHotkeyList`
|
||||||
*
|
*
|
||||||
* @requestField hotkeyName | String | Name of the hotkey to trigger
|
* @requestField hotkeyName | String | Name of the hotkey to trigger
|
||||||
|
* @requestField ?contextName | String | Name of context of the hotkey to trigger
|
||||||
*
|
*
|
||||||
* @requestType TriggerHotkeyByName
|
* @requestType TriggerHotkeyByName
|
||||||
* @complexity 3
|
* @complexity 3
|
||||||
@ -248,7 +249,15 @@ RequestResult RequestHandler::TriggerHotkeyByName(const Request &request)
|
|||||||
if (!request.ValidateString("hotkeyName", statusCode, comment))
|
if (!request.ValidateString("hotkeyName", statusCode, comment))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
obs_hotkey_t *hotkey = Utils::Obs::SearchHelper::GetHotkeyByName(request.RequestData["hotkeyName"]);
|
std::string contextName;
|
||||||
|
if (request.Contains("contextName")) {
|
||||||
|
if (!request.ValidateOptionalString("contextName", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
contextName = request.RequestData["contextName"];
|
||||||
|
}
|
||||||
|
|
||||||
|
obs_hotkey_t *hotkey = Utils::Obs::SearchHelper::GetHotkeyByName(request.RequestData["hotkeyName"], contextName);
|
||||||
if (!hotkey)
|
if (!hotkey)
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound, "No hotkeys were found by that name.");
|
return RequestResult::Error(RequestStatus::ResourceNotFound, "No hotkeys were found by that name.");
|
||||||
|
|
||||||
@ -323,7 +332,9 @@ RequestResult RequestHandler::TriggerHotkeyByKeySequence(const Request &request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
|
* Sleeps for a time duration or number of frames.
|
||||||
|
*
|
||||||
|
* Note: Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
|
||||||
*
|
*
|
||||||
* @requestField ?sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000
|
* @requestField ?sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000
|
||||||
* @requestField ?sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000
|
* @requestField ?sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000
|
||||||
@ -356,3 +367,63 @@ RequestResult RequestHandler::Sleep(const Request &request)
|
|||||||
return RequestResult::Error(RequestStatus::UnsupportedRequestBatchExecutionType);
|
return RequestResult::Error(RequestStatus::UnsupportedRequestBatchExecutionType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares the values of the two request fields, `left` and `right`.
|
||||||
|
*
|
||||||
|
* Note: Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
|
||||||
|
*
|
||||||
|
* @requestField left | Any | First request batch variable in comparison
|
||||||
|
* @requestField right | Any | Second request batch variable in comparison
|
||||||
|
*
|
||||||
|
* @responseField result | Boolean | Whether the comparison is equal
|
||||||
|
*
|
||||||
|
* @requestType Compare
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @category general
|
||||||
|
* @api requests
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::Compare(const Request &request)
|
||||||
|
{
|
||||||
|
if (!request.RequestData.contains("left") || !request.RequestData.contains("right"))
|
||||||
|
return RequestResult::Error(RequestStatus::MissingRequestField, "One or more sides of the comparison are missing.");
|
||||||
|
|
||||||
|
bool result = request.RequestData["left"] == request.RequestData["right"];
|
||||||
|
|
||||||
|
json responseData;
|
||||||
|
responseData["result"] = result;
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an error if the value of `check` is not `true`.
|
||||||
|
*
|
||||||
|
* This can be useful to interrupt a request batch from proceeding if an assumed state does not match real-world state.
|
||||||
|
*
|
||||||
|
* Note: Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
|
||||||
|
*
|
||||||
|
* @requestField check | Boolean | Value to assert to be true
|
||||||
|
*
|
||||||
|
* @requestType Assert
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @category general
|
||||||
|
* @api requests
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::Assert(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
if (!request.ValidateBoolean("check", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
bool check = request.RequestData["check"];
|
||||||
|
if (!check)
|
||||||
|
return RequestResult::Error(RequestStatus::AssertFailed, "Assertion failed.");
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
@ -54,6 +54,8 @@ RequestResult RequestHandler::GetRecordStatus(const Request &)
|
|||||||
/**
|
/**
|
||||||
* Toggles the status of the record output.
|
* Toggles the status of the record output.
|
||||||
*
|
*
|
||||||
|
* @responseField outputActive | Boolean | The new active state of the output
|
||||||
|
*
|
||||||
* @requestType ToggleRecord
|
* @requestType ToggleRecord
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
|
@ -44,12 +44,16 @@ RequestResult RequestHandler::GetStreamStatus(const Request &)
|
|||||||
|
|
||||||
uint64_t outputDuration = Utils::Obs::NumberHelper::GetOutputDuration(streamOutput);
|
uint64_t outputDuration = Utils::Obs::NumberHelper::GetOutputDuration(streamOutput);
|
||||||
|
|
||||||
|
float outputCongestion = obs_output_get_congestion(streamOutput);
|
||||||
|
if (std::isnan(outputCongestion)) // libobs does not handle NaN, so we're handling it here
|
||||||
|
outputCongestion = 0.0f;
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["outputActive"] = obs_output_active(streamOutput);
|
responseData["outputActive"] = obs_output_active(streamOutput);
|
||||||
responseData["outputReconnecting"] = obs_output_reconnecting(streamOutput);
|
responseData["outputReconnecting"] = obs_output_reconnecting(streamOutput);
|
||||||
responseData["outputTimecode"] = Utils::Obs::StringHelper::DurationToTimecode(outputDuration);
|
responseData["outputTimecode"] = Utils::Obs::StringHelper::DurationToTimecode(outputDuration);
|
||||||
responseData["outputDuration"] = outputDuration;
|
responseData["outputDuration"] = outputDuration;
|
||||||
responseData["outputCongestion"] = obs_output_get_congestion(streamOutput);
|
responseData["outputCongestion"] = outputCongestion;
|
||||||
responseData["outputBytes"] = (uint64_t)obs_output_get_total_bytes(streamOutput);
|
responseData["outputBytes"] = (uint64_t)obs_output_get_total_bytes(streamOutput);
|
||||||
responseData["outputSkippedFrames"] = obs_output_get_frames_dropped(streamOutput);
|
responseData["outputSkippedFrames"] = obs_output_get_frames_dropped(streamOutput);
|
||||||
responseData["outputTotalFrames"] = obs_output_get_total_frames(streamOutput);
|
responseData["outputTotalFrames"] = obs_output_get_total_frames(streamOutput);
|
||||||
|
@ -415,5 +415,16 @@ namespace RequestStatus {
|
|||||||
* @api enums
|
* @api enums
|
||||||
*/
|
*/
|
||||||
CannotAct = 703,
|
CannotAct = 703,
|
||||||
|
/**
|
||||||
|
* Assertion failed.
|
||||||
|
*
|
||||||
|
* @enumIdentifier AssertFailed
|
||||||
|
* @enumValue 704
|
||||||
|
* @enumType RequestStatus
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @api enums
|
||||||
|
*/
|
||||||
|
AssertFailed = 704,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -297,7 +297,7 @@ namespace Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace SearchHelper {
|
namespace SearchHelper {
|
||||||
obs_hotkey_t *GetHotkeyByName(std::string name);
|
obs_hotkey_t *GetHotkeyByName(std::string name, std::string context);
|
||||||
obs_source_t *GetSceneTransitionByName(std::string name); // Increments source ref. Use OBSSourceAutoRelease
|
obs_source_t *GetSceneTransitionByName(std::string name); // Increments source ref. Use OBSSourceAutoRelease
|
||||||
obs_sceneitem_t *GetSceneItemByName(obs_scene_t *scene, std::string name,
|
obs_sceneitem_t *GetSceneItemByName(obs_scene_t *scene, std::string name,
|
||||||
int offset = 0); // Increments ref. Use OBSSceneItemAutoRelease
|
int offset = 0); // Increments ref. Use OBSSceneItemAutoRelease
|
||||||
|
@ -19,7 +19,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "Obs.h"
|
#include "Obs.h"
|
||||||
#include "plugin-macros.generated.h"
|
#include "plugin-macros.generated.h"
|
||||||
|
|
||||||
obs_hotkey_t *Utils::Obs::SearchHelper::GetHotkeyByName(std::string name)
|
obs_hotkey_t *Utils::Obs::SearchHelper::GetHotkeyByName(std::string name, std::string context)
|
||||||
{
|
{
|
||||||
if (name.empty())
|
if (name.empty())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -27,8 +27,47 @@ obs_hotkey_t *Utils::Obs::SearchHelper::GetHotkeyByName(std::string name)
|
|||||||
auto hotkeys = ArrayHelper::GetHotkeyList();
|
auto hotkeys = ArrayHelper::GetHotkeyList();
|
||||||
|
|
||||||
for (auto hotkey : hotkeys) {
|
for (auto hotkey : hotkeys) {
|
||||||
if (obs_hotkey_get_name(hotkey) == name)
|
if (obs_hotkey_get_name(hotkey) != name)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (context.empty())
|
||||||
return hotkey;
|
return hotkey;
|
||||||
|
|
||||||
|
auto type = obs_hotkey_get_registerer_type(hotkey);
|
||||||
|
if (type == OBS_HOTKEY_REGISTERER_SOURCE) {
|
||||||
|
OBSSourceAutoRelease source = obs_weak_source_get_source((obs_weak_source_t *)obs_hotkey_get_registerer(hotkey));
|
||||||
|
if (!source)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (context != obs_source_get_name(source))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (type == OBS_HOTKEY_REGISTERER_OUTPUT) {
|
||||||
|
OBSOutputAutoRelease output = obs_weak_output_get_output((obs_weak_output_t *)obs_hotkey_get_registerer(hotkey));
|
||||||
|
if (!output)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (context != obs_output_get_name(output))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (type == OBS_HOTKEY_REGISTERER_ENCODER) {
|
||||||
|
OBSEncoderAutoRelease encoder = obs_weak_encoder_get_encoder((obs_weak_encoder_t *)obs_hotkey_get_registerer(hotkey));
|
||||||
|
if (!encoder)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (context != obs_encoder_get_name(encoder))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
} else if (type == OBS_HOTKEY_REGISTERER_SERVICE) {
|
||||||
|
OBSServiceAutoRelease service = obs_weak_service_get_service((obs_weak_service_t *)obs_hotkey_get_registerer(hotkey));
|
||||||
|
if (!service)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (context != obs_service_get_name(service))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
}
|
||||||
|
return hotkey;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -116,11 +116,12 @@ void Utils::Platform::SendTrayNotification(QSystemTrayIcon::MessageIcon icon, QS
|
|||||||
obs_queue_task(
|
obs_queue_task(
|
||||||
OBS_TASK_UI,
|
OBS_TASK_UI,
|
||||||
[](void *param) {
|
[](void *param) {
|
||||||
void *systemTrayPtr = obs_frontend_get_system_tray();
|
|
||||||
auto systemTray = static_cast<QSystemTrayIcon *>(systemTrayPtr);
|
|
||||||
|
|
||||||
auto notification = static_cast<SystemTrayNotification *>(param);
|
auto notification = static_cast<SystemTrayNotification *>(param);
|
||||||
systemTray->showMessage(notification->title, notification->body, notification->icon);
|
void *systemTrayPtr = obs_frontend_get_system_tray();
|
||||||
|
if (systemTrayPtr) {
|
||||||
|
auto systemTray = static_cast<QSystemTrayIcon *>(systemTrayPtr);
|
||||||
|
systemTray->showMessage(notification->title, notification->body, notification->icon);
|
||||||
|
}
|
||||||
delete notification;
|
delete notification;
|
||||||
},
|
},
|
||||||
(void *)notification, false);
|
(void *)notification, false);
|
||||||
|
Reference in New Issue
Block a user