mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Compare commits
108 Commits
Author | SHA1 | Date | |
---|---|---|---|
3b7c1c5381 | |||
20551043f9 | |||
086bf06008 | |||
6483dcaef0 | |||
71920c484b | |||
0eda8f9406 | |||
3b873ceb30 | |||
36f50adf8a | |||
acd1af12a1 | |||
eb2882515f | |||
5c3c4c76c8 | |||
8c80e0745a | |||
5b4aa9dabd | |||
ee283c7141 | |||
179e197bd5 | |||
5fc39ef054 | |||
74719ce502 | |||
9123879c76 | |||
9db7464faa | |||
e2b8a06d94 | |||
af31f1adca | |||
4410e30684 | |||
2c884ca690 | |||
f72f23a9d7 | |||
a589e80bdb | |||
305afd763d | |||
42e7eb6c34 | |||
bdf812dc09 | |||
c8cf2d94ac | |||
d2d4bfb3e7 | |||
d5077fca03 | |||
4a647c5262 | |||
3ea3d3228b | |||
e94f9194a2 | |||
9ee6e2ff2a | |||
b61a5c2431 | |||
fbd4cfb4af | |||
e5aa4c2f69 | |||
4cf8de8382 | |||
7adfb5874c | |||
f18f46543b | |||
f40426efa1 | |||
830f7eb931 | |||
5e3fff78f3 | |||
b53527cba8 | |||
b806a0cfb1 | |||
1d0db34bb2 | |||
690726d281 | |||
ef4142fe75 | |||
caaec5d97f | |||
6c67b276a7 | |||
fad7dfd55c | |||
a5c459b6d4 | |||
899a9b3801 | |||
939e503736 | |||
5b149add99 | |||
50b57d38d0 | |||
9b58dd1627 | |||
81b307e5ad | |||
52733ddce7 | |||
444caeb1d7 | |||
f03e82c3f8 | |||
bbdc5bc823 | |||
9ecc9532e8 | |||
0189c3a3f5 | |||
f48fcc06ec | |||
f43ef8e2da | |||
7a1c71bb96 | |||
cf285b3761 | |||
ede66a68cb | |||
e8089a5bbf | |||
07537a33fa | |||
efeae8d640 | |||
4ff109b62b | |||
42da47f81d | |||
a889799655 | |||
f52f47ec5d | |||
08767ae5a7 | |||
16bf61aab6 | |||
e9c0eee9e4 | |||
f4a3de575c | |||
2bfa1b4c64 | |||
0e611f579b | |||
ec2cdc8475 | |||
3cd8163945 | |||
132d4bafdd | |||
d991e21f29 | |||
a74468e07e | |||
55b3f88db9 | |||
ba7839bb69 | |||
417725801c | |||
93713c438e | |||
6db08f960e | |||
6434c42155 | |||
ac00465565 | |||
2606f262e6 | |||
2caecf6c01 | |||
19170fe6d9 | |||
1fc7900b1c | |||
53d7596160 | |||
886738547a | |||
c11874eb17 | |||
a0ffe16e91 | |||
e3d0751385 | |||
d5185417ec | |||
f7637250f1 | |||
57a9c19f2c | |||
6633144ce8 |
131
.clang-format
131
.clang-format
@ -1,6 +1,6 @@
|
|||||||
# please use clang-format version 8 or later
|
# please use clang-format version 16 or later
|
||||||
|
|
||||||
Standard: Cpp11
|
Standard: c++17
|
||||||
AccessModifierOffset: -8
|
AccessModifierOffset: -8
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
AlignConsecutiveAssignments: false
|
AlignConsecutiveAssignments: false
|
||||||
@ -8,14 +8,14 @@ AlignConsecutiveDeclarations: false
|
|||||||
AlignEscapedNewlines: Left
|
AlignEscapedNewlines: Left
|
||||||
AlignOperands: true
|
AlignOperands: true
|
||||||
AlignTrailingComments: true
|
AlignTrailingComments: true
|
||||||
#AllowAllArgumentsOnNextLine: false # requires clang-format 9
|
AllowAllArgumentsOnNextLine: false
|
||||||
#AllowAllConstructorInitializersOnNextLine: false # requires clang-format 9
|
AllowAllConstructorInitializersOnNextLine: false
|
||||||
AllowAllParametersOfDeclarationOnNextLine: false
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
AllowShortBlocksOnASingleLine: false
|
AllowShortBlocksOnASingleLine: false
|
||||||
AllowShortCaseLabelsOnASingleLine: false
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
AllowShortFunctionsOnASingleLine: Inline
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
AllowShortIfStatementsOnASingleLine: false
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
#AllowShortLambdasOnASingleLine: Inline # requires clang-format 9
|
AllowShortLambdasOnASingleLine: Inline
|
||||||
AllowShortLoopsOnASingleLine: false
|
AllowShortLoopsOnASingleLine: false
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
AlwaysBreakAfterReturnType: None
|
AlwaysBreakAfterReturnType: None
|
||||||
@ -53,10 +53,11 @@ Cpp11BracedListStyle: true
|
|||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
FixNamespaceComments: false
|
FixNamespaceComments: false
|
||||||
ForEachMacros:
|
ForEachMacros:
|
||||||
- 'json_object_foreach'
|
- 'json_object_foreach'
|
||||||
- 'json_object_foreach_safe'
|
- 'json_object_foreach_safe'
|
||||||
- 'json_array_foreach'
|
- 'json_array_foreach'
|
||||||
|
- 'HASH_ITER'
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IndentCaseLabels: false
|
IndentCaseLabels: false
|
||||||
IndentPPDirectives: None
|
IndentPPDirectives: None
|
||||||
@ -65,7 +66,7 @@ IndentWrappedFunctionNames: false
|
|||||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
MaxEmptyLinesToKeep: 1
|
MaxEmptyLinesToKeep: 1
|
||||||
NamespaceIndentation: All
|
NamespaceIndentation: All
|
||||||
#ObjCBinPackProtocolList: Auto # requires clang-format 7
|
ObjCBinPackProtocolList: Auto
|
||||||
ObjCBlockIndentWidth: 8
|
ObjCBlockIndentWidth: 8
|
||||||
ObjCSpaceAfterProperty: true
|
ObjCSpaceAfterProperty: true
|
||||||
ObjCSpaceBeforeProtocolList: true
|
ObjCSpaceBeforeProtocolList: true
|
||||||
@ -83,13 +84,13 @@ ReflowComments: false
|
|||||||
SortIncludes: false
|
SortIncludes: false
|
||||||
SortUsingDeclarations: false
|
SortUsingDeclarations: false
|
||||||
SpaceAfterCStyleCast: false
|
SpaceAfterCStyleCast: false
|
||||||
#SpaceAfterLogicalNot: false # requires clang-format 9
|
SpaceAfterLogicalNot: false
|
||||||
SpaceAfterTemplateKeyword: false
|
SpaceAfterTemplateKeyword: false
|
||||||
SpaceBeforeAssignmentOperators: true
|
SpaceBeforeAssignmentOperators: true
|
||||||
#SpaceBeforeCtorInitializerColon: true # requires clang-format 7
|
SpaceBeforeCtorInitializerColon: true
|
||||||
#SpaceBeforeInheritanceColon: true # requires clang-format 7
|
SpaceBeforeInheritanceColon: true
|
||||||
SpaceBeforeParens: ControlStatements
|
SpaceBeforeParens: ControlStatements
|
||||||
#SpaceBeforeRangeBasedForLoopColon: true # requires clang-format 7
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
SpaceInEmptyParentheses: false
|
SpaceInEmptyParentheses: false
|
||||||
SpacesBeforeTrailingComments: 1
|
SpacesBeforeTrailingComments: 1
|
||||||
SpacesInAngles: false
|
SpacesInAngles: false
|
||||||
@ -97,11 +98,111 @@ SpacesInCStyleCastParentheses: false
|
|||||||
SpacesInContainerLiterals: false
|
SpacesInContainerLiterals: false
|
||||||
SpacesInParentheses: false
|
SpacesInParentheses: false
|
||||||
SpacesInSquareBrackets: false
|
SpacesInSquareBrackets: false
|
||||||
#StatementMacros: # requires clang-format 8
|
StatementMacros:
|
||||||
# - 'Q_OBJECT'
|
- 'Q_OBJECT'
|
||||||
TabWidth: 8
|
TabWidth: 8
|
||||||
#TypenameMacros: # requires clang-format 9
|
TypenameMacros:
|
||||||
# - 'DARRAY'
|
- 'DARRAY'
|
||||||
UseTab: ForContinuationAndIndentation
|
UseTab: ForContinuationAndIndentation
|
||||||
---
|
---
|
||||||
Language: ObjC
|
Language: ObjC
|
||||||
|
AccessModifierOffset: 2
|
||||||
|
AlignArrayOfStructures: Right
|
||||||
|
AlignConsecutiveAssignments: None
|
||||||
|
AlignConsecutiveBitFields: None
|
||||||
|
AlignConsecutiveDeclarations: None
|
||||||
|
AlignConsecutiveMacros:
|
||||||
|
Enabled: true
|
||||||
|
AcrossEmptyLines: false
|
||||||
|
AcrossComments: true
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortEnumsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: Empty
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLambdasOnASingleLine: None
|
||||||
|
AttributeMacros: ['__unused', '__autoreleasing', '_Nonnull', '__bridge']
|
||||||
|
BitFieldColonSpacing: Both
|
||||||
|
#BreakBeforeBraces: Webkit
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: false
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: Never
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
BeforeWhile: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakAfterAttributes: Never
|
||||||
|
BreakArrays: false
|
||||||
|
BreakBeforeConceptDeclarations: Allowed
|
||||||
|
BreakBeforeInlineASMColon: OnlyMultiline
|
||||||
|
BreakConstructorInitializers: AfterColon
|
||||||
|
BreakInheritanceList: AfterComma
|
||||||
|
ColumnLimit: 120
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
EmptyLineAfterAccessModifier: Never
|
||||||
|
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
|
IndentAccessModifiers: false
|
||||||
|
IndentCaseBlocks: false
|
||||||
|
IndentCaseLabels: true
|
||||||
|
IndentExternBlock: Indent
|
||||||
|
IndentGotoLabels: false
|
||||||
|
IndentRequiresClause: true
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: true
|
||||||
|
InsertBraces: false
|
||||||
|
InsertNewlineAtEOF: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
LambdaBodyIndentation: Signature
|
||||||
|
NamespaceIndentation: All
|
||||||
|
ObjCBinPackProtocolList: Auto
|
||||||
|
ObjCBlockIndentWidth: 4
|
||||||
|
ObjCBreakBeforeNestedBlockParam: false
|
||||||
|
ObjCSpaceAfterProperty: true
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PPIndentWidth: -1
|
||||||
|
PackConstructorInitializers: NextLine
|
||||||
|
QualifierAlignment: Leave
|
||||||
|
ReferenceAlignment: Right
|
||||||
|
RemoveSemicolon: false
|
||||||
|
RequiresClausePosition: WithPreceding
|
||||||
|
RequiresExpressionIndentation: OuterScope
|
||||||
|
SeparateDefinitionBlocks: Always
|
||||||
|
ShortNamespaceLines: 1
|
||||||
|
SortIncludes: false
|
||||||
|
#SortUsingDeclarations: LexicographicNumeric
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAroundPointerQualifiers: Default
|
||||||
|
SpaceBeforeCaseColon: false
|
||||||
|
SpaceBeforeCpp11BracedList: true
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInLineCommentPrefix:
|
||||||
|
Minimum: 1
|
||||||
|
Maximum: -1
|
||||||
|
Standard: c++17
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
|
22
.github/workflows/crowdin_upload.yml
vendored
Normal file
22
.github/workflows/crowdin_upload.yml
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
name: Upload Language Files 🌐
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- "**/en-US.ini"
|
||||||
|
jobs:
|
||||||
|
upload-language-files:
|
||||||
|
name: Upload Language Files 🌐
|
||||||
|
if: github.repository_owner == 'obsproject'
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 100
|
||||||
|
- name: Upload US English Language Files 🇺🇸
|
||||||
|
uses: obsproject/obs-crowdin-sync/upload@30b5446e3b5eb19595aa68a81ddf896a857302cf
|
||||||
|
env:
|
||||||
|
CROWDIN_PAT: ${{ secrets.CROWDIN_SYNC_CROWDIN_PAT }}
|
||||||
|
GITHUB_EVENT_BEFORE: ${{ github.event.before }}
|
||||||
|
SUBMODULE_NAME: obs-websocket
|
2
.github/workflows/generate_docs.yml
vendored
2
.github/workflows/generate_docs.yml
vendored
@ -18,7 +18,7 @@ jobs:
|
|||||||
IS_CI: "true"
|
IS_CI: "true"
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout'
|
- name: 'Checkout'
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: ${{ github.workspace }}/obs-websocket
|
path: ${{ github.workspace }}/obs-websocket
|
||||||
- name: 'Generate docs'
|
- name: 'Generate docs'
|
||||||
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@ -15,7 +15,7 @@ jobs:
|
|||||||
if: contains(github.event.head_commit.message, '[skip ci]') != true
|
if: contains(github.event.head_commit.message, '[skip ci]') != true
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
- name: Generate docs
|
- name: Generate docs
|
||||||
run: cd docs && ./build_docs.sh
|
run: cd docs && ./build_docs.sh
|
||||||
- name: Run markdownlint-cli
|
- name: Run markdownlint-cli
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
|||||||
[submodule "deps/qr"]
|
|
||||||
path = deps/qr
|
|
||||||
url = https://github.com/nayuki/QR-Code-generator.git
|
|
||||||
|
@ -2,26 +2,28 @@ cmake_minimum_required(VERSION 3.16...3.25)
|
|||||||
|
|
||||||
legacy_check()
|
legacy_check()
|
||||||
|
|
||||||
set(obs-websocket_VERSION 5.2.2)
|
set(obs-websocket_VERSION 5.5.0)
|
||||||
set(OBS_WEBSOCKET_RPC_VERSION 1)
|
set(OBS_WEBSOCKET_RPC_VERSION 1)
|
||||||
|
|
||||||
|
include(cmake/obs-websocket-api.cmake)
|
||||||
|
|
||||||
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
|
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
|
||||||
if(NOT ENABLE_WEBSOCKET)
|
if(NOT ENABLE_WEBSOCKET)
|
||||||
target_disable(obs-websocket)
|
target_disable(obs-websocket)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Submodule deps check
|
|
||||||
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp")
|
|
||||||
message(FATAL_ERROR "obs-websocket submodule deps not available.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Find Qt
|
# Find Qt
|
||||||
find_qt(COMPONENTS Core Widgets Svg Network)
|
find_package(Qt6 REQUIRED Core Widgets Svg Network)
|
||||||
|
|
||||||
# Find nlohmann JSON
|
# Find nlohmann JSON
|
||||||
find_package(nlohmann_json 3 REQUIRED)
|
find_package(nlohmann_json 3 REQUIRED)
|
||||||
|
|
||||||
|
# Find qrcodegencpp
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||||
|
find_package(qrcodegencpp REQUIRED)
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
|
||||||
|
|
||||||
# Find WebSocket++
|
# Find WebSocket++
|
||||||
find_package(Websocketpp 0.8 REQUIRED)
|
find_package(Websocketpp 0.8 REQUIRED)
|
||||||
|
|
||||||
@ -31,52 +33,52 @@ find_package(Asio 1.12.1 REQUIRED)
|
|||||||
add_library(obs-websocket MODULE)
|
add_library(obs-websocket MODULE)
|
||||||
add_library(OBS::websocket ALIAS obs-websocket)
|
add_library(OBS::websocket ALIAS obs-websocket)
|
||||||
|
|
||||||
target_sources(obs-websocket PRIVATE)
|
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE src/obs-websocket.cpp
|
PRIVATE # cmake-format: sortable
|
||||||
src/obs-websocket.h
|
|
||||||
src/Config.cpp
|
src/Config.cpp
|
||||||
src/Config.h
|
src/Config.h
|
||||||
lib/obs-websocket-api.h
|
|
||||||
src/forms/ConnectInfo.cpp
|
src/forms/ConnectInfo.cpp
|
||||||
src/forms/ConnectInfo.h
|
src/forms/ConnectInfo.h
|
||||||
src/forms/resources.qrc
|
src/forms/resources.qrc
|
||||||
src/forms/SettingsDialog.cpp
|
src/forms/SettingsDialog.cpp
|
||||||
src/forms/SettingsDialog.h
|
src/forms/SettingsDialog.h
|
||||||
|
src/obs-websocket.cpp
|
||||||
|
src/obs-websocket.h
|
||||||
src/WebSocketApi.cpp
|
src/WebSocketApi.cpp
|
||||||
src/WebSocketApi.h)
|
src/WebSocketApi.h)
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE src/websocketserver/WebSocketServer.cpp
|
PRIVATE # cmake-format: sortable
|
||||||
src/websocketserver/WebSocketServer_Protocol.cpp
|
|
||||||
src/websocketserver/WebSocketServer.h
|
|
||||||
src/websocketserver/rpc/WebSocketSession.cpp
|
|
||||||
src/websocketserver/rpc/WebSocketSession.h
|
src/websocketserver/rpc/WebSocketSession.h
|
||||||
src/websocketserver/types/WebSocketCloseCode.h
|
src/websocketserver/types/WebSocketCloseCode.h
|
||||||
src/websocketserver/types/WebSocketOpCode.h)
|
src/websocketserver/types/WebSocketOpCode.h
|
||||||
|
src/websocketserver/WebSocketServer.cpp
|
||||||
|
src/websocketserver/WebSocketServer.h
|
||||||
|
src/websocketserver/WebSocketServer_Protocol.cpp)
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE src/eventhandler/EventHandler.cpp
|
PRIVATE # cmake-format: sortable
|
||||||
|
src/eventhandler/EventHandler.cpp
|
||||||
src/eventhandler/EventHandler.h
|
src/eventhandler/EventHandler.h
|
||||||
src/eventhandler/EventHandler_Config.cpp
|
src/eventhandler/EventHandler_Config.cpp
|
||||||
src/eventhandler/EventHandler_General.cpp
|
|
||||||
src/eventhandler/EventHandler_Filters.cpp
|
src/eventhandler/EventHandler_Filters.cpp
|
||||||
|
src/eventhandler/EventHandler_General.cpp
|
||||||
src/eventhandler/EventHandler_Inputs.cpp
|
src/eventhandler/EventHandler_Inputs.cpp
|
||||||
src/eventhandler/EventHandler_MediaInputs.cpp
|
src/eventhandler/EventHandler_MediaInputs.cpp
|
||||||
src/eventhandler/EventHandler_Outputs.cpp
|
src/eventhandler/EventHandler_Outputs.cpp
|
||||||
src/eventhandler/EventHandler_Scenes.cpp
|
|
||||||
src/eventhandler/EventHandler_SceneItems.cpp
|
src/eventhandler/EventHandler_SceneItems.cpp
|
||||||
|
src/eventhandler/EventHandler_Scenes.cpp
|
||||||
src/eventhandler/EventHandler_Transitions.cpp
|
src/eventhandler/EventHandler_Transitions.cpp
|
||||||
src/eventhandler/EventHandler_Ui.cpp
|
src/eventhandler/EventHandler_Ui.cpp
|
||||||
src/eventhandler/types/EventSubscription.h)
|
src/eventhandler/types/EventSubscription.h)
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE src/requesthandler/RequestBatchHandler.cpp
|
PRIVATE # cmake-format: sortable
|
||||||
|
src/requesthandler/RequestBatchHandler.cpp
|
||||||
src/requesthandler/RequestBatchHandler.h
|
src/requesthandler/RequestBatchHandler.h
|
||||||
src/requesthandler/RequestHandler.cpp
|
src/requesthandler/RequestHandler.cpp
|
||||||
src/requesthandler/RequestHandler.h
|
src/requesthandler/RequestHandler.h
|
||||||
@ -86,10 +88,10 @@ target_sources(
|
|||||||
src/requesthandler/RequestHandler_Inputs.cpp
|
src/requesthandler/RequestHandler_Inputs.cpp
|
||||||
src/requesthandler/RequestHandler_MediaInputs.cpp
|
src/requesthandler/RequestHandler_MediaInputs.cpp
|
||||||
src/requesthandler/RequestHandler_Outputs.cpp
|
src/requesthandler/RequestHandler_Outputs.cpp
|
||||||
src/requesthandler/RequestHandler_Sources.cpp
|
|
||||||
src/requesthandler/RequestHandler_Record.cpp
|
src/requesthandler/RequestHandler_Record.cpp
|
||||||
src/requesthandler/RequestHandler_Scenes.cpp
|
|
||||||
src/requesthandler/RequestHandler_SceneItems.cpp
|
src/requesthandler/RequestHandler_SceneItems.cpp
|
||||||
|
src/requesthandler/RequestHandler_Scenes.cpp
|
||||||
|
src/requesthandler/RequestHandler_Sources.cpp
|
||||||
src/requesthandler/RequestHandler_Stream.cpp
|
src/requesthandler/RequestHandler_Stream.cpp
|
||||||
src/requesthandler/RequestHandler_Transitions.cpp
|
src/requesthandler/RequestHandler_Transitions.cpp
|
||||||
src/requesthandler/RequestHandler_Ui.cpp
|
src/requesthandler/RequestHandler_Ui.cpp
|
||||||
@ -99,12 +101,13 @@ target_sources(
|
|||||||
src/requesthandler/rpc/RequestBatchRequest.h
|
src/requesthandler/rpc/RequestBatchRequest.h
|
||||||
src/requesthandler/rpc/RequestResult.cpp
|
src/requesthandler/rpc/RequestResult.cpp
|
||||||
src/requesthandler/rpc/RequestResult.h
|
src/requesthandler/rpc/RequestResult.h
|
||||||
src/requesthandler/types/RequestStatus.h
|
src/requesthandler/types/RequestBatchExecutionType.h
|
||||||
src/requesthandler/types/RequestBatchExecutionType.h)
|
src/requesthandler/types/RequestStatus.h)
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE src/utils/Compat.cpp
|
PRIVATE # cmake-format: sortable
|
||||||
|
src/utils/Compat.cpp
|
||||||
src/utils/Compat.h
|
src/utils/Compat.h
|
||||||
src/utils/Crypto.cpp
|
src/utils/Crypto.cpp
|
||||||
src/utils/Crypto.h
|
src/utils/Crypto.h
|
||||||
@ -116,8 +119,8 @@ target_sources(
|
|||||||
src/utils/Obs_ArrayHelper.cpp
|
src/utils/Obs_ArrayHelper.cpp
|
||||||
src/utils/Obs_NumberHelper.cpp
|
src/utils/Obs_NumberHelper.cpp
|
||||||
src/utils/Obs_ObjectHelper.cpp
|
src/utils/Obs_ObjectHelper.cpp
|
||||||
src/utils/Obs_StringHelper.cpp
|
|
||||||
src/utils/Obs_SearchHelper.cpp
|
src/utils/Obs_SearchHelper.cpp
|
||||||
|
src/utils/Obs_StringHelper.cpp
|
||||||
src/utils/Obs_VolumeMeter.cpp
|
src/utils/Obs_VolumeMeter.cpp
|
||||||
src/utils/Obs_VolumeMeter.h
|
src/utils/Obs_VolumeMeter.h
|
||||||
src/utils/Obs_VolumeMeter_Helpers.h
|
src/utils/Obs_VolumeMeter_Helpers.h
|
||||||
@ -125,37 +128,44 @@ target_sources(
|
|||||||
src/utils/Platform.h
|
src/utils/Platform.h
|
||||||
src/utils/Utils.h)
|
src/utils/Utils.h)
|
||||||
|
|
||||||
target_sources(obs-websocket PRIVATE deps/qr/cpp/QrCode.cpp deps/qr/cpp/QrCode.hpp)
|
|
||||||
|
|
||||||
configure_file(src/plugin-macros.h.in plugin-macros.generated.h)
|
configure_file(src/plugin-macros.h.in plugin-macros.generated.h)
|
||||||
target_sources(obs-websocket PRIVATE plugin-macros.generated.h)
|
target_sources(obs-websocket PRIVATE plugin-macros.generated.h)
|
||||||
|
|
||||||
target_compile_definitions(
|
target_compile_definitions(
|
||||||
obs-websocket PRIVATE ASIO_STANDALONE $<$<BOOL:PLUGIN_TESTS>:PLUGIN_TESTS>
|
obs-websocket PRIVATE ASIO_STANDALONE $<$<BOOL:${PLUGIN_TESTS}>:PLUGIN_TESTS>
|
||||||
$<$<PLATFORM_ID:Windows>:_WEBSOCKETPP_CPP11_STL_> $<$<PLATFORM_ID:Windows>:_WIN32_WINNT=0x0603>)
|
$<$<PLATFORM_ID:Windows>:_WEBSOCKETPP_CPP11_STL_> $<$<PLATFORM_ID:Windows>:_WIN32_WINNT=0x0603>)
|
||||||
|
|
||||||
target_compile_options(
|
target_compile_options(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE
|
PRIVATE $<$<PLATFORM_ID:Windows>:/wd4267>
|
||||||
$<$<PLATFORM_ID:Windows>:/wd4267>
|
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wall>
|
||||||
$<$<PLATFORM_ID:Windows>:/wd4996>
|
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=float-conversion>
|
||||||
$<$<PLATFORM_ID:Darwin,Linux,FreeBSD>:-Wall>
|
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=shadow>
|
||||||
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=float-conversion;-Wno-error=shadow>
|
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow>
|
||||||
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow;-Wno-error=int-conversion;-Wno-error=comment>
|
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=int-conversion>
|
||||||
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations;-Wno-error=implicit-int-conversion;-Wno-error=shorten-64-to-32>
|
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=comment>
|
||||||
)
|
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction>
|
||||||
|
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=deprecated-declarations>
|
||||||
|
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=implicit-int-conversion>
|
||||||
|
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=shorten-64-to-32>
|
||||||
|
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-comma>
|
||||||
|
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-quoted-include-in-framework-header>)
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE OBS::libobs
|
PRIVATE OBS::libobs
|
||||||
OBS::frontend-api
|
OBS::frontend-api
|
||||||
|
OBS::websocket-api
|
||||||
Qt::Core
|
Qt::Core
|
||||||
Qt::Widgets
|
Qt::Widgets
|
||||||
Qt::Svg
|
Qt::Svg
|
||||||
Qt::Network
|
Qt::Network
|
||||||
nlohmann_json::nlohmann_json
|
nlohmann_json::nlohmann_json
|
||||||
Websocketpp::Websocketpp
|
Websocketpp::Websocketpp
|
||||||
Asio::Asio)
|
Asio::Asio
|
||||||
|
qrcodegencpp::qrcodegencpp)
|
||||||
|
|
||||||
|
target_link_options(obs-websocket PRIVATE $<$<PLATFORM_ID:Windows>:/IGNORE:4099>)
|
||||||
|
|
||||||
set_target_properties_obs(
|
set_target_properties_obs(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
|
13
README.md
13
README.md
@ -13,7 +13,7 @@ WebSocket API for OBS Studio.
|
|||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
obs-websocket is now included by default with OBS Studio 28.0.0 and above. As such, **there should be no need to download obs-websocket if you have OBS Studio > 28.0.0.**
|
**obs-websocket is now included by default with OBS Studio 28.0.0 and above. As such, there should be no need to download obs-websocket if you have OBS Studio > 28.0.0.**
|
||||||
|
|
||||||
Binaries **for OBS Studio < 28.0.0** on Windows, MacOS, and Linux are available in the [Releases](https://github.com/obsproject/obs-websocket/releases) section.
|
Binaries **for OBS Studio < 28.0.0** on Windows, MacOS, and Linux are available in the [Releases](https://github.com/obsproject/obs-websocket/releases) section.
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ It is **highly recommended** to keep obs-websocket protected with a password aga
|
|||||||
|
|
||||||
### Client software
|
### Client software
|
||||||
|
|
||||||
- [Macro Deck](https://www.macrodeck.org/)
|
- [Macro Deck](https://macrodeck.org/)
|
||||||
- [Touch Portal](https://www.touch-portal.com/)
|
- [Touch Portal](https://www.touch-portal.com/)
|
||||||
- [Twitchat](https://twitchat.fr/)
|
- [Twitchat](https://twitchat.fr/)
|
||||||
- [OBS-web](https://github.com/Niek/obs-web) - hosted client at [obs-web.niek.tv/](http://obs-web.niek.tv/)
|
- [OBS-web](https://github.com/Niek/obs-web) - hosted client at [obs-web.niek.tv/](http://obs-web.niek.tv/)
|
||||||
@ -41,6 +41,8 @@ It is **highly recommended** to keep obs-websocket protected with a password aga
|
|||||||
- [Aitum](https://aitum.tv/)
|
- [Aitum](https://aitum.tv/)
|
||||||
- [Kruiz Control](https://github.com/Kruiser8/Kruiz-Control)
|
- [Kruiz Control](https://github.com/Kruiser8/Kruiz-Control)
|
||||||
- [Bitfocus Companion Module](https://bitfocus.io/companion/)
|
- [Bitfocus Companion Module](https://bitfocus.io/companion/)
|
||||||
|
- [MacroGraph](https://github.com/Brendonovich/macrograph) - hosted client [here](https://macrograph.brendonovich.dev/)
|
||||||
|
- [MATRIC](https://matricapp.com/)
|
||||||
|
|
||||||
### Client libraries (for developers)
|
### Client libraries (for developers)
|
||||||
|
|
||||||
@ -49,7 +51,7 @@ Here's a list of available language APIs for obs-websocket:
|
|||||||
- Python 3.7+ (Asyncio): [simpleobsws](https://github.com/IRLToolkit/simpleobsws/tree/master) by IRLToolkit
|
- Python 3.7+ (Asyncio): [simpleobsws](https://github.com/IRLToolkit/simpleobsws/tree/master) by IRLToolkit
|
||||||
- Python 3.10+ (Non-Asyncio): [obsws-python](https://pypi.org/project/obsws-python) by aatikturk and onyx-and-iris
|
- Python 3.10+ (Non-Asyncio): [obsws-python](https://pypi.org/project/obsws-python) by aatikturk and onyx-and-iris
|
||||||
- Rust: [obws](https://github.com/dnaka91/obws) by dnaka91
|
- Rust: [obws](https://github.com/dnaka91/obws) by dnaka91
|
||||||
- Godot 3.4.x: [obs-websocket-gd](https://github.com/you-win/obs-websocket-gd) by you-win
|
- Godot 4.0.x: [obs-websocket-gd](https://github.com/you-win/obs-websocket-gd) by you-win
|
||||||
- Javascript (Node and web): [obs-websocket-js](https://github.com/obs-websocket-community-projects/obs-websocket-js) by OBS Websocket Community
|
- Javascript (Node and web): [obs-websocket-js](https://github.com/obs-websocket-community-projects/obs-websocket-js) by OBS Websocket Community
|
||||||
- C (uses obs-websocket-js): [v8-libwebsocket-obs-websocket](https://github.com/dgatwood/v8-libwebsocket-obs-websocket)
|
- C (uses obs-websocket-js): [v8-libwebsocket-obs-websocket](https://github.com/dgatwood/v8-libwebsocket-obs-websocket)
|
||||||
- Go: [goobs](https://github.com/andreykaipov/goobs) by andreykaipov
|
- Go: [goobs](https://github.com/andreykaipov/goobs) by andreykaipov
|
||||||
@ -65,12 +67,11 @@ We'd like to know what you're building with obs-websocket! If you do something i
|
|||||||
|
|
||||||
### Code Contributors
|
### Code Contributors
|
||||||
|
|
||||||
This project exists thanks to [all the people](graphs/contributors) who contribute. [Contribute](wiki/Contributing-Guidelines).
|
This project exists thanks to [all the people](https://github.com/obsproject/obs-websocket/graphs/contributors) who contribute. [Contribute Code](https://github.com/obsproject/obs-websocket/wiki/Contributing-Guidelines).
|
||||||
<a href="https://github.com/obsproject/obs-websocket/graphs/contributors"><img src="https://opencollective.com/obs-websocket-dev/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
### Financial Contributors
|
### Financial Contributors
|
||||||
|
|
||||||
Become a financial contributor and help us sustain our community. [Contribute](https://opencollective.com/obs-websocket-dev/contribute)
|
Become a financial contributor and help us sustain our community. [Contribute Financially](https://opencollective.com/obs-websocket-dev/contribute)
|
||||||
|
|
||||||
#### Individuals
|
#### Individuals
|
||||||
|
|
||||||
|
@ -1,18 +1,28 @@
|
|||||||
project(obs-websocket VERSION 5.2.2)
|
project(obs-websocket VERSION 5.5.0)
|
||||||
set(OBS_WEBSOCKET_RPC_VERSION 1)
|
set(OBS_WEBSOCKET_RPC_VERSION 1)
|
||||||
|
|
||||||
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
|
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
|
||||||
|
|
||||||
|
add_library(obs-websocket-api INTERFACE)
|
||||||
|
add_library(OBS::websocket-api ALIAS obs-websocket-api)
|
||||||
|
|
||||||
|
target_sources(obs-websocket-api INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib/obs-websocket-api.h>
|
||||||
|
$<INSTALL_INTERFACE:${OBS_INCLUDE_DESTINATION}/obs-websocket-api.h>)
|
||||||
|
|
||||||
|
target_link_libraries(obs-websocket-api INTERFACE OBS::libobs)
|
||||||
|
|
||||||
|
target_include_directories(obs-websocket-api INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>
|
||||||
|
$<INSTALL_INTERFACE:${OBS_INCLUDE_DESTINATION}>)
|
||||||
|
|
||||||
|
set_target_properties(obs-websocket-api PROPERTIES PUBLIC_HEADER lib/obs-websocket-api.h)
|
||||||
|
|
||||||
|
export_target(obs-websocket-api)
|
||||||
|
|
||||||
if(NOT ENABLE_WEBSOCKET OR NOT ENABLE_UI)
|
if(NOT ENABLE_WEBSOCKET OR NOT ENABLE_UI)
|
||||||
message(STATUS "OBS: DISABLED obs-websocket")
|
message(STATUS "OBS: DISABLED obs-websocket")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Submodule deps check
|
|
||||||
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp)
|
|
||||||
obs_status(FATAL_ERROR "obs-websocket submodule deps not available.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Plugin tests flag
|
# Plugin tests flag
|
||||||
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
|
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
|
||||||
|
|
||||||
@ -22,6 +32,11 @@ find_qt(COMPONENTS Core Widgets Svg Network)
|
|||||||
# Find nlohmann JSON
|
# Find nlohmann JSON
|
||||||
find_package(nlohmann_json 3 REQUIRED)
|
find_package(nlohmann_json 3 REQUIRED)
|
||||||
|
|
||||||
|
# Find qrcodegencpp
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||||
|
find_package(qrcodegencpp REQUIRED)
|
||||||
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF)
|
||||||
|
|
||||||
# Find WebSocket++
|
# Find WebSocket++
|
||||||
find_package(Websocketpp 0.8 REQUIRED)
|
find_package(Websocketpp 0.8 REQUIRED)
|
||||||
|
|
||||||
@ -56,7 +71,6 @@ target_sources(
|
|||||||
src/obs-websocket.h
|
src/obs-websocket.h
|
||||||
src/Config.cpp
|
src/Config.cpp
|
||||||
src/Config.h
|
src/Config.h
|
||||||
lib/obs-websocket-api.h
|
|
||||||
src/forms/SettingsDialog.cpp
|
src/forms/SettingsDialog.cpp
|
||||||
src/forms/SettingsDialog.h
|
src/forms/SettingsDialog.h
|
||||||
src/forms/ConnectInfo.cpp
|
src/forms/ConnectInfo.cpp
|
||||||
@ -67,7 +81,6 @@ target_sources(
|
|||||||
src/websocketserver/WebSocketServer.cpp
|
src/websocketserver/WebSocketServer.cpp
|
||||||
src/websocketserver/WebSocketServer_Protocol.cpp
|
src/websocketserver/WebSocketServer_Protocol.cpp
|
||||||
src/websocketserver/WebSocketServer.h
|
src/websocketserver/WebSocketServer.h
|
||||||
src/websocketserver/rpc/WebSocketSession.cpp
|
|
||||||
src/websocketserver/rpc/WebSocketSession.h
|
src/websocketserver/rpc/WebSocketSession.h
|
||||||
src/websocketserver/types/WebSocketCloseCode.h
|
src/websocketserver/types/WebSocketCloseCode.h
|
||||||
src/websocketserver/types/WebSocketOpCode.h
|
src/websocketserver/types/WebSocketOpCode.h
|
||||||
@ -128,21 +141,21 @@ target_sources(
|
|||||||
src/utils/Platform.h
|
src/utils/Platform.h
|
||||||
src/utils/Compat.cpp
|
src/utils/Compat.cpp
|
||||||
src/utils/Compat.h
|
src/utils/Compat.h
|
||||||
src/utils/Utils.h
|
src/utils/Utils.h)
|
||||||
deps/qr/cpp/QrCode.cpp
|
|
||||||
deps/qr/cpp/QrCode.hpp)
|
|
||||||
|
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
PRIVATE OBS::libobs
|
PRIVATE OBS::libobs
|
||||||
OBS::frontend-api
|
OBS::frontend-api
|
||||||
|
OBS::websocket-api
|
||||||
Qt::Core
|
Qt::Core
|
||||||
Qt::Widgets
|
Qt::Widgets
|
||||||
Qt::Svg
|
Qt::Svg
|
||||||
Qt::Network
|
Qt::Network
|
||||||
nlohmann_json::nlohmann_json
|
nlohmann_json::nlohmann_json
|
||||||
Websocketpp::Websocketpp
|
Websocketpp::Websocketpp
|
||||||
Asio::Asio)
|
Asio::Asio
|
||||||
|
qrcodegencpp::qrcodegencpp)
|
||||||
|
|
||||||
target_compile_features(obs-websocket PRIVATE cxx_std_17)
|
target_compile_features(obs-websocket PRIVATE cxx_std_17)
|
||||||
|
|
||||||
@ -159,6 +172,7 @@ endif()
|
|||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_compile_options(obs-websocket PRIVATE /wd4267 /wd4996)
|
target_compile_options(obs-websocket PRIVATE /wd4267 /wd4996)
|
||||||
|
target_link_options(obs-websocket PRIVATE "LINKER:/IGNORE:4099")
|
||||||
else()
|
else()
|
||||||
target_compile_options(
|
target_compile_options(
|
||||||
obs-websocket
|
obs-websocket
|
||||||
|
14
cmake/obs-websocket-api.cmake
Normal file
14
cmake/obs-websocket-api.cmake
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
add_library(obs-websocket-api INTERFACE)
|
||||||
|
add_library(OBS::websocket-api ALIAS obs-websocket-api)
|
||||||
|
|
||||||
|
target_sources(obs-websocket-api INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib/obs-websocket-api.h>
|
||||||
|
$<INSTALL_INTERFACE:${OBS_INCLUDE_DESTINATION}/obs-websocket-api.h>)
|
||||||
|
|
||||||
|
target_link_libraries(obs-websocket-api INTERFACE OBS::libobs)
|
||||||
|
|
||||||
|
target_include_directories(obs-websocket-api INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>"
|
||||||
|
"$<INSTALL_INTERFACE:${OBS_INCLUDE_DESTINATION}>")
|
||||||
|
|
||||||
|
set_target_properties(obs-websocket-api PROPERTIES PREFIX "" PUBLIC_HEADER lib/obs-websocket-api.h)
|
||||||
|
|
||||||
|
target_export(obs-websocket-api)
|
8
cmake/obs-websocket-apiConfig.cmake.in
Normal file
8
cmake/obs-websocket-apiConfig.cmake.in
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
|
||||||
|
find_dependency(libobs REQUIRED)
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake")
|
||||||
|
check_required_components("@PROJECT_NAME@")
|
35
data/locale/af-ZA.ini
Normal file
35
data/locale/af-ZA.ini
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Afstandbeheer van OBS deur WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="WebSocket-bedienerinstellings"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Inpropinstellings"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Aktiveer WebSocket-diens"
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Bedienerinstellings"
|
||||||
|
OBSWebSocket.Settings.Password="Bedienerwagwoord"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Genereer wagwoord"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Bedienerpoort"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Waarskuwing: Tans regstreeks"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Dit lyk of ’n afvoer (stroom, opname, ens.) tans aktief is."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Is u seker u wil u verbindingsinligting laat sien?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Waarskuwing: potensiële beveiligingsprobleem"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websok bewaar die bedienerwagwoord as platteks. Dit word ten sterkste aanbeveel om ’n wagwoord wat deur obs-websok geskep is te gebruik."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Is u seker u wil u eie wagwoord gebruik?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Fout: Ongeldige opstalling"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="U moet ’n wagwoord van meet as 6 karakters gebruik."
|
||||||
|
OBSWebSocket.SessionTable.Title="Gekoppelde WebSocket-sessies"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Afstandsadres"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Sessieduur"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Boodskappe In/Uit"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Geïdentifiseer"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Verwyder?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Verwyder"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-verbindingsinligting"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopieer"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Bediener-IP (beste skatting)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Bedienerpoort"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Bedienerwagwoord"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Koppel QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nuwe WebSocket-koppeling"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Kliënt %1 geïdentifiseer."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-waarmerkfout"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Kliënt %1 kon nie waarmerk nie."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-kliënt is ontkoppel"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Kliënt %1 is ontkoppel."
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="فشل مصادقة We
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="فشل العميل %1 في المصادقة."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="فشل العميل %1 في المصادقة."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="تم قطع اتصال عميل WebSocket"
|
OBSWebSocket.TrayNotification.Disconnected.Title="تم قطع اتصال عميل WebSocket"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="العميل %1 قطع الاتصال."
|
OBSWebSocket.TrayNotification.Disconnected.Body="العميل %1 قطع الاتصال."
|
||||||
OBSWebSocket.Server.StartFailed.Title="فشل خادم WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="فشل تشغيل خادم WebSocket. قد يكون منفذ TCP %1 قيد الاستخدام في تطبيق آخر على هذا النظام. حاول تعيين منفذ TCP مختلف في إعدادات خادم WebSocket، أو إيقاف أي تطبيق يمكن أن يستخدم هذا المنفذ.\n رسالة الخطأ: %2"
|
|
||||||
|
41
data/locale/be-BY.ini
Normal file
41
data/locale/be-BY.ini
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Аддаленае кіраванне OBS Studio праз WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Налады сервера WebSocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Налады плагіна"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Уключыць сервер WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Уключыць апавяшчэнні ў вобласці апавяшчэнняў"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Уключыць журнал адладкі"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Уключае журнал адладкі толькі для бягучага сеансу OBS. Пасля перазапуску будзе выключана.\nКаб праграма запускалася з уключанай наладай, выкарыстайце параметр --websocket_debug"
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Налады сервера"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Уключыць аўтэнтыфікацыю"
|
||||||
|
OBSWebSocket.Settings.Password="Пароль сервера"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Згенераваць"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Порт сервера"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Паказаць звесткі пра злучэнне"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Увага: ідзе трансляцыя"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Выглядае, што ў бягучы момант ідзе вывад (стрым, запіс і г. д.)."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ці вы ўпэўненыя, што хочаце паказаць вашы звесткі пра злучэнне?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Увага: магчымая небяспека"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket захоўвае пароль сервера ў выглядзе звычайнага тэксту. Настойліва рэкамендуецца выкарыстоўваць пароль, які згенеруе obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ці вы ўпэўненыя, што хочаце карыстацца сваім паролем?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Увага: памылковая канфігурацыя"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Пароль павінен утрымліваць 6 або больш сімвалаў."
|
||||||
|
OBSWebSocket.SessionTable.Title="Злучаныя сеансы WebSocket"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Аддалены адрас"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Даўжыня сеансу"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Паведамленні I/O"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Ідэнтыфікавана"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Выгнаць?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Выгнаць"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Звесткі пра злучэнне WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Скапіяваць"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP сервера (найлепшая здагадка)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Порт сервера"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Пароль сервера"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[аўтэнтыфікацыя адкл.]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR-код злучэння"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Новае злучэнне WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Кліент %1 ідэнтыфікаваны."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Збой аўтэнтыфікацыі WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Кліент %1 не прайшоў аўтэнтыфікацыю."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Кліент WebSocket адключаны"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Кліент %1 адключаны."
|
@ -1,10 +1,10 @@
|
|||||||
OBSWebSocket.Plugin.Description="Control remot de l'OBS Studio mitjançant un servidor web"
|
OBSWebSocket.Plugin.Description="Control remot de l'OBS Studio mitjançant WebSocket"
|
||||||
OBSWebSocket.Settings.DialogTitle="Configuració del servidor WebSocket"
|
OBSWebSocket.Settings.DialogTitle="Configuració del servidor WebSocket"
|
||||||
OBSWebSocket.Settings.PluginSettingsTitle="Configuració del complement"
|
OBSWebSocket.Settings.PluginSettingsTitle="Configuració del complement"
|
||||||
OBSWebSocket.Settings.ServerEnable="Habilita el servidor web"
|
OBSWebSocket.Settings.ServerEnable="Habilita el servidor WebSocket"
|
||||||
OBSWebSocket.Settings.AlertsEnable="Habilita les notificacions a la barra de tasques"
|
OBSWebSocket.Settings.AlertsEnable="Habilita les notificacions a la barra de tasques"
|
||||||
OBSWebSocket.Settings.DebugEnable="Habilita l'informe de depuració"
|
OBSWebSocket.Settings.DebugEnable="Habilita l'informe de depuració"
|
||||||
OBSWebSocket.Settings.DebugEnableHoverText="Habilita l'informe de depuració només per a la instància actual de l'OBS i no queda resident en inicis posteriors.\nUtilitzeu --websocket_debug si us cal que el canvi sigui persistent."
|
OBSWebSocket.Settings.DebugEnableHoverText="Habilita l'informe de depuració només per a la instància actual de l'OBS. No persisteix en inicis posteriors.\nUtilitzeu --websocket_debug si us cal que el canvi sigui persistent."
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="Configuració del servidor"
|
OBSWebSocket.Settings.ServerSettingsTitle="Configuració del servidor"
|
||||||
OBSWebSocket.Settings.AuthRequired="Habilita l'autenticació"
|
OBSWebSocket.Settings.AuthRequired="Habilita l'autenticació"
|
||||||
OBSWebSocket.Settings.Password="Contrasenya del servidor"
|
OBSWebSocket.Settings.Password="Contrasenya del servidor"
|
||||||
@ -15,29 +15,27 @@ OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Atenció: Actualment en direc
|
|||||||
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sembla que una sortida (retransmissió, gravació, etc.) està actualment activa."
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sembla que una sortida (retransmissió, gravació, etc.) està actualment activa."
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Segur que voleu mostrar la vostra informació de connexió?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Segur que voleu mostrar la vostra informació de connexió?"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Atenció: Risc potencial de seguretat"
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Atenció: Risc potencial de seguretat"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="El servidor web del l'OBS (obs-websocket) emmagatzema la contrasenya del servidor com a text pla. És altament recomanable l'ús d'una contrasenya generada automàticament."
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket emmagatzema la contrasenya del servidor com a text pla. És altament recomanable l'ús d'una contrasenya generada automàticament."
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Segur que voleu utilitzar la vostra contrasenya?"
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Segur que voleu utilitzar la vostra contrasenya?"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Configuració no vàlida"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Configuració no vàlida"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Utilitzeu una contrasenya de 6 o més caràcters."
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Utilitzeu una contrasenya de 6 o més caràcters."
|
||||||
OBSWebSocket.SessionTable.Title="Sessions de servidor connectades"
|
OBSWebSocket.SessionTable.Title="Sessions de WebSocket connectades"
|
||||||
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adreça remota"
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adreça remota"
|
||||||
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durada de la sessió"
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durada de la sessió"
|
||||||
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Missatges d'entrada/sortida"
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Missatges d'entrada/sortida"
|
||||||
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
|
||||||
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsió?"
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsar?"
|
||||||
OBSWebSocket.SessionTable.KickButtonText="Expulsa"
|
OBSWebSocket.SessionTable.KickButtonText="Expulsa"
|
||||||
OBSWebSocket.ConnectInfo.DialogTitle="Informació de connexió del servidor Web (WebSocket)"
|
OBSWebSocket.ConnectInfo.DialogTitle="Informació de connexió del servidor WebSocket"
|
||||||
OBSWebSocket.ConnectInfo.CopyText="Copia"
|
OBSWebSocket.ConnectInfo.CopyText="Copia"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="Adreça IP (més acurada)"
|
OBSWebSocket.ConnectInfo.ServerIp="Adreça IP (més acurada)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Port"
|
OBSWebSocket.ConnectInfo.ServerPort="Port"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Contrasenya"
|
OBSWebSocket.ConnectInfo.ServerPassword="Contrasenya"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticació inhabilitada]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticació inhabilitada]"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="QR de la connexió"
|
OBSWebSocket.ConnectInfo.QrTitle="QR de la connexió"
|
||||||
OBSWebSocket.TrayNotification.Identified.Title="Connexió nova de servidor Web (WebSocket)"
|
OBSWebSocket.TrayNotification.Identified.Title="Connexió nova de WebSocket"
|
||||||
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identificat."
|
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identificat."
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ha fallat l'autenticació del servidor Web"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ha fallat l'autenticació del servidor WebSocket"
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Ha fallat l'autenticació del client %1."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Ha fallat l'autenticació del client %1."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Client desconnectat del servidor Web"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client desconnectat del servidor WebSocket"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 desconnectat."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 desconnectat."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Ha fallat el servidor Web (WebSocket)"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="El servidor Web ha fallat en iniciar. Potser el port TCP %1 ja està en ús per altre programa del sistema. Proveu un port diferent a la configuració del servidor Web (WebSocket), o atureu qualsevol altra aplicació que pugui utilitzar aquest port.\n Missatge d'error: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Chyba přihlášení k
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nebyl přihlášen"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nebyl přihlášen"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient se odpojil"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient se odpojil"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 se odpojil."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 se odpojil."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Chyba WebSocket serveru"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket server se nepodařilo spustit. TCP port %1 může být používán jinou aplikací. Zkuste nastavit jiný TCP port v nastavení WebSocket serveru nebo zavřete aplikaci, která může používat tento port.\n Chybová zpráva: %2"
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
OBSWebSocket.Plugin.Description="Fjernstyring af OBS Studio via WebSocket"
|
OBSWebSocket.Plugin.Description="Fjernstyring af OBS Studio via WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="WebSocket-serverindstillinger"
|
||||||
OBSWebSocket.Settings.PluginSettingsTitle="Plugin-indstillinger"
|
OBSWebSocket.Settings.PluginSettingsTitle="Plugin-indstillinger"
|
||||||
OBSWebSocket.Settings.ServerEnable="Aktivér WebSocket-server"
|
OBSWebSocket.Settings.ServerEnable="Aktivér WebSocket-server"
|
||||||
OBSWebSocket.Settings.AlertsEnable="Aktivér Systembakke Alarmer"
|
OBSWebSocket.Settings.AlertsEnable="Aktivér Systembakke Alarmer"
|
||||||
@ -38,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket godkendelses
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klienten %1 kunne ikke godkendes."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klienten %1 kunne ikke godkendes."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frakoblet"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frakoblet"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frakoblet."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frakoblet."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket-serverfejl"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket-serveren started ikke. TCP-port %1 bruges måske allerede på dette system af et andet program. Prøv at angive en anden TCP-port i WebSocket-serverindstillingerne, eller stop ethvert program, der kan bruge denne port.\n Fejlmeddelelse: %2"
|
|
||||||
|
@ -4,7 +4,7 @@ OBSWebSocket.Settings.PluginSettingsTitle="Plugineinstellungen"
|
|||||||
OBSWebSocket.Settings.ServerEnable="WebSocket-Server aktivieren"
|
OBSWebSocket.Settings.ServerEnable="WebSocket-Server aktivieren"
|
||||||
OBSWebSocket.Settings.AlertsEnable="Warnungen im Infobereich aktivieren"
|
OBSWebSocket.Settings.AlertsEnable="Warnungen im Infobereich aktivieren"
|
||||||
OBSWebSocket.Settings.DebugEnable="Debug-Logging aktivieren"
|
OBSWebSocket.Settings.DebugEnable="Debug-Logging aktivieren"
|
||||||
OBSWebSocket.Settings.DebugEnableHoverText="Aktiviert Debug-Logging für die aktuelle OBS-Instanz.\nVerwenden Sie „--websocket_debug“, damit die Option beim Laden aktiviert wird."
|
OBSWebSocket.Settings.DebugEnableHoverText="Aktiviert Debug-Logging für die aktuelle OBS-Instanz.\nVerwenden Sie „--websocket_debug“, damit die Option beim Starten aktiviert wird."
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="Servereinstellungen"
|
OBSWebSocket.Settings.ServerSettingsTitle="Servereinstellungen"
|
||||||
OBSWebSocket.Settings.AuthRequired="Authentifizierung aktivieren"
|
OBSWebSocket.Settings.AuthRequired="Authentifizierung aktivieren"
|
||||||
OBSWebSocket.Settings.Password="Serverpasswort"
|
OBSWebSocket.Settings.Password="Serverpasswort"
|
||||||
@ -28,7 +28,7 @@ OBSWebSocket.SessionTable.KickButtonColumnTitle="Entfernen?"
|
|||||||
OBSWebSocket.SessionTable.KickButtonText="Entfernen"
|
OBSWebSocket.SessionTable.KickButtonText="Entfernen"
|
||||||
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-Verbindungsinformationen"
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-Verbindungsinformationen"
|
||||||
OBSWebSocket.ConnectInfo.CopyText="Kopieren"
|
OBSWebSocket.ConnectInfo.CopyText="Kopieren"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="Server-IP (geschätzt)"
|
OBSWebSocket.ConnectInfo.ServerIp="Server-IP (Geschätzt)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Serverport"
|
OBSWebSocket.ConnectInfo.ServerPort="Serverport"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Serverpasswort"
|
OBSWebSocket.ConnectInfo.ServerPassword="Serverpasswort"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="Authentifizierung deaktiviert"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="Authentifizierung deaktiviert"
|
||||||
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-Authentifizi
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 konnte sich nicht authentifizieren."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 konnte sich nicht authentifizieren."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-Client getrennt"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-Client getrennt"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 getrennt."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 getrennt."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket-Serverfehler"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Der WebSocket-Server konnte nicht gestartet werden, da der TCP-Port %1 möglicherweise benutzt wird. Versuchen Sie, den Port in den WebSocket-Servereinstellungen zu ändern oder Anwendungen zu schließen, die diesen verwenden könnten.\nFehler: %2"
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
OBSWebSocket.Plugin.Description="Απομακρυσμένος έλεγχος του OBS Studio μέσω WebSocket"
|
OBSWebSocket.Plugin.Description="Απομακρυσμένος έλεγχος του OBS Studio μέσω WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Ρυθμίσεις Διακομιστή WebSocket"
|
||||||
OBSWebSocket.Settings.PluginSettingsTitle="Ρυθμίσεις Προσθέτων"
|
OBSWebSocket.Settings.PluginSettingsTitle="Ρυθμίσεις Προσθέτων"
|
||||||
OBSWebSocket.Settings.ServerEnable="Ενεργοποίηση διακομιστή WebSocket"
|
OBSWebSocket.Settings.ServerEnable="Ενεργοποίηση διακομιστή WebSocket"
|
||||||
OBSWebSocket.Settings.AlertsEnable="Ενεργοποίηση Ειδοποιήσεων στο System Tray"
|
OBSWebSocket.Settings.AlertsEnable="Ενεργοποίηση Ειδοποιήσεων στο System Tray"
|
||||||
@ -38,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Αποτυχία Τα
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Αποτυχία ταυτοποίησης του πελάτη %1."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Αποτυχία ταυτοποίησης του πελάτη %1."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Αποσυνδέθηκε ο Πελάτης του WebSocket"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Αποσυνδέθηκε ο Πελάτης του WebSocket"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Ο πελάτης %1 αποσυνδέθηκε."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Ο πελάτης %1 αποσυνδέθηκε."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Αποτυχία Διακομιστή WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Ο διακομιστής WebSocket απέτυχε να ξεκινήσει. Η θύρα %1 TCP μπορεί ήδη να χρησιμοποιείται από μια άλλη εφαρμογή σε αυτό το σύστημα. Δοκιμάστε να ορίσετε μια διαφορετική θύρα TCP στις ρυθμίσεις διακομιστή WebSocket ή να σταματήσετε οποιαδήποτε εφαρμογή που θα μπορούσε να χρησιμοποιήσει αυτή τη θύρα.\n Μήνυμα σφάλματος: %2"
|
|
||||||
|
1
data/locale/en-GB.ini
Normal file
1
data/locale/en-GB.ini
Normal file
@ -0,0 +1 @@
|
|||||||
|
#
|
@ -45,6 +45,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Authenticati
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 failed to authenticate."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 failed to authenticate."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client Disconnected"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client Disconnected"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnected."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnected."
|
||||||
|
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket Server Failure"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="The WebSocket server failed to start. TCP port %1 may already be in use elsewhere on this system by another application. Try setting a different TCP port in the WebSocket server settings, or stop any application that could be using this port.\n Error message: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Fallo de autenticació
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="El cliente %1 no se pudo autenticar."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="El cliente %1 no se pudo autenticar."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desconectado"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desconectado"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Fallo del servidor WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="El servidor WebSocket no pudo iniciarse. El puerto TCP %1 puede que ya esté en uso en otro lugar de este sistema por otra aplicación. Intente configurar un puerto TCP diferente en la configuración del servidor WebSocket o detenga cualquier aplicación que pueda estar usando este puerto.\n Mensaje de error: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket autentimise
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Kliendi %1 autentimine ebaõnnestus."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Kliendi %1 autentimine ebaõnnestus."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket kliendi ühendus katkenud"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket kliendi ühendus katkenud"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Kliendi %1 ühendus katkenud."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Kliendi %1 ühendus katkenud."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket serveri tõrge"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket'i serveri käivitamine ebaõnnestus. TCP-port %1 võib olla juba mujal selles süsteemis mõne teise rakenduse poolt kasutusel. Proovige määrata WebSocket'i serveri seadetes teine TCP-port või peatada rakendus, mis võib seda porti kasutada.\n Veateade: %2"
|
|
||||||
|
@ -38,5 +38,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Autentikazio
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 bezeroak autentifikatzen huts egin du."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 bezeroak autentifikatzen huts egin du."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Bezeroa deskonektatu da"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Bezeroa deskonektatu da"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="%1 bezeroa deskonektatu da."
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 bezeroa deskonektatu da."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket Zerbitzari hutsegitea"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket zerbitzaria ez da hasi. %1 TCP portua agian dagoeneko beste aplikazio batek erabiltzen ari du sistema honetan. Saiatu beste TCP portu bat konfiguratzen WebSocket zerbitzariaren konfigurazioan, edo portu hori erabiltzen ari den edozein aplikazio geldiarazi.\nErrore-mezua: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="خرابی تأیید
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="سرویس گیرنده %1 احراز هویت نشد."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="سرویس گیرنده %1 احراز هویت نشد."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="سرویس گیرنده سوکت وب قطع شد"
|
OBSWebSocket.TrayNotification.Disconnected.Title="سرویس گیرنده سوکت وب قطع شد"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="سرویس گیرنده %1 قطع شد."
|
OBSWebSocket.TrayNotification.Disconnected.Body="سرویس گیرنده %1 قطع شد."
|
||||||
OBSWebSocket.Server.StartFailed.Title="خرابی سرور سوکت وب"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="سرور WebSocket راهاندازی نشد. درگاه TCP % 1 ممکن است قبلاً در جای دیگری در این سیستم توسط برنامه دیگری استفاده شده باشد. یک پورت TCP دیگر را در تنظیمات سرور WebSocket تنظیم کنید، یا هر برنامهای را که میتواند از این پورت استفاده کند متوقف کنید.\n پیام خطا: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-tunnistusvir
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Asiakas %1 todennus epäonnistui."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Asiakas %1 todennus epäonnistui."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-asiakas katkaisi yhteyden"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-asiakas katkaisi yhteyden"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Asiakas %1 on katkaistu."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Asiakas %1 on katkaistu."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket-palvelinvirhe"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket-palvelin ei käynnistynyt. TCP-portti %1 saattaa olla jo toisen sovelluksen käytössä. Yritä määrittää toinen TCP-portti WebSocket-palvelimen asetuksissa tai lopeta kaikki sovellukset, jotka saattavat käyttää tätä porttia.\nVirheilmoitus: %2"
|
|
||||||
|
@ -35,5 +35,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Nabigo sa Pagpapatunay
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Nabigo ang kliyenteng %1 na patotohanan."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Nabigo ang kliyenteng %1 na patotohanan."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Nadiskonekta ang WebSocket Client"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Nadiskonekta ang WebSocket Client"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Nadiskonekta ang kliyenteng %1."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Nadiskonekta ang kliyenteng %1."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Nabigo ng WebSocket Server"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Nabigong magsimula ang WebSocket server. Ang TCP port %1 ay maaaring ginagamit na sa ibang lugar sa system na ito ng isa pang application. Subukang magtakda ng ibang TCP port sa mga setting ng WebSocket server, o ihinto ang anumang application na maaaring gumagamit ng port na ito.\n Mensahe ng error: %2"
|
|
||||||
|
@ -16,9 +16,9 @@ OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Il semble qu'une sortie (st
|
|||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Êtes-vous sûr de vouloir afficher vos informations de connexion ?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Êtes-vous sûr de vouloir afficher vos informations de connexion ?"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avertissement : Problème potentiel de sécurité"
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avertissement : Problème potentiel de sécurité"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket enregistre le mot de passe du serveur en texte brut. L'utilisation d'un mot de passe généré par obs-websocket est fortement recommandée."
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket enregistre le mot de passe du serveur en texte brut. L'utilisation d'un mot de passe généré par obs-websocket est fortement recommandée."
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Êtes-vous sûr de vouloir utiliser votre propre mot de passe ?"
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Êtes-vous sûr(e) de vouloir utiliser votre propre mot de passe ?"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Erreur : Configuration invalide"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Erreur : Configuration invalide"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Vous devez utiliser un mot de passe d'au moins 6 caractères"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Vous devez utiliser un mot de passe de 6 caractères ou plus."
|
||||||
OBSWebSocket.SessionTable.Title="Sessions WebSocket connectées"
|
OBSWebSocket.SessionTable.Title="Sessions WebSocket connectées"
|
||||||
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adresse distante"
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adresse distante"
|
||||||
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durée de session"
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durée de session"
|
||||||
@ -30,7 +30,7 @@ OBSWebSocket.ConnectInfo.DialogTitle="Informations de connexion WebSocket"
|
|||||||
OBSWebSocket.ConnectInfo.CopyText="Copier"
|
OBSWebSocket.ConnectInfo.CopyText="Copier"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="IP du serveur (meilleure estimation)"
|
OBSWebSocket.ConnectInfo.ServerIp="IP du serveur (meilleure estimation)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Port serveur"
|
OBSWebSocket.ConnectInfo.ServerPort="Port serveur"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Mot de passe serveur"
|
OBSWebSocket.ConnectInfo.ServerPassword="Mot de passe du serveur"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Authentification désactivée]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Authentification désactivée]"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="QR code de connexion"
|
OBSWebSocket.ConnectInfo.QrTitle="QR code de connexion"
|
||||||
OBSWebSocket.TrayNotification.Identified.Title="Nouvelle connexion WebSocket"
|
OBSWebSocket.TrayNotification.Identified.Title="Nouvelle connexion WebSocket"
|
||||||
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Échec de l'authentifi
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Échec d'authentification du client %1."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Échec d'authentification du client %1."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket déconnecté"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket déconnecté"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 déconnecté."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 déconnecté."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Échec du serveur WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Le serveur WebSocket n'a pas pu démarrer. Le port TCP %1 est peut être déjà utilisé par une autre application ailleurs sur ce système. Essayez de définir un port TCP différent dans les paramètres du serveur WebSocket, ou arrêtez toute application qui pourrait utiliser ce port.\n Message d'erreur : %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="אימות WebSocket
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="לקוח %1 נכשל באימות"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="לקוח %1 נכשל באימות"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="לקוח WebSocket התנתק"
|
OBSWebSocket.TrayNotification.Disconnected.Title="לקוח WebSocket התנתק"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="לקוח %1 התנתק."
|
OBSWebSocket.TrayNotification.Disconnected.Body="לקוח %1 התנתק."
|
||||||
OBSWebSocket.Server.StartFailed.Title="שגיאת שרת WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="שרת ה-WebSocket נכשל בהפעלה. ייתכן שפורט TCP %1 כבר נמצא בשימוש במקום אחר במערכת זו על ידי יישום אחר. יש לנסות להגדיר פורט TCP אחר בהגדרות שרת WebSocket, או לעצור כל יישום שעשוי להשתמש בפורט זה.\nהודעת שגיאה: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket सत्य
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="क्लाइंट %1प्रमाणित करने में विफल रहा."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="क्लाइंट %1प्रमाणित करने में विफल रहा."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="वेबसॉकेट क्लाइंट डिस्कनेक्ट हो गया"
|
OBSWebSocket.TrayNotification.Disconnected.Title="वेबसॉकेट क्लाइंट डिस्कनेक्ट हो गया"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="क्लाइंट %1 डिस्कनेक्ट हो गया."
|
OBSWebSocket.TrayNotification.Disconnected.Body="क्लाइंट %1 डिस्कनेक्ट हो गया."
|
||||||
OBSWebSocket.Server.StartFailed.Title="वेबसॉकेट सर्वर विफलता"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket सर्वर प्रारंभ करने में विफल रहा. TCP पोर्ट %1 पहले से ही इस सिस्टम पर किसी अन्य एप्लिकेशन द्वारा कहीं और उपयोग में हो सकता है. वेबसॉकेट सर्वर सेटिंग्स में एक अलग TCP पोर्ट सेट करने का प्रयास करें, या इस पोर्ट का उपयोग करने वाले किसी भी एप्लिकेशन को रोकें.\n त्रुटि संदेश : %2"
|
|
||||||
|
@ -1 +1,10 @@
|
|||||||
OBSWebSocket.Settings.DialogTitle="Postavke servera WebSocket"
|
OBSWebSocket.Settings.DialogTitle="Postavke servera WebSocket"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Pogreška: Neispravna konfiguracija"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Lozinka mora sadržavati barem 6 znakova."
|
||||||
|
OBSWebSocket.SessionTable.Title="Spojene sesije WebSocketa"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Udaljena adresa"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Trajanje sesije"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Ulaz/izlaz poruka"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopiraj"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Vrata servera"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Lozinka servera"
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket hitelesíté
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="A(z) %1 kliens hitelesítése sikertelen."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="A(z) %1 kliens hitelesítése sikertelen."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="A WebSocket-kliens bontotta a kapcsolatot"
|
OBSWebSocket.TrayNotification.Disconnected.Title="A WebSocket-kliens bontotta a kapcsolatot"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="A(z) %1 kliens bontotta a kapcsolatot"
|
OBSWebSocket.TrayNotification.Disconnected.Body="A(z) %1 kliens bontotta a kapcsolatot"
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket kiszolgálóhiba"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="A WebSocket-kiszolgáló nem tudott elindulni. A(z) %1 TCP-portot lehet, hogy már egy másik alkalmazás használja. Próbáljon eltérő TCP-portot beállítani a WebSocket-kiszolgáló beállítasaiban, vagy állítson le minden olyan alkalmazást, amely ezt a portot használhatja.\n Hibaüzenet: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket վավերա
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 հաճախորդը չհաջողվեց նույնականացնել:"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 հաճախորդը չհաջողվեց նույնականացնել:"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket հաճախորդն անջատված է"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket հաճախորդն անջատված է"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="%1 հաճախորդն անջատվել է:"
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 հաճախորդն անջատվել է:"
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket սերվերի սխալ"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Չհաջողվեց գործարկել WebSockt սերվերը: Հնարավոր է, որ TCP %1 պորտն արդեն օգտագործվում է մեկ այլ հավելվածի կողմից: Փորձեք կարգավորել այլ TCP պորտ WebSocket սերվերի կարգավորումներում կամ դադարեցնել ցանկացած ծրագիր, որը կարող է օգտագործել այս պորտը:\n Սխալի հաղորդագրություն՝ %2։"
|
|
||||||
|
@ -8,7 +8,7 @@ OBSWebSocket.Settings.DebugEnableHoverText="Aktifkan pencatatan awakutu untuk pe
|
|||||||
OBSWebSocket.Settings.ServerSettingsTitle="Pengaturan Server"
|
OBSWebSocket.Settings.ServerSettingsTitle="Pengaturan Server"
|
||||||
OBSWebSocket.Settings.AuthRequired="Aktifkan Autentikasi"
|
OBSWebSocket.Settings.AuthRequired="Aktifkan Autentikasi"
|
||||||
OBSWebSocket.Settings.Password="Kata Sandi Server"
|
OBSWebSocket.Settings.Password="Kata Sandi Server"
|
||||||
OBSWebSocket.Settings.GeneratePassword="Ciptakan Kata Sandi"
|
OBSWebSocket.Settings.GeneratePassword="Buat Kata Sandi"
|
||||||
OBSWebSocket.Settings.ServerPort="Port Server"
|
OBSWebSocket.Settings.ServerPort="Port Server"
|
||||||
OBSWebSocket.Settings.ShowConnectInfo="Tampilkan Informasi Koneksi"
|
OBSWebSocket.Settings.ShowConnectInfo="Tampilkan Informasi Koneksi"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Peringatan: Saat Ini Siaran Langsung"
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Peringatan: Saat Ini Siaran Langsung"
|
||||||
@ -16,7 +16,7 @@ OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sepertinya sebuah output (s
|
|||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Anda yakin ingin melihat informasi koneksi Anda?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Anda yakin ingin melihat informasi koneksi Anda?"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Peringatan: Potensi Masalah Keamanan"
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Peringatan: Potensi Masalah Keamanan"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket menyimpan kata sandi server sebagai teks biasa. Sangat disarankan untuk menggunakan kata sandi yang diciptakan oleh obs-websocket."
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket menyimpan kata sandi server sebagai teks biasa. Sangat disarankan untuk menggunakan kata sandi yang diciptakan oleh obs-websocket."
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Anda yakin ingin menggunakan kata sandi Anda sendiri?"
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Apakah Anda yakin ingin menggunakan kata sandi sendiri?"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Galat: Konfigurasi Tidak Berlaku"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Galat: Konfigurasi Tidak Berlaku"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Anda harus menggunakan kata sandi yang minimal 6 karakter atau lebih."
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Anda harus menggunakan kata sandi yang minimal 6 karakter atau lebih."
|
||||||
OBSWebSocket.SessionTable.Title="Sesi WebSocket yang Terhubung"
|
OBSWebSocket.SessionTable.Title="Sesi WebSocket yang Terhubung"
|
||||||
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Autentikasi WebSocket
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal mengautentikasi."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal mengautentikasi."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Server WebSocket Gagal"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Server WebSocket gagal untuk memulai. Port TCP %1 mungkin sudah digunakan siapa pun pada sistem ini oleh aplikasi lain. Coba atur port TCP yang berbeda di pengaturan server WebSocket, atau hentikan aplikasi apapun yang bisa menggunakan port ini.\n Pesan galat: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Errore di autenticazio
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Il client %1 non è riuscito ad autenticarsi."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Il client %1 non è riuscito ad autenticarsi."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket disconnesso"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket disconnesso"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnesso."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnesso."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Errore del server WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Impossibile avviare il server WebSocket.\nLa porta TCP %1 potrebbe essere già usata in questo sistema da un'altra applicazione.\nProva a impostare nelle impostazioni del server WebSocket una porta TCP diversa oppure interrompi qualsiasi applicazione che potrebbe usare questa porta.\nMessaggio di errore: %2."
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket認証失敗"
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="クライアント %1 の認証に失敗しました。"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="クライアント %1 の認証に失敗しました。"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocketクライアントが切断されました"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocketクライアントが切断されました"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="クライアント %1 が切断されました。"
|
OBSWebSocket.TrayNotification.Disconnected.Body="クライアント %1 が切断されました。"
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocketサーバー障害"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocketサーバーの起動に失敗しました。TCPポート %1 はこのシステム上の他の場所で別のアプリケーションによって既に使用されている可能性があります。 WebSocketサーバーの設定で別のTCPポートを設定するか、このポートを使用している可能性のあるアプリケーションを終了してください。\n エラーメッセージ: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-შესვ
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="კლიენტი %1 ვერ დამოწმდა."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="კლიენტი %1 ვერ დამოწმდა."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-კლიენტი გამოითიშა"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-კლიენტი გამოითიშა"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="კლიენტი %1 გამოთიშეულია."
|
OBSWebSocket.TrayNotification.Disconnected.Body="კლიენტი %1 გამოთიშეულია."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket-სერვერის ხარვეზი"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket-სერვერი ვერ ამუშავდა. TCP-პორტი %1 შეიძლება უკვე გამოიყენება სისტემაში სხვა პროგამის მიერ. მოსინჯეთ განსხვავებული TCP-პორტი WebSocket-სერვერის პარამეტრებში ან გათიშეთ ყველა პროგრამა, რომელიც ამ პორტს უნდა იყენებდეს.\n შეცდომის აღწერა: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Rastandina WebSocket t
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Rastandina rajegir %1 têk çû."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Rastandina rajegir %1 têk çû."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Girêdana rajegira WebSocket qut bû"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Girêdana rajegira WebSocket qut bû"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Girêdana rajegir %1 qut bû."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Girêdana rajegir %1 qut bû."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Rajekara WebSocket têk çû"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Destpêkirina rajekara WebSocket têk çû. Dibe ku dergeha TCP %1 jixwe ji hêla sepaneke din ve li cîhek din li ser vê pergalê were bikaranîn. Kontrol bike ku di sazkariyên rajekara WebSocket de dergehek TCP a cuda saz bikî, an jî sepanek ku dikare vê dergehê bi kar bîne rawestîne.\n Peyama çewtiyê: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 인증 실
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="클라이언트 %1 인증 실패."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="클라이언트 %1 인증 실패."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 클라이언트 연결 해제됨"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 클라이언트 연결 해제됨"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="클라이언트 %1 연결 해제됨."
|
OBSWebSocket.TrayNotification.Disconnected.Body="클라이언트 %1 연결 해제됨."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket 서버 기동 실패"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket 서버를 시작하는 데 실패했습니다. %1 TCP 포트가 타 응용 프로그램에 의해 이 시스템에서 이미 사용 중일 수 있습니다. WebSocket 서버 설정에서 다른 TCP 포트로 변경하거나 이 포트를 사용하는 응용 프로그램을 종료하십시오.\n 오류 메시지: %2"
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
OBSWebSocket.Plugin.Description="Kawalan-jauh OBS Studio melalui WebSocket"
|
OBSWebSocket.Plugin.Description="Kawalan-jauh OBS Studio melalui WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Tetapan Pelayan WebSocket"
|
||||||
OBSWebSocket.Settings.PluginSettingsTitle="Tetapan Pemalam"
|
OBSWebSocket.Settings.PluginSettingsTitle="Tetapan Pemalam"
|
||||||
OBSWebSocket.Settings.ServerEnable="Benarkan pelayan WebSocket"
|
OBSWebSocket.Settings.ServerEnable="Benarkan pelayan WebSocket"
|
||||||
OBSWebSocket.Settings.AlertsEnable="Benarkan Amaran Talam Sistem"
|
OBSWebSocket.Settings.AlertsEnable="Benarkan Amaran Talam Sistem"
|
||||||
@ -38,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Kegagalan Pengesahihan
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal disahihkan."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal disahihkan."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Kegagalan Pelayan WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Pelayan WebSocket gagal dimulakan. Port TCP %1 mungkin telah digunakan di tempat lain dalam sistem ini oleh aplikasi lain. Cuba tetapkan port TCP lain dalam tetapan pelayan WebSocket, atau hentikan mana-mana aplikasi yang guna port tersebut.\n Mesej ralat: %2"
|
|
||||||
|
25
data/locale/nb-NO.ini
Normal file
25
data/locale/nb-NO.ini
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
OBSWebSocket.Settings.DialogTitle="WebSocket-tjenerinnstillinger"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Utvidelsesinnstillinger"
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Tjenerinnstillinger"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Skru på autentisering"
|
||||||
|
OBSWebSocket.Settings.Password="Server Passord"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Generer Passord"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Vis tilkoblingsinfo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Advarsel: For øyeblikket på direktesending"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Advarsel: Potensielt sikkerhetsproblem"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Feil: Ugyldig konfigurasjon"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Du må bruke et passord på minst 6 tegn."
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Ekstern adresse"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Øktens varighet"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Innboks/Utboks"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identifisert"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-tilkoblingsinfo"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopier"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Tjenerens IP (beste gjetning)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Tjenerport"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Tjenerpassord"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR-tilkobling"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Ny WebSocket-tilkobling"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 er identifisert."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient koblet fra"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 koblet fra."
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Authenticati
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Authenticatie van client %1 mislukt."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Authenticatie van client %1 mislukt."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client losgekoppeld"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client losgekoppeld"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 ontkoppeld."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 ontkoppeld."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket Server fout"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="De WebSocket server kon niet worden gestart. TCP-poort %1 is mogelijk al in gebruik op dit systeem door een andere toepassing. Probeer een andere TCP-poort in te stellen in de WebSocket server-instellingen, of stop elke toepassing die deze poort zou kunnen gebruiken.\n Foutmelding: %2"
|
|
||||||
|
@ -18,7 +18,7 @@ OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Ostrzeżenie: Potencjalny p
|
|||||||
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket przechowuje hasło serwera jako zwykły tekst. Wysoce zalecane jest użycie hasła generowanego przez obs-websocket."
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket przechowuje hasło serwera jako zwykły tekst. Wysoce zalecane jest użycie hasła generowanego przez obs-websocket."
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Czy na pewno chcesz użyć własnego hasła?"
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Czy na pewno chcesz użyć własnego hasła?"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Błąd: Nieprawidłowa konfiguracja"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Błąd: Nieprawidłowa konfiguracja"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Musisz użyć hasła, które ma 6 lub więcej znaków."
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Hasło musi zawierać 6 lub więcej znaków."
|
||||||
OBSWebSocket.SessionTable.Title="Podłączone sesje WebSocket"
|
OBSWebSocket.SessionTable.Title="Podłączone sesje WebSocket"
|
||||||
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adres zdalny"
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adres zdalny"
|
||||||
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Czas trwania sesji"
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Czas trwania sesji"
|
||||||
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Błąd uwierzytelniani
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nie został uwierzytelniony."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nie został uwierzytelniony."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Klient WebSocket odłączony"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Klient WebSocket odłączony"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odłączony."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odłączony."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Błąd serwera WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Nie udało się uruchomić serwera WebSocket. Port TCP %1 może być już używany w innym miejscu tego systemu przez inną aplikację. Spróbuj ustawić inny port TCP w ustawieniach serwera WebSocket lub zatrzymaj aplikację, która może korzystać z tego portu.\n Komunikat błędu: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Falha na Autenticaçã
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket Desconectado"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket Desconectado"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Falha no Servidor WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="O servidor de WebSocket falhou ao iniciar. A porta TCP %1 já pode estar em uso em outro lugar neste sistema por outro aplicativo. Tente definir uma porta TCP diferente nas configurações do servidor de WebSocket, ou pare qualquer aplicativo que possa estar usando essa porta.\n Mensagem de erro: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Falha na autenticaçã
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desligado"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desligado"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desligado."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desligado."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Falha no servidor WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="O servidor de WebSocket falhou ao iniciar. A porta TCP %1 pode já estar em uso noutro local deste sistema por outra aplicação. Tente definir uma porta TCP diferente nas configurações do servidor de WebSocket, ou pare qualquer aplicação que possa estar a usar essa porta.\n Mensagem de erro: %2"
|
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
OBSWebSocket.Plugin.Description="Control de la distanță pentru OBS Studio prin WebSocket"
|
OBSWebSocket.Plugin.Description="Control de la distanță pentru OBS Studio prin WebSocket"
|
||||||
OBSWebSocket.Settings.DialogTitle="Setări ale server-ului WebSocket"
|
OBSWebSocket.Settings.DialogTitle="Setări pentru serverul WebSocket"
|
||||||
OBSWebSocket.Settings.PluginSettingsTitle="Setări pentru plugin"
|
OBSWebSocket.Settings.PluginSettingsTitle="Setări pentru plugin"
|
||||||
OBSWebSocket.Settings.ServerEnable="Activează serverul WebSocket"
|
OBSWebSocket.Settings.ServerEnable="Activează serverul WebSocket"
|
||||||
OBSWebSocket.Settings.AlertsEnable="Activează alertele din bara de sistem"
|
OBSWebSocket.Settings.AlertsEnable="Activează alertele din bara de sistem"
|
||||||
OBSWebSocket.Settings.DebugEnable="Activează jurnalizarea de depanare"
|
OBSWebSocket.Settings.DebugEnable="Activează jurnalizarea pentru depanare"
|
||||||
OBSWebSocket.Settings.DebugEnableHoverText="Activează jurnalizarea de depanare pentru instanța actuală de OBS. Nu persistă la încărcare.\nFolosește --websocket_debug pentru a activa la încărcare."
|
OBSWebSocket.Settings.DebugEnableHoverText="Activează jurnalizarea pentru depanare în cazul instanței actuale de OBS. Nu persistă la încărcare.\nFolosește --websocket_debug pentru a activa la încărcare."
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="Setări server"
|
OBSWebSocket.Settings.ServerSettingsTitle="Setări pentru server"
|
||||||
OBSWebSocket.Settings.AuthRequired="Activează autentificarea"
|
OBSWebSocket.Settings.AuthRequired="Activează autentificarea"
|
||||||
OBSWebSocket.Settings.Password="Parola serverului"
|
OBSWebSocket.Settings.Password="Parola serverului"
|
||||||
OBSWebSocket.Settings.GeneratePassword="Generează parola"
|
OBSWebSocket.Settings.GeneratePassword="Generează parola"
|
||||||
OBSWebSocket.Settings.ServerPort="Portul serverului"
|
OBSWebSocket.Settings.ServerPort="Portul serverului"
|
||||||
OBSWebSocket.Settings.ShowConnectInfo="Afișează informațiile de conectare"
|
OBSWebSocket.Settings.ShowConnectInfo="Afișează informațiile conexiunii"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Avertisment: În prezent în direct"
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Avertisment: În prezent în direct"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Se pare că un output (transmisiune, înregistrare etc.) este activ în prezent."
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Se pare că un output (transmisiune, înregistrare etc.) este activ în prezent."
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sigur vrei să afișezi informațiile de conectare?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sigur vrei să afișezi informațiile de conectare?"
|
||||||
@ -24,20 +24,18 @@ OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adresă la distanță"
|
|||||||
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durata sesiunii"
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durata sesiunii"
|
||||||
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mesaje de intrare/ieșire"
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mesaje de intrare/ieșire"
|
||||||
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
|
||||||
OBSWebSocket.SessionTable.KickButtonColumnTitle="Înlătură?"
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Înlături?"
|
||||||
OBSWebSocket.SessionTable.KickButtonText="Înlătură"
|
OBSWebSocket.SessionTable.KickButtonText="Înlătură"
|
||||||
OBSWebSocket.ConnectInfo.DialogTitle="Informații de conectare WebSocket"
|
OBSWebSocket.ConnectInfo.DialogTitle="Informațiile conexiunii WebSocket"
|
||||||
OBSWebSocket.ConnectInfo.CopyText="Copiază"
|
OBSWebSocket.ConnectInfo.CopyText="Copiază"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="IP-ul serverului (cea mai bună presupunere)"
|
OBSWebSocket.ConnectInfo.ServerIp="IP-ul serverului (cea mai bună presupunere)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Portul serverului"
|
OBSWebSocket.ConnectInfo.ServerPort="Portul serverului"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Parola serverului"
|
OBSWebSocket.ConnectInfo.ServerPassword="Parola serverului"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentificare dezactivată]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentificare dezactivată]"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="Conectare QR"
|
OBSWebSocket.ConnectInfo.QrTitle="QR de conectare"
|
||||||
OBSWebSocket.TrayNotification.Identified.Title="O nouă conexiune WebSocket"
|
OBSWebSocket.TrayNotification.Identified.Title="O nouă conexiune WebSocket"
|
||||||
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identificat."
|
OBSWebSocket.TrayNotification.Identified.Body="Clientul %1 identificat."
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Eroare de autentificare WebSocket"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Eroare de autentificare WebSocket"
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 nu a reușit să se autentifice."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 nu a reușit să se autentifice."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket deconectat"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket deconectat"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Clientul %1 s-a deconectat."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Clientul %1 s-a deconectat."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Eroare de server WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Serverul WebSocket nu a reușit să pornească. Este posibil ca portul TCP %1 să fie deja utilizat în altă parte pe acest sistem de o altă aplicație. Încearcă să setezi un alt port TCP în setările serverului WebSocket sau oprește orice aplicație care ar putea utiliza acest port.\n Mesaj de eroare: %2"
|
|
||||||
|
@ -6,13 +6,13 @@ OBSWebSocket.Settings.AlertsEnable="Включить оповещения в т
|
|||||||
OBSWebSocket.Settings.DebugEnable="Включить отладочный журнал"
|
OBSWebSocket.Settings.DebugEnable="Включить отладочный журнал"
|
||||||
OBSWebSocket.Settings.DebugEnableHoverText="Включает ведение журнала отладки для текущего экземпляра OBS. Не сохраняется при запуске.\nИспользуйте --websocket_debug для включения при запуске."
|
OBSWebSocket.Settings.DebugEnableHoverText="Включает ведение журнала отладки для текущего экземпляра OBS. Не сохраняется при запуске.\nИспользуйте --websocket_debug для включения при запуске."
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="Настройки сервера"
|
OBSWebSocket.Settings.ServerSettingsTitle="Настройки сервера"
|
||||||
OBSWebSocket.Settings.AuthRequired="Включить аутентификацию"
|
OBSWebSocket.Settings.AuthRequired="Включить вход в аккаунт"
|
||||||
OBSWebSocket.Settings.Password="Пароль сервера"
|
OBSWebSocket.Settings.Password="Пароль сервера"
|
||||||
OBSWebSocket.Settings.GeneratePassword="Сгенерировать пароль"
|
OBSWebSocket.Settings.GeneratePassword="Создать пароль"
|
||||||
OBSWebSocket.Settings.ServerPort="Порт сервера"
|
OBSWebSocket.Settings.ServerPort="Порт сервера"
|
||||||
OBSWebSocket.Settings.ShowConnectInfo="Показать сведения о подключении"
|
OBSWebSocket.Settings.ShowConnectInfo="Показать сведения о подключении"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Предупреждение: Сейчас в эфире"
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Предупреждение: Сейчас в эфире"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Похоже, что вывод (поток, запись и т. д.) в настоящее время активен."
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Похоже, что вывод (поток, запись и т. д.) в настоящее время уже выбран."
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Уверены, что хотите показать ваши сведения о подключении?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Уверены, что хотите показать ваши сведения о подключении?"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Предупреждение: Потенциальная проблема безопасности"
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Предупреждение: Потенциальная проблема безопасности"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket хранит пароль сервера в виде обычного текста. Настоятельно рекомендуется использовать пароль, сгенерированный obs-websock."
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket хранит пароль сервера в виде обычного текста. Настоятельно рекомендуется использовать пароль, сгенерированный obs-websock."
|
||||||
@ -28,16 +28,14 @@ OBSWebSocket.SessionTable.KickButtonColumnTitle="Выгнать?"
|
|||||||
OBSWebSocket.SessionTable.KickButtonText="Выгнать"
|
OBSWebSocket.SessionTable.KickButtonText="Выгнать"
|
||||||
OBSWebSocket.ConnectInfo.DialogTitle="Сведения о подключении WebSocket"
|
OBSWebSocket.ConnectInfo.DialogTitle="Сведения о подключении WebSocket"
|
||||||
OBSWebSocket.ConnectInfo.CopyText="Копировать"
|
OBSWebSocket.ConnectInfo.CopyText="Копировать"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="IP сервера (лучшая догадка)"
|
OBSWebSocket.ConnectInfo.ServerIp="IP сервера (вероятный)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Порт сервера"
|
OBSWebSocket.ConnectInfo.ServerPort="Порт сервера"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Пароль сервера"
|
OBSWebSocket.ConnectInfo.ServerPassword="Пароль сервера"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Авторизация отключена]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Вход отключён]"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="QR-код подключения"
|
OBSWebSocket.ConnectInfo.QrTitle="QR-код подключения"
|
||||||
OBSWebSocket.TrayNotification.Identified.Title="Новое подключение WebSocket"
|
OBSWebSocket.TrayNotification.Identified.Title="Новое подключение WebSocket"
|
||||||
OBSWebSocket.TrayNotification.Identified.Body="Клиент %1 распознан."
|
OBSWebSocket.TrayNotification.Identified.Body="Клиент %1 распознан."
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ошибка аутентификации WebSocket"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ошибка входа WebSocket"
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Клиент %1 не смог аутентифицироваться."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Клиент %1 не смог войти."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Клиент WebSocket отключился"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Клиент WebSocket отключился"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Клиент %1 отключился."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Клиент %1 отключился."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Ошибка сервера WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Не удалось запустить сервер WebSockt. Возможно, порт TCP %1 уже используется другим приложением. Попробуйте установить другой TCP-порт в настройках сервера WebSocket или остановите любое приложение, которое может использовать этот порт.\n Сообщение ошибки: %2"
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
OBSWebSocket.Settings.PluginSettingsTitle="පේනුවේ සැකසුම්"
|
OBSWebSocket.Settings.PluginSettingsTitle="පේනුවේ සැකසුම්"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="නිදොස්කරණ සටහන් තැබීම සබල කරන්න"
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="සේවාදායකයේ සැකසුම්"
|
OBSWebSocket.Settings.ServerSettingsTitle="සේවාදායකයේ සැකසුම්"
|
||||||
OBSWebSocket.Settings.AuthRequired="සත්යාපනය සබල කරන්න"
|
OBSWebSocket.Settings.AuthRequired="සත්යාපනය සබල කරන්න"
|
||||||
OBSWebSocket.Settings.Password="සේවාදායකයේ මුරපදය"
|
OBSWebSocket.Settings.Password="සේවාදායකයේ මුරපදය"
|
||||||
@ -11,6 +12,7 @@ OBSWebSocket.SessionTable.SessionDurationColumnTitle="වාරයේ පරා
|
|||||||
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="පණිවිඩ එන/යන"
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="පණිවිඩ එන/යන"
|
||||||
OBSWebSocket.SessionTable.IdentifiedTitle="හඳුනා ගැනිණි"
|
OBSWebSocket.SessionTable.IdentifiedTitle="හඳුනා ගැනිණි"
|
||||||
OBSWebSocket.ConnectInfo.CopyText="පිටපතක්"
|
OBSWebSocket.ConnectInfo.CopyText="පිටපතක්"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="සේවාදායකයේ අ.ජා.කෙ. (අනුමානය)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="සේවාදායකයේ තොට"
|
OBSWebSocket.ConnectInfo.ServerPort="සේවාදායකයේ තොට"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="සේවාදායකයේ මුරපදය"
|
OBSWebSocket.ConnectInfo.ServerPassword="සේවාදායකයේ මුරපදය"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[සත්යාපනය අබලයි]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[සත්යාපනය අබලයි]"
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Zlyhanie WebSocket aut
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klientovi %1 sa nepodarilo autentifikovať."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klientovi %1 sa nepodarilo autentifikovať."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient odpojený"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient odpojený"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odpojený."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odpojený."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Zlyhanie WebSocket servera"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket server zlyhal pri spustení. TCP port %1 sa môže používať na inom mieste, na tomto systéme, inou aplikáciou. Skúste nastaviť iný TCP port v nastaveniach WebSocket servera, alebo zastavte iné aplikácie, ktoré by mohli používať tento port.\n Chybová správa: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Spodletelo ovetjanje W
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Odjemalec %1 ni prestal overjanja."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Odjemalec %1 ni prestal overjanja."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Odjemalec WebSocket je prekinil povezavo"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Odjemalec WebSocket je prekinil povezavo"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Odjemalec %1 ni več povezan."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Odjemalec %1 ni več povezan."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Odpoved strežnika WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Strežnik WebSocket se ni uspel zagnati. Vrata TCP %1 morda že uporablja drug program na tem sistemu. Poskusite določiti druga vrata TCP v nastavitvah strežnika WebSocket ali pa ustaviti program, ki bi lahko uporabljal želena vrata.\nSporočilo o napaki: %2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Autentisering av WebSo
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 misslyckades att autentiseras."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 misslyckades att autentiseras."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frånkopplades"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frånkopplades"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frånkopplades."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frånkopplades."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket-serverfel"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket-servern kunde inte startaw. TCP-porten %1 kanske redan används någon annanstans på detta system av ett annat program. Prova att ange en annan TCP-port i WebSocket-serverinställningarna eller stoppa alla program som kan använda denna port.\n Felmeddelande: %2"
|
|
||||||
|
@ -29,7 +29,7 @@ OBSWebSocket.SessionTable.KickButtonText="Çıkar"
|
|||||||
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket Bağlanma Bilgileri"
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket Bağlanma Bilgileri"
|
||||||
OBSWebSocket.ConnectInfo.CopyText="Kopyala"
|
OBSWebSocket.ConnectInfo.CopyText="Kopyala"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="Sunucu IP (En İyi Tahmin)"
|
OBSWebSocket.ConnectInfo.ServerIp="Sunucu IP (En İyi Tahmin)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Sunucu Kapısı"
|
OBSWebSocket.ConnectInfo.ServerPort="Sunucu Portu"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Sunucu Parolası"
|
OBSWebSocket.ConnectInfo.ServerPassword="Sunucu Parolası"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Doğrulama Devre Dışı]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Doğrulama Devre Dışı]"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="Kare Kod ile Bağlan"
|
OBSWebSocket.ConnectInfo.QrTitle="Kare Kod ile Bağlan"
|
||||||
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Kimlik Doğr
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 istemcisinin kimlik doğrulaması başarısız oldu."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 istemcisinin kimlik doğrulaması başarısız oldu."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket İstemcisinin Bağlantısı Kesildi"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket İstemcisinin Bağlantısı Kesildi"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="%1 istemcisinin bağlantısı kesildi."
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 istemcisinin bağlantısı kesildi."
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket Sunucu Hatası"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket sunucusu başlatılamadı. %1 TCP kapısı bu sistemde başka bir yerde başka bir uygulama tarafından zaten kullanılıyor olabilir. WebSocket sunucu ayarlarında farklı bir TCP kapısı ayarlamayı deneyin, veya bu kapıyı kullanıyor olabilecek herhangi bir uygulamayı durdurun.\n Hata mesajı: %2"
|
|
||||||
|
9
data/locale/tt-RU.ini
Normal file
9
data/locale/tt-RU.ini
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Сервер көйләүләре"
|
||||||
|
OBSWebSocket.Settings.Password="Сервер серсүзе"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Серсүзне ясау"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Сервер порты"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Чыгарыргамы?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Чыгару"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Күчермә алу"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Сервер порты"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Сервер серсүзе"
|
2
data/locale/ug-CN.ini
Normal file
2
data/locale/ug-CN.ini
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
OBSWebSocket.Settings.GeneratePassword="ئىم ھاسىللا"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="كۆچۈر"
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Помилка авт
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Клієнт %1 не зміг автентифікуватися."
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Клієнт %1 не зміг автентифікуватися."
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="Клієнт WebSocket від'єднаний"
|
OBSWebSocket.TrayNotification.Disconnected.Title="Клієнт WebSocket від'єднаний"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="Клієнт %1 від'єднаний."
|
OBSWebSocket.TrayNotification.Disconnected.Body="Клієнт %1 від'єднаний."
|
||||||
OBSWebSocket.Server.StartFailed.Title="Помилка сервера WebSocket"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="Не вдалося запустити сервер WebSocket. Порт TCP %1 може вже використовуватися в іншому місці цим системним інтерфейсом. Спробуйте встановити інший TCP порт в налаштуваннях WebSocket сервера або зупинити будь-які застосунки, які можуть використовувати цей порт.\n Повідомлення про помилку: %2"
|
|
||||||
|
@ -1,13 +1,37 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Điều khiển từ xa OBS Studio thông qua WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Cài đặt máy chủ WebSocket"
|
||||||
OBSWebSocket.Settings.PluginSettingsTitle="Thiết đặt trình cắm"
|
OBSWebSocket.Settings.PluginSettingsTitle="Thiết đặt trình cắm"
|
||||||
OBSWebSocket.Settings.ServerEnable="Bật máy chủ WebSocket"
|
OBSWebSocket.Settings.ServerEnable="Bật máy chủ WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Bật cảnh báo khay hệ thống"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Bật ghi nhật ký gỡ lỗi"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Cho phép ghi nhật ký gỡ lỗi cho phiên bản OBS hiện tại. Không tồn tại khi tải.\nUde --websocket gỡ lỗi để bật khi tải."
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="Thiết đặt máy chủ"
|
OBSWebSocket.Settings.ServerSettingsTitle="Thiết đặt máy chủ"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Bật xác thực"
|
||||||
OBSWebSocket.Settings.Password="Mật khẩu máy chủ"
|
OBSWebSocket.Settings.Password="Mật khẩu máy chủ"
|
||||||
OBSWebSocket.Settings.GeneratePassword="Tạo mật khẩu"
|
OBSWebSocket.Settings.GeneratePassword="Tạo mật khẩu"
|
||||||
OBSWebSocket.Settings.ServerPort="Cổng máy chủ"
|
OBSWebSocket.Settings.ServerPort="Cổng máy chủ"
|
||||||
OBSWebSocket.Settings.ShowConnectInfo="Hiện thông tin kết nối"
|
OBSWebSocket.Settings.ShowConnectInfo="Hiện thông tin kết nối"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Cảnh báo: Hiện đang chạy"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Có vẻ như một đầu ra (luồng, bản ghi, v.v.) hiện đang hoạt động."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Bạn có chắc chắn muốn hiển thị thông tin kết nối của mình không?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Cảnh báo: Vấn đề bảo mật tiềm ẩn"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket lưu trữ mật khẩu máy chủ dưới dạng văn bản thuần túy. Bạn nên sử dụng mật khẩu được tạo bởi obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Bạn có chắc bạn muốn sử dụng mật khẩu của mình?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Lỗi: Thiết lập không hợp lệ"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Bạn phải sử dụng mật khẩu có 6 ký tự trở lên."
|
||||||
|
OBSWebSocket.SessionTable.Title="Các phiên WebSocket được kết nối"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Địa chỉ từ xa"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Thời lượng phiên"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Tin nhắn vào/ra"
|
||||||
OBSWebSocket.SessionTable.IdentifiedTitle="Định dạng"
|
OBSWebSocket.SessionTable.IdentifiedTitle="Định dạng"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Thông tin kết nối WebSocket"
|
||||||
OBSWebSocket.ConnectInfo.ServerIp="IP Máy chủ (Gợi ý tốt nhất)"
|
OBSWebSocket.ConnectInfo.ServerIp="IP Máy chủ (Gợi ý tốt nhất)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="Cổng máy chủ"
|
OBSWebSocket.ConnectInfo.ServerPort="Cổng máy chủ"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="Mật khẩu máy chủ"
|
OBSWebSocket.ConnectInfo.ServerPassword="Mật khẩu máy chủ"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="Kết nối bằng mã QR"
|
OBSWebSocket.ConnectInfo.QrTitle="Kết nối bằng mã QR"
|
||||||
OBSWebSocket.TrayNotification.Identified.Title="Tạo cổng kết nối WebSocket mới"
|
OBSWebSocket.TrayNotification.Identified.Title="Tạo cổng kết nối WebSocket mới"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Máy khách %1 được xác định."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Lỗi xác thực WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Máy khách %1 không xác thực được."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Máy khách WebSocket bị ngắt kết nối"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Máy khách %1 bị ngắt kết nối."
|
||||||
|
@ -6,23 +6,23 @@ OBSWebSocket.Settings.AlertsEnable="开启系统托盘提醒"
|
|||||||
OBSWebSocket.Settings.DebugEnable="开启调试日志"
|
OBSWebSocket.Settings.DebugEnable="开启调试日志"
|
||||||
OBSWebSocket.Settings.DebugEnableHoverText="开启当前 OBS 实例的调试日志。下次启动时需重新设置。\n使用 --websocket_debug 在启动 OBS 时开启日志。"
|
OBSWebSocket.Settings.DebugEnableHoverText="开启当前 OBS 实例的调试日志。下次启动时需重新设置。\n使用 --websocket_debug 在启动 OBS 时开启日志。"
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="服务器设置"
|
OBSWebSocket.Settings.ServerSettingsTitle="服务器设置"
|
||||||
OBSWebSocket.Settings.AuthRequired="开启鉴权"
|
OBSWebSocket.Settings.AuthRequired="开启身份认证"
|
||||||
OBSWebSocket.Settings.Password="服务器密码"
|
OBSWebSocket.Settings.Password="服务器密码"
|
||||||
OBSWebSocket.Settings.GeneratePassword="生成密码"
|
OBSWebSocket.Settings.GeneratePassword="生成密码"
|
||||||
OBSWebSocket.Settings.ServerPort="服务器端口"
|
OBSWebSocket.Settings.ServerPort="服务器端口"
|
||||||
OBSWebSocket.Settings.ShowConnectInfo="显示连接信息"
|
OBSWebSocket.Settings.ShowConnectInfo="显示连接信息"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="警告:正在直播"
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="警告:正在直播"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="似乎正在输出(串流、录像等)。"
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="似乎输出(串流、录像等)正在进行。"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="您确定要显示您的连接信息吗?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="您确定要显示您的连接信息吗?"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="警告:潜在安全问题"
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="警告:潜在安全问题"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket 会以明文形式储存服务器密码。强烈建议使用 obs-websocket 生成的密码。"
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket 会以明文形式储存服务器密码。强烈建议使用 obs-websocket 生成的密码。"
|
||||||
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="您确定要使用自定义密码吗?"
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="您确定要使用自定义密码吗?"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="错误:配置无效"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="错误:无效的配置"
|
||||||
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="您的密码必须包含 6 个或以上的字符。"
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="您的密码必须包含 6 个或以上的字符。"
|
||||||
OBSWebSocket.SessionTable.Title="已连接的 WebSocket 会话"
|
OBSWebSocket.SessionTable.Title="已连接的 WebSocket 会话"
|
||||||
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="远程地址"
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="远程地址"
|
||||||
OBSWebSocket.SessionTable.SessionDurationColumnTitle="会话持续时间"
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="会话持续时间"
|
||||||
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="消息传入/出"
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="消息传入/传出"
|
||||||
OBSWebSocket.SessionTable.IdentifiedTitle="已识别"
|
OBSWebSocket.SessionTable.IdentifiedTitle="已识别"
|
||||||
OBSWebSocket.SessionTable.KickButtonColumnTitle="踢出?"
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="踢出?"
|
||||||
OBSWebSocket.SessionTable.KickButtonText="踢出"
|
OBSWebSocket.SessionTable.KickButtonText="踢出"
|
||||||
@ -31,13 +31,11 @@ OBSWebSocket.ConnectInfo.CopyText="复制"
|
|||||||
OBSWebSocket.ConnectInfo.ServerIp="服务器 IP(最佳猜测)"
|
OBSWebSocket.ConnectInfo.ServerIp="服务器 IP(最佳猜测)"
|
||||||
OBSWebSocket.ConnectInfo.ServerPort="服务器端口"
|
OBSWebSocket.ConnectInfo.ServerPort="服务器端口"
|
||||||
OBSWebSocket.ConnectInfo.ServerPassword="服务器密码"
|
OBSWebSocket.ConnectInfo.ServerPassword="服务器密码"
|
||||||
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[鉴权已停用]"
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[身份认证已停用]"
|
||||||
OBSWebSocket.ConnectInfo.QrTitle="连接 QR 码"
|
OBSWebSocket.ConnectInfo.QrTitle="连接 QR 码"
|
||||||
OBSWebSocket.TrayNotification.Identified.Title="新 WebSocket 连接"
|
OBSWebSocket.TrayNotification.Identified.Title="新 WebSocket 连接"
|
||||||
OBSWebSocket.TrayNotification.Identified.Body="已识别 %1 客户端。"
|
OBSWebSocket.TrayNotification.Identified.Body="客户端%1已识别 。"
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 鉴权失败"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 认证失败"
|
||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 客户端认证失败。"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 客户端认证失败。"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 客户端已断开"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 客户端已断开"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="%1 客户端已断开。"
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 客户端已断开。"
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket 服务器启动失败"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="WebSocket 服务器启动失败。TCP 端口 %1 可能已被其它程序占用。请尝试在 WebSocket 服务器设置中更改不同的 TCP 端口号,或者结束其它任何可能占用此端口的程序。\n错误信息:%2"
|
|
||||||
|
@ -39,5 +39,3 @@ OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket 認證失敗
|
|||||||
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 用戶端無法進行認證。"
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 用戶端無法進行認證。"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 用戶端已斷線"
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket 用戶端已斷線"
|
||||||
OBSWebSocket.TrayNotification.Disconnected.Body="%1 用戶端已斷線。"
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 用戶端已斷線。"
|
||||||
OBSWebSocket.Server.StartFailed.Title="WebSocket 伺服器錯誤"
|
|
||||||
OBSWebSocket.Server.StartFailed.Message="無法啟動 WebSocket 伺服器。可能 TCP 連線埠 %1 已經被系統中的某個應用程式佔用。請嘗試在 WebSocket 伺服器設定更改不同的 TCP 連線埠,或停止任何可能正在使用這個連線埠的應用程式。\n錯誤訊息:%2"
|
|
||||||
|
1
deps/qr
vendored
1
deps/qr
vendored
Submodule deps/qr deleted from 8518684c0f
@ -1,5 +1,7 @@
|
|||||||
# obs-websocket documentation
|
# obs-websocket documentation
|
||||||
|
|
||||||
|
## If you're looking for the documentation page, it's [here](generated/protocol.md)
|
||||||
|
|
||||||
This is the documentation for obs-websocket. Run `build_docs.sh` to auto generate the latest docs from the `src` directory. There are 3 components to the docs generation:
|
This is the documentation for obs-websocket. Run `build_docs.sh` to auto generate the latest docs from the `src` directory. There are 3 components to the docs generation:
|
||||||
|
|
||||||
- `comments/comments.js`: Generates the `work/comments.json` file from the code comments in the src directory.
|
- `comments/comments.js`: Generates the `work/comments.json` file from the code comments in the src directory.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
# obs-websocket 5.1.0 Protocol
|
# obs-websocket 5.x.x Protocol
|
||||||
|
|
||||||
## Main Table of Contents
|
## Main Table of Contents
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include <obs.h>
|
#include <obs.h>
|
||||||
|
|
||||||
#define OBS_WEBSOCKET_API_VERSION 2
|
#define OBS_WEBSOCKET_API_VERSION 3
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -30,6 +30,7 @@ extern "C" {
|
|||||||
|
|
||||||
typedef void *obs_websocket_vendor;
|
typedef void *obs_websocket_vendor;
|
||||||
typedef void (*obs_websocket_request_callback_function)(obs_data_t *, obs_data_t *, void *);
|
typedef void (*obs_websocket_request_callback_function)(obs_data_t *, obs_data_t *, void *);
|
||||||
|
typedef void (*obs_websocket_event_callback_function)(uint64_t, const char *, const char *, void *);
|
||||||
|
|
||||||
struct obs_websocket_request_response {
|
struct obs_websocket_request_response {
|
||||||
unsigned int status_code;
|
unsigned int status_code;
|
||||||
@ -44,7 +45,12 @@ struct obs_websocket_request_callback {
|
|||||||
void *priv_data;
|
void *priv_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline proc_handler_t *_ph;
|
struct obs_websocket_event_callback {
|
||||||
|
obs_websocket_event_callback_function callback;
|
||||||
|
void *priv_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static proc_handler_t *_ph;
|
||||||
|
|
||||||
/* ==================== INTERNAL API FUNCTIONS ==================== */
|
/* ==================== INTERNAL API FUNCTIONS ==================== */
|
||||||
|
|
||||||
@ -53,7 +59,7 @@ static inline proc_handler_t *obs_websocket_get_ph(void)
|
|||||||
proc_handler_t *global_ph = obs_get_proc_handler();
|
proc_handler_t *global_ph = obs_get_proc_handler();
|
||||||
assert(global_ph != NULL);
|
assert(global_ph != NULL);
|
||||||
|
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
if (!proc_handler_call(global_ph, "obs_websocket_api_get_ph", &cd))
|
if (!proc_handler_call(global_ph, "obs_websocket_api_get_ph", &cd))
|
||||||
blog(LOG_DEBUG, "Unable to fetch obs-websocket proc handler object. obs-websocket not installed?");
|
blog(LOG_DEBUG, "Unable to fetch obs-websocket proc handler object. obs-websocket not installed?");
|
||||||
proc_handler_t *ret = (proc_handler_t *)calldata_ptr(&cd, "ph");
|
proc_handler_t *ret = (proc_handler_t *)calldata_ptr(&cd, "ph");
|
||||||
@ -91,7 +97,7 @@ static inline unsigned int obs_websocket_get_api_version(void)
|
|||||||
if (!obs_websocket_ensure_ph())
|
if (!obs_websocket_ensure_ph())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
|
||||||
if (!proc_handler_call(_ph, "get_api_version", &cd))
|
if (!proc_handler_call(_ph, "get_api_version", &cd))
|
||||||
return 1; // API v1 does not include get_api_version
|
return 1; // API v1 does not include get_api_version
|
||||||
@ -104,7 +110,11 @@ static inline unsigned int obs_websocket_get_api_version(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calls an obs-websocket request. Free response with `obs_websocket_request_response_free()`
|
// Calls an obs-websocket request. Free response with `obs_websocket_request_response_free()`
|
||||||
static inline obs_websocket_request_response *obs_websocket_call_request(const char *request_type, obs_data_t *request_data = NULL)
|
static inline struct obs_websocket_request_response *obs_websocket_call_request(const char *request_type, obs_data_t *request_data
|
||||||
|
#ifdef __cplusplus
|
||||||
|
= NULL
|
||||||
|
#endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (!obs_websocket_ensure_ph())
|
if (!obs_websocket_ensure_ph())
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -113,14 +123,13 @@ static inline obs_websocket_request_response *obs_websocket_call_request(const c
|
|||||||
if (request_data)
|
if (request_data)
|
||||||
request_data_string = obs_data_get_json(request_data);
|
request_data_string = obs_data_get_json(request_data);
|
||||||
|
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
|
||||||
calldata_set_string(&cd, "request_type", request_type);
|
calldata_set_string(&cd, "request_type", request_type);
|
||||||
calldata_set_string(&cd, "request_data", request_data_string);
|
calldata_set_string(&cd, "request_data", request_data_string);
|
||||||
|
|
||||||
proc_handler_call(_ph, "call_request", &cd);
|
proc_handler_call(_ph, "call_request", &cd);
|
||||||
|
|
||||||
auto ret = (struct obs_websocket_request_response *)calldata_ptr(&cd, "response");
|
struct obs_websocket_request_response *ret = (struct obs_websocket_request_response *)calldata_ptr(&cd, "response");
|
||||||
|
|
||||||
calldata_free(&cd);
|
calldata_free(&cd);
|
||||||
|
|
||||||
@ -140,6 +149,46 @@ static inline void obs_websocket_request_response_free(struct obs_websocket_requ
|
|||||||
bfree(response);
|
bfree(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register an event handler to receive obs-websocket events
|
||||||
|
static inline bool obs_websocket_register_event_callback(obs_websocket_event_callback_function event_callback, void *priv_data)
|
||||||
|
{
|
||||||
|
if (!obs_websocket_ensure_ph())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
struct obs_websocket_event_callback cb = {event_callback, priv_data};
|
||||||
|
|
||||||
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
calldata_set_ptr(&cd, "callback", &cb);
|
||||||
|
|
||||||
|
proc_handler_call(_ph, "register_event_callback", &cd);
|
||||||
|
|
||||||
|
bool ret = calldata_bool(&cd, "success");
|
||||||
|
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unregister an existing event handler
|
||||||
|
static inline bool obs_websocket_unregister_event_callback(obs_websocket_event_callback_function event_callback, void *priv_data)
|
||||||
|
{
|
||||||
|
if (!obs_websocket_ensure_ph())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
struct obs_websocket_event_callback cb = {event_callback, priv_data};
|
||||||
|
|
||||||
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
calldata_set_ptr(&cd, "callback", &cb);
|
||||||
|
|
||||||
|
proc_handler_call(_ph, "unregister_event_callback", &cd);
|
||||||
|
|
||||||
|
bool ret = calldata_bool(&cd, "success");
|
||||||
|
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* ==================== VENDOR API FUNCTIONS ==================== */
|
/* ==================== VENDOR API FUNCTIONS ==================== */
|
||||||
|
|
||||||
// ALWAYS CALL ONLY VIA `obs_module_post_load()` CALLBACK!
|
// ALWAYS CALL ONLY VIA `obs_module_post_load()` CALLBACK!
|
||||||
@ -149,8 +198,7 @@ static inline obs_websocket_vendor obs_websocket_register_vendor(const char *ven
|
|||||||
if (!obs_websocket_ensure_ph())
|
if (!obs_websocket_ensure_ph())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
|
||||||
calldata_set_string(&cd, "name", vendor_name);
|
calldata_set_string(&cd, "name", vendor_name);
|
||||||
|
|
||||||
proc_handler_call(_ph, "vendor_register", &cd);
|
proc_handler_call(_ph, "vendor_register", &cd);
|
||||||
@ -164,12 +212,9 @@ static inline obs_websocket_vendor obs_websocket_register_vendor(const char *ven
|
|||||||
static inline bool obs_websocket_vendor_register_request(obs_websocket_vendor vendor, const char *request_type,
|
static inline bool obs_websocket_vendor_register_request(obs_websocket_vendor vendor, const char *request_type,
|
||||||
obs_websocket_request_callback_function request_callback, void *priv_data)
|
obs_websocket_request_callback_function request_callback, void *priv_data)
|
||||||
{
|
{
|
||||||
calldata_t cd = {0};
|
struct obs_websocket_request_callback cb = {request_callback, priv_data};
|
||||||
|
|
||||||
struct obs_websocket_request_callback cb = {};
|
|
||||||
cb.callback = request_callback;
|
|
||||||
cb.priv_data = priv_data;
|
|
||||||
|
|
||||||
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
calldata_set_string(&cd, "type", request_type);
|
calldata_set_string(&cd, "type", request_type);
|
||||||
calldata_set_ptr(&cd, "callback", &cb);
|
calldata_set_ptr(&cd, "callback", &cb);
|
||||||
|
|
||||||
@ -182,8 +227,7 @@ static inline bool obs_websocket_vendor_register_request(obs_websocket_vendor ve
|
|||||||
// Unregisters an existing vendor request
|
// Unregisters an existing vendor request
|
||||||
static inline bool obs_websocket_vendor_unregister_request(obs_websocket_vendor vendor, const char *request_type)
|
static inline bool obs_websocket_vendor_unregister_request(obs_websocket_vendor vendor, const char *request_type)
|
||||||
{
|
{
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
|
||||||
calldata_set_string(&cd, "type", request_type);
|
calldata_set_string(&cd, "type", request_type);
|
||||||
|
|
||||||
bool success = obs_websocket_vendor_run_simple_proc(vendor, "vendor_request_unregister", &cd);
|
bool success = obs_websocket_vendor_run_simple_proc(vendor, "vendor_request_unregister", &cd);
|
||||||
@ -196,8 +240,7 @@ static inline bool obs_websocket_vendor_unregister_request(obs_websocket_vendor
|
|||||||
// Emits an event under the vendor's name
|
// Emits an event under the vendor's name
|
||||||
static inline bool obs_websocket_vendor_emit_event(obs_websocket_vendor vendor, const char *event_name, obs_data_t *event_data)
|
static inline bool obs_websocket_vendor_emit_event(obs_websocket_vendor vendor, const char *event_name, obs_data_t *event_data)
|
||||||
{
|
{
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0, 0, 0, 0};
|
||||||
|
|
||||||
calldata_set_string(&cd, "type", event_name);
|
calldata_set_string(&cd, "type", event_name);
|
||||||
calldata_set_ptr(&cd, "data", (void *)event_data);
|
calldata_set_ptr(&cd, "data", (void *)event_data);
|
||||||
|
|
||||||
|
182
src/Config.cpp
182
src/Config.cpp
@ -17,64 +17,70 @@ You should have received a copy of the GNU General Public License along
|
|||||||
with this program. If not, see <https://www.gnu.org/licenses/>
|
with this program. If not, see <https://www.gnu.org/licenses/>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
#include <obs-frontend-api.h>
|
#include <obs-frontend-api.h>
|
||||||
|
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "utils/Crypto.h"
|
#include "utils/Crypto.h"
|
||||||
#include "utils/Platform.h"
|
#include "utils/Platform.h"
|
||||||
|
#include "utils/Obs.h"
|
||||||
|
|
||||||
#define CONFIG_SECTION_NAME "OBSWebSocket"
|
#define CONFIG_SECTION_NAME "OBSWebSocket"
|
||||||
|
#define CONFIG_PARAM_FIRSTLOAD "FirstLoad"
|
||||||
|
#define CONFIG_PARAM_ENABLED "ServerEnabled"
|
||||||
|
#define CONFIG_PARAM_PORT "ServerPort"
|
||||||
|
#define CONFIG_PARAM_ALERTS "AlertsEnabled"
|
||||||
|
#define CONFIG_PARAM_AUTHREQUIRED "AuthRequired"
|
||||||
|
#define CONFIG_PARAM_PASSWORD "ServerPassword"
|
||||||
|
|
||||||
#define PARAM_FIRSTLOAD "FirstLoad"
|
#define CONFIG_FILE_NAME "config.json"
|
||||||
#define PARAM_ENABLED "ServerEnabled"
|
#define PARAM_FIRSTLOAD "first_load"
|
||||||
#define PARAM_PORT "ServerPort"
|
#define PARAM_ENABLED "server_enabled"
|
||||||
#define PARAM_ALERTS "AlertsEnabled"
|
#define PARAM_PORT "server_port"
|
||||||
#define PARAM_AUTHREQUIRED "AuthRequired"
|
#define PARAM_ALERTS "alerts_enabled"
|
||||||
#define PARAM_PASSWORD "ServerPassword"
|
#define PARAM_AUTHREQUIRED "auth_required"
|
||||||
|
#define PARAM_PASSWORD "server_password"
|
||||||
|
|
||||||
#define CMDLINE_WEBSOCKET_PORT "websocket_port"
|
#define CMDLINE_WEBSOCKET_PORT "websocket_port"
|
||||||
#define CMDLINE_WEBSOCKET_IPV4_ONLY "websocket_ipv4_only"
|
#define CMDLINE_WEBSOCKET_IPV4_ONLY "websocket_ipv4_only"
|
||||||
#define CMDLINE_WEBSOCKET_PASSWORD "websocket_password"
|
#define CMDLINE_WEBSOCKET_PASSWORD "websocket_password"
|
||||||
#define CMDLINE_WEBSOCKET_DEBUG "websocket_debug"
|
#define CMDLINE_WEBSOCKET_DEBUG "websocket_debug"
|
||||||
|
|
||||||
Config::Config()
|
void Config::Load(json config)
|
||||||
: PortOverridden(false),
|
|
||||||
PasswordOverridden(false),
|
|
||||||
FirstLoad(true),
|
|
||||||
ServerEnabled(false),
|
|
||||||
ServerPort(4455),
|
|
||||||
Ipv4Only(false),
|
|
||||||
DebugEnabled(false),
|
|
||||||
AlertsEnabled(false),
|
|
||||||
AuthRequired(true),
|
|
||||||
ServerPassword("")
|
|
||||||
{
|
{
|
||||||
SetDefaultsToGlobalStore();
|
// Only load from plugin config directory if there hasn't been a migration
|
||||||
}
|
if (config.is_null()) {
|
||||||
|
std::string configFilePath = Utils::Obs::StringHelper::GetModuleConfigPath(CONFIG_FILE_NAME);
|
||||||
void Config::Load()
|
Utils::Json::GetJsonFileContent(configFilePath, config); // Fetch the existing config, which may not exist
|
||||||
{
|
|
||||||
config_t *obsConfig = GetConfigStore();
|
|
||||||
if (!obsConfig) {
|
|
||||||
blog(LOG_ERROR, "[Config::Load] Unable to fetch OBS config!");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FirstLoad = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_FIRSTLOAD);
|
if (!config.is_object()) {
|
||||||
ServerEnabled = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED);
|
blog(LOG_INFO, "[Config::Load] Existing configuration not found, using defaults.");
|
||||||
AlertsEnabled = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS);
|
config = json::object();
|
||||||
ServerPort = config_get_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT);
|
}
|
||||||
AuthRequired = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED);
|
|
||||||
ServerPassword = config_get_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD);
|
if (config.contains(PARAM_FIRSTLOAD) && config[PARAM_FIRSTLOAD].is_boolean())
|
||||||
|
FirstLoad = config[PARAM_FIRSTLOAD];
|
||||||
|
if (config.contains(PARAM_ENABLED) && config[PARAM_ENABLED].is_boolean())
|
||||||
|
ServerEnabled = config[PARAM_ENABLED];
|
||||||
|
if (config.contains(PARAM_ALERTS) && config[PARAM_ALERTS].is_boolean())
|
||||||
|
AlertsEnabled = config[PARAM_ALERTS];
|
||||||
|
if (config.contains(PARAM_PORT) && config[PARAM_PORT].is_number_unsigned())
|
||||||
|
ServerPort = config[PARAM_PORT];
|
||||||
|
if (config.contains(PARAM_AUTHREQUIRED) && config[PARAM_AUTHREQUIRED].is_boolean())
|
||||||
|
AuthRequired = config[PARAM_AUTHREQUIRED];
|
||||||
|
if (config.contains(PARAM_PASSWORD) && config[PARAM_PASSWORD].is_string())
|
||||||
|
ServerPassword = config[PARAM_PASSWORD];
|
||||||
|
|
||||||
// Set server password and save it to the config before processing overrides,
|
// Set server password and save it to the config before processing overrides,
|
||||||
// so that there is always a true configured password regardless of if
|
// so that there is always a true configured password regardless of if
|
||||||
// future loads use the override flag.
|
// future loads use the override flag.
|
||||||
if (FirstLoad) {
|
if (FirstLoad) {
|
||||||
FirstLoad = false;
|
FirstLoad = false;
|
||||||
if (ServerPassword.isEmpty()) {
|
if (ServerPassword.empty()) {
|
||||||
blog(LOG_INFO, "[Config::Load] (FirstLoad) Generating new server password.");
|
blog(LOG_INFO, "[Config::Load] (FirstLoad) Generating new server password.");
|
||||||
ServerPassword = QString::fromStdString(Utils::Crypto::GeneratePassword());
|
ServerPassword = Utils::Crypto::GeneratePassword();
|
||||||
} else {
|
} else {
|
||||||
blog(LOG_INFO, "[Config::Load] (FirstLoad) Not generating new password since one is already configured.");
|
blog(LOG_INFO, "[Config::Load] (FirstLoad) Not generating new password since one is already configured.");
|
||||||
}
|
}
|
||||||
@ -107,7 +113,7 @@ void Config::Load()
|
|||||||
blog(LOG_INFO, "[Config::Load] --websocket_password passed. Overriding WebSocket password.");
|
blog(LOG_INFO, "[Config::Load] --websocket_password passed. Overriding WebSocket password.");
|
||||||
PasswordOverridden = true;
|
PasswordOverridden = true;
|
||||||
AuthRequired = true;
|
AuthRequired = true;
|
||||||
ServerPassword = passwordArgument;
|
ServerPassword = passwordArgument.toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process `--websocket_debug` override
|
// Process `--websocket_debug` override
|
||||||
@ -120,43 +126,95 @@ void Config::Load()
|
|||||||
|
|
||||||
void Config::Save()
|
void Config::Save()
|
||||||
{
|
{
|
||||||
config_t *obsConfig = GetConfigStore();
|
json config;
|
||||||
if (!obsConfig) {
|
|
||||||
blog(LOG_ERROR, "[Config::Save] Unable to fetch OBS config!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_FIRSTLOAD, FirstLoad);
|
std::string configFilePath = Utils::Obs::StringHelper::GetModuleConfigPath(CONFIG_FILE_NAME);
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED, ServerEnabled);
|
Utils::Json::GetJsonFileContent(configFilePath, config); // Fetch the existing config, which may not exist
|
||||||
if (!PortOverridden) {
|
|
||||||
config_set_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT, ServerPort);
|
config[PARAM_FIRSTLOAD] = FirstLoad.load();
|
||||||
}
|
config[PARAM_ENABLED] = ServerEnabled.load();
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS, AlertsEnabled);
|
if (!PortOverridden)
|
||||||
|
config[PARAM_PORT] = ServerPort.load();
|
||||||
|
config[PARAM_ALERTS] = AlertsEnabled.load();
|
||||||
if (!PasswordOverridden) {
|
if (!PasswordOverridden) {
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED, AuthRequired);
|
config[PARAM_AUTHREQUIRED] = AuthRequired.load();
|
||||||
config_set_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD, QT_TO_UTF8(ServerPassword));
|
config[PARAM_PASSWORD] = ServerPassword;
|
||||||
}
|
}
|
||||||
|
|
||||||
config_save(obsConfig);
|
if (!Utils::Json::SetJsonFileContent(configFilePath, config))
|
||||||
|
blog(LOG_ERROR, "[Config::Save] Failed to write config file!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Config::SetDefaultsToGlobalStore()
|
// Finds any old values in global.ini and removes them, then returns the values as JSON
|
||||||
|
json MigrateGlobalConfigData()
|
||||||
{
|
{
|
||||||
config_t *obsConfig = GetConfigStore();
|
// Get existing global config
|
||||||
if (!obsConfig) {
|
config_t *config = obs_frontend_get_global_config();
|
||||||
blog(LOG_ERROR, "[Config::SetDefaultsToGlobalStore] Unable to fetch OBS config!");
|
json ret;
|
||||||
return;
|
|
||||||
|
// Move values to temporary JSON blob
|
||||||
|
if (config_has_user_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_FIRSTLOAD)) {
|
||||||
|
ret[PARAM_FIRSTLOAD] = config_get_bool(config, CONFIG_SECTION_NAME, CONFIG_PARAM_FIRSTLOAD);
|
||||||
|
config_remove_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_FIRSTLOAD);
|
||||||
|
}
|
||||||
|
if (config_has_user_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_ENABLED)) {
|
||||||
|
ret[PARAM_ENABLED] = config_get_bool(config, CONFIG_SECTION_NAME, CONFIG_PARAM_ENABLED);
|
||||||
|
config_remove_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_ENABLED);
|
||||||
|
}
|
||||||
|
if (config_has_user_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_PORT)) {
|
||||||
|
ret[PARAM_PORT] = config_get_uint(config, CONFIG_SECTION_NAME, CONFIG_PARAM_PORT);
|
||||||
|
config_remove_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_PORT);
|
||||||
|
}
|
||||||
|
if (config_has_user_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_ALERTS)) {
|
||||||
|
ret[PARAM_ALERTS] = config_get_bool(config, CONFIG_SECTION_NAME, CONFIG_PARAM_ALERTS);
|
||||||
|
config_remove_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_ALERTS);
|
||||||
|
}
|
||||||
|
if (config_has_user_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_AUTHREQUIRED)) {
|
||||||
|
ret[PARAM_AUTHREQUIRED] = config_get_bool(config, CONFIG_SECTION_NAME, CONFIG_PARAM_AUTHREQUIRED);
|
||||||
|
config_remove_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_AUTHREQUIRED);
|
||||||
|
}
|
||||||
|
if (config_has_user_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_PASSWORD)) {
|
||||||
|
ret[PARAM_PASSWORD] = config_get_string(config, CONFIG_SECTION_NAME, CONFIG_PARAM_PASSWORD);
|
||||||
|
config_remove_value(config, CONFIG_SECTION_NAME, CONFIG_PARAM_PASSWORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_FIRSTLOAD, FirstLoad);
|
if (!ret.is_null()) {
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED, ServerEnabled);
|
blog(LOG_INFO, "[MigrateGlobalConfigData] Some configurations have been migrated from old config");
|
||||||
config_set_default_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT, ServerPort);
|
config_save(config);
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS, AlertsEnabled);
|
}
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED, AuthRequired);
|
|
||||||
config_set_default_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD, QT_TO_UTF8(ServerPassword));
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
config_t *Config::GetConfigStore()
|
// Migration from storing persistent data in obsWebSocketPersistentData.json to the module config directory
|
||||||
|
// This will overwrite any persistent data in the destination. People doing manual OBS config modification be warned!
|
||||||
|
bool MigratePersistentData()
|
||||||
{
|
{
|
||||||
return obs_frontend_get_global_config();
|
std::error_code ec;
|
||||||
|
|
||||||
|
// Ensure module config directory exists
|
||||||
|
std::string moduleConfigDirectory = Utils::Obs::StringHelper::GetModuleConfigPath("");
|
||||||
|
if (!std::filesystem::exists(moduleConfigDirectory, ec))
|
||||||
|
std::filesystem::create_directories(moduleConfigDirectory, ec);
|
||||||
|
if (ec) {
|
||||||
|
blog(LOG_ERROR, "[MigratePersistentData] Failed to create directory `%s`: %s", moduleConfigDirectory.c_str(),
|
||||||
|
ec.message().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move any existing persistent data to module config directory, then delete old file
|
||||||
|
std::string oldPersistentDataPath =
|
||||||
|
Utils::Obs::StringHelper::GetCurrentProfilePath() + "/../../../obsWebSocketPersistentData.json";
|
||||||
|
if (std::filesystem::exists(oldPersistentDataPath, ec)) {
|
||||||
|
std::string persistentDataPath = Utils::Obs::StringHelper::GetModuleConfigPath("persistent_data.json");
|
||||||
|
std::filesystem::copy_file(oldPersistentDataPath, persistentDataPath, ec);
|
||||||
|
std::filesystem::remove(oldPersistentDataPath, ec);
|
||||||
|
blog(LOG_INFO, "[MigratePersistentData] Persistent data migrated to new path");
|
||||||
|
}
|
||||||
|
if (ec) {
|
||||||
|
blog(LOG_ERROR, "[MigratePersistentData] Failed to move persistent data: %s", ec.message().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
29
src/Config.h
29
src/Config.h
@ -23,24 +23,25 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <util/config-file.h>
|
#include <util/config-file.h>
|
||||||
|
|
||||||
|
#include "utils/Json.h"
|
||||||
#include "plugin-macros.generated.h"
|
#include "plugin-macros.generated.h"
|
||||||
|
|
||||||
struct Config {
|
struct Config {
|
||||||
Config();
|
void Load(json config = nullptr);
|
||||||
void Load();
|
|
||||||
void Save();
|
void Save();
|
||||||
void SetDefaultsToGlobalStore();
|
|
||||||
config_t *GetConfigStore();
|
|
||||||
|
|
||||||
std::atomic<bool> PortOverridden;
|
std::atomic<bool> PortOverridden = false;
|
||||||
std::atomic<bool> PasswordOverridden;
|
std::atomic<bool> PasswordOverridden = false;
|
||||||
|
|
||||||
std::atomic<bool> FirstLoad;
|
std::atomic<bool> FirstLoad = true;
|
||||||
std::atomic<bool> ServerEnabled;
|
std::atomic<bool> ServerEnabled = false;
|
||||||
std::atomic<uint16_t> ServerPort;
|
std::atomic<uint16_t> ServerPort = 4455;
|
||||||
std::atomic<bool> Ipv4Only;
|
std::atomic<bool> Ipv4Only = false;
|
||||||
std::atomic<bool> DebugEnabled;
|
std::atomic<bool> DebugEnabled = false;
|
||||||
std::atomic<bool> AlertsEnabled;
|
std::atomic<bool> AlertsEnabled = false;
|
||||||
std::atomic<bool> AuthRequired;
|
std::atomic<bool> AuthRequired = true;
|
||||||
QString ServerPassword;
|
std::string ServerPassword;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
json MigrateGlobalConfigData();
|
||||||
|
bool MigratePersistentData();
|
||||||
|
@ -1,6 +1,23 @@
|
|||||||
|
/*
|
||||||
|
obs-websocket
|
||||||
|
Copyright (C) 2020-2023 Kyle Manning <tt2468@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program. If not, see <https://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
#include "WebSocketApi.h"
|
#include "WebSocketApi.h"
|
||||||
#include "requesthandler/RequestHandler.h"
|
#include "requesthandler/RequestHandler.h"
|
||||||
#include "obs-websocket.h"
|
|
||||||
#include "utils/Json.h"
|
#include "utils/Json.h"
|
||||||
|
|
||||||
#define RETURN_STATUS(status) \
|
#define RETURN_STATUS(status) \
|
||||||
@ -30,14 +47,19 @@ WebSocketApi::WebSocketApi()
|
|||||||
|
|
||||||
proc_handler_add(_procHandler, "bool get_api_version(out int version)", &get_api_version, nullptr);
|
proc_handler_add(_procHandler, "bool get_api_version(out int version)", &get_api_version, nullptr);
|
||||||
proc_handler_add(_procHandler, "bool call_request(in string request_type, in string request_data, out ptr response)",
|
proc_handler_add(_procHandler, "bool call_request(in string request_type, in string request_data, out ptr response)",
|
||||||
&call_request, nullptr);
|
&call_request, this);
|
||||||
proc_handler_add(_procHandler, "bool vendor_register(in string name, out ptr vendor)", &vendor_register_cb, this);
|
proc_handler_add(_procHandler, "bool register_event_callback(in ptr callback, out bool success)", ®ister_event_callback,
|
||||||
proc_handler_add(_procHandler, "bool vendor_request_register(in ptr vendor, in string type, in ptr callback)",
|
|
||||||
&vendor_request_register_cb, this);
|
|
||||||
proc_handler_add(_procHandler, "bool vendor_request_unregister(in ptr vendor, in string type)",
|
|
||||||
&vendor_request_unregister_cb, this);
|
|
||||||
proc_handler_add(_procHandler, "bool vendor_event_emit(in ptr vendor, in string type, in ptr data)", &vendor_event_emit_cb,
|
|
||||||
this);
|
this);
|
||||||
|
proc_handler_add(_procHandler, "bool unregister_event_callback(in ptr callback, out bool success)",
|
||||||
|
&unregister_event_callback, this);
|
||||||
|
proc_handler_add(_procHandler, "bool vendor_register(in string name, out ptr vendor)", &vendor_register_cb, this);
|
||||||
|
proc_handler_add(_procHandler,
|
||||||
|
"bool vendor_request_register(in ptr vendor, in string type, in ptr callback, out bool success)",
|
||||||
|
&vendor_request_register_cb, this);
|
||||||
|
proc_handler_add(_procHandler, "bool vendor_request_unregister(in ptr vendor, in string type, out bool success)",
|
||||||
|
&vendor_request_unregister_cb, this);
|
||||||
|
proc_handler_add(_procHandler, "bool vendor_event_emit(in ptr vendor, in string type, in ptr data, out bool success)",
|
||||||
|
&vendor_event_emit_cb, this);
|
||||||
|
|
||||||
proc_handler_t *ph = obs_get_proc_handler();
|
proc_handler_t *ph = obs_get_proc_handler();
|
||||||
assert(ph != NULL);
|
assert(ph != NULL);
|
||||||
@ -53,6 +75,10 @@ WebSocketApi::~WebSocketApi()
|
|||||||
|
|
||||||
proc_handler_destroy(_procHandler);
|
proc_handler_destroy(_procHandler);
|
||||||
|
|
||||||
|
size_t numEventCallbacks = _eventCallbacks.size();
|
||||||
|
_eventCallbacks.clear();
|
||||||
|
blog_debug("[WebSocketApi::~WebSocketApi] Deleted %ld event callbacks", numEventCallbacks);
|
||||||
|
|
||||||
for (auto vendor : _vendors) {
|
for (auto vendor : _vendors) {
|
||||||
blog_debug("[WebSocketApi::~WebSocketApi] Deleting vendor: %s", vendor.first.c_str());
|
blog_debug("[WebSocketApi::~WebSocketApi] Deleting vendor: %s", vendor.first.c_str());
|
||||||
delete vendor.second;
|
delete vendor.second;
|
||||||
@ -61,9 +87,21 @@ WebSocketApi::~WebSocketApi()
|
|||||||
blog_debug("[WebSocketApi::~WebSocketApi] Finished.");
|
blog_debug("[WebSocketApi::~WebSocketApi] Finished.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketApi::SetEventCallback(EventCallback cb)
|
void WebSocketApi::BroadcastEvent(uint64_t requiredIntent, const std::string &eventType, const json &eventData, uint8_t rpcVersion)
|
||||||
{
|
{
|
||||||
_eventCallback = cb;
|
if (!_obsReady)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Only broadcast events applicable to the latest RPC version
|
||||||
|
if (rpcVersion && rpcVersion != CURRENT_RPC_VERSION)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string eventDataString = eventData.dump();
|
||||||
|
|
||||||
|
std::shared_lock l(_mutex);
|
||||||
|
|
||||||
|
for (auto &cb : _eventCallbacks)
|
||||||
|
cb.callback(requiredIntent, eventType.c_str(), eventDataString.c_str(), cb.priv_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum WebSocketApi::RequestReturnCode WebSocketApi::PerformVendorRequest(std::string vendorName, std::string requestType,
|
enum WebSocketApi::RequestReturnCode WebSocketApi::PerformVendorRequest(std::string vendorName, std::string requestType,
|
||||||
@ -108,14 +146,27 @@ void WebSocketApi::get_api_version(void *, calldata_t *cd)
|
|||||||
RETURN_SUCCESS();
|
RETURN_SUCCESS();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebSocketApi::call_request(void *, calldata_t *cd)
|
void WebSocketApi::call_request(void *priv_data, calldata_t *cd)
|
||||||
{
|
{
|
||||||
|
auto c = static_cast<WebSocketApi *>(priv_data);
|
||||||
|
|
||||||
|
#if !defined(PLUGIN_TESTS)
|
||||||
|
if (!c->_obsReady)
|
||||||
|
RETURN_FAILURE();
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *request_type = calldata_string(cd, "request_type");
|
const char *request_type = calldata_string(cd, "request_type");
|
||||||
const char *request_data = calldata_string(cd, "request_data");
|
const char *request_data = calldata_string(cd, "request_data");
|
||||||
|
|
||||||
if (!request_type)
|
if (!request_type)
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
|
|
||||||
|
#ifdef PLUGIN_TESTS
|
||||||
|
// Allow plugin tests to complete, even though OBS wouldn't be ready at the time of the test
|
||||||
|
if (!c->_obsReady && std::string(request_type) != "GetVersion")
|
||||||
|
RETURN_FAILURE();
|
||||||
|
#endif
|
||||||
|
|
||||||
auto response = static_cast<obs_websocket_request_response *>(bzalloc(sizeof(struct obs_websocket_request_response)));
|
auto response = static_cast<obs_websocket_request_response *>(bzalloc(sizeof(struct obs_websocket_request_response)));
|
||||||
if (!response)
|
if (!response)
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
@ -144,6 +195,52 @@ void WebSocketApi::call_request(void *, calldata_t *cd)
|
|||||||
RETURN_SUCCESS();
|
RETURN_SUCCESS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebSocketApi::register_event_callback(void *priv_data, calldata_t *cd)
|
||||||
|
{
|
||||||
|
auto c = static_cast<WebSocketApi *>(priv_data);
|
||||||
|
|
||||||
|
void *voidCallback;
|
||||||
|
if (!calldata_get_ptr(cd, "callback", &voidCallback) || !voidCallback) {
|
||||||
|
blog(LOG_WARNING, "[WebSocketApi::register_event_callback] Failed due to missing `callback` pointer.");
|
||||||
|
RETURN_FAILURE();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cb = static_cast<obs_websocket_event_callback *>(voidCallback);
|
||||||
|
|
||||||
|
std::unique_lock l(c->_mutex);
|
||||||
|
|
||||||
|
int64_t foundIndex = c->GetEventCallbackIndex(*cb);
|
||||||
|
if (foundIndex != -1)
|
||||||
|
RETURN_FAILURE();
|
||||||
|
|
||||||
|
c->_eventCallbacks.push_back(*cb);
|
||||||
|
|
||||||
|
RETURN_SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebSocketApi::unregister_event_callback(void *priv_data, calldata_t *cd)
|
||||||
|
{
|
||||||
|
auto c = static_cast<WebSocketApi *>(priv_data);
|
||||||
|
|
||||||
|
void *voidCallback;
|
||||||
|
if (!calldata_get_ptr(cd, "callback", &voidCallback) || !voidCallback) {
|
||||||
|
blog(LOG_WARNING, "[WebSocketApi::register_event_callback] Failed due to missing `callback` pointer.");
|
||||||
|
RETURN_FAILURE();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cb = static_cast<obs_websocket_event_callback *>(voidCallback);
|
||||||
|
|
||||||
|
std::unique_lock l(c->_mutex);
|
||||||
|
|
||||||
|
int64_t foundIndex = c->GetEventCallbackIndex(*cb);
|
||||||
|
if (foundIndex == -1)
|
||||||
|
RETURN_FAILURE();
|
||||||
|
|
||||||
|
c->_eventCallbacks.erase(c->_eventCallbacks.begin() + foundIndex);
|
||||||
|
|
||||||
|
RETURN_SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
void WebSocketApi::vendor_register_cb(void *priv_data, calldata_t *cd)
|
void WebSocketApi::vendor_register_cb(void *priv_data, calldata_t *cd)
|
||||||
{
|
{
|
||||||
auto c = static_cast<WebSocketApi *>(priv_data);
|
auto c = static_cast<WebSocketApi *>(priv_data);
|
||||||
@ -154,7 +251,7 @@ void WebSocketApi::vendor_register_cb(void *priv_data, calldata_t *cd)
|
|||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Theoretically doesn't need a mutex, but it's good to be safe.
|
// Theoretically doesn't need a mutex due to module load being single-thread, but it's good to be safe.
|
||||||
std::unique_lock l(c->_mutex);
|
std::unique_lock l(c->_mutex);
|
||||||
|
|
||||||
if (c->_vendors.count(vendorName)) {
|
if (c->_vendors.count(vendorName)) {
|
||||||
@ -271,10 +368,10 @@ void WebSocketApi::vendor_event_emit_cb(void *priv_data, calldata_t *cd)
|
|||||||
|
|
||||||
auto eventData = static_cast<obs_data_t *>(voidEventData);
|
auto eventData = static_cast<obs_data_t *>(voidEventData);
|
||||||
|
|
||||||
if (!c->_eventCallback)
|
if (!c->_vendorEventCallback)
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
|
|
||||||
c->_eventCallback(v->_name, eventType, eventData);
|
c->_vendorEventCallback(v->_name, eventType, eventData);
|
||||||
|
|
||||||
RETURN_SUCCESS();
|
RETURN_SUCCESS();
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
/*
|
||||||
|
obs-websocket
|
||||||
|
Copyright (C) 2020-2023 Kyle Manning <tt2468@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program. If not, see <https://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
@ -5,9 +23,12 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <shared_mutex>
|
#include <shared_mutex>
|
||||||
|
#include <atomic>
|
||||||
#include <obs.h>
|
#include <obs.h>
|
||||||
|
#include <obs-websocket-api.h>
|
||||||
|
|
||||||
#include "../lib/obs-websocket-api.h"
|
#include "utils/Json.h"
|
||||||
|
#include "plugin-macros.generated.h"
|
||||||
|
|
||||||
class WebSocketApi {
|
class WebSocketApi {
|
||||||
public:
|
public:
|
||||||
@ -17,8 +38,6 @@ public:
|
|||||||
NoVendorRequest,
|
NoVendorRequest,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::function<void(std::string, std::string, obs_data_t *)> EventCallback;
|
|
||||||
|
|
||||||
struct Vendor {
|
struct Vendor {
|
||||||
std::shared_mutex _mutex;
|
std::shared_mutex _mutex;
|
||||||
std::string _name;
|
std::string _name;
|
||||||
@ -27,23 +46,44 @@ public:
|
|||||||
|
|
||||||
WebSocketApi();
|
WebSocketApi();
|
||||||
~WebSocketApi();
|
~WebSocketApi();
|
||||||
|
void BroadcastEvent(uint64_t requiredIntent, const std::string &eventType, const json &eventData = nullptr,
|
||||||
void SetEventCallback(EventCallback cb);
|
uint8_t rpcVersion = 0);
|
||||||
|
void SetObsReady(bool ready) { _obsReady = ready; }
|
||||||
enum RequestReturnCode PerformVendorRequest(std::string vendorName, std::string requestName, obs_data_t *requestData,
|
enum RequestReturnCode PerformVendorRequest(std::string vendorName, std::string requestName, obs_data_t *requestData,
|
||||||
obs_data_t *responseData);
|
obs_data_t *responseData);
|
||||||
|
|
||||||
|
// Callback for when a vendor emits an event
|
||||||
|
typedef std::function<void(std::string, std::string, obs_data_t *)> VendorEventCallback;
|
||||||
|
inline void SetVendorEventCallback(VendorEventCallback cb) { _vendorEventCallback = cb; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline int64_t GetEventCallbackIndex(obs_websocket_event_callback &cb)
|
||||||
|
{
|
||||||
|
for (int64_t i = 0; i < (int64_t)_eventCallbacks.size(); i++) {
|
||||||
|
auto currentCb = _eventCallbacks[i];
|
||||||
|
if (currentCb.callback == cb.callback && currentCb.priv_data == cb.priv_data)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Proc handlers
|
||||||
static void get_ph_cb(void *priv_data, calldata_t *cd);
|
static void get_ph_cb(void *priv_data, calldata_t *cd);
|
||||||
static void get_api_version(void *, calldata_t *cd);
|
static void get_api_version(void *, calldata_t *cd);
|
||||||
static void call_request(void *, calldata_t *cd);
|
static void call_request(void *, calldata_t *cd);
|
||||||
|
static void register_event_callback(void *, calldata_t *cd);
|
||||||
|
static void unregister_event_callback(void *, calldata_t *cd);
|
||||||
static void vendor_register_cb(void *priv_data, calldata_t *cd);
|
static void vendor_register_cb(void *priv_data, calldata_t *cd);
|
||||||
static void vendor_request_register_cb(void *priv_data, calldata_t *cd);
|
static void vendor_request_register_cb(void *priv_data, calldata_t *cd);
|
||||||
static void vendor_request_unregister_cb(void *priv_data, calldata_t *cd);
|
static void vendor_request_unregister_cb(void *priv_data, calldata_t *cd);
|
||||||
static void vendor_event_emit_cb(void *priv_data, calldata_t *cd);
|
static void vendor_event_emit_cb(void *priv_data, calldata_t *cd);
|
||||||
|
|
||||||
private:
|
|
||||||
std::shared_mutex _mutex;
|
std::shared_mutex _mutex;
|
||||||
EventCallback _eventCallback;
|
|
||||||
proc_handler_t *_procHandler;
|
proc_handler_t *_procHandler;
|
||||||
std::map<std::string, Vendor *> _vendors;
|
std::map<std::string, Vendor *> _vendors;
|
||||||
|
std::vector<obs_websocket_event_callback> _eventCallbacks;
|
||||||
|
|
||||||
|
std::atomic<bool> _obsReady = false;
|
||||||
|
|
||||||
|
VendorEventCallback _vendorEventCallback;
|
||||||
};
|
};
|
||||||
|
@ -20,11 +20,6 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
|
|
||||||
EventHandler::EventHandler()
|
EventHandler::EventHandler()
|
||||||
: _obsLoaded(false),
|
|
||||||
_inputVolumeMetersRef(0),
|
|
||||||
_inputActiveStateChangedRef(0),
|
|
||||||
_inputShowStateChangedRef(0),
|
|
||||||
_sceneItemTransformChangedRef(0)
|
|
||||||
{
|
{
|
||||||
blog_debug("[EventHandler::EventHandler] Setting up...");
|
blog_debug("[EventHandler::EventHandler] Setting up...");
|
||||||
|
|
||||||
@ -32,10 +27,11 @@ EventHandler::EventHandler()
|
|||||||
|
|
||||||
signal_handler_t *coreSignalHandler = obs_get_signal_handler();
|
signal_handler_t *coreSignalHandler = obs_get_signal_handler();
|
||||||
if (coreSignalHandler) {
|
if (coreSignalHandler) {
|
||||||
signal_handler_connect(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
|
coreSignals.emplace_back(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
|
||||||
signal_handler_connect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
coreSignals.emplace_back(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
||||||
signal_handler_connect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
coreSignals.emplace_back(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
||||||
signal_handler_connect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
coreSignals.emplace_back(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
||||||
|
coreSignals.emplace_back(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!");
|
||||||
}
|
}
|
||||||
@ -49,71 +45,66 @@ EventHandler::~EventHandler()
|
|||||||
|
|
||||||
obs_frontend_remove_event_callback(OnFrontendEvent, this);
|
obs_frontend_remove_event_callback(OnFrontendEvent, this);
|
||||||
|
|
||||||
signal_handler_t *coreSignalHandler = obs_get_signal_handler();
|
coreSignals.clear();
|
||||||
if (coreSignalHandler) {
|
|
||||||
signal_handler_disconnect(coreSignalHandler, "source_create", SourceCreatedMultiHandler, this);
|
// Revoke callbacks of all inputs and scenes, in case some still have our callbacks attached
|
||||||
signal_handler_disconnect(coreSignalHandler, "source_destroy", SourceDestroyedMultiHandler, this);
|
auto enumInputs = [](void *param, obs_source_t *source) {
|
||||||
signal_handler_disconnect(coreSignalHandler, "source_remove", SourceRemovedMultiHandler, this);
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
signal_handler_disconnect(coreSignalHandler, "source_rename", SourceRenamedMultiHandler, this);
|
eventHandler->DisconnectSourceSignals(source);
|
||||||
} else {
|
return true;
|
||||||
blog(LOG_ERROR, "[EventHandler::~EventHandler] Unable to get libobs signal handler!");
|
};
|
||||||
}
|
obs_enum_sources(enumInputs, this);
|
||||||
|
auto enumScenes = [](void *param, obs_source_t *source) {
|
||||||
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
eventHandler->DisconnectSourceSignals(source);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
obs_enum_scenes(enumScenes, this);
|
||||||
|
|
||||||
blog_debug("[EventHandler::~EventHandler] Finished.");
|
blog_debug("[EventHandler::~EventHandler] Finished.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventHandler::SetBroadcastCallback(EventHandler::BroadcastCallback cb)
|
// Function to increment or decrement refcounts for high volume event subscriptions
|
||||||
|
void EventHandler::ProcessSubscriptionChange(bool type, uint64_t eventSubscriptions)
|
||||||
{
|
{
|
||||||
_broadcastCallback = cb;
|
if (type) {
|
||||||
}
|
if ((eventSubscriptions & EventSubscription::InputVolumeMeters) != 0) {
|
||||||
|
if (_inputVolumeMetersRef.fetch_add(1) == 0) {
|
||||||
void EventHandler::SetObsLoadedCallback(EventHandler::ObsLoadedCallback cb)
|
if (_inputVolumeMetersHandler)
|
||||||
{
|
blog(LOG_WARNING,
|
||||||
_obsLoadedCallback = cb;
|
"[EventHandler::ProcessSubscription] Input volume meter handler already exists!");
|
||||||
}
|
else
|
||||||
|
_inputVolumeMetersHandler = std::make_unique<Utils::Obs::VolumeMeter::Handler>(
|
||||||
// Function to increment refcounts for high volume event subscriptions
|
std::bind(&EventHandler::HandleInputVolumeMeters, this, std::placeholders::_1));
|
||||||
void EventHandler::ProcessSubscription(uint64_t eventSubscriptions)
|
}
|
||||||
{
|
|
||||||
if ((eventSubscriptions & EventSubscription::InputVolumeMeters) != 0) {
|
|
||||||
if (_inputVolumeMetersRef.fetch_add(1) == 0) {
|
|
||||||
if (_inputVolumeMetersHandler)
|
|
||||||
blog(LOG_WARNING, "[EventHandler::ProcessSubscription] Input volume meter handler already exists!");
|
|
||||||
else
|
|
||||||
_inputVolumeMetersHandler = std::make_unique<Utils::Obs::VolumeMeter::Handler>(
|
|
||||||
std::bind(&EventHandler::HandleInputVolumeMeters, this, std::placeholders::_1));
|
|
||||||
}
|
}
|
||||||
|
if ((eventSubscriptions & EventSubscription::InputActiveStateChanged) != 0)
|
||||||
|
_inputActiveStateChangedRef++;
|
||||||
|
if ((eventSubscriptions & EventSubscription::InputShowStateChanged) != 0)
|
||||||
|
_inputShowStateChangedRef++;
|
||||||
|
if ((eventSubscriptions & EventSubscription::SceneItemTransformChanged) != 0)
|
||||||
|
_sceneItemTransformChangedRef++;
|
||||||
|
} else {
|
||||||
|
if ((eventSubscriptions & EventSubscription::InputVolumeMeters) != 0) {
|
||||||
|
if (_inputVolumeMetersRef.fetch_sub(1) == 1)
|
||||||
|
_inputVolumeMetersHandler.reset();
|
||||||
|
}
|
||||||
|
if ((eventSubscriptions & EventSubscription::InputActiveStateChanged) != 0)
|
||||||
|
_inputActiveStateChangedRef--;
|
||||||
|
if ((eventSubscriptions & EventSubscription::InputShowStateChanged) != 0)
|
||||||
|
_inputShowStateChangedRef--;
|
||||||
|
if ((eventSubscriptions & EventSubscription::SceneItemTransformChanged) != 0)
|
||||||
|
_sceneItemTransformChangedRef--;
|
||||||
}
|
}
|
||||||
if ((eventSubscriptions & EventSubscription::InputActiveStateChanged) != 0)
|
|
||||||
_inputActiveStateChangedRef++;
|
|
||||||
if ((eventSubscriptions & EventSubscription::InputShowStateChanged) != 0)
|
|
||||||
_inputShowStateChangedRef++;
|
|
||||||
if ((eventSubscriptions & EventSubscription::SceneItemTransformChanged) != 0)
|
|
||||||
_sceneItemTransformChangedRef++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function to decrement refcounts for high volume event subscriptions
|
|
||||||
void EventHandler::ProcessUnsubscription(uint64_t eventSubscriptions)
|
|
||||||
{
|
|
||||||
if ((eventSubscriptions & EventSubscription::InputVolumeMeters) != 0) {
|
|
||||||
if (_inputVolumeMetersRef.fetch_sub(1) == 1)
|
|
||||||
_inputVolumeMetersHandler.reset();
|
|
||||||
}
|
|
||||||
if ((eventSubscriptions & EventSubscription::InputActiveStateChanged) != 0)
|
|
||||||
_inputActiveStateChangedRef--;
|
|
||||||
if ((eventSubscriptions & EventSubscription::InputShowStateChanged) != 0)
|
|
||||||
_inputShowStateChangedRef--;
|
|
||||||
if ((eventSubscriptions & EventSubscription::SceneItemTransformChanged) != 0)
|
|
||||||
_sceneItemTransformChangedRef--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function required in order to use default arguments
|
// Function required in order to use default arguments
|
||||||
void EventHandler::BroadcastEvent(uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion)
|
void EventHandler::BroadcastEvent(uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion)
|
||||||
{
|
{
|
||||||
if (!_broadcastCallback)
|
if (!_eventCallback)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_broadcastCallback(requiredIntent, eventType, eventData, rpcVersion);
|
_eventCallback(requiredIntent, eventType, eventData, rpcVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect source signals for Inputs, Scenes, and Transitions. Filters are automatically connected.
|
// Connect source signals for Inputs, Scenes, and Transitions. Filters are automatically connected.
|
||||||
@ -261,15 +252,12 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
{
|
{
|
||||||
auto eventHandler = static_cast<EventHandler *>(private_data);
|
auto eventHandler = static_cast<EventHandler *>(private_data);
|
||||||
|
|
||||||
if (!eventHandler->_obsLoaded.load() && event != OBS_FRONTEND_EVENT_FINISHED_LOADING)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
// General
|
// General
|
||||||
case OBS_FRONTEND_EVENT_FINISHED_LOADING:
|
case OBS_FRONTEND_EVENT_FINISHED_LOADING:
|
||||||
eventHandler->FrontendFinishedLoadingMultiHandler();
|
eventHandler->FrontendFinishedLoadingMultiHandler();
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_EXIT:
|
case OBS_FRONTEND_EVENT_SCRIPTING_SHUTDOWN:
|
||||||
eventHandler->FrontendExitMultiHandler();
|
eventHandler->FrontendExitMultiHandler();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -283,7 +271,11 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
}
|
}
|
||||||
obs_frontend_source_list_free(&transitions);
|
obs_frontend_source_list_free(&transitions);
|
||||||
}
|
}
|
||||||
|
// Before ready update to allow event to broadcast
|
||||||
eventHandler->HandleCurrentSceneCollectionChanging();
|
eventHandler->HandleCurrentSceneCollectionChanging();
|
||||||
|
eventHandler->_obsReady = false;
|
||||||
|
if (eventHandler->_obsReadyCallback)
|
||||||
|
eventHandler->_obsReadyCallback(false);
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: {
|
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: {
|
||||||
obs_frontend_source_list transitions = {};
|
obs_frontend_source_list transitions = {};
|
||||||
@ -294,6 +286,9 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
}
|
}
|
||||||
obs_frontend_source_list_free(&transitions);
|
obs_frontend_source_list_free(&transitions);
|
||||||
}
|
}
|
||||||
|
eventHandler->_obsReady = true;
|
||||||
|
if (eventHandler->_obsReadyCallback)
|
||||||
|
eventHandler->_obsReadyCallback(true);
|
||||||
eventHandler->HandleCurrentSceneCollectionChanged();
|
eventHandler->HandleCurrentSceneCollectionChanged();
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED:
|
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_LIST_CHANGED:
|
||||||
@ -374,12 +369,21 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_RECORDING_STARTED:
|
case OBS_FRONTEND_EVENT_RECORDING_STARTED:
|
||||||
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STARTED);
|
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STARTED);
|
||||||
|
{
|
||||||
|
OBSOutputAutoRelease recordOutput = obs_frontend_get_recording_output();
|
||||||
|
if (recordOutput) {
|
||||||
|
signal_handler_t *sh = obs_output_get_signal_handler(recordOutput);
|
||||||
|
eventHandler->recordFileChangedSignal.Connect(sh, "file_changed", HandleRecordFileChanged,
|
||||||
|
private_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_RECORDING_STOPPING:
|
case OBS_FRONTEND_EVENT_RECORDING_STOPPING:
|
||||||
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPING);
|
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPING);
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_RECORDING_STOPPED:
|
case OBS_FRONTEND_EVENT_RECORDING_STOPPED:
|
||||||
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPED);
|
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPED);
|
||||||
|
eventHandler->recordFileChangedSignal.Disconnect();
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_RECORDING_PAUSED:
|
case OBS_FRONTEND_EVENT_RECORDING_PAUSED:
|
||||||
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_PAUSED);
|
eventHandler->HandleRecordStateChanged(OBS_WEBSOCKET_OUTPUT_PAUSED);
|
||||||
@ -430,30 +434,6 @@ void EventHandler::FrontendFinishedLoadingMultiHandler()
|
|||||||
blog_debug(
|
blog_debug(
|
||||||
"[EventHandler::FrontendFinishedLoadingMultiHandler] OBS has finished loading. Connecting final handlers and enabling events...");
|
"[EventHandler::FrontendFinishedLoadingMultiHandler] OBS has finished loading. Connecting final handlers and enabling events...");
|
||||||
|
|
||||||
// Connect source signals and enable events only after OBS has fully loaded (to reduce extra logging).
|
|
||||||
_obsLoaded.store(true);
|
|
||||||
|
|
||||||
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::EventHandler()`
|
|
||||||
// Enumerate inputs and connect each one
|
|
||||||
{
|
|
||||||
auto enumInputs = [](void *param, obs_source_t *source) {
|
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
|
||||||
eventHandler->ConnectSourceSignals(source);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
obs_enum_sources(enumInputs, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enumerate scenes and connect each one
|
|
||||||
{
|
|
||||||
auto enumScenes = [](void *param, obs_source_t *source) {
|
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
|
||||||
eventHandler->ConnectSourceSignals(source);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
obs_enum_scenes(enumScenes, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enumerate all scene transitions and connect each one
|
// Enumerate all scene transitions and connect each one
|
||||||
{
|
{
|
||||||
obs_frontend_source_list transitions = {};
|
obs_frontend_source_list transitions = {};
|
||||||
@ -465,41 +445,23 @@ void EventHandler::FrontendFinishedLoadingMultiHandler()
|
|||||||
obs_frontend_source_list_free(&transitions);
|
obs_frontend_source_list_free(&transitions);
|
||||||
}
|
}
|
||||||
|
|
||||||
blog_debug("[EventHandler::FrontendFinishedLoadingMultiHandler] Finished.");
|
_obsReady = true;
|
||||||
|
if (_obsReadyCallback)
|
||||||
|
_obsReadyCallback(true);
|
||||||
|
|
||||||
if (_obsLoadedCallback)
|
blog_debug("[EventHandler::FrontendFinishedLoadingMultiHandler] Finished.");
|
||||||
_obsLoadedCallback();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventHandler::FrontendExitMultiHandler()
|
void EventHandler::FrontendExitMultiHandler()
|
||||||
{
|
{
|
||||||
HandleExitStarted();
|
|
||||||
|
|
||||||
blog_debug("[EventHandler::FrontendExitMultiHandler] OBS is unloading. Disabling events...");
|
blog_debug("[EventHandler::FrontendExitMultiHandler] OBS is unloading. Disabling events...");
|
||||||
|
|
||||||
|
HandleExitStarted();
|
||||||
|
|
||||||
// Disconnect source signals and disable events when OBS starts unloading (to reduce extra logging).
|
// Disconnect source signals and disable events when OBS starts unloading (to reduce extra logging).
|
||||||
_obsLoaded.store(false);
|
_obsReady = false;
|
||||||
|
if (_obsReadyCallback)
|
||||||
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::~EventHandler()`
|
_obsReadyCallback(false);
|
||||||
// Enumerate inputs and disconnect each one
|
|
||||||
{
|
|
||||||
auto enumInputs = [](void *param, obs_source_t *source) {
|
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
|
||||||
eventHandler->DisconnectSourceSignals(source);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
obs_enum_sources(enumInputs, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enumerate scenes and disconnect each one
|
|
||||||
{
|
|
||||||
auto enumScenes = [](void *param, obs_source_t *source) {
|
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
|
||||||
eventHandler->DisconnectSourceSignals(source);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
obs_enum_scenes(enumScenes, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enumerate all scene transitions and disconnect each one
|
// Enumerate all scene transitions and disconnect each one
|
||||||
{
|
{
|
||||||
@ -520,10 +482,6 @@ void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data)
|
|||||||
{
|
{
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
|
||||||
// Don't react to signals until OBS has finished loading
|
|
||||||
if (!eventHandler->_obsLoaded.load())
|
|
||||||
return;
|
|
||||||
|
|
||||||
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
||||||
if (!source)
|
if (!source)
|
||||||
return;
|
return;
|
||||||
@ -556,10 +514,6 @@ void EventHandler::SourceDestroyedMultiHandler(void *param, calldata_t *data)
|
|||||||
// Disconnect all signals from the source
|
// Disconnect all signals from the source
|
||||||
eventHandler->DisconnectSourceSignals(source);
|
eventHandler->DisconnectSourceSignals(source);
|
||||||
|
|
||||||
// Don't react to signals if OBS is unloading
|
|
||||||
if (!eventHandler->_obsLoaded.load())
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (obs_source_get_type(source)) {
|
switch (obs_source_get_type(source)) {
|
||||||
case OBS_SOURCE_TYPE_INPUT:
|
case OBS_SOURCE_TYPE_INPUT:
|
||||||
// Only emit removed if the input has not already been removed. This is the case when removing the last scene item of an input.
|
// Only emit removed if the input has not already been removed. This is the case when removing the last scene item of an input.
|
||||||
@ -582,9 +536,6 @@ void EventHandler::SourceRemovedMultiHandler(void *param, calldata_t *data)
|
|||||||
{
|
{
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
|
||||||
if (!eventHandler->_obsLoaded.load())
|
|
||||||
return;
|
|
||||||
|
|
||||||
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
||||||
if (!source)
|
if (!source)
|
||||||
return;
|
return;
|
||||||
@ -605,9 +556,6 @@ void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data)
|
|||||||
{
|
{
|
||||||
auto eventHandler = static_cast<EventHandler *>(param);
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
|
||||||
if (!eventHandler->_obsLoaded.load())
|
|
||||||
return;
|
|
||||||
|
|
||||||
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
obs_source_t *source = GetCalldataPointer<obs_source_t>(data, "source");
|
||||||
if (!source)
|
if (!source)
|
||||||
return;
|
return;
|
||||||
@ -631,6 +579,26 @@ 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;
|
||||||
|
case OBS_SOURCE_TYPE_FILTER:
|
||||||
|
eventHandler->HandleSourceFilterSettingsChanged(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);
|
||||||
|
@ -34,25 +34,31 @@ public:
|
|||||||
EventHandler();
|
EventHandler();
|
||||||
~EventHandler();
|
~EventHandler();
|
||||||
|
|
||||||
typedef std::function<void(uint64_t, std::string, json, uint8_t)> BroadcastCallback;
|
void ProcessSubscriptionChange(bool type, uint64_t eventSubscriptions);
|
||||||
void SetBroadcastCallback(BroadcastCallback cb);
|
|
||||||
typedef std::function<void()> ObsLoadedCallback;
|
|
||||||
void SetObsLoadedCallback(ObsLoadedCallback cb);
|
|
||||||
|
|
||||||
void ProcessSubscription(uint64_t eventSubscriptions);
|
// Callback when an event fires
|
||||||
void ProcessUnsubscription(uint64_t eventSubscriptions);
|
typedef std::function<void(uint64_t, std::string, json, uint8_t)>
|
||||||
|
EventCallback; // uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion
|
||||||
|
inline void SetEventCallback(EventCallback cb) { _eventCallback = cb; }
|
||||||
|
|
||||||
|
// Callback when OBS becomes ready or non-ready
|
||||||
|
typedef std::function<void(bool)> ObsReadyCallback; // bool ready
|
||||||
|
inline void SetObsReadyCallback(ObsReadyCallback cb) { _obsReadyCallback = cb; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BroadcastCallback _broadcastCallback;
|
EventCallback _eventCallback;
|
||||||
ObsLoadedCallback _obsLoadedCallback;
|
ObsReadyCallback _obsReadyCallback;
|
||||||
|
|
||||||
std::atomic<bool> _obsLoaded;
|
std::atomic<bool> _obsReady = false;
|
||||||
|
|
||||||
|
std::vector<OBSSignal> coreSignals;
|
||||||
|
OBSSignal recordFileChangedSignal;
|
||||||
|
|
||||||
std::unique_ptr<Utils::Obs::VolumeMeter::Handler> _inputVolumeMetersHandler;
|
std::unique_ptr<Utils::Obs::VolumeMeter::Handler> _inputVolumeMetersHandler;
|
||||||
std::atomic<uint64_t> _inputVolumeMetersRef;
|
std::atomic<uint64_t> _inputVolumeMetersRef = 0;
|
||||||
std::atomic<uint64_t> _inputActiveStateChangedRef;
|
std::atomic<uint64_t> _inputActiveStateChangedRef = 0;
|
||||||
std::atomic<uint64_t> _inputShowStateChangedRef;
|
std::atomic<uint64_t> _inputShowStateChangedRef = 0;
|
||||||
std::atomic<uint64_t> _sceneItemTransformChangedRef;
|
std::atomic<uint64_t> _sceneItemTransformChangedRef = 0;
|
||||||
|
|
||||||
void ConnectSourceSignals(obs_source_t *source);
|
void ConnectSourceSignals(obs_source_t *source);
|
||||||
void DisconnectSourceSignals(obs_source_t *source);
|
void DisconnectSourceSignals(obs_source_t *source);
|
||||||
@ -68,9 +74,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);
|
||||||
@ -105,7 +112,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,
|
||||||
@ -122,6 +129,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();
|
||||||
@ -143,12 +151,14 @@ private:
|
|||||||
void HandleSourceFilterCreated(obs_source_t *source, obs_source_t *filter);
|
void HandleSourceFilterCreated(obs_source_t *source, obs_source_t *filter);
|
||||||
void HandleSourceFilterRemoved(obs_source_t *source, obs_source_t *filter);
|
void HandleSourceFilterRemoved(obs_source_t *source, obs_source_t *filter);
|
||||||
static void HandleSourceFilterNameChanged(void *param,
|
static void HandleSourceFilterNameChanged(void *param,
|
||||||
calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
|
void HandleSourceFilterSettingsChanged(obs_source_t *source);
|
||||||
static void HandleSourceFilterEnableStateChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleSourceFilterEnableStateChanged(void *param, calldata_t *data); // Direct callback
|
||||||
|
|
||||||
// Outputs
|
// Outputs
|
||||||
void HandleStreamStateChanged(ObsOutputState state);
|
void HandleStreamStateChanged(ObsOutputState state);
|
||||||
void HandleRecordStateChanged(ObsOutputState state);
|
void HandleRecordStateChanged(ObsOutputState state);
|
||||||
|
static void HandleRecordFileChanged(void *param, calldata_t *data); // Direct callback
|
||||||
void HandleReplayBufferStateChanged(ObsOutputState state);
|
void HandleReplayBufferStateChanged(ObsOutputState state);
|
||||||
void HandleVirtualcamStateChanged(ObsOutputState state);
|
void HandleVirtualcamStateChanged(ObsOutputState state);
|
||||||
void HandleReplayBufferSaved();
|
void HandleReplayBufferSaved();
|
||||||
|
@ -163,6 +163,32 @@ void EventHandler::HandleSourceFilterNameChanged(void *param, calldata_t *data)
|
|||||||
eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterNameChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Filters, "SourceFilterNameChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An source filter's settings have changed (been updated).
|
||||||
|
*
|
||||||
|
* @dataField sourceName | String | Name of the source the filter is on
|
||||||
|
* @dataField filterName | String | Name of the filter
|
||||||
|
* @dataField filterSettings | Object | New settings object of the filter
|
||||||
|
*
|
||||||
|
* @eventType SourceFilterSettingsChanged
|
||||||
|
* @eventSubscription Filters
|
||||||
|
* @complexity 3
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @api events
|
||||||
|
* @category filters
|
||||||
|
*/
|
||||||
|
void EventHandler::HandleSourceFilterSettingsChanged(obs_source_t *source)
|
||||||
|
{
|
||||||
|
OBSDataAutoRelease filterSettings = obs_source_get_settings(source);
|
||||||
|
|
||||||
|
json eventData;
|
||||||
|
eventData["sourceName"] = obs_source_get_name(obs_filter_get_parent(source));
|
||||||
|
eventData["filterName"] = obs_source_get_name(source);
|
||||||
|
eventData["filterSettings"] = Utils::Json::ObsDataToJson(filterSettings);
|
||||||
|
BroadcastEvent(EventSubscription::Filters, "SourceFilterSettingsChanged", eventData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A source filter's enable state has changed.
|
* A source filter's enable state has changed.
|
||||||
*
|
*
|
||||||
|
@ -23,6 +23,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
* An input has been created.
|
* An input has been created.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField inputKind | String | The kind of the input
|
* @dataField inputKind | String | The kind of the input
|
||||||
* @dataField unversionedInputKind | String | The unversioned kind of input (aka no `_v2` stuff)
|
* @dataField unversionedInputKind | String | The unversioned kind of input (aka no `_v2` stuff)
|
||||||
* @dataField inputSettings | Object | The settings configured to the input when it was created
|
* @dataField inputSettings | Object | The settings configured to the input when it was created
|
||||||
@ -44,6 +45,7 @@ void EventHandler::HandleInputCreated(obs_source_t *source)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["inputKind"] = inputKind;
|
eventData["inputKind"] = inputKind;
|
||||||
eventData["unversionedInputKind"] = obs_source_get_unversioned_id(source);
|
eventData["unversionedInputKind"] = obs_source_get_unversioned_id(source);
|
||||||
eventData["inputSettings"] = Utils::Json::ObsDataToJson(inputSettings);
|
eventData["inputSettings"] = Utils::Json::ObsDataToJson(inputSettings);
|
||||||
@ -55,6 +57,7 @@ void EventHandler::HandleInputCreated(obs_source_t *source)
|
|||||||
* An input has been removed.
|
* An input has been removed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
*
|
*
|
||||||
* @eventType InputRemoved
|
* @eventType InputRemoved
|
||||||
* @eventSubscription Inputs
|
* @eventSubscription Inputs
|
||||||
@ -68,12 +71,14 @@ void EventHandler::HandleInputRemoved(obs_source_t *source)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
BroadcastEvent(EventSubscription::Inputs, "InputRemoved", eventData);
|
BroadcastEvent(EventSubscription::Inputs, "InputRemoved", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of an input has changed.
|
* The name of an input has changed.
|
||||||
*
|
*
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField oldInputName | String | Old name of the input
|
* @dataField oldInputName | String | Old name of the input
|
||||||
* @dataField inputName | String | New name of the input
|
* @dataField inputName | String | New name of the input
|
||||||
*
|
*
|
||||||
@ -85,20 +90,50 @@ void EventHandler::HandleInputRemoved(obs_source_t *source)
|
|||||||
* @api events
|
* @api events
|
||||||
* @category inputs
|
* @category inputs
|
||||||
*/
|
*/
|
||||||
void EventHandler::HandleInputNameChanged(obs_source_t *, std::string oldInputName, std::string inputName)
|
void EventHandler::HandleInputNameChanged(obs_source_t *source, std::string oldInputName, std::string inputName)
|
||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["oldInputName"] = oldInputName;
|
eventData["oldInputName"] = oldInputName;
|
||||||
eventData["inputName"] = inputName;
|
eventData["inputName"] = inputName;
|
||||||
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 inputUuid | String | UUID 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["inputUuid"] = obs_source_get_uuid(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.
|
||||||
*
|
*
|
||||||
* When an input is active, it means it's being shown by the program feed.
|
* When an input is active, it means it's being shown by the program feed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField videoActive | Boolean | Whether the input is active
|
* @dataField videoActive | Boolean | Whether the input is active
|
||||||
*
|
*
|
||||||
* @eventType InputActiveStateChanged
|
* @eventType InputActiveStateChanged
|
||||||
@ -125,6 +160,7 @@ void EventHandler::HandleInputActiveStateChanged(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["videoActive"] = obs_source_active(source);
|
eventData["videoActive"] = obs_source_active(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::InputActiveStateChanged, "InputActiveStateChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::InputActiveStateChanged, "InputActiveStateChanged", eventData);
|
||||||
}
|
}
|
||||||
@ -135,6 +171,7 @@ void EventHandler::HandleInputActiveStateChanged(void *param, calldata_t *data)
|
|||||||
* When an input is showing, it means it's being shown by the preview or a dialog.
|
* When an input is showing, it means it's being shown by the preview or a dialog.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField videoShowing | Boolean | Whether the input is showing
|
* @dataField videoShowing | Boolean | Whether the input is showing
|
||||||
*
|
*
|
||||||
* @eventType InputShowStateChanged
|
* @eventType InputShowStateChanged
|
||||||
@ -161,6 +198,7 @@ void EventHandler::HandleInputShowStateChanged(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["videoShowing"] = obs_source_showing(source);
|
eventData["videoShowing"] = obs_source_showing(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::InputShowStateChanged, "InputShowStateChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::InputShowStateChanged, "InputShowStateChanged", eventData);
|
||||||
}
|
}
|
||||||
@ -169,6 +207,7 @@ void EventHandler::HandleInputShowStateChanged(void *param, calldata_t *data)
|
|||||||
* An input's mute state has changed.
|
* An input's mute state has changed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField inputMuted | Boolean | Whether the input is muted
|
* @dataField inputMuted | Boolean | Whether the input is muted
|
||||||
*
|
*
|
||||||
* @eventType InputMuteStateChanged
|
* @eventType InputMuteStateChanged
|
||||||
@ -192,6 +231,7 @@ void EventHandler::HandleInputMuteStateChanged(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["inputMuted"] = obs_source_muted(source);
|
eventData["inputMuted"] = obs_source_muted(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputMuteStateChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputMuteStateChanged", eventData);
|
||||||
}
|
}
|
||||||
@ -200,6 +240,7 @@ void EventHandler::HandleInputMuteStateChanged(void *param, calldata_t *data)
|
|||||||
* An input's volume level has changed.
|
* An input's volume level has changed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField inputVolumeMul | Number | New volume level multiplier
|
* @dataField inputVolumeMul | Number | New volume level multiplier
|
||||||
* @dataField inputVolumeDb | Number | New volume level in dB
|
* @dataField inputVolumeDb | Number | New volume level in dB
|
||||||
*
|
*
|
||||||
@ -231,6 +272,7 @@ void EventHandler::HandleInputVolumeChanged(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["inputVolumeMul"] = inputVolumeMul;
|
eventData["inputVolumeMul"] = inputVolumeMul;
|
||||||
eventData["inputVolumeDb"] = inputVolumeDb;
|
eventData["inputVolumeDb"] = inputVolumeDb;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputVolumeChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputVolumeChanged", eventData);
|
||||||
@ -239,7 +281,8 @@ void EventHandler::HandleInputVolumeChanged(void *param, calldata_t *data)
|
|||||||
/**
|
/**
|
||||||
* The audio balance value of an input has changed.
|
* The audio balance value of an input has changed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the affected input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField inputAudioBalance | Number | New audio balance value of the input
|
* @dataField inputAudioBalance | Number | New audio balance value of the input
|
||||||
*
|
*
|
||||||
* @eventType InputAudioBalanceChanged
|
* @eventType InputAudioBalanceChanged
|
||||||
@ -265,6 +308,7 @@ void EventHandler::HandleInputAudioBalanceChanged(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["inputAudioBalance"] = inputAudioBalance;
|
eventData["inputAudioBalance"] = inputAudioBalance;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioBalanceChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioBalanceChanged", eventData);
|
||||||
}
|
}
|
||||||
@ -273,6 +317,7 @@ void EventHandler::HandleInputAudioBalanceChanged(void *param, calldata_t *data)
|
|||||||
* The sync offset of an input has changed.
|
* The sync offset of an input has changed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField inputAudioSyncOffset | Number | New sync offset in milliseconds
|
* @dataField inputAudioSyncOffset | Number | New sync offset in milliseconds
|
||||||
*
|
*
|
||||||
* @eventType InputAudioSyncOffsetChanged
|
* @eventType InputAudioSyncOffsetChanged
|
||||||
@ -298,6 +343,7 @@ void EventHandler::HandleInputAudioSyncOffsetChanged(void *param, calldata_t *da
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["inputAudioSyncOffset"] = inputAudioSyncOffset / 1000000;
|
eventData["inputAudioSyncOffset"] = inputAudioSyncOffset / 1000000;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioSyncOffsetChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioSyncOffsetChanged", eventData);
|
||||||
}
|
}
|
||||||
@ -306,6 +352,7 @@ void EventHandler::HandleInputAudioSyncOffsetChanged(void *param, calldata_t *da
|
|||||||
* The audio tracks of an input have changed.
|
* The audio tracks of an input have changed.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField inputAudioTracks | Object | Object of audio tracks along with their associated enable states
|
* @dataField inputAudioTracks | Object | Object of audio tracks along with their associated enable states
|
||||||
*
|
*
|
||||||
* @eventType InputAudioTracksChanged
|
* @eventType InputAudioTracksChanged
|
||||||
@ -336,6 +383,7 @@ void EventHandler::HandleInputAudioTracksChanged(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["inputAudioTracks"] = inputAudioTracks;
|
eventData["inputAudioTracks"] = inputAudioTracks;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioTracksChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioTracksChanged", eventData);
|
||||||
}
|
}
|
||||||
@ -350,6 +398,7 @@ void EventHandler::HandleInputAudioTracksChanged(void *param, calldata_t *data)
|
|||||||
* - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`
|
* - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField monitorType | String | New monitor type of the input
|
* @dataField monitorType | String | New monitor type of the input
|
||||||
*
|
*
|
||||||
* @eventType InputAudioMonitorTypeChanged
|
* @eventType InputAudioMonitorTypeChanged
|
||||||
@ -375,6 +424,7 @@ void EventHandler::HandleInputAudioMonitorTypeChanged(void *param, calldata_t *d
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["monitorType"] = monitorType;
|
eventData["monitorType"] = monitorType;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioMonitorTypeChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioMonitorTypeChanged", eventData);
|
||||||
}
|
}
|
||||||
|
@ -124,6 +124,7 @@ void EventHandler::SourceMediaPreviousMultiHandler(void *param, calldata_t *data
|
|||||||
* A media input has started playing.
|
* A media input has started playing.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
*
|
*
|
||||||
* @eventType MediaInputPlaybackStarted
|
* @eventType MediaInputPlaybackStarted
|
||||||
* @eventSubscription MediaInputs
|
* @eventSubscription MediaInputs
|
||||||
@ -146,6 +147,7 @@ void EventHandler::HandleMediaInputPlaybackStarted(void *param, calldata_t *data
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputPlaybackStarted", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputPlaybackStarted", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,6 +155,7 @@ void EventHandler::HandleMediaInputPlaybackStarted(void *param, calldata_t *data
|
|||||||
* A media input has finished playing.
|
* A media input has finished playing.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
*
|
*
|
||||||
* @eventType MediaInputPlaybackEnded
|
* @eventType MediaInputPlaybackEnded
|
||||||
* @eventSubscription MediaInputs
|
* @eventSubscription MediaInputs
|
||||||
@ -175,6 +178,7 @@ void EventHandler::HandleMediaInputPlaybackEnded(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputPlaybackEnded", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::MediaInputs, "MediaInputPlaybackEnded", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,6 +186,7 @@ void EventHandler::HandleMediaInputPlaybackEnded(void *param, calldata_t *data)
|
|||||||
* An action has been performed on an input.
|
* An action has been performed on an input.
|
||||||
*
|
*
|
||||||
* @dataField inputName | String | Name of the input
|
* @dataField inputName | String | Name of the input
|
||||||
|
* @dataField inputUuid | String | UUID of the input
|
||||||
* @dataField mediaAction | String | Action performed on the input. See `ObsMediaInputAction` enum
|
* @dataField mediaAction | String | Action performed on the input. See `ObsMediaInputAction` enum
|
||||||
*
|
*
|
||||||
* @eventType MediaInputActionTriggered
|
* @eventType MediaInputActionTriggered
|
||||||
@ -196,6 +201,7 @@ void EventHandler::HandleMediaInputActionTriggered(obs_source_t *source, ObsMedi
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
|
eventData["inputUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["mediaAction"] = GetMediaInputActionString(action);
|
eventData["mediaAction"] = GetMediaInputActionString(action);
|
||||||
BroadcastEvent(EventSubscription::MediaInputs, "MediaInputActionTriggered", eventData);
|
BroadcastEvent(EventSubscription::MediaInputs, "MediaInputActionTriggered", eventData);
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,28 @@ void EventHandler::HandleRecordStateChanged(ObsOutputState state)
|
|||||||
BroadcastEvent(EventSubscription::Outputs, "RecordStateChanged", eventData);
|
BroadcastEvent(EventSubscription::Outputs, "RecordStateChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The record output has started writing to a new file. For example, when a file split happens.
|
||||||
|
*
|
||||||
|
* @dataField newOutputPath | String | File name that the output has begun writing to
|
||||||
|
*
|
||||||
|
* @eventType RecordFileChanged
|
||||||
|
* @eventSubscription Outputs
|
||||||
|
* @complexity 2
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.5.0
|
||||||
|
* @api events
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
void EventHandler::HandleRecordFileChanged(void *param, calldata_t *data)
|
||||||
|
{
|
||||||
|
auto eventHandler = static_cast<EventHandler *>(param);
|
||||||
|
|
||||||
|
json eventData;
|
||||||
|
eventData["newOutputPath"] = calldata_string(data, "next_file");
|
||||||
|
eventHandler->BroadcastEvent(EventSubscription::Outputs, "RecordFileChanged", eventData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The state of the replay buffer output has changed.
|
* The state of the replay buffer output has changed.
|
||||||
*
|
*
|
||||||
|
@ -23,7 +23,9 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
* A scene item has been created.
|
* A scene item has been created.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene the item was added to
|
* @dataField sceneName | String | Name of the scene the item was added to
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene the item was added to
|
||||||
* @dataField sourceName | String | Name of the underlying source (input/scene)
|
* @dataField sourceName | String | Name of the underlying source (input/scene)
|
||||||
|
* @dataField sourceUuid | String | UUID of the underlying source (input/scene)
|
||||||
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
||||||
* @dataField sceneItemIndex | Number | Index position of the item
|
* @dataField sceneItemIndex | Number | Index position of the item
|
||||||
*
|
*
|
||||||
@ -49,7 +51,9 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sourceName"] = obs_source_get_name(obs_sceneitem_get_source(sceneItem));
|
eventData["sourceName"] = obs_source_get_name(obs_sceneitem_get_source(sceneItem));
|
||||||
|
eventData["sourceUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem));
|
||||||
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
eventData["sceneItemIndex"] = obs_sceneitem_get_order_position(sceneItem);
|
eventData["sceneItemIndex"] = obs_sceneitem_get_order_position(sceneItem);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemCreated", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemCreated", eventData);
|
||||||
@ -61,7 +65,9 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data)
|
|||||||
* This event is not emitted when the scene the item is in is removed.
|
* This event is not emitted when the scene the item is in is removed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene the item was removed from
|
* @dataField sceneName | String | Name of the scene the item was removed from
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene the item was removed from
|
||||||
* @dataField sourceName | String | Name of the underlying source (input/scene)
|
* @dataField sourceName | String | Name of the underlying source (input/scene)
|
||||||
|
* @dataField sourceUuid | String | UUID of the underlying source (input/scene)
|
||||||
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
||||||
*
|
*
|
||||||
* @eventType SceneItemRemoved
|
* @eventType SceneItemRemoved
|
||||||
@ -86,7 +92,9 @@ void EventHandler::HandleSceneItemRemoved(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sourceName"] = obs_source_get_name(obs_sceneitem_get_source(sceneItem));
|
eventData["sourceName"] = obs_source_get_name(obs_sceneitem_get_source(sceneItem));
|
||||||
|
eventData["sourceUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem));
|
||||||
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemRemoved", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemRemoved", eventData);
|
||||||
}
|
}
|
||||||
@ -95,6 +103,7 @@ void EventHandler::HandleSceneItemRemoved(void *param, calldata_t *data)
|
|||||||
* A scene's item list has been reindexed.
|
* A scene's item list has been reindexed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene
|
* @dataField sceneName | String | Name of the scene
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene
|
||||||
* @dataField sceneItems | Array<Object> | Array of scene item objects
|
* @dataField sceneItems | Array<Object> | Array of scene item objects
|
||||||
*
|
*
|
||||||
* @eventType SceneItemListReindexed
|
* @eventType SceneItemListReindexed
|
||||||
@ -115,6 +124,7 @@ void EventHandler::HandleSceneItemListReindexed(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sceneItems"] = Utils::Obs::ArrayHelper::GetSceneItemList(scene, true);
|
eventData["sceneItems"] = Utils::Obs::ArrayHelper::GetSceneItemList(scene, true);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemListReindexed", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemListReindexed", eventData);
|
||||||
}
|
}
|
||||||
@ -123,6 +133,7 @@ void EventHandler::HandleSceneItemListReindexed(void *param, calldata_t *data)
|
|||||||
* A scene item's enable state has changed.
|
* A scene item's enable state has changed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene the item is in
|
* @dataField sceneName | String | Name of the scene the item is in
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene the item is in
|
||||||
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
||||||
* @dataField sceneItemEnabled | Boolean | Whether the scene item is enabled (visible)
|
* @dataField sceneItemEnabled | Boolean | Whether the scene item is enabled (visible)
|
||||||
*
|
*
|
||||||
@ -150,6 +161,7 @@ void EventHandler::HandleSceneItemEnableStateChanged(void *param, calldata_t *da
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
eventData["sceneItemEnabled"] = sceneItemEnabled;
|
eventData["sceneItemEnabled"] = sceneItemEnabled;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemEnableStateChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemEnableStateChanged", eventData);
|
||||||
@ -159,6 +171,7 @@ void EventHandler::HandleSceneItemEnableStateChanged(void *param, calldata_t *da
|
|||||||
* A scene item's lock state has changed.
|
* A scene item's lock state has changed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene the item is in
|
* @dataField sceneName | String | Name of the scene the item is in
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene the item is in
|
||||||
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
||||||
* @dataField sceneItemLocked | Boolean | Whether the scene item is locked
|
* @dataField sceneItemLocked | Boolean | Whether the scene item is locked
|
||||||
*
|
*
|
||||||
@ -186,6 +199,7 @@ void EventHandler::HandleSceneItemLockStateChanged(void *param, calldata_t *data
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
eventData["sceneItemLocked"] = sceneItemLocked;
|
eventData["sceneItemLocked"] = sceneItemLocked;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemLockStateChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemLockStateChanged", eventData);
|
||||||
@ -195,6 +209,7 @@ void EventHandler::HandleSceneItemLockStateChanged(void *param, calldata_t *data
|
|||||||
* A scene item has been selected in the Ui.
|
* A scene item has been selected in the Ui.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene the item is in
|
* @dataField sceneName | String | Name of the scene the item is in
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene the item is in
|
||||||
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
||||||
*
|
*
|
||||||
* @eventType SceneItemSelected
|
* @eventType SceneItemSelected
|
||||||
@ -219,6 +234,7 @@ void EventHandler::HandleSceneItemSelected(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemSelected", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemSelected", eventData);
|
||||||
}
|
}
|
||||||
@ -227,6 +243,7 @@ void EventHandler::HandleSceneItemSelected(void *param, calldata_t *data)
|
|||||||
* The transform/crop of a scene item has changed.
|
* The transform/crop of a scene item has changed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | The name of the scene the item is in
|
* @dataField sceneName | String | The name of the scene the item is in
|
||||||
|
* @dataField sceneUuid | String | The UUID of the scene the item is in
|
||||||
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
* @dataField sceneItemId | Number | Numeric ID of the scene item
|
||||||
* @dataField sceneItemTransform | Object | New transform/crop info of the scene item
|
* @dataField sceneItemTransform | Object | New transform/crop info of the scene item
|
||||||
*
|
*
|
||||||
@ -255,6 +272,7 @@ void EventHandler::HandleSceneItemTransformChanged(void *param, calldata_t *data
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene));
|
||||||
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
eventData["sceneItemTransform"] = Utils::Obs::ObjectHelper::GetSceneItemTransform(sceneItem);
|
eventData["sceneItemTransform"] = Utils::Obs::ObjectHelper::GetSceneItemTransform(sceneItem);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::SceneItemTransformChanged, "SceneItemTransformChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::SceneItemTransformChanged, "SceneItemTransformChanged", eventData);
|
||||||
|
@ -23,6 +23,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
* A new scene has been created.
|
* A new scene has been created.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the new scene
|
* @dataField sceneName | String | Name of the new scene
|
||||||
|
* @dataField sceneUuid | String | UUID of the new scene
|
||||||
* @dataField isGroup | Boolean | Whether the new scene is a group
|
* @dataField isGroup | Boolean | Whether the new scene is a group
|
||||||
*
|
*
|
||||||
* @eventType SceneCreated
|
* @eventType SceneCreated
|
||||||
@ -37,6 +38,7 @@ void EventHandler::HandleSceneCreated(obs_source_t *source)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(source);
|
eventData["sceneName"] = obs_source_get_name(source);
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["isGroup"] = obs_source_is_group(source);
|
eventData["isGroup"] = obs_source_is_group(source);
|
||||||
BroadcastEvent(EventSubscription::Scenes, "SceneCreated", eventData);
|
BroadcastEvent(EventSubscription::Scenes, "SceneCreated", eventData);
|
||||||
}
|
}
|
||||||
@ -45,6 +47,7 @@ void EventHandler::HandleSceneCreated(obs_source_t *source)
|
|||||||
* A scene has been removed.
|
* A scene has been removed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the removed scene
|
* @dataField sceneName | String | Name of the removed scene
|
||||||
|
* @dataField sceneUuid | String | UUID of the removed scene
|
||||||
* @dataField isGroup | Boolean | Whether the scene was a group
|
* @dataField isGroup | Boolean | Whether the scene was a group
|
||||||
*
|
*
|
||||||
* @eventType SceneRemoved
|
* @eventType SceneRemoved
|
||||||
@ -59,6 +62,7 @@ void EventHandler::HandleSceneRemoved(obs_source_t *source)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(source);
|
eventData["sceneName"] = obs_source_get_name(source);
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["isGroup"] = obs_source_is_group(source);
|
eventData["isGroup"] = obs_source_is_group(source);
|
||||||
BroadcastEvent(EventSubscription::Scenes, "SceneRemoved", eventData);
|
BroadcastEvent(EventSubscription::Scenes, "SceneRemoved", eventData);
|
||||||
}
|
}
|
||||||
@ -66,6 +70,7 @@ void EventHandler::HandleSceneRemoved(obs_source_t *source)
|
|||||||
/**
|
/**
|
||||||
* The name of a scene has changed.
|
* The name of a scene has changed.
|
||||||
*
|
*
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene
|
||||||
* @dataField oldSceneName | String | Old name of the scene
|
* @dataField oldSceneName | String | Old name of the scene
|
||||||
* @dataField sceneName | String | New name of the scene
|
* @dataField sceneName | String | New name of the scene
|
||||||
*
|
*
|
||||||
@ -77,9 +82,10 @@ void EventHandler::HandleSceneRemoved(obs_source_t *source)
|
|||||||
* @api events
|
* @api events
|
||||||
* @category scenes
|
* @category scenes
|
||||||
*/
|
*/
|
||||||
void EventHandler::HandleSceneNameChanged(obs_source_t *, std::string oldSceneName, std::string sceneName)
|
void EventHandler::HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName)
|
||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(source);
|
||||||
eventData["oldSceneName"] = oldSceneName;
|
eventData["oldSceneName"] = oldSceneName;
|
||||||
eventData["sceneName"] = sceneName;
|
eventData["sceneName"] = sceneName;
|
||||||
BroadcastEvent(EventSubscription::Scenes, "SceneNameChanged", eventData);
|
BroadcastEvent(EventSubscription::Scenes, "SceneNameChanged", eventData);
|
||||||
@ -89,6 +95,7 @@ void EventHandler::HandleSceneNameChanged(obs_source_t *, std::string oldSceneNa
|
|||||||
* The current program scene has changed.
|
* The current program scene has changed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene that was switched to
|
* @dataField sceneName | String | Name of the scene that was switched to
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene that was switched to
|
||||||
*
|
*
|
||||||
* @eventType CurrentProgramSceneChanged
|
* @eventType CurrentProgramSceneChanged
|
||||||
* @eventSubscription Scenes
|
* @eventSubscription Scenes
|
||||||
@ -104,6 +111,7 @@ void EventHandler::HandleCurrentProgramSceneChanged()
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(currentScene);
|
eventData["sceneName"] = obs_source_get_name(currentScene);
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(currentScene);
|
||||||
BroadcastEvent(EventSubscription::Scenes, "CurrentProgramSceneChanged", eventData);
|
BroadcastEvent(EventSubscription::Scenes, "CurrentProgramSceneChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +119,7 @@ void EventHandler::HandleCurrentProgramSceneChanged()
|
|||||||
* The current preview scene has changed.
|
* The current preview scene has changed.
|
||||||
*
|
*
|
||||||
* @dataField sceneName | String | Name of the scene that was switched to
|
* @dataField sceneName | String | Name of the scene that was switched to
|
||||||
|
* @dataField sceneUuid | String | UUID of the scene that was switched to
|
||||||
*
|
*
|
||||||
* @eventType CurrentPreviewSceneChanged
|
* @eventType CurrentPreviewSceneChanged
|
||||||
* @eventSubscription Scenes
|
* @eventSubscription Scenes
|
||||||
@ -130,6 +139,7 @@ void EventHandler::HandleCurrentPreviewSceneChanged()
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["sceneName"] = obs_source_get_name(currentPreviewScene);
|
eventData["sceneName"] = obs_source_get_name(currentPreviewScene);
|
||||||
|
eventData["sceneUuid"] = obs_source_get_uuid(currentPreviewScene);
|
||||||
BroadcastEvent(EventSubscription::Scenes, "CurrentPreviewSceneChanged", eventData);
|
BroadcastEvent(EventSubscription::Scenes, "CurrentPreviewSceneChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
* The current scene transition has changed.
|
* The current scene transition has changed.
|
||||||
*
|
*
|
||||||
* @dataField transitionName | String | Name of the new transition
|
* @dataField transitionName | String | Name of the new transition
|
||||||
|
* @dataField transitionUuid | String | UUID of the new transition
|
||||||
*
|
*
|
||||||
* @eventType CurrentSceneTransitionChanged
|
* @eventType CurrentSceneTransitionChanged
|
||||||
* @eventSubscription Transitions
|
* @eventSubscription Transitions
|
||||||
@ -38,6 +39,7 @@ void EventHandler::HandleCurrentSceneTransitionChanged()
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["transitionName"] = obs_source_get_name(transition);
|
eventData["transitionName"] = obs_source_get_name(transition);
|
||||||
|
eventData["transitionUuid"] = obs_source_get_uuid(transition);
|
||||||
BroadcastEvent(EventSubscription::Transitions, "CurrentSceneTransitionChanged", eventData);
|
BroadcastEvent(EventSubscription::Transitions, "CurrentSceneTransitionChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +67,7 @@ void EventHandler::HandleCurrentSceneTransitionDurationChanged()
|
|||||||
* A scene transition has started.
|
* A scene transition has started.
|
||||||
*
|
*
|
||||||
* @dataField transitionName | String | Scene transition name
|
* @dataField transitionName | String | Scene transition name
|
||||||
|
* @dataField transitionUuid | String | Scene transition UUID
|
||||||
*
|
*
|
||||||
* @eventType SceneTransitionStarted
|
* @eventType SceneTransitionStarted
|
||||||
* @eventSubscription Transitions
|
* @eventSubscription Transitions
|
||||||
@ -84,6 +87,7 @@ void EventHandler::HandleSceneTransitionStarted(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["transitionName"] = obs_source_get_name(source);
|
eventData["transitionName"] = obs_source_get_name(source);
|
||||||
|
eventData["transitionUuid"] = obs_source_get_uuid(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionStarted", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionStarted", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +97,7 @@ void EventHandler::HandleSceneTransitionStarted(void *param, calldata_t *data)
|
|||||||
* Note: Does not appear to trigger when the transition is interrupted by the user.
|
* Note: Does not appear to trigger when the transition is interrupted by the user.
|
||||||
*
|
*
|
||||||
* @dataField transitionName | String | Scene transition name
|
* @dataField transitionName | String | Scene transition name
|
||||||
|
* @dataField transitionUuid | String | Scene transition UUID
|
||||||
*
|
*
|
||||||
* @eventType SceneTransitionEnded
|
* @eventType SceneTransitionEnded
|
||||||
* @eventSubscription Transitions
|
* @eventSubscription Transitions
|
||||||
@ -112,6 +117,7 @@ void EventHandler::HandleSceneTransitionEnded(void *param, calldata_t *data)
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["transitionName"] = obs_source_get_name(source);
|
eventData["transitionName"] = obs_source_get_name(source);
|
||||||
|
eventData["transitionUuid"] = obs_source_get_uuid(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionEnded", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionEnded", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,6 +130,7 @@ void EventHandler::HandleSceneTransitionEnded(void *param, calldata_t *data)
|
|||||||
* Note: Appears to be called by every transition, regardless of relevance.
|
* Note: Appears to be called by every transition, regardless of relevance.
|
||||||
*
|
*
|
||||||
* @dataField transitionName | String | Scene transition name
|
* @dataField transitionName | String | Scene transition name
|
||||||
|
* @dataField transitionUuid | String | Scene transition UUID
|
||||||
*
|
*
|
||||||
* @eventType SceneTransitionVideoEnded
|
* @eventType SceneTransitionVideoEnded
|
||||||
* @eventSubscription Transitions
|
* @eventSubscription Transitions
|
||||||
@ -143,5 +150,6 @@ void EventHandler::HandleSceneTransitionVideoEnded(void *param, calldata_t *data
|
|||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["transitionName"] = obs_source_get_name(source);
|
eventData["transitionName"] = obs_source_get_name(source);
|
||||||
|
eventData["transitionUuid"] = obs_source_get_uuid(source);
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionVideoEnded", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionVideoEnded", eventData);
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,9 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <obs-module.h>
|
#include <obs-module.h>
|
||||||
|
#include <qrcodegen.hpp>
|
||||||
|
|
||||||
#include "ConnectInfo.h"
|
#include "ConnectInfo.h"
|
||||||
#include "../../deps/qr/cpp/QrCode.hpp"
|
|
||||||
#include "../obs-websocket.h"
|
#include "../obs-websocket.h"
|
||||||
#include "../Config.h"
|
#include "../Config.h"
|
||||||
#include "../utils/Platform.h"
|
#include "../utils/Platform.h"
|
||||||
@ -64,7 +64,7 @@ void ConnectInfo::RefreshData()
|
|||||||
QString serverPassword;
|
QString serverPassword;
|
||||||
if (conf->AuthRequired) {
|
if (conf->AuthRequired) {
|
||||||
ui->copyServerPasswordButton->setEnabled(true);
|
ui->copyServerPasswordButton->setEnabled(true);
|
||||||
serverPassword = QUrl::toPercentEncoding(conf->ServerPassword);
|
serverPassword = QUrl::toPercentEncoding(QString::fromStdString(conf->ServerPassword));
|
||||||
} else {
|
} else {
|
||||||
ui->copyServerPasswordButton->setEnabled(false);
|
ui->copyServerPasswordButton->setEnabled(false);
|
||||||
serverPassword = obs_module_text("OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText");
|
serverPassword = obs_module_text("OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText");
|
||||||
|
@ -123,7 +123,7 @@ void SettingsDialog::RefreshData()
|
|||||||
ui->enableDebugLoggingCheckBox->setChecked(conf->DebugEnabled);
|
ui->enableDebugLoggingCheckBox->setChecked(conf->DebugEnabled);
|
||||||
ui->serverPortSpinBox->setValue(conf->ServerPort);
|
ui->serverPortSpinBox->setValue(conf->ServerPort);
|
||||||
ui->enableAuthenticationCheckBox->setChecked(conf->AuthRequired);
|
ui->enableAuthenticationCheckBox->setChecked(conf->AuthRequired);
|
||||||
ui->serverPasswordLineEdit->setText(conf->ServerPassword);
|
ui->serverPasswordLineEdit->setText(QString::fromStdString(conf->ServerPassword));
|
||||||
|
|
||||||
ui->serverPasswordLineEdit->setEnabled(conf->AuthRequired);
|
ui->serverPasswordLineEdit->setEnabled(conf->AuthRequired);
|
||||||
ui->generatePasswordButton->setEnabled(conf->AuthRequired);
|
ui->generatePasswordButton->setEnabled(conf->AuthRequired);
|
||||||
@ -158,7 +158,7 @@ void SettingsDialog::SaveFormData()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show a confirmation box to the user if they attempt to provide their own password
|
// Show a confirmation box to the user if they attempt to provide their own password
|
||||||
if (passwordManuallyEdited && (conf->ServerPassword != ui->serverPasswordLineEdit->text())) {
|
if (passwordManuallyEdited && (conf->ServerPassword != ui->serverPasswordLineEdit->text().toStdString())) {
|
||||||
QMessageBox msgBox;
|
QMessageBox msgBox;
|
||||||
msgBox.setWindowTitle(obs_module_text("OBSWebSocket.Settings.Save.UserPasswordWarningTitle"));
|
msgBox.setWindowTitle(obs_module_text("OBSWebSocket.Settings.Save.UserPasswordWarningTitle"));
|
||||||
msgBox.setText(obs_module_text("OBSWebSocket.Settings.Save.UserPasswordWarningMessage"));
|
msgBox.setText(obs_module_text("OBSWebSocket.Settings.Save.UserPasswordWarningMessage"));
|
||||||
@ -172,22 +172,22 @@ void SettingsDialog::SaveFormData()
|
|||||||
break;
|
break;
|
||||||
case QMessageBox::No:
|
case QMessageBox::No:
|
||||||
default:
|
default:
|
||||||
ui->serverPasswordLineEdit->setText(conf->ServerPassword);
|
ui->serverPasswordLineEdit->setText(QString::fromStdString(conf->ServerPassword));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needsRestart =
|
bool needsRestart = (conf->ServerEnabled != ui->enableWebSocketServerCheckBox->isChecked()) ||
|
||||||
(conf->ServerEnabled != ui->enableWebSocketServerCheckBox->isChecked()) ||
|
(conf->ServerPort != ui->serverPortSpinBox->value()) ||
|
||||||
(conf->ServerPort != ui->serverPortSpinBox->value()) ||
|
(ui->enableAuthenticationCheckBox->isChecked() &&
|
||||||
(ui->enableAuthenticationCheckBox->isChecked() && conf->ServerPassword != ui->serverPasswordLineEdit->text());
|
conf->ServerPassword != ui->serverPasswordLineEdit->text().toStdString());
|
||||||
|
|
||||||
conf->ServerEnabled = ui->enableWebSocketServerCheckBox->isChecked();
|
conf->ServerEnabled = ui->enableWebSocketServerCheckBox->isChecked();
|
||||||
conf->AlertsEnabled = ui->enableSystemTrayAlertsCheckBox->isChecked();
|
conf->AlertsEnabled = ui->enableSystemTrayAlertsCheckBox->isChecked();
|
||||||
conf->DebugEnabled = ui->enableDebugLoggingCheckBox->isChecked();
|
conf->DebugEnabled = ui->enableDebugLoggingCheckBox->isChecked();
|
||||||
conf->ServerPort = ui->serverPortSpinBox->value();
|
conf->ServerPort = ui->serverPortSpinBox->value();
|
||||||
conf->AuthRequired = ui->enableAuthenticationCheckBox->isChecked();
|
conf->AuthRequired = ui->enableAuthenticationCheckBox->isChecked();
|
||||||
conf->ServerPassword = ui->serverPasswordLineEdit->text();
|
conf->ServerPassword = ui->serverPasswordLineEdit->text().toStdString();
|
||||||
|
|
||||||
conf->Save();
|
conf->Save();
|
||||||
|
|
||||||
|
@ -48,7 +48,9 @@ WebSocketApiPtr _webSocketApi;
|
|||||||
WebSocketServerPtr _webSocketServer;
|
WebSocketServerPtr _webSocketServer;
|
||||||
SettingsDialog *_settingsDialog = nullptr;
|
SettingsDialog *_settingsDialog = nullptr;
|
||||||
|
|
||||||
void WebSocketApiEventCallback(std::string vendorName, std::string eventType, obs_data_t *obsEventData);
|
void OnWebSocketApiVendorEvent(std::string vendorName, std::string eventType, obs_data_t *obsEventData);
|
||||||
|
void OnEvent(uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion);
|
||||||
|
void OnObsReady(bool ready);
|
||||||
|
|
||||||
bool obs_module_load(void)
|
bool obs_module_load(void)
|
||||||
{
|
{
|
||||||
@ -60,19 +62,30 @@ bool obs_module_load(void)
|
|||||||
// Initialize the cpu stats
|
// Initialize the cpu stats
|
||||||
_cpuUsageInfo = os_cpu_usage_info_start();
|
_cpuUsageInfo = os_cpu_usage_info_start();
|
||||||
|
|
||||||
|
// Handle migrations
|
||||||
|
if (!MigratePersistentData()) {
|
||||||
|
os_cpu_usage_info_destroy(_cpuUsageInfo);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
json migratedConfig = MigrateGlobalConfigData();
|
||||||
|
|
||||||
// Create the config manager then load the parameters from storage
|
// Create the config manager then load the parameters from storage
|
||||||
_config = ConfigPtr(new Config());
|
_config = std::make_shared<Config>();
|
||||||
_config->Load();
|
_config->Load(migratedConfig);
|
||||||
|
|
||||||
// Initialize the event handler
|
// Initialize the event handler
|
||||||
_eventHandler = EventHandlerPtr(new EventHandler());
|
_eventHandler = std::make_shared<EventHandler>();
|
||||||
|
_eventHandler->SetEventCallback(OnEvent);
|
||||||
|
_eventHandler->SetObsReadyCallback(OnObsReady);
|
||||||
|
|
||||||
// Initialize the plugin/script API
|
// Initialize the plugin/script API
|
||||||
_webSocketApi = WebSocketApiPtr(new WebSocketApi());
|
_webSocketApi = std::make_shared<WebSocketApi>();
|
||||||
_webSocketApi->SetEventCallback(WebSocketApiEventCallback);
|
_webSocketApi->SetVendorEventCallback(OnWebSocketApiVendorEvent);
|
||||||
|
|
||||||
// Initialize the WebSocket server
|
// Initialize the WebSocket server
|
||||||
_webSocketServer = WebSocketServerPtr(new WebSocketServer());
|
_webSocketServer = std::make_shared<WebSocketServer>();
|
||||||
|
_webSocketServer->SetClientSubscriptionCallback(std::bind(&EventHandler::ProcessSubscriptionChange, _eventHandler.get(),
|
||||||
|
std::placeholders::_1, std::placeholders::_2));
|
||||||
|
|
||||||
// Initialize the settings dialog
|
// Initialize the settings dialog
|
||||||
obs_frontend_push_ui_translation(obs_module_get_string);
|
obs_frontend_push_ui_translation(obs_module_get_string);
|
||||||
@ -89,7 +102,28 @@ bool obs_module_load(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void obs_module_unload()
|
#ifdef PLUGIN_TESTS
|
||||||
|
void test_call_request();
|
||||||
|
void test_register_event_callback();
|
||||||
|
void test_register_vendor();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void obs_module_post_load(void)
|
||||||
|
{
|
||||||
|
#ifdef PLUGIN_TESTS
|
||||||
|
test_call_request();
|
||||||
|
test_register_event_callback();
|
||||||
|
test_register_vendor();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Server will accept clients, but requests and events will not be served until FINISHED_LOADING occurs
|
||||||
|
if (_config->ServerEnabled) {
|
||||||
|
blog(LOG_INFO, "[obs_module_post_load] WebSocket server is enabled, starting...");
|
||||||
|
_webSocketServer->Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void obs_module_unload(void)
|
||||||
{
|
{
|
||||||
blog(LOG_INFO, "[obs_module_unload] Shutting down...");
|
blog(LOG_INFO, "[obs_module_unload] Shutting down...");
|
||||||
|
|
||||||
@ -99,18 +133,20 @@ void obs_module_unload()
|
|||||||
_webSocketServer->Stop();
|
_webSocketServer->Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destroy the WebSocket server
|
// Release the WebSocket server
|
||||||
_webSocketServer.reset();
|
_webSocketServer->SetClientSubscriptionCallback(nullptr);
|
||||||
|
_webSocketServer = nullptr;
|
||||||
|
|
||||||
// Destroy the plugin/script api
|
// Release the plugin/script api
|
||||||
_webSocketApi.reset();
|
_webSocketApi = nullptr;
|
||||||
|
|
||||||
// Destroy the event handler
|
// Release the event handler
|
||||||
_eventHandler.reset();
|
_eventHandler->SetObsReadyCallback(nullptr);
|
||||||
|
_eventHandler->SetEventCallback(nullptr);
|
||||||
|
_eventHandler = nullptr;
|
||||||
|
|
||||||
// Save and destroy the config manager
|
// Release the config manager
|
||||||
_config->Save();
|
_config = nullptr;
|
||||||
_config.reset();
|
|
||||||
|
|
||||||
// Destroy the cpu stats
|
// Destroy the cpu stats
|
||||||
os_cpu_usage_info_destroy(_cpuUsageInfo);
|
os_cpu_usage_info_destroy(_cpuUsageInfo);
|
||||||
@ -166,7 +202,7 @@ bool IsDebugEnabled()
|
|||||||
* @api events
|
* @api events
|
||||||
* @category general
|
* @category general
|
||||||
*/
|
*/
|
||||||
void WebSocketApiEventCallback(std::string vendorName, std::string eventType, obs_data_t *obsEventData)
|
void OnWebSocketApiVendorEvent(std::string vendorName, std::string eventType, obs_data_t *obsEventData)
|
||||||
{
|
{
|
||||||
json eventData = Utils::Json::ObsDataToJson(obsEventData);
|
json eventData = Utils::Json::ObsDataToJson(obsEventData);
|
||||||
|
|
||||||
@ -178,13 +214,62 @@ void WebSocketApiEventCallback(std::string vendorName, std::string eventType, ob
|
|||||||
_webSocketServer->BroadcastEvent(EventSubscription::Vendors, "VendorEvent", broadcastEventData);
|
_webSocketServer->BroadcastEvent(EventSubscription::Vendors, "VendorEvent", broadcastEventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sent from: EventHandler
|
||||||
|
void OnEvent(uint64_t requiredIntent, std::string eventType, json eventData, uint8_t rpcVersion)
|
||||||
|
{
|
||||||
|
if (_webSocketServer)
|
||||||
|
_webSocketServer->BroadcastEvent(requiredIntent, eventType, eventData, rpcVersion);
|
||||||
|
if (_webSocketApi)
|
||||||
|
_webSocketApi->BroadcastEvent(requiredIntent, eventType, eventData, rpcVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sent from: EventHandler
|
||||||
|
void OnObsReady(bool ready)
|
||||||
|
{
|
||||||
|
if (_webSocketServer)
|
||||||
|
_webSocketServer->SetObsReady(ready);
|
||||||
|
if (_webSocketApi)
|
||||||
|
_webSocketApi->SetObsReady(ready);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PLUGIN_TESTS
|
#ifdef PLUGIN_TESTS
|
||||||
|
void test_call_request()
|
||||||
|
{
|
||||||
|
blog(LOG_INFO, "[test_call_request] Testing obs-websocket plugin API request calling...");
|
||||||
|
|
||||||
|
struct obs_websocket_request_response *response = obs_websocket_call_request("GetVersion");
|
||||||
|
if (response) {
|
||||||
|
blog(LOG_INFO, "[test_call_request] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s",
|
||||||
|
response->status_code, response->comment, response->response_data);
|
||||||
|
obs_websocket_request_response_free(response);
|
||||||
|
} else {
|
||||||
|
blog(LOG_ERROR, "[test_call_request] Failed to call GetVersion request via obs-websocket plugin API!");
|
||||||
|
}
|
||||||
|
|
||||||
|
blog(LOG_INFO, "[test_call_request] Test done.");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_event_cb(uint64_t eventIntent, const char *eventType, const char *eventData, void *priv_data)
|
||||||
|
{
|
||||||
|
blog(LOG_DEBUG, "[test_event_cb] New event! Type: %s | Data: %s", eventType, eventData);
|
||||||
|
|
||||||
|
UNUSED_PARAMETER(eventIntent);
|
||||||
|
UNUSED_PARAMETER(priv_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_register_event_callback()
|
||||||
|
{
|
||||||
|
blog(LOG_INFO, "[test_register_event_callback] Registering test event callback...");
|
||||||
|
|
||||||
|
if (!obs_websocket_register_event_callback(test_event_cb, nullptr))
|
||||||
|
blog(LOG_ERROR, "[test_register_event_callback] Failed to register event callback!");
|
||||||
|
|
||||||
|
blog(LOG_INFO, "[test_register_event_callback] Test done.");
|
||||||
|
}
|
||||||
|
|
||||||
static void test_vendor_request_cb(obs_data_t *requestData, obs_data_t *responseData, void *priv_data)
|
static void test_vendor_request_cb(obs_data_t *requestData, obs_data_t *responseData, void *priv_data)
|
||||||
{
|
{
|
||||||
blog(LOG_INFO, "[test_vendor_request_cb] Request called!");
|
blog(LOG_INFO, "[test_vendor_request_cb] Request called! Request data: %s", obs_data_get_json(requestData));
|
||||||
|
|
||||||
blog(LOG_INFO, "[test_vendor_request_cb] Request data: %s", obs_data_get_json(requestData));
|
|
||||||
|
|
||||||
// Set an item to the response data
|
// Set an item to the response data
|
||||||
obs_data_set_string(responseData, "test", "pp");
|
obs_data_set_string(responseData, "test", "pp");
|
||||||
@ -193,36 +278,27 @@ static void test_vendor_request_cb(obs_data_t *requestData, obs_data_t *response
|
|||||||
obs_websocket_vendor_emit_event(priv_data, "TestEvent", requestData);
|
obs_websocket_vendor_emit_event(priv_data, "TestEvent", requestData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void obs_module_post_load()
|
void test_register_vendor()
|
||||||
{
|
{
|
||||||
blog(LOG_INFO, "[obs_module_post_load] Post load started.");
|
blog(LOG_INFO, "[test_register_vendor] Testing vendor registration...");
|
||||||
|
|
||||||
// Test plugin API version fetch
|
// Test plugin API version fetch
|
||||||
uint apiVersion = obs_websocket_get_api_version();
|
uint apiVersion = obs_websocket_get_api_version();
|
||||||
blog(LOG_INFO, "[obs_module_post_load] obs-websocket plugin API version: %u", apiVersion);
|
blog(LOG_INFO, "[test_register_vendor] obs-websocket plugin API version: %u", apiVersion);
|
||||||
|
|
||||||
// Test calling obs-websocket requests
|
|
||||||
struct obs_websocket_request_response *response = obs_websocket_call_request("GetVersion");
|
|
||||||
if (response) {
|
|
||||||
blog(LOG_INFO, "[obs_module_post_load] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s",
|
|
||||||
response->status_code, response->comment, response->response_data);
|
|
||||||
obs_websocket_request_response_free(response);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test vendor creation
|
// Test vendor creation
|
||||||
auto vendor = obs_websocket_register_vendor("obs-websocket-test");
|
auto vendor = obs_websocket_register_vendor("obs-websocket-test");
|
||||||
if (!vendor) {
|
if (!vendor) {
|
||||||
blog(LOG_WARNING, "[obs_module_post_load] Failed to create vendor!");
|
blog(LOG_ERROR, "[test_register_vendor] Failed to create vendor!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test vendor request registration
|
// Test vendor request registration
|
||||||
if (!obs_websocket_vendor_register_request(vendor, "TestRequest", test_vendor_request_cb, vendor)) {
|
if (!obs_websocket_vendor_register_request(vendor, "TestRequest", test_vendor_request_cb, vendor)) {
|
||||||
blog(LOG_WARNING, "[obs_module_post_load] Failed to register vendor request!");
|
blog(LOG_ERROR, "[test_register_vendor] Failed to register vendor request!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
blog(LOG_INFO, "[obs_module_post_load] Post load completed.");
|
blog(LOG_INFO, "[test_register_vendor] Test done.");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,6 +26,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "utils/Obs.h"
|
#include "utils/Obs.h"
|
||||||
#include "plugin-macros.generated.h"
|
#include "plugin-macros.generated.h"
|
||||||
|
|
||||||
|
#define CURRENT_RPC_VERSION 1
|
||||||
|
|
||||||
struct Config;
|
struct Config;
|
||||||
typedef std::shared_ptr<Config> ConfigPtr;
|
typedef std::shared_ptr<Config> ConfigPtr;
|
||||||
|
|
||||||
|
@ -31,17 +31,15 @@ struct SerialFrameBatch {
|
|||||||
json &variables;
|
json &variables;
|
||||||
bool haltOnFailure;
|
bool haltOnFailure;
|
||||||
|
|
||||||
size_t frameCount;
|
size_t frameCount = 0;
|
||||||
size_t sleepUntilFrame;
|
size_t sleepUntilFrame = 0;
|
||||||
std::mutex conditionMutex;
|
std::mutex conditionMutex;
|
||||||
std::condition_variable condition;
|
std::condition_variable condition;
|
||||||
|
|
||||||
SerialFrameBatch(RequestHandler &requestHandler, json &variables, bool haltOnFailure)
|
SerialFrameBatch(RequestHandler &requestHandler, json &variables, bool haltOnFailure)
|
||||||
: requestHandler(requestHandler),
|
: requestHandler(requestHandler),
|
||||||
variables(variables),
|
variables(variables),
|
||||||
haltOnFailure(haltOnFailure),
|
haltOnFailure(haltOnFailure)
|
||||||
frameCount(0),
|
|
||||||
sleepUntilFrame(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -51,6 +51,7 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"GetStreamServiceSettings", &RequestHandler::GetStreamServiceSettings},
|
{"GetStreamServiceSettings", &RequestHandler::GetStreamServiceSettings},
|
||||||
{"SetStreamServiceSettings", &RequestHandler::SetStreamServiceSettings},
|
{"SetStreamServiceSettings", &RequestHandler::SetStreamServiceSettings},
|
||||||
{"GetRecordDirectory", &RequestHandler::GetRecordDirectory},
|
{"GetRecordDirectory", &RequestHandler::GetRecordDirectory},
|
||||||
|
{"SetRecordDirectory", &RequestHandler::SetRecordDirectory},
|
||||||
|
|
||||||
// Sources
|
// Sources
|
||||||
{"GetSourceActive", &RequestHandler::GetSourceActive},
|
{"GetSourceActive", &RequestHandler::GetSourceActive},
|
||||||
@ -110,6 +111,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},
|
||||||
@ -124,6 +126,7 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"GetSceneItemList", &RequestHandler::GetSceneItemList},
|
{"GetSceneItemList", &RequestHandler::GetSceneItemList},
|
||||||
{"GetGroupSceneItemList", &RequestHandler::GetGroupSceneItemList},
|
{"GetGroupSceneItemList", &RequestHandler::GetGroupSceneItemList},
|
||||||
{"GetSceneItemId", &RequestHandler::GetSceneItemId},
|
{"GetSceneItemId", &RequestHandler::GetSceneItemId},
|
||||||
|
{"GetSceneItemSource", &RequestHandler::GetSceneItemSource},
|
||||||
{"CreateSceneItem", &RequestHandler::CreateSceneItem},
|
{"CreateSceneItem", &RequestHandler::CreateSceneItem},
|
||||||
{"RemoveSceneItem", &RequestHandler::RemoveSceneItem},
|
{"RemoveSceneItem", &RequestHandler::RemoveSceneItem},
|
||||||
{"DuplicateSceneItem", &RequestHandler::DuplicateSceneItem},
|
{"DuplicateSceneItem", &RequestHandler::DuplicateSceneItem},
|
||||||
@ -174,6 +177,8 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"ToggleRecordPause", &RequestHandler::ToggleRecordPause},
|
{"ToggleRecordPause", &RequestHandler::ToggleRecordPause},
|
||||||
{"PauseRecord", &RequestHandler::PauseRecord},
|
{"PauseRecord", &RequestHandler::PauseRecord},
|
||||||
{"ResumeRecord", &RequestHandler::ResumeRecord},
|
{"ResumeRecord", &RequestHandler::ResumeRecord},
|
||||||
|
{"SplitRecordFile", &RequestHandler::SplitRecordFile},
|
||||||
|
{"CreateRecordChapter", &RequestHandler::CreateRecordChapter},
|
||||||
|
|
||||||
// Media Inputs
|
// Media Inputs
|
||||||
{"GetMediaInputStatus", &RequestHandler::GetMediaInputStatus},
|
{"GetMediaInputStatus", &RequestHandler::GetMediaInputStatus},
|
||||||
@ -220,9 +225,8 @@ RequestResult RequestHandler::ProcessRequest(const Request &request)
|
|||||||
std::vector<std::string> RequestHandler::GetRequestList()
|
std::vector<std::string> RequestHandler::GetRequestList()
|
||||||
{
|
{
|
||||||
std::vector<std::string> ret;
|
std::vector<std::string> ret;
|
||||||
for (auto const &[key, val] : _handlerMap) {
|
for (auto const &[key, val] : _handlerMap)
|
||||||
ret.push_back(key);
|
ret.push_back(key);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ private:
|
|||||||
RequestResult GetStreamServiceSettings(const Request &);
|
RequestResult GetStreamServiceSettings(const Request &);
|
||||||
RequestResult SetStreamServiceSettings(const Request &);
|
RequestResult SetStreamServiceSettings(const Request &);
|
||||||
RequestResult GetRecordDirectory(const Request &);
|
RequestResult GetRecordDirectory(const Request &);
|
||||||
|
RequestResult SetRecordDirectory(const Request &);
|
||||||
|
|
||||||
// Sources
|
// Sources
|
||||||
RequestResult GetSourceActive(const Request &);
|
RequestResult GetSourceActive(const Request &);
|
||||||
@ -129,6 +130,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 &);
|
||||||
@ -143,6 +145,7 @@ private:
|
|||||||
RequestResult GetSceneItemList(const Request &);
|
RequestResult GetSceneItemList(const Request &);
|
||||||
RequestResult GetGroupSceneItemList(const Request &);
|
RequestResult GetGroupSceneItemList(const Request &);
|
||||||
RequestResult GetSceneItemId(const Request &);
|
RequestResult GetSceneItemId(const Request &);
|
||||||
|
RequestResult GetSceneItemSource(const Request &);
|
||||||
RequestResult CreateSceneItem(const Request &);
|
RequestResult CreateSceneItem(const Request &);
|
||||||
RequestResult RemoveSceneItem(const Request &);
|
RequestResult RemoveSceneItem(const Request &);
|
||||||
RequestResult DuplicateSceneItem(const Request &);
|
RequestResult DuplicateSceneItem(const Request &);
|
||||||
@ -193,6 +196,8 @@ private:
|
|||||||
RequestResult ToggleRecordPause(const Request &);
|
RequestResult ToggleRecordPause(const Request &);
|
||||||
RequestResult PauseRecord(const Request &);
|
RequestResult PauseRecord(const Request &);
|
||||||
RequestResult ResumeRecord(const Request &);
|
RequestResult ResumeRecord(const Request &);
|
||||||
|
RequestResult SplitRecordFile(const Request &);
|
||||||
|
RequestResult CreateRecordChapter(const Request &);
|
||||||
|
|
||||||
// Media Inputs
|
// Media Inputs
|
||||||
RequestResult GetMediaInputStatus(const Request &);
|
RequestResult GetMediaInputStatus(const Request &);
|
||||||
|
@ -22,6 +22,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "RequestHandler.h"
|
#include "RequestHandler.h"
|
||||||
|
|
||||||
|
#define GLOBAL_PERSISTENT_DATA_FILE_NAME "persistent_data.json"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the value of a "slot" from the selected persistent data realm.
|
* Gets the value of a "slot" from the selected persistent data realm.
|
||||||
*
|
*
|
||||||
@ -47,11 +49,11 @@ RequestResult RequestHandler::GetPersistentData(const Request &request)
|
|||||||
std::string realm = request.RequestData["realm"];
|
std::string realm = request.RequestData["realm"];
|
||||||
std::string slotName = request.RequestData["slotName"];
|
std::string slotName = request.RequestData["slotName"];
|
||||||
|
|
||||||
std::string persistentDataPath = Utils::Obs::StringHelper::GetCurrentProfilePath();
|
std::string persistentDataPath;
|
||||||
if (realm == "OBS_WEBSOCKET_DATA_REALM_GLOBAL")
|
if (realm == "OBS_WEBSOCKET_DATA_REALM_GLOBAL")
|
||||||
persistentDataPath += "/../../../obsWebSocketPersistentData.json";
|
persistentDataPath = Utils::Obs::StringHelper::GetModuleConfigPath(GLOBAL_PERSISTENT_DATA_FILE_NAME);
|
||||||
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
||||||
persistentDataPath += "/obsWebSocketPersistentData.json";
|
persistentDataPath = Utils::Obs::StringHelper::GetCurrentProfilePath() + "/obsWebSocketPersistentData.json";
|
||||||
else
|
else
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
||||||
"You have specified an invalid persistent data realm.");
|
"You have specified an invalid persistent data realm.");
|
||||||
@ -92,16 +94,16 @@ RequestResult RequestHandler::SetPersistentData(const Request &request)
|
|||||||
std::string slotName = request.RequestData["slotName"];
|
std::string slotName = request.RequestData["slotName"];
|
||||||
json slotValue = request.RequestData["slotValue"];
|
json slotValue = request.RequestData["slotValue"];
|
||||||
|
|
||||||
std::string persistentDataPath = Utils::Obs::StringHelper::GetCurrentProfilePath();
|
std::string persistentDataPath;
|
||||||
if (realm == "OBS_WEBSOCKET_DATA_REALM_GLOBAL")
|
if (realm == "OBS_WEBSOCKET_DATA_REALM_GLOBAL")
|
||||||
persistentDataPath += "/../../../obsWebSocketPersistentData.json";
|
persistentDataPath = Utils::Obs::StringHelper::GetModuleConfigPath(GLOBAL_PERSISTENT_DATA_FILE_NAME);
|
||||||
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
||||||
persistentDataPath += "/obsWebSocketPersistentData.json";
|
persistentDataPath = Utils::Obs::StringHelper::GetCurrentProfilePath() + "/obsWebSocketPersistentData.json";
|
||||||
else
|
else
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
||||||
"You have specified an invalid persistent data realm.");
|
"You have specified an invalid persistent data realm.");
|
||||||
|
|
||||||
json persistentData = json::object();
|
json persistentData;
|
||||||
Utils::Json::GetJsonFileContent(persistentDataPath, persistentData);
|
Utils::Json::GetJsonFileContent(persistentDataPath, persistentData);
|
||||||
persistentData[slotName] = slotValue;
|
persistentData[slotName] = slotValue;
|
||||||
if (!Utils::Json::SetJsonFileContent(persistentDataPath, persistentData))
|
if (!Utils::Json::SetJsonFileContent(persistentDataPath, persistentData))
|
||||||
@ -198,10 +200,7 @@ RequestResult RequestHandler::CreateSceneCollection(const Request &request)
|
|||||||
if (std::find(sceneCollections.begin(), sceneCollections.end(), sceneCollectionName) != sceneCollections.end())
|
if (std::find(sceneCollections.begin(), sceneCollections.end(), sceneCollectionName) != sceneCollections.end())
|
||||||
return RequestResult::Error(RequestStatus::ResourceAlreadyExists);
|
return RequestResult::Error(RequestStatus::ResourceAlreadyExists);
|
||||||
|
|
||||||
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
bool success = obs_frontend_add_scene_collection(sceneCollectionName.c_str());
|
||||||
bool success = false;
|
|
||||||
QMetaObject::invokeMethod(mainWindow, "AddSceneCollection", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success),
|
|
||||||
Q_ARG(bool, true), Q_ARG(QString, QString::fromStdString(sceneCollectionName)));
|
|
||||||
if (!success)
|
if (!success)
|
||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene collection.");
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene collection.");
|
||||||
|
|
||||||
@ -599,9 +598,9 @@ RequestResult RequestHandler::SetStreamServiceSettings(const Request &request)
|
|||||||
|
|
||||||
obs_service_update(currentStreamService, newStreamServiceSettings);
|
obs_service_update(currentStreamService, newStreamServiceSettings);
|
||||||
} else {
|
} else {
|
||||||
// TODO: This leaks memory. I have no idea why.
|
OBSServiceAutoRelease newStreamService = obs_service_create(requestedStreamServiceType.c_str(),
|
||||||
OBSService newStreamService = obs_service_create(requestedStreamServiceType.c_str(), "obs_websocket_custom_service",
|
"obs_websocket_custom_service",
|
||||||
requestedStreamServiceSettings, nullptr);
|
requestedStreamServiceSettings, nullptr);
|
||||||
// TODO: Check service type here, instead of relying on service creation to fail.
|
// TODO: Check service type here, instead of relying on service creation to fail.
|
||||||
if (!newStreamService)
|
if (!newStreamService)
|
||||||
return RequestResult::Error(
|
return RequestResult::Error(
|
||||||
@ -622,7 +621,7 @@ RequestResult RequestHandler::SetStreamServiceSettings(const Request &request)
|
|||||||
* @responseField recordDirectory | String | Output directory
|
* @responseField recordDirectory | String | Output directory
|
||||||
*
|
*
|
||||||
* @requestType GetRecordDirectory
|
* @requestType GetRecordDirectory
|
||||||
* @complexity 1
|
* @complexity 2
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
* @initialVersion 5.0.0
|
* @initialVersion 5.0.0
|
||||||
* @api requests
|
* @api requests
|
||||||
@ -635,3 +634,35 @@ RequestResult RequestHandler::GetRecordDirectory(const Request &)
|
|||||||
|
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current directory that the record output writes files to.
|
||||||
|
*
|
||||||
|
* @requestField recordDirectory | String | Output directory
|
||||||
|
*
|
||||||
|
* @requestType SetRecordDirectory
|
||||||
|
* @complexity 2
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.3.0
|
||||||
|
* @api requests
|
||||||
|
* @category config
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::SetRecordDirectory(const Request &request)
|
||||||
|
{
|
||||||
|
if (obs_frontend_recording_active())
|
||||||
|
return RequestResult::Error(RequestStatus::OutputRunning);
|
||||||
|
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
if (!request.ValidateString("recordDirectory", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
std::string recordDirectory = request.RequestData["recordDirectory"];
|
||||||
|
|
||||||
|
config_t *config = obs_frontend_get_profile_config();
|
||||||
|
config_set_string(config, "AdvOut", "RecFilePath", recordDirectory.c_str());
|
||||||
|
config_set_string(config, "SimpleOutput", "FilePath", recordDirectory.c_str());
|
||||||
|
config_save(config);
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
@ -19,10 +19,32 @@ 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.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source
|
* @requestField ?sourceName | String | Name of the source
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source
|
||||||
*
|
*
|
||||||
* @responseField filters | Array<Object> | Array of filters
|
* @responseField filters | Array<Object> | Array of filters
|
||||||
*
|
*
|
||||||
@ -37,7 +59,7 @@ RequestResult RequestHandler::GetSourceFilterList(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -85,7 +107,8 @@ RequestResult RequestHandler::GetSourceFilterDefaultSettings(const Request &requ
|
|||||||
/**
|
/**
|
||||||
* Creates a new filter, adding it to the specified source.
|
* Creates a new filter, adding it to the specified source.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source to add the filter to
|
* @requestField ?sourceName | String | Name of the source to add the filter to
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source to add the filter to
|
||||||
* @requestField filterName | String | Name of the new filter to be created
|
* @requestField filterName | String | Name of the new filter to be created
|
||||||
* @requestField filterKind | String | The kind of filter to be created
|
* @requestField filterKind | String | The kind of filter to be created
|
||||||
* @requestField ?filterSettings | Object | Settings object to initialize the filter with | Default settings used
|
* @requestField ?filterSettings | Object | Settings object to initialize the filter with | Default settings used
|
||||||
@ -102,7 +125,7 @@ RequestResult RequestHandler::CreateSourceFilter(const Request &request)
|
|||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
|
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!(source && request.ValidateString("filterName", statusCode, comment) &&
|
if (!(source && request.ValidateString("filterName", statusCode, comment) &&
|
||||||
request.ValidateString("filterKind", statusCode, comment)))
|
request.ValidateString("filterKind", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
@ -138,8 +161,9 @@ RequestResult RequestHandler::CreateSourceFilter(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Removes a filter from a source.
|
* Removes a filter from a source.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source the filter is on
|
* @requestField ?sourceName | String | Name of the source the filter is on
|
||||||
* @requestField filterName | String | Name of the filter to remove
|
* @requestField ?sourceUuid | String | UUID of the source the filter is on
|
||||||
|
* @requestField filterName | String | Name of the filter to remove
|
||||||
*
|
*
|
||||||
* @requestType RemoveSourceFilter
|
* @requestType RemoveSourceFilter
|
||||||
* @complexity 2
|
* @complexity 2
|
||||||
@ -152,7 +176,7 @@ RequestResult RequestHandler::RemoveSourceFilter(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
FilterPair pair = request.ValidateFilter("sourceName", "filterName", statusCode, comment);
|
FilterPair pair = request.ValidateFilter(statusCode, comment);
|
||||||
if (!pair.filter)
|
if (!pair.filter)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -164,7 +188,8 @@ RequestResult RequestHandler::RemoveSourceFilter(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the name of a source filter (rename).
|
* Sets the name of a source filter (rename).
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source the filter is on
|
* @requestField ?sourceName | String | Name of the source the filter is on
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source the filter is on
|
||||||
* @requestField filterName | String | Current name of the filter
|
* @requestField filterName | String | Current name of the filter
|
||||||
* @requestField newFilterName | String | New name for the filter
|
* @requestField newFilterName | String | New name for the filter
|
||||||
*
|
*
|
||||||
@ -179,7 +204,7 @@ RequestResult RequestHandler::SetSourceFilterName(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
FilterPair pair = request.ValidateFilter("sourceName", "filterName", statusCode, comment);
|
FilterPair pair = request.ValidateFilter(statusCode, comment);
|
||||||
if (!pair.filter || !request.ValidateString("newFilterName", statusCode, comment))
|
if (!pair.filter || !request.ValidateString("newFilterName", statusCode, comment))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -197,8 +222,9 @@ RequestResult RequestHandler::SetSourceFilterName(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Gets the info for a specific source filter.
|
* Gets the info for a specific source filter.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source
|
* @requestField ?sourceName | String | Name of the source
|
||||||
* @requestField filterName | String | Name of the filter
|
* @requestField ?sourceUuid | String | UUID of the source
|
||||||
|
* @requestField filterName | String | Name of the filter
|
||||||
*
|
*
|
||||||
* @responseField filterEnabled | Boolean | Whether the filter is enabled
|
* @responseField filterEnabled | Boolean | Whether the filter is enabled
|
||||||
* @responseField filterIndex | Number | Index of the filter in the list, beginning at 0
|
* @responseField filterIndex | Number | Index of the filter in the list, beginning at 0
|
||||||
@ -216,7 +242,7 @@ RequestResult RequestHandler::GetSourceFilter(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
FilterPair pair = request.ValidateFilter("sourceName", "filterName", statusCode, comment);
|
FilterPair pair = request.ValidateFilter(statusCode, comment);
|
||||||
if (!pair.filter)
|
if (!pair.filter)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -236,7 +262,8 @@ RequestResult RequestHandler::GetSourceFilter(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the index position of a filter on a source.
|
* Sets the index position of a filter on a source.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source the filter is on
|
* @requestField ?sourceName | String | Name of the source the filter is on
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source the filter is on
|
||||||
* @requestField filterName | String | Name of the filter
|
* @requestField filterName | String | Name of the filter
|
||||||
* @requestField filterIndex | Number | New index position of the filter | >= 0
|
* @requestField filterIndex | Number | New index position of the filter | >= 0
|
||||||
*
|
*
|
||||||
@ -251,7 +278,7 @@ RequestResult RequestHandler::SetSourceFilterIndex(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
FilterPair pair = request.ValidateFilter("sourceName", "filterName", statusCode, comment);
|
FilterPair pair = request.ValidateFilter(statusCode, comment);
|
||||||
if (!(pair.filter && request.ValidateNumber("filterIndex", statusCode, comment, 0, 8192)))
|
if (!(pair.filter && request.ValidateNumber("filterIndex", statusCode, comment, 0, 8192)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -265,7 +292,8 @@ RequestResult RequestHandler::SetSourceFilterIndex(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the settings of a source filter.
|
* Sets the settings of a source filter.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source the filter is on
|
* @requestField ?sourceName | String | Name of the source the filter is on
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source the filter is on
|
||||||
* @requestField filterName | String | Name of the filter to set the settings of
|
* @requestField filterName | String | Name of the filter to set the settings of
|
||||||
* @requestField filterSettings | Object | Object of settings to apply
|
* @requestField filterSettings | Object | Object of settings to apply
|
||||||
* @requestField ?overlay | Boolean | True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings. | true
|
* @requestField ?overlay | Boolean | True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings. | true
|
||||||
@ -281,7 +309,7 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
FilterPair pair = request.ValidateFilter("sourceName", "filterName", statusCode, comment);
|
FilterPair pair = request.ValidateFilter(statusCode, comment);
|
||||||
if (!(pair.filter && request.ValidateObject("filterSettings", statusCode, comment, true)))
|
if (!(pair.filter && request.ValidateObject("filterSettings", statusCode, comment, true)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -313,7 +341,8 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the enable state of a source filter.
|
* Sets the enable state of a source filter.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source the filter is on
|
* @requestField ?sourceName | String | Name of the source the filter is on
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source the filter is on
|
||||||
* @requestField filterName | String | Name of the filter
|
* @requestField filterName | String | Name of the filter
|
||||||
* @requestField filterEnabled | Boolean | New enable state of the filter
|
* @requestField filterEnabled | Boolean | New enable state of the filter
|
||||||
*
|
*
|
||||||
@ -328,7 +357,7 @@ RequestResult RequestHandler::SetSourceFilterEnabled(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
FilterPair pair = request.ValidateFilter("sourceName", "filterName", statusCode, comment);
|
FilterPair pair = request.ValidateFilter(statusCode, comment);
|
||||||
if (!(pair.filter && request.ValidateBoolean("filterEnabled", statusCode, comment)))
|
if (!(pair.filter && request.ValidateBoolean("filterEnabled", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -211,12 +211,14 @@ RequestResult RequestHandler::CallVendorRequest(const Request &request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets an array of all hotkey names in OBS
|
* Gets an array of all hotkey names in OBS.
|
||||||
|
*
|
||||||
|
* Note: Hotkey functionality in obs-websocket comes as-is, and we do not guarantee support if things are broken. In 9/10 usages of hotkey requests, there exists a better, more reliable method via other requests.
|
||||||
*
|
*
|
||||||
* @responseField hotkeys | Array<String> | Array of hotkey names
|
* @responseField hotkeys | Array<String> | Array of hotkey names
|
||||||
*
|
*
|
||||||
* @requestType GetHotkeyList
|
* @requestType GetHotkeyList
|
||||||
* @complexity 3
|
* @complexity 4
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
* @initialVersion 5.0.0
|
* @initialVersion 5.0.0
|
||||||
* @category general
|
* @category general
|
||||||
@ -230,12 +232,15 @@ RequestResult RequestHandler::GetHotkeyList(const Request &)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers a hotkey using its name. See `GetHotkeyList`
|
* Triggers a hotkey using its name. See `GetHotkeyList`.
|
||||||
|
*
|
||||||
|
* Note: Hotkey functionality in obs-websocket comes as-is, and we do not guarantee support if things are broken. In 9/10 usages of hotkey requests, there exists a better, more reliable method via other requests.
|
||||||
*
|
*
|
||||||
* @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 4
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
* @initialVersion 5.0.0
|
* @initialVersion 5.0.0
|
||||||
* @category general
|
* @category general
|
||||||
@ -248,11 +253,20 @@ 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.");
|
||||||
|
|
||||||
obs_hotkey_trigger_routed_callback(obs_hotkey_get_id(hotkey), true);
|
obs_hotkey_trigger_routed_callback(obs_hotkey_get_id(hotkey), true);
|
||||||
|
obs_hotkey_trigger_routed_callback(obs_hotkey_get_id(hotkey), false);
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
}
|
}
|
||||||
@ -260,6 +274,8 @@ RequestResult RequestHandler::TriggerHotkeyByName(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Triggers a hotkey using a sequence of keys.
|
* Triggers a hotkey using a sequence of keys.
|
||||||
*
|
*
|
||||||
|
* Note: Hotkey functionality in obs-websocket comes as-is, and we do not guarantee support if things are broken. In 9/10 usages of hotkey requests, there exists a better, more reliable method via other requests.
|
||||||
|
*
|
||||||
* @requestField ?keyId | String | The OBS key ID to use. See https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h | Not pressed
|
* @requestField ?keyId | String | The OBS key ID to use. See https://github.com/obsproject/obs-studio/blob/master/libobs/obs-hotkeys.h | Not pressed
|
||||||
* @requestField ?keyModifiers | Object | Object containing key modifiers to apply | Ignored
|
* @requestField ?keyModifiers | Object | Object containing key modifiers to apply | Ignored
|
||||||
* @requestField ?keyModifiers.shift | Boolean | Press Shift | Not pressed
|
* @requestField ?keyModifiers.shift | Boolean | Press Shift | Not pressed
|
||||||
|
@ -123,12 +123,14 @@ RequestResult RequestHandler::GetSpecialInputs(const Request &)
|
|||||||
/**
|
/**
|
||||||
* Creates a new input, adding it as a scene item to the specified scene.
|
* Creates a new input, adding it as a scene item to the specified scene.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene to add the input to as a scene item
|
* @requestField ?sceneName | String | Name of the scene to add the input to as a scene item
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene to add the input to as a scene item
|
||||||
* @requestField inputName | String | Name of the new input to created
|
* @requestField inputName | String | Name of the new input to created
|
||||||
* @requestField inputKind | String | The kind of input to be created
|
* @requestField inputKind | String | The kind of input to be created
|
||||||
* @requestField ?inputSettings | Object | Settings object to initialize the input with | Default settings used
|
* @requestField ?inputSettings | Object | Settings object to initialize the input with | Default settings used
|
||||||
* @requestField ?sceneItemEnabled | Boolean | Whether to set the created scene item to enabled or disabled | True
|
* @requestField ?sceneItemEnabled | Boolean | Whether to set the created scene item to enabled or disabled | True
|
||||||
*
|
*
|
||||||
|
* @responseField inputUuid | String | UUID of the newly created input
|
||||||
* @responseField sceneItemId | Number | ID of the newly created scene item
|
* @responseField sceneItemId | Number | ID of the newly created scene item
|
||||||
*
|
*
|
||||||
* @requestType CreateInput
|
* @requestType CreateInput
|
||||||
@ -142,7 +144,7 @@ RequestResult RequestHandler::CreateInput(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease sceneSource = request.ValidateScene(statusCode, comment);
|
||||||
if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) &&
|
if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) &&
|
||||||
request.ValidateString("inputKind", statusCode, comment)))
|
request.ValidateString("inputKind", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
@ -185,6 +187,7 @@ RequestResult RequestHandler::CreateInput(const Request &request)
|
|||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Creation of the input or scene item failed.");
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Creation of the input or scene item failed.");
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
|
responseData["inputUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem));
|
||||||
responseData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
responseData["sceneItemId"] = obs_sceneitem_get_id(sceneItem);
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
@ -194,7 +197,8 @@ RequestResult RequestHandler::CreateInput(const Request &request)
|
|||||||
*
|
*
|
||||||
* Note: Will immediately remove all associated scene items.
|
* Note: Will immediately remove all associated scene items.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to remove
|
* @requestField ?inputName | String | Name of the input to remove
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to remove
|
||||||
*
|
*
|
||||||
* @requestType RemoveInput
|
* @requestType RemoveInput
|
||||||
* @complexity 2
|
* @complexity 2
|
||||||
@ -207,7 +211,7 @@ RequestResult RequestHandler::RemoveInput(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -222,7 +226,8 @@ RequestResult RequestHandler::RemoveInput(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the name of an input (rename).
|
* Sets the name of an input (rename).
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Current input name
|
* @requestField ?inputName | String | Current input name
|
||||||
|
* @requestField ?inputUuid | String | Current input UUID
|
||||||
* @requestField newInputName | String | New name for the input
|
* @requestField newInputName | String | New name for the input
|
||||||
*
|
*
|
||||||
* @requestType SetInputName
|
* @requestType SetInputName
|
||||||
@ -236,7 +241,7 @@ RequestResult RequestHandler::SetInputName(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateString("newInputName", statusCode, comment)))
|
if (!(input && request.ValidateString("newInputName", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -292,7 +297,8 @@ RequestResult RequestHandler::GetInputDefaultSettings(const Request &request)
|
|||||||
*
|
*
|
||||||
* Note: Does not include defaults. To create the entire settings object, overlay `inputSettings` over the `defaultInputSettings` provided by `GetInputDefaultSettings`.
|
* Note: Does not include defaults. To create the entire settings object, overlay `inputSettings` over the `defaultInputSettings` provided by `GetInputDefaultSettings`.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to get the settings of
|
* @requestField ?inputName | String | Name of the input to get the settings of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to get the settings of
|
||||||
*
|
*
|
||||||
* @responseField inputSettings | Object | Object of settings for the input
|
* @responseField inputSettings | Object | Object of settings for the input
|
||||||
* @responseField inputKind | String | The kind of the input
|
* @responseField inputKind | String | The kind of the input
|
||||||
@ -308,7 +314,7 @@ RequestResult RequestHandler::GetInputSettings(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -323,7 +329,8 @@ RequestResult RequestHandler::GetInputSettings(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the settings of an input.
|
* Sets the settings of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to set the settings of
|
* @requestField ?inputName | String | Name of the input to set the settings of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to set the settings of
|
||||||
* @requestField inputSettings | Object | Object of settings to apply
|
* @requestField inputSettings | Object | Object of settings to apply
|
||||||
* @requestField ?overlay | Boolean | True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings. | true
|
* @requestField ?overlay | Boolean | True == apply the settings on top of existing ones, False == reset the input to its defaults, then apply settings. | true
|
||||||
*
|
*
|
||||||
@ -338,7 +345,7 @@ RequestResult RequestHandler::SetInputSettings(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateObject("inputSettings", statusCode, comment, true)))
|
if (!(input && request.ValidateObject("inputSettings", statusCode, comment, true)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -373,7 +380,8 @@ RequestResult RequestHandler::SetInputSettings(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Gets the audio mute state of an input.
|
* Gets the audio mute state of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of input to get the mute state of
|
* @requestField ?inputName | String | Name of input to get the mute state of
|
||||||
|
* @requestField ?inputUuid | String | UUID of input to get the mute state of
|
||||||
*
|
*
|
||||||
* @responseField inputMuted | Boolean | Whether the input is muted
|
* @responseField inputMuted | Boolean | Whether the input is muted
|
||||||
*
|
*
|
||||||
@ -388,7 +396,7 @@ RequestResult RequestHandler::GetInputMute(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -403,7 +411,8 @@ RequestResult RequestHandler::GetInputMute(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the audio mute state of an input.
|
* Sets the audio mute state of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to set the mute state of
|
* @requestField ?inputName | String | Name of the input to set the mute state of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to set the mute state of
|
||||||
* @requestField inputMuted | Boolean | Whether to mute the input or not
|
* @requestField inputMuted | Boolean | Whether to mute the input or not
|
||||||
*
|
*
|
||||||
* @requestType SetInputMute
|
* @requestType SetInputMute
|
||||||
@ -417,7 +426,7 @@ RequestResult RequestHandler::SetInputMute(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment)))
|
if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -432,7 +441,8 @@ RequestResult RequestHandler::SetInputMute(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Toggles the audio mute state of an input.
|
* Toggles the audio mute state of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to toggle the mute state of
|
* @requestField ?inputName | String | Name of the input to toggle the mute state of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to toggle the mute state of
|
||||||
*
|
*
|
||||||
* @responseField inputMuted | Boolean | Whether the input has been muted or unmuted
|
* @responseField inputMuted | Boolean | Whether the input has been muted or unmuted
|
||||||
*
|
*
|
||||||
@ -447,7 +457,7 @@ RequestResult RequestHandler::ToggleInputMute(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -465,7 +475,8 @@ RequestResult RequestHandler::ToggleInputMute(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Gets the current volume setting of an input.
|
* Gets the current volume setting of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to get the volume of
|
* @requestField ?inputName | String | Name of the input to get the volume of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to get the volume of
|
||||||
*
|
*
|
||||||
* @responseField inputVolumeMul | Number | Volume setting in mul
|
* @responseField inputVolumeMul | Number | Volume setting in mul
|
||||||
* @responseField inputVolumeDb | Number | Volume setting in dB
|
* @responseField inputVolumeDb | Number | Volume setting in dB
|
||||||
@ -481,7 +492,7 @@ RequestResult RequestHandler::GetInputVolume(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -502,7 +513,8 @@ RequestResult RequestHandler::GetInputVolume(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the volume setting of an input.
|
* Sets the volume setting of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to set the volume of
|
* @requestField ?inputName | String | Name of the input to set the volume of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to set the volume of
|
||||||
* @requestField ?inputVolumeMul | Number | Volume setting in mul | >= 0, <= 20 | `inputVolumeDb` should be specified
|
* @requestField ?inputVolumeMul | Number | Volume setting in mul | >= 0, <= 20 | `inputVolumeDb` should be specified
|
||||||
* @requestField ?inputVolumeDb | Number | Volume setting in dB | >= -100, <= 26 | `inputVolumeMul` should be specified
|
* @requestField ?inputVolumeDb | Number | Volume setting in dB | >= -100, <= 26 | `inputVolumeMul` should be specified
|
||||||
*
|
*
|
||||||
@ -517,7 +529,7 @@ RequestResult RequestHandler::SetInputVolume(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -552,7 +564,8 @@ RequestResult RequestHandler::SetInputVolume(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Gets the audio balance of an input.
|
* Gets the audio balance of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to get the audio balance of
|
* @requestField ?inputName | String | Name of the input to get the audio balance of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to get the audio balance of
|
||||||
*
|
*
|
||||||
* @responseField inputAudioBalance | Number | Audio balance value from 0.0-1.0
|
* @responseField inputAudioBalance | Number | Audio balance value from 0.0-1.0
|
||||||
*
|
*
|
||||||
@ -567,7 +580,7 @@ RequestResult RequestHandler::GetInputAudioBalance(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -583,7 +596,8 @@ RequestResult RequestHandler::GetInputAudioBalance(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the audio balance of an input.
|
* Sets the audio balance of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to set the audio balance of
|
* @requestField ?inputName | String | Name of the input to set the audio balance of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to set the audio balance of
|
||||||
* @requestField inputAudioBalance | Number | New audio balance value | >= 0.0, <= 1.0
|
* @requestField inputAudioBalance | Number | New audio balance value | >= 0.0, <= 1.0
|
||||||
*
|
*
|
||||||
* @requestType SetInputAudioBalance
|
* @requestType SetInputAudioBalance
|
||||||
@ -597,7 +611,7 @@ RequestResult RequestHandler::SetInputAudioBalance(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0)))
|
if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -615,7 +629,8 @@ RequestResult RequestHandler::SetInputAudioBalance(const Request &request)
|
|||||||
*
|
*
|
||||||
* Note: The audio sync offset can be negative too!
|
* Note: The audio sync offset can be negative too!
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to get the audio sync offset of
|
* @requestField ?inputName | String | Name of the input to get the audio sync offset of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to get the audio sync offset of
|
||||||
*
|
*
|
||||||
* @responseField inputAudioSyncOffset | Number | Audio sync offset in milliseconds
|
* @responseField inputAudioSyncOffset | Number | Audio sync offset in milliseconds
|
||||||
*
|
*
|
||||||
@ -630,7 +645,7 @@ RequestResult RequestHandler::GetInputAudioSyncOffset(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -647,7 +662,8 @@ RequestResult RequestHandler::GetInputAudioSyncOffset(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the audio sync offset of an input.
|
* Sets the audio sync offset of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to set the audio sync offset of
|
* @requestField ?inputName | String | Name of the input to set the audio sync offset of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to set the audio sync offset of
|
||||||
* @requestField inputAudioSyncOffset | Number | New audio sync offset in milliseconds | >= -950, <= 20000
|
* @requestField inputAudioSyncOffset | Number | New audio sync offset in milliseconds | >= -950, <= 20000
|
||||||
*
|
*
|
||||||
* @requestType SetInputAudioSyncOffset
|
* @requestType SetInputAudioSyncOffset
|
||||||
@ -661,7 +677,7 @@ RequestResult RequestHandler::SetInputAudioSyncOffset(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000)))
|
if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -683,7 +699,8 @@ RequestResult RequestHandler::SetInputAudioSyncOffset(const Request &request)
|
|||||||
* - `OBS_MONITORING_TYPE_MONITOR_ONLY`
|
* - `OBS_MONITORING_TYPE_MONITOR_ONLY`
|
||||||
* - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`
|
* - `OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT`
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to get the audio monitor type of
|
* @requestField ?inputName | String | Name of the input to get the audio monitor type of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to get the audio monitor type of
|
||||||
*
|
*
|
||||||
* @responseField monitorType | String | Audio monitor type
|
* @responseField monitorType | String | Audio monitor type
|
||||||
*
|
*
|
||||||
@ -698,7 +715,7 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -714,7 +731,8 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the audio monitor type of an input.
|
* Sets the audio monitor type of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to set the audio monitor type of
|
* @requestField ?inputName | String | Name of the input to set the audio monitor type of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to set the audio monitor type of
|
||||||
* @requestField monitorType | String | Audio monitor type
|
* @requestField monitorType | String | Audio monitor type
|
||||||
*
|
*
|
||||||
* @requestType SetInputAudioMonitorType
|
* @requestType SetInputAudioMonitorType
|
||||||
@ -728,7 +746,7 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateString("monitorType", statusCode, comment)))
|
if (!(input && request.ValidateString("monitorType", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -759,7 +777,8 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Gets the enable state of all audio tracks of an input.
|
* Gets the enable state of all audio tracks of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input
|
* @requestField ?inputName | String | Name of the input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input
|
||||||
*
|
*
|
||||||
* @responseField inputAudioTracks | Object | Object of audio tracks and associated enable states
|
* @responseField inputAudioTracks | Object | Object of audio tracks and associated enable states
|
||||||
*
|
*
|
||||||
@ -774,7 +793,7 @@ RequestResult RequestHandler::GetInputAudioTracks(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -797,7 +816,8 @@ RequestResult RequestHandler::GetInputAudioTracks(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the enable state of audio tracks of an input.
|
* Sets the enable state of audio tracks of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input
|
* @requestField ?inputName | String | Name of the input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input
|
||||||
* @requestField inputAudioTracks | Object | Track settings to apply
|
* @requestField inputAudioTracks | Object | Track settings to apply
|
||||||
*
|
*
|
||||||
* @requestType SetInputAudioTracks
|
* @requestType SetInputAudioTracks
|
||||||
@ -811,7 +831,7 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input || !request.ValidateObject("inputAudioTracks", statusCode, comment))
|
if (!input || !request.ValidateObject("inputAudioTracks", statusCode, comment))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -851,7 +871,8 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request &request)
|
|||||||
*
|
*
|
||||||
* Note: Use this in cases where an input provides a dynamic, selectable list of items. For example, display capture, where it provides a list of available displays.
|
* Note: Use this in cases where an input provides a dynamic, selectable list of items. For example, display capture, where it provides a list of available displays.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input
|
* @requestField ?inputName | String | Name of the input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input
|
||||||
* @requestField propertyName | String | Name of the list property to get the items of
|
* @requestField propertyName | String | Name of the list property to get the items of
|
||||||
*
|
*
|
||||||
* @responseField propertyItems | Array<Object> | Array of items in the list property
|
* @responseField propertyItems | Array<Object> | Array of items in the list property
|
||||||
@ -867,7 +888,7 @@ RequestResult RequestHandler::GetInputPropertiesListPropertyItems(const Request
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateString("propertyName", statusCode, comment)))
|
if (!(input && request.ValidateString("propertyName", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -895,7 +916,8 @@ RequestResult RequestHandler::GetInputPropertiesListPropertyItems(const Request
|
|||||||
*
|
*
|
||||||
* Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button.
|
* Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input
|
* @requestField ?inputName | String | Name of the input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input
|
||||||
* @requestField propertyName | String | Name of the button property to press
|
* @requestField propertyName | String | Name of the button property to press
|
||||||
*
|
*
|
||||||
* @requestType PressInputPropertiesButton
|
* @requestType PressInputPropertiesButton
|
||||||
@ -909,7 +931,7 @@ RequestResult RequestHandler::PressInputPropertiesButton(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateString("propertyName", statusCode, comment)))
|
if (!(input && request.ValidateString("propertyName", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -39,7 +39,8 @@ bool IsMediaTimeValid(obs_source_t *input)
|
|||||||
* - `OBS_MEDIA_STATE_ENDED`
|
* - `OBS_MEDIA_STATE_ENDED`
|
||||||
* - `OBS_MEDIA_STATE_ERROR`
|
* - `OBS_MEDIA_STATE_ERROR`
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the media input
|
* @requestField ?inputName | String | Name of the media input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the media input
|
||||||
*
|
*
|
||||||
* @responseField mediaState | String | State of the media input
|
* @responseField mediaState | String | State of the media input
|
||||||
* @responseField mediaDuration | Number | Total duration of the playing media in milliseconds. `null` if not playing
|
* @responseField mediaDuration | Number | Total duration of the playing media in milliseconds. `null` if not playing
|
||||||
@ -56,7 +57,7 @@ RequestResult RequestHandler::GetMediaInputStatus(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -80,7 +81,8 @@ RequestResult RequestHandler::GetMediaInputStatus(const Request &request)
|
|||||||
*
|
*
|
||||||
* This request does not perform bounds checking of the cursor position.
|
* This request does not perform bounds checking of the cursor position.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the media input
|
* @requestField ?inputName | String | Name of the media input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the media input
|
||||||
* @requestField mediaCursor | Number | New cursor position to set | >= 0
|
* @requestField mediaCursor | Number | New cursor position to set | >= 0
|
||||||
*
|
*
|
||||||
* @requestType SetMediaInputCursor
|
* @requestType SetMediaInputCursor
|
||||||
@ -94,7 +96,7 @@ RequestResult RequestHandler::SetMediaInputCursor(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateNumber("mediaCursor", statusCode, comment, 0)))
|
if (!(input && request.ValidateNumber("mediaCursor", statusCode, comment, 0)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -115,7 +117,8 @@ RequestResult RequestHandler::SetMediaInputCursor(const Request &request)
|
|||||||
*
|
*
|
||||||
* This request does not perform bounds checking of the cursor position.
|
* This request does not perform bounds checking of the cursor position.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the media input
|
* @requestField ?inputName | String | Name of the media input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the media input
|
||||||
* @requestField mediaCursorOffset | Number | Value to offset the current cursor position by | None
|
* @requestField mediaCursorOffset | Number | Value to offset the current cursor position by | None
|
||||||
*
|
*
|
||||||
* @requestType OffsetMediaInputCursor
|
* @requestType OffsetMediaInputCursor
|
||||||
@ -129,7 +132,7 @@ RequestResult RequestHandler::OffsetMediaInputCursor(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateNumber("mediaCursorOffset", statusCode, comment)))
|
if (!(input && request.ValidateNumber("mediaCursorOffset", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -151,7 +154,8 @@ RequestResult RequestHandler::OffsetMediaInputCursor(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Triggers an action on a media input.
|
* Triggers an action on a media input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the media input
|
* @requestField ?inputName | String | Name of the media input
|
||||||
|
* @requestField ?inputUuid | String | UUID of the media input
|
||||||
* @requestField mediaAction | String | Identifier of the `ObsMediaInputAction` enum
|
* @requestField mediaAction | String | Identifier of the `ObsMediaInputAction` enum
|
||||||
*
|
*
|
||||||
* @requestType TriggerMediaInputAction
|
* @requestType TriggerMediaInputAction
|
||||||
@ -165,7 +169,7 @@ RequestResult RequestHandler::TriggerMediaInputAction(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!(input && request.ValidateString("mediaAction", statusCode, comment)))
|
if (!(input && request.ValidateString("mediaAction", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -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
|
||||||
@ -187,3 +189,60 @@ RequestResult RequestHandler::ResumeRecord(const Request &)
|
|||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Splits the current file being recorded into a new file.
|
||||||
|
*
|
||||||
|
* @requestType SplitRecordFile
|
||||||
|
* @complexity 2
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.5.0
|
||||||
|
* @api requests
|
||||||
|
* @category record
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::SplitRecordFile(const Request &)
|
||||||
|
{
|
||||||
|
if (!obs_frontend_recording_active())
|
||||||
|
return RequestResult::Error(RequestStatus::OutputNotRunning);
|
||||||
|
|
||||||
|
if (!obs_frontend_recording_split_file())
|
||||||
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"Verify that file splitting is enabled in the output settings.");
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new chapter marker to the file currently being recorded.
|
||||||
|
*
|
||||||
|
* Note: As of OBS 30.2.0, the only file format supporting this feature is Hybrid MP4.
|
||||||
|
*
|
||||||
|
* @requestField ?chapterName | String | Name of the new chapter
|
||||||
|
*
|
||||||
|
* @requestType CreateRecordChapter
|
||||||
|
* @complexity 2
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.5.0
|
||||||
|
* @api requests
|
||||||
|
* @category record
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::CreateRecordChapter(const Request &request)
|
||||||
|
{
|
||||||
|
std::string chapterName;
|
||||||
|
if (request.Contains("chapterName")) {
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
if (!request.ValidateOptionalString("chapterName", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
chapterName = request.RequestData["chapterName"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!obs_frontend_recording_active())
|
||||||
|
return RequestResult::Error(RequestStatus::OutputNotRunning);
|
||||||
|
|
||||||
|
if (!obs_frontend_recording_add_chapter(chapterName.empty() ? nullptr : chapterName.c_str()))
|
||||||
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"Verify that the output being used supports chapter markers.");
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
@ -24,7 +24,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
*
|
*
|
||||||
* Scenes only
|
* Scenes only
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene to get the items of
|
* @requestField ?sceneName | String | Name of the scene to get the items of
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene to get the items of
|
||||||
*
|
*
|
||||||
* @responseField sceneItems | Array<Object> | Array of scene items in the scene
|
* @responseField sceneItems | Array<Object> | Array of scene items in the scene
|
||||||
*
|
*
|
||||||
@ -39,7 +40,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -56,7 +57,8 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request)
|
|||||||
*
|
*
|
||||||
* Groups only
|
* Groups only
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the group to get the items of
|
* @requestField ?sceneName | String | Name of the group to get the items of
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the group to get the items of
|
||||||
*
|
*
|
||||||
* @responseField sceneItems | Array<Object> | Array of scene items in the group
|
* @responseField sceneItems | Array<Object> | Array of scene items in the group
|
||||||
*
|
*
|
||||||
@ -71,7 +73,7 @@ RequestResult RequestHandler::GetGroupSceneItemList(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -86,7 +88,8 @@ RequestResult RequestHandler::GetGroupSceneItemList(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene or group to search in
|
* @requestField ?sceneName | String | Name of the scene or group to search in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene or group to search in
|
||||||
* @requestField sourceName | String | Name of the source to find
|
* @requestField sourceName | String | Name of the source to find
|
||||||
* @requestField ?searchOffset | Number | Number of matches to skip during search. >= 0 means first forward. -1 means last (top) item | >= -1 | 0
|
* @requestField ?searchOffset | Number | Number of matches to skip during search. >= 0 means first forward. -1 means last (top) item | >= -1 | 0
|
||||||
*
|
*
|
||||||
@ -103,9 +106,8 @@ RequestResult RequestHandler::GetSceneItemId(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneAutoRelease scene =
|
OBSSceneAutoRelease scene = request.ValidateScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
request.ValidateScene2("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
if (!(scene && request.ValidateString("sourceName", statusCode, comment))) // TODO: Source UUID support
|
||||||
if (!(scene && request.ValidateString("sourceName", statusCode, comment)))
|
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string sourceName = request.RequestData["sourceName"];
|
std::string sourceName = request.RequestData["sourceName"];
|
||||||
@ -128,13 +130,49 @@ RequestResult RequestHandler::GetSceneItemId(const Request &request)
|
|||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the source associated with a scene item.
|
||||||
|
*
|
||||||
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
|
*
|
||||||
|
* @responseField sourceName | String | Name of the source associated with the scene item
|
||||||
|
* @responseField sourceUuid | String | UUID of the source associated with the scene item
|
||||||
|
*
|
||||||
|
* @requestType GetSceneItemSource
|
||||||
|
* @complexity 3
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.4.0
|
||||||
|
* @api requests
|
||||||
|
* @category scene items
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::GetSceneItemSource(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment);
|
||||||
|
if (!sceneItem)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
OBSSource source = obs_sceneitem_get_source(sceneItem);
|
||||||
|
|
||||||
|
json responseData;
|
||||||
|
responseData["sourceName"] = obs_source_get_name(source);
|
||||||
|
responseData["sourceUuid"] = obs_source_get_uuid(source);
|
||||||
|
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new scene item using a source.
|
* Creates a new scene item using a source.
|
||||||
*
|
*
|
||||||
* Scenes only
|
* Scenes only
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene to create the new item in
|
* @requestField ?sceneName | String | Name of the scene to create the new item in
|
||||||
* @requestField sourceName | String | Name of the source to add to the scene
|
* @requestField ?sceneUuid | String | UUID of the scene to create the new item in
|
||||||
|
* @requestField ?sourceName | String | Name of the source to add to the scene
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source to add to the scene
|
||||||
* @requestField ?sceneItemEnabled | Boolean | Enable state to apply to the scene item on creation | True
|
* @requestField ?sceneItemEnabled | Boolean | Enable state to apply to the scene item on creation | True
|
||||||
*
|
*
|
||||||
* @responseField sceneItemId | Number | Numeric ID of the scene item
|
* @responseField sceneItemId | Number | Numeric ID of the scene item
|
||||||
@ -150,17 +188,17 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease sceneSource = request.ValidateScene(statusCode, comment);
|
||||||
if (!sceneSource)
|
if (!sceneSource)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
OBSScene scene = obs_scene_from_source(sceneSource);
|
OBSScene scene = obs_scene_from_source(sceneSource);
|
||||||
|
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
if (request.RequestData["sceneName"] == request.RequestData["sourceName"])
|
if (sceneSource == source)
|
||||||
return RequestResult::Error(RequestStatus::CannotAct, "You cannot create scene item of a scene within itself.");
|
return RequestResult::Error(RequestStatus::CannotAct, "You cannot create scene item of a scene within itself.");
|
||||||
|
|
||||||
bool sceneItemEnabled = true;
|
bool sceneItemEnabled = true;
|
||||||
@ -185,7 +223,8 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes only
|
* Scenes only
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
*
|
*
|
||||||
* @requestType RemoveSceneItem
|
* @requestType RemoveSceneItem
|
||||||
@ -199,7 +238,7 @@ RequestResult RequestHandler::RemoveSceneItem(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -214,9 +253,11 @@ RequestResult RequestHandler::RemoveSceneItem(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes only
|
* Scenes only
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
* @requestField ?destinationSceneName | String | Name of the scene to create the duplicated item in | `sceneName` is assumed
|
* @requestField ?destinationSceneName | String | Name of the scene to create the duplicated item in | From scene is assumed
|
||||||
|
* @requestField ?destinationSceneUuid | String | UUID of the scene to create the duplicated item in | From scene is assumed
|
||||||
*
|
*
|
||||||
* @responseField sceneItemId | Number | Numeric ID of the duplicated scene item
|
* @responseField sceneItemId | Number | Numeric ID of the duplicated scene item
|
||||||
*
|
*
|
||||||
@ -231,16 +272,26 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
// Get destination scene
|
// Get destination scene
|
||||||
obs_scene_t *destinationScene;
|
obs_scene_t *destinationScene;
|
||||||
if (request.Contains("destinationSceneName")) {
|
if (request.Contains("destinationSceneName")) {
|
||||||
destinationScene = request.ValidateScene2("destinationSceneName", statusCode, comment);
|
OBSSourceAutoRelease destinationSceneSource =
|
||||||
if (!destinationScene)
|
request.ValidateSource("destinationSceneName", "destinationSceneUuid", statusCode, comment);
|
||||||
|
if (!destinationSceneSource)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
// Reimplementation of ValidateScene2
|
||||||
|
if (obs_source_get_type(destinationSceneSource) != OBS_SOURCE_TYPE_SCENE)
|
||||||
|
return RequestResult::Error(RequestStatus::InvalidResourceType, "The specified source is not a scene.");
|
||||||
|
if (obs_source_is_group(destinationSceneSource))
|
||||||
|
return RequestResult::Error(RequestStatus::InvalidResourceType,
|
||||||
|
"The specified source is not a scene. (Is group)");
|
||||||
|
|
||||||
|
destinationScene = obs_scene_get_ref(obs_scene_from_source(destinationSceneSource));
|
||||||
} else {
|
} else {
|
||||||
destinationScene = obs_scene_get_ref(obs_sceneitem_get_scene(sceneItem));
|
destinationScene = obs_scene_get_ref(obs_sceneitem_get_scene(sceneItem));
|
||||||
if (!destinationScene)
|
if (!destinationScene)
|
||||||
@ -258,7 +309,7 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request)
|
|||||||
bool sceneItemEnabled = obs_sceneitem_visible(sceneItem);
|
bool sceneItemEnabled = obs_sceneitem_visible(sceneItem);
|
||||||
obs_transform_info sceneItemTransform;
|
obs_transform_info sceneItemTransform;
|
||||||
obs_sceneitem_crop sceneItemCrop;
|
obs_sceneitem_crop sceneItemCrop;
|
||||||
obs_sceneitem_get_info(sceneItem, &sceneItemTransform);
|
obs_sceneitem_get_info2(sceneItem, &sceneItemTransform);
|
||||||
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
||||||
|
|
||||||
// Create the new item
|
// Create the new item
|
||||||
@ -279,7 +330,8 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
*
|
*
|
||||||
* @responseField sceneItemTransform | Object | Object containing scene item transform info
|
* @responseField sceneItemTransform | Object | Object containing scene item transform info
|
||||||
@ -295,8 +347,8 @@ RequestResult RequestHandler::GetSceneItemTransform(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -309,7 +361,8 @@ RequestResult RequestHandler::GetSceneItemTransform(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the transform and crop info of a scene item.
|
* Sets the transform and crop info of a scene item.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
* @requestField sceneItemTransform | Object | Object containing scene item transform info to update
|
* @requestField sceneItemTransform | Object | Object containing scene item transform info to update
|
||||||
*
|
*
|
||||||
@ -324,8 +377,8 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment)))
|
if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -336,7 +389,7 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request)
|
|||||||
bool cropChanged = false;
|
bool cropChanged = false;
|
||||||
obs_transform_info sceneItemTransform;
|
obs_transform_info sceneItemTransform;
|
||||||
obs_sceneitem_crop sceneItemCrop;
|
obs_sceneitem_crop sceneItemCrop;
|
||||||
obs_sceneitem_get_info(sceneItem, &sceneItemTransform);
|
obs_sceneitem_get_info2(sceneItem, &sceneItemTransform);
|
||||||
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
||||||
|
|
||||||
OBSSource source = obs_sceneitem_get_source(sceneItem);
|
OBSSource source = obs_sceneitem_get_source(sceneItem);
|
||||||
@ -449,11 +502,18 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request)
|
|||||||
cropChanged = true;
|
cropChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r.Contains("cropToBounds")) {
|
||||||
|
if (!r.ValidateOptionalBoolean("cropToBounds", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
sceneItemTransform.crop_to_bounds = r.RequestData["cropToBounds"];
|
||||||
|
transformChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!transformChanged && !cropChanged)
|
if (!transformChanged && !cropChanged)
|
||||||
return RequestResult::Error(RequestStatus::CannotAct, "You have not provided any valid transform changes.");
|
return RequestResult::Error(RequestStatus::CannotAct, "You have not provided any valid transform changes.");
|
||||||
|
|
||||||
if (transformChanged)
|
if (transformChanged)
|
||||||
obs_sceneitem_set_info(sceneItem, &sceneItemTransform);
|
obs_sceneitem_set_info2(sceneItem, &sceneItemTransform);
|
||||||
|
|
||||||
if (cropChanged)
|
if (cropChanged)
|
||||||
obs_sceneitem_set_crop(sceneItem, &sceneItemCrop);
|
obs_sceneitem_set_crop(sceneItem, &sceneItemCrop);
|
||||||
@ -466,7 +526,8 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
*
|
*
|
||||||
* @responseField sceneItemEnabled | Boolean | Whether the scene item is enabled. `true` for enabled, `false` for disabled
|
* @responseField sceneItemEnabled | Boolean | Whether the scene item is enabled. `true` for enabled, `false` for disabled
|
||||||
@ -482,8 +543,8 @@ RequestResult RequestHandler::GetSceneItemEnabled(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -498,7 +559,8 @@ RequestResult RequestHandler::GetSceneItemEnabled(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
* @requestField sceneItemEnabled | Boolean | New enable state of the scene item
|
* @requestField sceneItemEnabled | Boolean | New enable state of the scene item
|
||||||
*
|
*
|
||||||
@ -513,8 +575,8 @@ RequestResult RequestHandler::SetSceneItemEnabled(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment)))
|
if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -530,7 +592,8 @@ RequestResult RequestHandler::SetSceneItemEnabled(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
*
|
*
|
||||||
* @responseField sceneItemLocked | Boolean | Whether the scene item is locked. `true` for locked, `false` for unlocked
|
* @responseField sceneItemLocked | Boolean | Whether the scene item is locked. `true` for locked, `false` for unlocked
|
||||||
@ -546,8 +609,8 @@ RequestResult RequestHandler::GetSceneItemLocked(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -562,8 +625,9 @@ RequestResult RequestHandler::GetSceneItemLocked(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Group
|
* Scenes and Group
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
* @requestField sceneItemLocked | Boolean | New lock state of the scene item
|
* @requestField sceneItemLocked | Boolean | New lock state of the scene item
|
||||||
*
|
*
|
||||||
* @requestType SetSceneItemLocked
|
* @requestType SetSceneItemLocked
|
||||||
@ -577,8 +641,8 @@ RequestResult RequestHandler::SetSceneItemLocked(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment)))
|
if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -596,7 +660,8 @@ RequestResult RequestHandler::SetSceneItemLocked(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
*
|
*
|
||||||
* @responseField sceneItemIndex | Number | Index position of the scene item
|
* @responseField sceneItemIndex | Number | Index position of the scene item
|
||||||
@ -612,8 +677,8 @@ RequestResult RequestHandler::GetSceneItemIndex(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -628,7 +693,8 @@ RequestResult RequestHandler::GetSceneItemIndex(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
* @requestField sceneItemIndex | Number | New index position of the scene item | >= 0
|
* @requestField sceneItemIndex | Number | New index position of the scene item | >= 0
|
||||||
*
|
*
|
||||||
@ -643,8 +709,8 @@ RequestResult RequestHandler::SetSceneItemIndex(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192)))
|
if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -670,7 +736,8 @@ RequestResult RequestHandler::SetSceneItemIndex(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
*
|
*
|
||||||
* @responseField sceneItemBlendMode | String | Current blend mode
|
* @responseField sceneItemBlendMode | String | Current blend mode
|
||||||
@ -686,8 +753,8 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -704,7 +771,8 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request &request)
|
|||||||
*
|
*
|
||||||
* Scenes and Groups
|
* Scenes and Groups
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene the item is in
|
* @requestField ?sceneName | String | Name of the scene the item is in
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene the item is in
|
||||||
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
* @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0
|
||||||
* @requestField sceneItemBlendMode | String | New blend mode
|
* @requestField sceneItemBlendMode | String | New blend mode
|
||||||
*
|
*
|
||||||
@ -719,8 +787,8 @@ RequestResult RequestHandler::SetSceneItemBlendMode(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment)))
|
if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -739,8 +807,8 @@ RequestResult RequestHandler::GetSceneItemPrivateSettings(const Request &request
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -757,8 +825,8 @@ RequestResult RequestHandler::SetSceneItemPrivateSettings(const Request &request
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment, true))
|
if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment, true))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -22,8 +22,10 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
/**
|
/**
|
||||||
* Gets an array of all scenes in OBS.
|
* Gets an array of all scenes in OBS.
|
||||||
*
|
*
|
||||||
* @responseField currentProgramSceneName | String | Current program scene
|
* @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if internal state desync
|
||||||
* @responseField currentPreviewSceneName | String | Current preview scene. `null` if not in studio mode
|
* @responseField currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if internal state desync
|
||||||
|
* @responseField currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode
|
||||||
|
* @responseField currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode
|
||||||
* @responseField scenes | Array<Object> | Array of scenes
|
* @responseField scenes | Array<Object> | Array of scenes
|
||||||
*
|
*
|
||||||
* @requestType GetSceneList
|
* @requestType GetSceneList
|
||||||
@ -38,16 +40,22 @@ RequestResult RequestHandler::GetSceneList(const Request &)
|
|||||||
json responseData;
|
json responseData;
|
||||||
|
|
||||||
OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene();
|
OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene();
|
||||||
if (currentProgramScene)
|
if (currentProgramScene) {
|
||||||
responseData["currentProgramSceneName"] = obs_source_get_name(currentProgramScene);
|
responseData["currentProgramSceneName"] = obs_source_get_name(currentProgramScene);
|
||||||
else
|
responseData["currentProgramSceneUuid"] = obs_source_get_uuid(currentProgramScene);
|
||||||
|
} else {
|
||||||
responseData["currentProgramSceneName"] = nullptr;
|
responseData["currentProgramSceneName"] = nullptr;
|
||||||
|
responseData["currentProgramSceneUuid"] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene();
|
OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene();
|
||||||
if (currentPreviewScene)
|
if (currentPreviewScene) {
|
||||||
responseData["currentPreviewSceneName"] = obs_source_get_name(currentPreviewScene);
|
responseData["currentPreviewSceneName"] = obs_source_get_name(currentPreviewScene);
|
||||||
else
|
responseData["currentPreviewSceneUuid"] = obs_source_get_uuid(currentPreviewScene);
|
||||||
|
} else {
|
||||||
responseData["currentPreviewSceneName"] = nullptr;
|
responseData["currentPreviewSceneName"] = nullptr;
|
||||||
|
responseData["currentPreviewSceneUuid"] = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
responseData["scenes"] = Utils::Obs::ArrayHelper::GetSceneList();
|
responseData["scenes"] = Utils::Obs::ArrayHelper::GetSceneList();
|
||||||
|
|
||||||
@ -80,7 +88,12 @@ RequestResult RequestHandler::GetGroupList(const Request &)
|
|||||||
/**
|
/**
|
||||||
* Gets the current program scene.
|
* Gets the current program scene.
|
||||||
*
|
*
|
||||||
* @responseField currentProgramSceneName | String | Current program scene
|
* Note: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version.
|
||||||
|
*
|
||||||
|
* @responseField sceneName | String | Current program scene name
|
||||||
|
* @responseField sceneUuid | String | Current program scene UUID
|
||||||
|
* @responseField currentProgramSceneName | String | Current program scene name (Deprecated)
|
||||||
|
* @responseField currentProgramSceneUuid | String | Current program scene UUID (Deprecated)
|
||||||
*
|
*
|
||||||
* @requestType GetCurrentProgramScene
|
* @requestType GetCurrentProgramScene
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -93,7 +106,8 @@ RequestResult RequestHandler::GetCurrentProgramScene(const Request &)
|
|||||||
{
|
{
|
||||||
json responseData;
|
json responseData;
|
||||||
OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene();
|
OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene();
|
||||||
responseData["currentProgramSceneName"] = obs_source_get_name(currentProgramScene);
|
responseData["sceneName"] = responseData["currentProgramSceneName"] = obs_source_get_name(currentProgramScene);
|
||||||
|
responseData["sceneUuid"] = responseData["currentProgramSceneUuid"] = obs_source_get_uuid(currentProgramScene);
|
||||||
|
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
@ -101,7 +115,8 @@ RequestResult RequestHandler::GetCurrentProgramScene(const Request &)
|
|||||||
/**
|
/**
|
||||||
* Sets the current program scene.
|
* Sets the current program scene.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Scene to set as the current program scene
|
* @requestField ?sceneName | String | Scene name to set as the current program scene
|
||||||
|
* @requestField ?sceneUuid | String | Scene UUID to set as the current program scene
|
||||||
*
|
*
|
||||||
* @requestType SetCurrentProgramScene
|
* @requestType SetCurrentProgramScene
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -114,7 +129,7 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -128,7 +143,12 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request)
|
|||||||
*
|
*
|
||||||
* Only available when studio mode is enabled.
|
* Only available when studio mode is enabled.
|
||||||
*
|
*
|
||||||
* @responseField currentPreviewSceneName | String | Current preview scene
|
* Note: This request is slated to have the `currentPreview`-prefixed fields removed from in an upcoming RPC version.
|
||||||
|
*
|
||||||
|
* @responseField sceneName | String | Current preview scene name
|
||||||
|
* @responseField sceneUuid | String | Current preview scene UUID
|
||||||
|
* @responseField currentPreviewSceneName | String | Current preview scene name
|
||||||
|
* @responseField currentPreviewSceneUuid | String | Current preview scene UUID
|
||||||
*
|
*
|
||||||
* @requestType GetCurrentPreviewScene
|
* @requestType GetCurrentPreviewScene
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -145,7 +165,8 @@ RequestResult RequestHandler::GetCurrentPreviewScene(const Request &)
|
|||||||
OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene();
|
OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene();
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["currentPreviewSceneName"] = obs_source_get_name(currentPreviewScene);
|
responseData["sceneName"] = responseData["currentPreviewSceneName"] = obs_source_get_name(currentPreviewScene);
|
||||||
|
responseData["sceneUuid"] = responseData["currentPreviewSceneUuid"] = obs_source_get_uuid(currentPreviewScene);
|
||||||
|
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
@ -155,7 +176,8 @@ RequestResult RequestHandler::GetCurrentPreviewScene(const Request &)
|
|||||||
*
|
*
|
||||||
* Only available when studio mode is enabled.
|
* Only available when studio mode is enabled.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Scene to set as the current preview scene
|
* @requestField ?sceneName | String | Scene name to set as the current preview scene
|
||||||
|
* @requestField ?sceneUuid | String | Scene UUID to set as the current preview scene
|
||||||
*
|
*
|
||||||
* @requestType SetCurrentPreviewScene
|
* @requestType SetCurrentPreviewScene
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -171,7 +193,7 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request)
|
|||||||
|
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -185,6 +207,8 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request)
|
|||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name for the new scene
|
* @requestField sceneName | String | Name for the new scene
|
||||||
*
|
*
|
||||||
|
* @responseField sceneUuid | String | UUID of the created scene
|
||||||
|
*
|
||||||
* @requestType CreateScene
|
* @requestType CreateScene
|
||||||
* @complexity 2
|
* @complexity 2
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
@ -205,19 +229,21 @@ RequestResult RequestHandler::CreateScene(const Request &request)
|
|||||||
if (scene)
|
if (scene)
|
||||||
return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that scene name.");
|
return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that scene name.");
|
||||||
|
|
||||||
obs_scene_t *createdScene = obs_scene_create(sceneName.c_str());
|
OBSSceneAutoRelease createdScene = obs_scene_create(sceneName.c_str());
|
||||||
if (!createdScene)
|
if (!createdScene)
|
||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene.");
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene.");
|
||||||
|
|
||||||
obs_scene_release(createdScene);
|
json responseData;
|
||||||
|
responseData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(createdScene));
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a scene from OBS.
|
* Removes a scene from OBS.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene to remove
|
* @requestField ?sceneName | String | Name of the scene to remove
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene to remove
|
||||||
*
|
*
|
||||||
* @requestType RemoveScene
|
* @requestType RemoveScene
|
||||||
* @complexity 2
|
* @complexity 2
|
||||||
@ -230,7 +256,7 @@ RequestResult RequestHandler::RemoveScene(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -246,7 +272,8 @@ RequestResult RequestHandler::RemoveScene(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Sets the name of a scene (rename).
|
* Sets the name of a scene (rename).
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene to be renamed
|
* @requestField ?sceneName | String | Name of the scene to be renamed
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene to be renamed
|
||||||
* @requestField newSceneName | String | New name for the scene
|
* @requestField newSceneName | String | New name for the scene
|
||||||
*
|
*
|
||||||
* @requestType SetSceneName
|
* @requestType SetSceneName
|
||||||
@ -260,7 +287,7 @@ RequestResult RequestHandler::SetSceneName(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!(scene && request.ValidateString("newSceneName", statusCode, comment)))
|
if (!(scene && request.ValidateString("newSceneName", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -279,7 +306,10 @@ RequestResult RequestHandler::SetSceneName(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Gets the scene transition overridden for a scene.
|
* Gets the scene transition overridden for a scene.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene
|
* Note: A transition UUID response field is not currently able to be implemented as of 2024-1-18.
|
||||||
|
*
|
||||||
|
* @requestField ?sceneName | String | Name of the scene
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene
|
||||||
*
|
*
|
||||||
* @responseField transitionName | String | Name of the overridden scene transition, else `null`
|
* @responseField transitionName | String | Name of the overridden scene transition, else `null`
|
||||||
* @responseField transitionDuration | Number | Duration of the overridden scene transition, else `null`
|
* @responseField transitionDuration | Number | Duration of the overridden scene transition, else `null`
|
||||||
@ -295,7 +325,7 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -317,9 +347,10 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the scene transition overridden for a scene.
|
* Sets the scene transition overridden for a scene.
|
||||||
*
|
*
|
||||||
* @requestField sceneName | String | Name of the scene
|
* @requestField ?sceneName | String | Name of the scene
|
||||||
|
* @requestField ?sceneUuid | String | UUID of the scene
|
||||||
* @requestField ?transitionName | String | Name of the scene transition to use as override. Specify `null` to remove | Unchanged
|
* @requestField ?transitionName | String | Name of the scene transition to use as override. Specify `null` to remove | Unchanged
|
||||||
* @requestField ?transitionDuration | Number | Duration to use for any overridden transition. Specify `null` to remove | >= 50, <= 20000 | Unchanged
|
* @requestField ?transitionDuration | Number | Duration to use for any overridden transition. Specify `null` to remove | >= 50, <= 20000 | Unchanged
|
||||||
*
|
*
|
||||||
@ -334,7 +365,7 @@ RequestResult RequestHandler::SetSceneSceneTransitionOverride(const Request &req
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease scene = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -28,8 +28,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
QImage TakeSourceScreenshot(obs_source_t *source, bool &success, uint32_t requestedWidth = 0, uint32_t requestedHeight = 0)
|
QImage TakeSourceScreenshot(obs_source_t *source, bool &success, uint32_t requestedWidth = 0, uint32_t requestedHeight = 0)
|
||||||
{
|
{
|
||||||
// Get info about the requested source
|
// Get info about the requested source
|
||||||
const uint32_t sourceWidth = obs_source_get_base_width(source);
|
const uint32_t sourceWidth = obs_source_get_width(source);
|
||||||
const uint32_t sourceHeight = obs_source_get_base_height(source);
|
const uint32_t sourceHeight = obs_source_get_height(source);
|
||||||
const double sourceAspectRatio = ((double)sourceWidth / (double)sourceHeight);
|
const double sourceAspectRatio = ((double)sourceWidth / (double)sourceHeight);
|
||||||
|
|
||||||
uint32_t imgWidth = sourceWidth;
|
uint32_t imgWidth = sourceWidth;
|
||||||
@ -114,7 +114,8 @@ bool IsImageFormatValid(std::string format)
|
|||||||
*
|
*
|
||||||
* **Compatible with inputs and scenes.**
|
* **Compatible with inputs and scenes.**
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source to get the active state of
|
* @requestField ?sourceName | String | Name of the source to get the active state of
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source to get the active state of
|
||||||
*
|
*
|
||||||
* @responseField videoActive | Boolean | Whether the source is showing in Program
|
* @responseField videoActive | Boolean | Whether the source is showing in Program
|
||||||
* @responseField videoShowing | Boolean | Whether the source is showing in the UI (Preview, Projector, Properties)
|
* @responseField videoShowing | Boolean | Whether the source is showing in the UI (Preview, Projector, Properties)
|
||||||
@ -130,7 +131,7 @@ RequestResult RequestHandler::GetSourceActive(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -151,7 +152,8 @@ RequestResult RequestHandler::GetSourceActive(const Request &request)
|
|||||||
*
|
*
|
||||||
* **Compatible with inputs and scenes.**
|
* **Compatible with inputs and scenes.**
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source to take a screenshot of
|
* @requestField ?sourceName | String | Name of the source to take a screenshot of
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source to take a screenshot of
|
||||||
* @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats
|
* @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats
|
||||||
* @requestField ?imageWidth | Number | Width to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
* @requestField ?imageWidth | Number | Width to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
||||||
* @requestField ?imageHeight | Number | Height to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
* @requestField ?imageHeight | Number | Height to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
||||||
@ -170,7 +172,7 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!(source && request.ValidateString("imageFormat", statusCode, comment)))
|
if (!(source && request.ValidateString("imageFormat", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -238,15 +240,14 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request &request)
|
|||||||
*
|
*
|
||||||
* **Compatible with inputs and scenes.**
|
* **Compatible with inputs and scenes.**
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source to take a screenshot of
|
* @requestField ?sourceName | String | Name of the source to take a screenshot of
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source to take a screenshot of
|
||||||
* @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats
|
* @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats
|
||||||
* @requestField imageFilePath | String | Path to save the screenshot file to. Eg. `C:\Users\user\Desktop\screenshot.png`
|
* @requestField imageFilePath | String | Path to save the screenshot file to. Eg. `C:\Users\user\Desktop\screenshot.png`
|
||||||
* @requestField ?imageWidth | Number | Width to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
* @requestField ?imageWidth | Number | Width to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
||||||
* @requestField ?imageHeight | Number | Height to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
* @requestField ?imageHeight | Number | Height to scale the screenshot to | >= 8, <= 4096 | Source value is used
|
||||||
* @requestField ?imageCompressionQuality | Number | Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use "default" (whatever that means, idk) | >= -1, <= 100 | -1
|
* @requestField ?imageCompressionQuality | Number | Compression quality to use. 0 for high compression, 100 for uncompressed. -1 to use "default" (whatever that means, idk) | >= -1, <= 100 | -1
|
||||||
*
|
*
|
||||||
* @responseField imageData | String | Base64-encoded screenshot
|
|
||||||
*
|
|
||||||
* @requestType SaveSourceScreenshot
|
* @requestType SaveSourceScreenshot
|
||||||
* @complexity 3
|
* @complexity 3
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
@ -258,7 +259,7 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!(source && request.ValidateString("imageFormat", statusCode, comment) &&
|
if (!(source && request.ValidateString("imageFormat", statusCode, comment) &&
|
||||||
request.ValidateString("imageFilePath", statusCode, comment)))
|
request.ValidateString("imageFilePath", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
@ -321,7 +322,7 @@ RequestResult RequestHandler::GetSourcePrivateSettings(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -338,7 +339,7 @@ RequestResult RequestHandler::SetSourcePrivateSettings(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true))
|
if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -46,6 +46,7 @@ RequestResult RequestHandler::GetTransitionKindList(const Request &)
|
|||||||
* Gets an array of all scene transitions in OBS.
|
* Gets an array of all scene transitions in OBS.
|
||||||
*
|
*
|
||||||
* @responseField currentSceneTransitionName | String | Name of the current scene transition. Can be null
|
* @responseField currentSceneTransitionName | String | Name of the current scene transition. Can be null
|
||||||
|
* @responseField currentSceneTransitionUuid | String | UUID of the current scene transition. Can be null
|
||||||
* @responseField currentSceneTransitionKind | String | Kind of the current scene transition. Can be null
|
* @responseField currentSceneTransitionKind | String | Kind of the current scene transition. Can be null
|
||||||
* @responseField transitions | Array<Object> | Array of transitions
|
* @responseField transitions | Array<Object> | Array of transitions
|
||||||
*
|
*
|
||||||
@ -63,9 +64,11 @@ RequestResult RequestHandler::GetSceneTransitionList(const Request &)
|
|||||||
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
||||||
if (transition) {
|
if (transition) {
|
||||||
responseData["currentSceneTransitionName"] = obs_source_get_name(transition);
|
responseData["currentSceneTransitionName"] = obs_source_get_name(transition);
|
||||||
|
responseData["currentSceneTransitionUuid"] = obs_source_get_uuid(transition);
|
||||||
responseData["currentSceneTransitionKind"] = obs_source_get_id(transition);
|
responseData["currentSceneTransitionKind"] = obs_source_get_id(transition);
|
||||||
} else {
|
} else {
|
||||||
responseData["currentSceneTransitionName"] = nullptr;
|
responseData["currentSceneTransitionName"] = nullptr;
|
||||||
|
responseData["currentSceneTransitionUuid"] = nullptr;
|
||||||
responseData["currentSceneTransitionKind"] = nullptr;
|
responseData["currentSceneTransitionKind"] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +81,7 @@ RequestResult RequestHandler::GetSceneTransitionList(const Request &)
|
|||||||
* Gets information about the current scene transition.
|
* Gets information about the current scene transition.
|
||||||
*
|
*
|
||||||
* @responseField transitionName | String | Name of the transition
|
* @responseField transitionName | String | Name of the transition
|
||||||
|
* @responseField transitionUuid | String | UUID of the transition
|
||||||
* @responseField transitionKind | String | Kind of the transition
|
* @responseField transitionKind | String | Kind of the transition
|
||||||
* @responseField transitionFixed | Boolean | Whether the transition uses a fixed (unconfigurable) duration
|
* @responseField transitionFixed | Boolean | Whether the transition uses a fixed (unconfigurable) duration
|
||||||
* @responseField transitionDuration | Number | Configured transition duration in milliseconds. `null` if transition is fixed
|
* @responseField transitionDuration | Number | Configured transition duration in milliseconds. `null` if transition is fixed
|
||||||
@ -100,6 +104,7 @@ RequestResult RequestHandler::GetCurrentSceneTransition(const Request &)
|
|||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["transitionName"] = obs_source_get_name(transition);
|
responseData["transitionName"] = obs_source_get_name(transition);
|
||||||
|
responseData["transitionUuid"] = obs_source_get_uuid(transition);
|
||||||
responseData["transitionKind"] = obs_source_get_id(transition);
|
responseData["transitionKind"] = obs_source_get_id(transition);
|
||||||
|
|
||||||
if (obs_transition_fixed(transition)) {
|
if (obs_transition_fixed(transition)) {
|
||||||
|
@ -82,7 +82,8 @@ RequestResult RequestHandler::SetStudioModeEnabled(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Opens the properties dialog of an input.
|
* Opens the properties dialog of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to open the dialog of
|
* @requestField ?inputName | String | Name of the input to open the dialog of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to open the dialog of
|
||||||
*
|
*
|
||||||
* @requestType OpenInputPropertiesDialog
|
* @requestType OpenInputPropertiesDialog
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -95,7 +96,7 @@ RequestResult RequestHandler::OpenInputPropertiesDialog(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -107,7 +108,8 @@ RequestResult RequestHandler::OpenInputPropertiesDialog(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Opens the filters dialog of an input.
|
* Opens the filters dialog of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to open the dialog of
|
* @requestField ?inputName | String | Name of the input to open the dialog of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to open the dialog of
|
||||||
*
|
*
|
||||||
* @requestType OpenInputFiltersDialog
|
* @requestType OpenInputFiltersDialog
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -120,7 +122,7 @@ RequestResult RequestHandler::OpenInputFiltersDialog(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -132,7 +134,8 @@ RequestResult RequestHandler::OpenInputFiltersDialog(const Request &request)
|
|||||||
/**
|
/**
|
||||||
* Opens the interact dialog of an input.
|
* Opens the interact dialog of an input.
|
||||||
*
|
*
|
||||||
* @requestField inputName | String | Name of the input to open the dialog of
|
* @requestField ?inputName | String | Name of the input to open the dialog of
|
||||||
|
* @requestField ?inputUuid | String | UUID of the input to open the dialog of
|
||||||
*
|
*
|
||||||
* @requestType OpenInputInteractDialog
|
* @requestType OpenInputInteractDialog
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
@ -145,7 +148,7 @@ RequestResult RequestHandler::OpenInputInteractDialog(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment);
|
OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment);
|
||||||
if (!input)
|
if (!input)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -262,7 +265,8 @@ RequestResult RequestHandler::OpenVideoMixProjector(const Request &request)
|
|||||||
*
|
*
|
||||||
* Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.
|
* Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.
|
||||||
*
|
*
|
||||||
* @requestField sourceName | String | Name of the source to open a projector for
|
* @requestField ?sourceName | String | Name of the source to open a projector for
|
||||||
|
* @requestField ?sourceUuid | String | UUID of the source to open a projector for
|
||||||
* @requestField ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode
|
* @requestField ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode
|
||||||
* @requestField ?projectorGeometry | String | Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex` | N/A
|
* @requestField ?projectorGeometry | String | Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex` | N/A
|
||||||
*
|
*
|
||||||
@ -277,7 +281,7 @@ RequestResult RequestHandler::OpenSourceProjector(const Request &request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
@ -211,28 +211,41 @@ bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestSt
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t *Request::ValidateSource(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
obs_source_t *Request::ValidateSource(const std::string &nameKeyName, const std::string &uuidKeyName,
|
||||||
std::string &comment) const
|
RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||||
{
|
{
|
||||||
if (!ValidateString(keyName, statusCode, comment))
|
if (ValidateString(nameKeyName, statusCode, comment)) {
|
||||||
return nullptr;
|
std::string sourceName = RequestData[nameKeyName];
|
||||||
|
obs_source_t *ret = obs_get_source_by_name(sourceName.c_str());
|
||||||
std::string sourceName = RequestData[keyName];
|
if (!ret) {
|
||||||
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
obs_source_t *ret = obs_get_source_by_name(sourceName.c_str());
|
comment = std::string("No source was found by the name of `") + sourceName + "`.";
|
||||||
if (!ret) {
|
return nullptr;
|
||||||
statusCode = RequestStatus::ResourceNotFound;
|
}
|
||||||
comment = std::string("No source was found by the name of `") + sourceName + "`.";
|
return ret;
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
if (ValidateString(uuidKeyName, statusCode, comment)) {
|
||||||
|
std::string sourceUuid = RequestData[uuidKeyName];
|
||||||
|
obs_source_t *ret = obs_get_source_by_uuid(sourceUuid.c_str());
|
||||||
|
if (!ret) {
|
||||||
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
|
comment = std::string("No source was found by the UUID of `") + sourceUuid + "`.";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
statusCode = RequestStatus::MissingRequestField;
|
||||||
|
comment = std::string("Your request must contain at least one of the following fields: `") + nameKeyName + "` or `" +
|
||||||
|
uuidKeyName + "`.";
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t *Request::ValidateScene(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
obs_source_t *Request::ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
const ObsWebSocketSceneFilter filter) const
|
const ObsWebSocketSceneFilter filter) const
|
||||||
{
|
{
|
||||||
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
|
obs_source_t *ret = ValidateSource("sceneName", "sceneUuid", statusCode, comment);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
@ -259,10 +272,10 @@ obs_source_t *Request::ValidateScene(const std::string &keyName, RequestStatus::
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_scene_t *Request::ValidateScene2(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
obs_scene_t *Request::ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
const ObsWebSocketSceneFilter filter) const
|
const ObsWebSocketSceneFilter filter) const
|
||||||
{
|
{
|
||||||
OBSSourceAutoRelease sceneSource = ValidateSource(keyName, statusCode, comment);
|
OBSSourceAutoRelease sceneSource = ValidateSource("sceneName", "sceneUuid", statusCode, comment);
|
||||||
if (!sceneSource)
|
if (!sceneSource)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
@ -290,10 +303,9 @@ obs_scene_t *Request::ValidateScene2(const std::string &keyName, RequestStatus::
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t *Request::ValidateInput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
obs_source_t *Request::ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||||
std::string &comment) const
|
|
||||||
{
|
{
|
||||||
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
|
obs_source_t *ret = ValidateSource("inputName", "inputUuid", statusCode, comment);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
@ -307,47 +319,46 @@ obs_source_t *Request::ValidateInput(const std::string &keyName, RequestStatus::
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
FilterPair Request::ValidateFilter(const std::string &sourceKeyName, const std::string &filterKeyName,
|
FilterPair Request::ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||||
RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
|
||||||
{
|
{
|
||||||
obs_source_t *source = ValidateSource(sourceKeyName, statusCode, comment);
|
obs_source_t *source = ValidateSource("sourceName", "sourceUuid", statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
return FilterPair{source, nullptr};
|
return FilterPair{source, nullptr};
|
||||||
|
|
||||||
if (!ValidateString(filterKeyName, statusCode, comment))
|
if (!ValidateString("filterName", statusCode, comment))
|
||||||
return FilterPair{source, nullptr};
|
return FilterPair{source, nullptr};
|
||||||
|
|
||||||
std::string filterName = RequestData[filterKeyName];
|
std::string filterName = RequestData["filterName"];
|
||||||
|
|
||||||
obs_source_t *filter = obs_source_get_filter_by_name(source, filterName.c_str());
|
obs_source_t *filter = obs_source_get_filter_by_name(source, filterName.c_str());
|
||||||
if (!filter) {
|
if (!filter) {
|
||||||
|
std::string sourceName = obs_source_get_name(source);
|
||||||
statusCode = RequestStatus::ResourceNotFound;
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
comment = std::string("No filter was found in the source `") + RequestData[sourceKeyName].get<std::string>() +
|
comment = std::string("No filter was found in the source `") + sourceName + "` with the name `" + filterName + "`.";
|
||||||
"` with the name `" + filterName + "`.";
|
|
||||||
return FilterPair{source, nullptr};
|
return FilterPair{source, nullptr};
|
||||||
}
|
}
|
||||||
|
|
||||||
return FilterPair{source, filter};
|
return FilterPair{source, filter};
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_sceneitem_t *Request::ValidateSceneItem(const std::string &sceneKeyName, const std::string &sceneItemIdKeyName,
|
obs_sceneitem_t *Request::ValidateSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
RequestStatus::RequestStatus &statusCode, std::string &comment,
|
|
||||||
const ObsWebSocketSceneFilter filter) const
|
const ObsWebSocketSceneFilter filter) const
|
||||||
{
|
{
|
||||||
OBSSceneAutoRelease scene = ValidateScene2(sceneKeyName, statusCode, comment, filter);
|
OBSSceneAutoRelease scene = ValidateScene2(statusCode, comment, filter);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
if (!ValidateNumber(sceneItemIdKeyName, statusCode, comment, 0))
|
if (!ValidateNumber("sceneItemId", statusCode, comment, 0))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
int64_t sceneItemId = RequestData[sceneItemIdKeyName];
|
int64_t sceneItemId = RequestData["sceneItemId"];
|
||||||
|
|
||||||
OBSSceneItem sceneItem = obs_scene_find_sceneitem_by_id(scene, sceneItemId);
|
OBSSceneItem sceneItem = obs_scene_find_sceneitem_by_id(scene, sceneItemId);
|
||||||
if (!sceneItem) {
|
if (!sceneItem) {
|
||||||
|
std::string sceneName = obs_source_get_name(obs_scene_get_source(scene));
|
||||||
statusCode = RequestStatus::ResourceNotFound;
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
comment = std::string("No scene items were found in scene `") + RequestData[sceneKeyName].get<std::string>() +
|
comment = std::string("No scene items were found in scene `") + sceneName + "` with the ID `" +
|
||||||
"` with the ID `" + std::to_string(sceneItemId) + "`.";
|
std::to_string(sceneItemId) + "`.";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,18 +64,15 @@ struct Request {
|
|||||||
const bool allowEmpty = false) const;
|
const bool allowEmpty = false) const;
|
||||||
|
|
||||||
// All return values have incremented refcounts
|
// All return values have incremented refcounts
|
||||||
obs_source_t *ValidateSource(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
obs_source_t *ValidateSource(const std::string &nameKeyName, const std::string &uuidKeyName,
|
||||||
std::string &comment) const;
|
RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
obs_source_t *ValidateScene(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
obs_source_t *ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
||||||
obs_scene_t *ValidateScene2(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
obs_scene_t *ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
||||||
obs_source_t *ValidateInput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
obs_source_t *ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
std::string &comment) const;
|
FilterPair ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
FilterPair ValidateFilter(const std::string &sourceKeyName, const std::string &filterKeyName,
|
obs_sceneitem_t *ValidateSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
|
||||||
obs_sceneitem_t *ValidateSceneItem(const std::string &sceneKeyName, const std::string &sceneItemIdKeyName,
|
|
||||||
RequestStatus::RequestStatus &statusCode, std::string &comment,
|
|
||||||
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
||||||
obs_output_t *ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
obs_output_t *ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
std::string &comment) const;
|
std::string &comment) const;
|
||||||
|
@ -21,6 +21,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
RequestBatchRequest::RequestBatchRequest(const std::string &requestType, const json &requestData,
|
RequestBatchRequest::RequestBatchRequest(const std::string &requestType, const json &requestData,
|
||||||
RequestBatchExecutionType::RequestBatchExecutionType executionType,
|
RequestBatchExecutionType::RequestBatchExecutionType executionType,
|
||||||
const json &inputVariables, const json &outputVariables)
|
const json &inputVariables, const json &outputVariables)
|
||||||
: Request(requestType, requestData, executionType), InputVariables(inputVariables), OutputVariables(outputVariables)
|
: Request(requestType, requestData, executionType),
|
||||||
|
InputVariables(inputVariables),
|
||||||
|
OutputVariables(outputVariables)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,10 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "RequestResult.h"
|
#include "RequestResult.h"
|
||||||
|
|
||||||
RequestResult::RequestResult(RequestStatus::RequestStatus statusCode, json responseData, std::string comment)
|
RequestResult::RequestResult(RequestStatus::RequestStatus statusCode, json responseData, std::string comment)
|
||||||
: StatusCode(statusCode), ResponseData(responseData), Comment(comment), SleepFrames(0)
|
: StatusCode(statusCode),
|
||||||
|
ResponseData(responseData),
|
||||||
|
Comment(comment),
|
||||||
|
SleepFrames(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,5 +77,8 @@ namespace RequestBatchExecutionType {
|
|||||||
Parallel = 2,
|
Parallel = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool IsValid(int8_t executionType) { return executionType >= None && executionType <= Parallel; }
|
inline bool IsValid(int8_t executionType)
|
||||||
|
{
|
||||||
|
return executionType >= None && executionType <= Parallel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user