mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-08-29 04:36:21 -05:00
Compare commits
136 Commits
test-codeq
...
1.19.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b8829f7df | ||
|
|
6fff3b54e6 | ||
|
|
dd69ca1b35 | ||
|
|
66ddf3b4ef | ||
|
|
c9b5bbfc14 | ||
|
|
3e1e8d01b6 | ||
|
|
c22f40e333 | ||
|
|
b83acaca79 | ||
|
|
53bef18d15 | ||
|
|
ced1c7605a | ||
|
|
f78e91eec4 | ||
|
|
7fdff72a92 | ||
|
|
d2d042bae3 | ||
|
|
f70ae803a3 | ||
|
|
cdefbf383c | ||
|
|
5f8641b18a | ||
|
|
d107f653de | ||
|
|
22f4c11ee3 | ||
|
|
7683957267 | ||
|
|
e0d4c7244d | ||
|
|
b2ccd30f68 | ||
|
|
1dea2e5f5d | ||
|
|
c95fb6c2ea | ||
|
|
d779ced27f | ||
|
|
c84c1638bf | ||
|
|
3ac4e22600 | ||
|
|
a59d15a77a | ||
|
|
c2edc7c612 | ||
|
|
77fe75f738 | ||
|
|
fdb70a32c6 | ||
|
|
487db7302e | ||
|
|
12a74caf62 | ||
|
|
742996fc83 | ||
|
|
f5a0b2e91a | ||
|
|
114ca7b545 | ||
|
|
a8953f23f4 | ||
|
|
106be642aa | ||
|
|
4c20ac605d | ||
|
|
75cdd3c80d | ||
|
|
b2585ae176 | ||
|
|
d1e912cb24 | ||
|
|
bd5ecb3b3b | ||
|
|
1a8a4584c1 | ||
|
|
6d755ad570 | ||
|
|
99ceb6a42a | ||
|
|
7ddfdcf5be | ||
|
|
a243e026c8 | ||
|
|
f40f98c702 | ||
|
|
d99618d2f6 | ||
|
|
a93305e16e | ||
|
|
fa3ae607b5 | ||
|
|
bddbcebece | ||
|
|
aeaa13955c | ||
|
|
f99eb6c3c8 | ||
|
|
c16b97e5cd | ||
|
|
0d29fb2ee1 | ||
|
|
0169f6c445 | ||
|
|
886639fe24 | ||
|
|
7304fa349e | ||
|
|
7b44c28767 | ||
|
|
9bed6df2b5 | ||
|
|
ad4c41c1dd | ||
|
|
9e2ca1529c | ||
|
|
e62504968c | ||
|
|
97720a798c | ||
|
|
636630fdf3 | ||
|
|
602622c841 | ||
|
|
c3aa421bc5 | ||
|
|
c392004edf | ||
|
|
9e4893abc3 | ||
|
|
54f940be0d | ||
|
|
046de4118f | ||
|
|
c9177c4429 | ||
|
|
9704d5f1f4 | ||
|
|
5ce177bcd3 | ||
|
|
a7b6a4a67c | ||
|
|
1978b8f1a1 | ||
|
|
59cc37c90a | ||
|
|
866c49bffd | ||
|
|
c9370c8929 | ||
|
|
e97f41a356 | ||
|
|
6c7ba4225b | ||
|
|
b694598d16 | ||
|
|
954b634aa5 | ||
|
|
c9820e77d8 | ||
|
|
a268f98b73 | ||
|
|
700e75a2b5 | ||
|
|
19e79aff50 | ||
|
|
c8f684ce9f | ||
|
|
1027dda6f6 | ||
|
|
6f7bcc34af | ||
|
|
face0f7f3c | ||
|
|
7480e793b8 | ||
|
|
bcdcaed136 | ||
|
|
85e715dc75 | ||
|
|
9e8e1a6e4d | ||
|
|
7fbfb7806b | ||
|
|
1556334c0e | ||
|
|
53a5fa6ff4 | ||
|
|
5ae9e18044 | ||
|
|
aef29d7d82 | ||
|
|
f000758820 | ||
|
|
786c9592a1 | ||
|
|
5cb50821e0 | ||
|
|
bcdfe79831 | ||
|
|
ec93babed6 | ||
|
|
e075dcd4be | ||
|
|
4113f94528 | ||
|
|
db3affc43d | ||
|
|
e11d882e87 | ||
|
|
925729e6b8 | ||
|
|
4d2c3e0f80 | ||
|
|
1665841589 | ||
|
|
e89343b03e | ||
|
|
a9c79b02ff | ||
|
|
c6541825f8 | ||
|
|
003a1aa696 | ||
|
|
20767630c0 | ||
|
|
70fb972f84 | ||
|
|
4d65956f25 | ||
|
|
a2e4580970 | ||
|
|
8da1e3ad40 | ||
|
|
92b6a057f6 | ||
|
|
70a3ae0245 | ||
|
|
8cc7b65436 | ||
|
|
fd18e64e19 | ||
|
|
e4526c4e81 | ||
|
|
d6ef69a3d4 | ||
|
|
b5eb0b3f3e | ||
|
|
22a361f977 | ||
|
|
a0db023aae | ||
|
|
dc8a60a5e5 | ||
|
|
d47b878b56 | ||
|
|
9105087036 | ||
|
|
e26f41a1a8 | ||
|
|
ff513d8664 |
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Help/Support
|
||||||
|
url: https://github.com/WarmUpTill/SceneSwitcher/wiki
|
||||||
|
about: For general questions about how to use and configure the plugin please have a look at the wiki (https://github.com/WarmUpTill/SceneSwitcher/wiki) or ask questions in the OBS forum (https://obsproject.com/forum/threads/advanced-scene-switcher.48264/)
|
||||||
85
.github/actions/build-plugin/action.yml
vendored
Normal file
85
.github/actions/build-plugin/action.yml
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
name: 'Setup and build plugin'
|
||||||
|
description: 'Builds the plugin for specified architecture and build config.'
|
||||||
|
inputs:
|
||||||
|
target:
|
||||||
|
description: 'Build target for dependencies'
|
||||||
|
required: true
|
||||||
|
config:
|
||||||
|
description: 'Build configuration'
|
||||||
|
required: false
|
||||||
|
default: 'Release'
|
||||||
|
codesign:
|
||||||
|
description: 'Enable codesigning (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
codesignIdent:
|
||||||
|
description: 'Developer ID for application codesigning (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: '-'
|
||||||
|
visualStudio:
|
||||||
|
description: 'Visual Studio version (Windows only)'
|
||||||
|
required: false
|
||||||
|
default: 'Visual Studio 16 2019'
|
||||||
|
portable:
|
||||||
|
description: 'Set portable mode (Linux only)'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
workingDirectory:
|
||||||
|
description: 'Working directory for packaging'
|
||||||
|
required: false
|
||||||
|
default: ${{ github.workspace }}
|
||||||
|
runs:
|
||||||
|
using: 'composite'
|
||||||
|
steps:
|
||||||
|
- name: Run macOS Build
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
shell: zsh {0}
|
||||||
|
env:
|
||||||
|
CODESIGN_IDENT: ${{ inputs.codesignIdent }}
|
||||||
|
run: |
|
||||||
|
build_args=(
|
||||||
|
-c ${{ inputs.config }}
|
||||||
|
-t macos-${{ inputs.target }}
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ '${{ inputs.codesign }}' == 'true' ]] build_args+=(-s)
|
||||||
|
if (( ${+CI} && ${+RUNNER_DEBUG} )) build_args+=(--debug)
|
||||||
|
|
||||||
|
${{ inputs.workingDirectory }}/.github/scripts/build-macos.zsh ${build_args}
|
||||||
|
|
||||||
|
- name: Run Linux Build
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
build_args=(
|
||||||
|
-c ${{ inputs.config }}
|
||||||
|
-t linux-${{ inputs.target }}
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ -n "${CI}" && -n "${RUNNER_DEBUG}" ]]; then
|
||||||
|
build_args+=(--debug)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ '${{ inputs.portable }}' == 'true' ]]; then
|
||||||
|
build_args+=(-p)
|
||||||
|
fi
|
||||||
|
|
||||||
|
${{ inputs.workingDirectory }}/.github/scripts/build-linux.sh "${build_args[@]}"
|
||||||
|
|
||||||
|
- name: Run Windows Build
|
||||||
|
if: ${{ runner.os == 'Windows' }}
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$BuildArgs = @{
|
||||||
|
Target = '${{ inputs.target }}'
|
||||||
|
Configuration = '${{ inputs.config }}'
|
||||||
|
CMakeGenerator = '${{ inputs.visualStudio }}'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( Test-Path env:CI ) -and ( Test-Path env:RUNNER_DEBUG ) ) {
|
||||||
|
$BuildArgs += @{
|
||||||
|
Debug = $true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
${{ inputs.workingDirectory }}/.github/scripts/Build-Windows.ps1 @BuildArgs
|
||||||
107
.github/actions/package-plugin/action.yml
vendored
Normal file
107
.github/actions/package-plugin/action.yml
vendored
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
name: 'Package plugin'
|
||||||
|
description: 'Packages the plugin for specified architecture and build config.'
|
||||||
|
inputs:
|
||||||
|
target:
|
||||||
|
description: 'Build target for dependencies'
|
||||||
|
required: true
|
||||||
|
config:
|
||||||
|
description: 'Build configuration'
|
||||||
|
required: false
|
||||||
|
default: 'Release'
|
||||||
|
codesign:
|
||||||
|
description: 'Enable codesigning (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
notarize:
|
||||||
|
description: 'Enable notarization (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
codesignIdent:
|
||||||
|
description: 'Developer ID for application codesigning (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: '-'
|
||||||
|
installerIdent:
|
||||||
|
description: 'Developer ID for installer package codesigning (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
codesignUser:
|
||||||
|
description: 'Apple ID username for notarization (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
codesignPass:
|
||||||
|
description: 'Apple ID password for notarization (macOS only)'
|
||||||
|
required: false
|
||||||
|
default: ''
|
||||||
|
createInstaller:
|
||||||
|
description: 'Create InnoSetup installer (Windows only)'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
portable:
|
||||||
|
description: 'Create deb package / portable archive (Linux only)'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
workingDirectory:
|
||||||
|
description: 'Working directory for packaging'
|
||||||
|
required: false
|
||||||
|
default: ${{ github.workspace }}
|
||||||
|
runs:
|
||||||
|
using: 'composite'
|
||||||
|
steps:
|
||||||
|
- name: Run macOS packaging
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
shell: zsh {0}
|
||||||
|
env:
|
||||||
|
CODESIGN_IDENT: ${{ inputs.codesignIdent }}
|
||||||
|
CODESIGN_IDENT_INSTALLER: ${{ inputs.installerIdent }}
|
||||||
|
CODESIGN_IDENT_USER: ${{ inputs.codesignUser }}
|
||||||
|
CODESIGN_IDENT_PASS: ${{ inputs.codesignPass }}
|
||||||
|
run: |
|
||||||
|
package_args=(
|
||||||
|
-c ${{ inputs.config }}
|
||||||
|
-t macos-${{ inputs.target }}
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ '${{ inputs.codesign }}' == 'true' ]] package_args+=(-s)
|
||||||
|
if [[ '${{ inputs.notarize }}' == 'true' ]] package_args+=(-n)
|
||||||
|
if (( ${+CI} && ${+RUNNER_DEBUG} )) build_args+=(--debug)
|
||||||
|
|
||||||
|
${{ inputs.workingDirectory }}/.github/scripts/package-macos.zsh ${package_args}
|
||||||
|
|
||||||
|
- name: Run Linux packaging
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
package_args=(
|
||||||
|
-c ${{ inputs.config }}
|
||||||
|
-t linux-${{ inputs.target }}
|
||||||
|
)
|
||||||
|
if [[ -n "${CI}" && -n "${RUNNER_DEBUG}" ]]; then
|
||||||
|
build_args+=(--debug)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ '${{ inputs.portable }}' == 'true' ]]; then
|
||||||
|
package_args+=(-z)
|
||||||
|
fi
|
||||||
|
|
||||||
|
${{ inputs.workingDirectory }}/.github/scripts/package-linux.sh "${package_args[@]}"
|
||||||
|
|
||||||
|
- name: Run Windows packaging
|
||||||
|
if: ${{ runner.os == 'Windows' }}
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$PackageArgs = @{
|
||||||
|
Target = '${{ inputs.target }}'
|
||||||
|
Configuration = '${{ inputs.config }}'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( '${{ inputs.createInstaller }}' -eq 'true' ) {
|
||||||
|
$PackageArgs += @{BuildInstaller = $true}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( Test-Path env:CI ) -and ( Test-Path env:RUNNER_DEBUG ) ) {
|
||||||
|
$BuildArgs += @{
|
||||||
|
Debug = $true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
${{ inputs.workingDirectory }}/.github/scripts/Package-Windows.ps1 @PackageArgs
|
||||||
9
.github/scripts/.Aptfile
vendored
Normal file
9
.github/scripts/.Aptfile
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package 'cmake'
|
||||||
|
package 'ccache'
|
||||||
|
package 'curl'
|
||||||
|
package 'git'
|
||||||
|
package 'jq'
|
||||||
|
package 'ninja-build', bin: 'ninja'
|
||||||
|
package 'pkg-config'
|
||||||
|
package 'clang'
|
||||||
|
package 'clang-format-13'
|
||||||
6
.github/scripts/.Brewfile
vendored
Normal file
6
.github/scripts/.Brewfile
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
brew "ccache"
|
||||||
|
brew "coreutils"
|
||||||
|
brew "cmake"
|
||||||
|
brew "git"
|
||||||
|
brew "jq"
|
||||||
|
brew "ninja"
|
||||||
3
.github/scripts/.Wingetfile
vendored
Normal file
3
.github/scripts/.Wingetfile
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
package '7zip.7zip', path: '7-zip', bin: '7z'
|
||||||
|
package 'cmake', path: 'Cmake\bin', bin: 'cmake'
|
||||||
|
package 'innosetup', path: 'Inno Setup 6', bin: 'iscc'
|
||||||
281
.github/scripts/.build.zsh
vendored
Executable file
281
.github/scripts/.build.zsh
vendored
Executable file
@@ -0,0 +1,281 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
builtin emulate -L zsh
|
||||||
|
setopt EXTENDED_GLOB
|
||||||
|
setopt PUSHD_SILENT
|
||||||
|
setopt ERR_EXIT
|
||||||
|
setopt ERR_RETURN
|
||||||
|
setopt NO_UNSET
|
||||||
|
setopt PIPE_FAIL
|
||||||
|
setopt NO_AUTO_PUSHD
|
||||||
|
setopt NO_PUSHD_IGNORE_DUPS
|
||||||
|
setopt FUNCTION_ARGZERO
|
||||||
|
|
||||||
|
## Enable for script debugging
|
||||||
|
# setopt WARN_CREATE_GLOBAL
|
||||||
|
# setopt WARN_NESTED_VAR
|
||||||
|
# setopt XTRACE
|
||||||
|
|
||||||
|
autoload -Uz is-at-least && if ! is-at-least 5.2; then
|
||||||
|
print -u2 -PR "%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.2%b is the minimum supported version. Upgrade Zsh to fix this issue."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
_trap_error() {
|
||||||
|
print -u2 -PR '%F{1} ✖︎ script execution error%f'
|
||||||
|
print -PR -e "
|
||||||
|
Callstack:
|
||||||
|
${(j:\n :)funcfiletrace}
|
||||||
|
"
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h}
|
||||||
|
local host_os=${${(s:-:)ZSH_ARGZERO:t:r}[2]}
|
||||||
|
local target="${host_os}-${CPUTYPE}"
|
||||||
|
local project_root=${SCRIPT_HOME:A:h:h}
|
||||||
|
local buildspec_file="${project_root}/buildspec.json"
|
||||||
|
|
||||||
|
trap '_trap_error' ZERR
|
||||||
|
|
||||||
|
fpath=("${SCRIPT_HOME}/utils.zsh" ${fpath})
|
||||||
|
autoload -Uz log_info log_error log_output set_loglevel check_${host_os} setup_${host_os} setup_obs setup_ccache
|
||||||
|
|
||||||
|
if [[ ! -r ${buildspec_file} ]] {
|
||||||
|
log_error \
|
||||||
|
'No buildspec.json found. Please create a build specification for your project.' \
|
||||||
|
'A buildspec.json.template file is provided in the repository to get you started.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
typeset -g -a skips=()
|
||||||
|
local -i _verbosity=1
|
||||||
|
local -r _version='1.0.0'
|
||||||
|
local -r -a _valid_targets=(
|
||||||
|
macos-x86_64
|
||||||
|
macos-arm64
|
||||||
|
macos-universal
|
||||||
|
linux-x86_64
|
||||||
|
)
|
||||||
|
local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel)
|
||||||
|
if [[ ${host_os} == 'macos' ]] {
|
||||||
|
local -r -a _valid_generators=(Xcode Ninja 'Unix Makefiles')
|
||||||
|
local generator="${${CI:+Ninja}:-Xcode}"
|
||||||
|
} else {
|
||||||
|
local -r -a _valid_generators=(Ninja 'Unix Makefiles')
|
||||||
|
local generator='Ninja'
|
||||||
|
}
|
||||||
|
local -r _usage="
|
||||||
|
Usage: %B${functrace[1]%:*}%b <option> [<options>]
|
||||||
|
|
||||||
|
%BOptions%b:
|
||||||
|
|
||||||
|
%F{yellow} Build configuration options%f
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
%B-t | --target%b Specify target - default: %B%F{green}${host_os}-${CPUTYPE}%f%b
|
||||||
|
%B-c | --config%b Build configuration - default: %B%F{green}RelWithDebInfo%f%b
|
||||||
|
%B-s | --codesign%b Enable codesigning (macOS only)
|
||||||
|
%B-p | --portable%b Enable portable mode (Linux only)
|
||||||
|
%B--generator%b Specify build system to generate - default: %B%F{green}Ninja%f%b
|
||||||
|
Available generators:
|
||||||
|
- Ninja
|
||||||
|
- Unix Makefiles
|
||||||
|
- Xcode (macOS only)
|
||||||
|
|
||||||
|
%F{yellow} Output options%f
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
%B-q | --quiet%b Quiet (error output only)
|
||||||
|
%B-v | --verbose%b Verbose (more detailed output)
|
||||||
|
%B--skip-[all|build|deps|unpack]%b Skip all|building OBS|checking for dependencies|unpacking dependencies
|
||||||
|
%B--debug%b Debug (very detailed and added output)
|
||||||
|
|
||||||
|
%F{yellow} General options%f
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
%B-h | --help%b Print this usage help
|
||||||
|
%B-V | --version%b Print script version information"
|
||||||
|
|
||||||
|
local -a args
|
||||||
|
while (( # )) {
|
||||||
|
case ${1} {
|
||||||
|
-t|--target|-c|--config|--generator)
|
||||||
|
if (( # == 1 )) || [[ ${2:0:1} == '-' ]] {
|
||||||
|
log_error "Missing value for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
case ${1} {
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
args+=($@)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-t|--target)
|
||||||
|
if (( ! ${_valid_targets[(Ie)${2}]} )) {
|
||||||
|
log_error "Invalid value %B${2}%b for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
target=${2}
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-c|--config)
|
||||||
|
if (( ! ${_valid_configs[(Ie)${2}]} )) {
|
||||||
|
log_error "Invalid value %B${2}%b for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
BUILD_CONFIG=${2}
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-s|--codesign) CODESIGN=1; shift ;;
|
||||||
|
-p|--portable) typeset -g PORTABLE=1; shift ;;
|
||||||
|
-q|--quiet) (( _verbosity -= 1 )) || true; shift ;;
|
||||||
|
-v|--verbose) (( _verbosity += 1 )); shift ;;
|
||||||
|
-h|--help) log_output ${_usage}; exit 0 ;;
|
||||||
|
-V|--version) print -Pr "${_version}"; exit 0 ;;
|
||||||
|
--debug) _verbosity=3; shift ;;
|
||||||
|
--generator)
|
||||||
|
if (( ! ${_valid_generators[(Ie)${2}]} )) {
|
||||||
|
log_error "Invalid value %B${2}%b for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
generator=${2}
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--skip-*)
|
||||||
|
local _skip="${${(s:-:)1}[-1]}"
|
||||||
|
local _check=(all deps unpack build)
|
||||||
|
(( ${_check[(Ie)${_skip}]} )) || log_warning "Invalid skip mode %B${_skip}%b supplied"
|
||||||
|
typeset -g -a skips=(${skips} ${_skip})
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*) log_error "Unknown option: %B${1}%b"; log_output ${_usage}; exit 2 ;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set -- ${(@)args}
|
||||||
|
set_loglevel ${_verbosity}
|
||||||
|
|
||||||
|
check_${host_os}
|
||||||
|
setup_ccache
|
||||||
|
|
||||||
|
typeset -g QT_VERSION
|
||||||
|
typeset -g DEPLOYMENT_TARGET
|
||||||
|
typeset -g OBS_DEPS_VERSION
|
||||||
|
setup_${host_os}
|
||||||
|
|
||||||
|
local product_name
|
||||||
|
local product_version
|
||||||
|
read -r product_name product_version <<< \
|
||||||
|
"$(jq -r '. | {name, version} | join(" ")' ${buildspec_file})"
|
||||||
|
|
||||||
|
local opencv_dir="${project_root}/deps/opencv"
|
||||||
|
local opencv_build_dir="${opencv_dir}/build_${target##*-}"
|
||||||
|
case ${host_os} {
|
||||||
|
macos)
|
||||||
|
sed -i '' \
|
||||||
|
"s/project(\(.*\) VERSION \(.*\))/project(${product_name} VERSION ${product_version})/" \
|
||||||
|
"${project_root}/CMakeLists.txt"
|
||||||
|
|
||||||
|
# Note: IPP must be set to OFF to avoid build failures on ARM architectures
|
||||||
|
local -a opencv_cmake_args=(
|
||||||
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
|
-DBUILD_LIST=core,imgproc,objdetect
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
|
||||||
|
-DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-10.15}
|
||||||
|
-DWITH_IPP=OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
pushd ${opencv_dir}
|
||||||
|
log_info "Configure OpenCV ..."
|
||||||
|
cmake -S . -B ${opencv_build_dir} -G ${generator} ${opencv_cmake_args}
|
||||||
|
|
||||||
|
log_info "Building OpenCV ..."
|
||||||
|
cmake --build ${opencv_build_dir} --config Release
|
||||||
|
|
||||||
|
log_info "Installing OpenCV..."
|
||||||
|
cmake --install ${opencv_build_dir} --config Release --prefix ${opencv_build_dir}
|
||||||
|
popd
|
||||||
|
|
||||||
|
;;
|
||||||
|
linux)
|
||||||
|
sed -i'' \
|
||||||
|
"s/project(\(.*\) VERSION \(.*\))/project(${product_name} VERSION ${product_version})/"\
|
||||||
|
"${project_root}/CMakeLists.txt"
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_obs
|
||||||
|
|
||||||
|
pushd ${project_root}
|
||||||
|
if (( ! (${skips[(Ie)all]} + ${skips[(Ie)build]}) )) {
|
||||||
|
log_info "Configuring ${product_name}..."
|
||||||
|
|
||||||
|
local _plugin_deps="${project_root:h}/obs-build-dependencies/plugin-deps-${OBS_DEPS_VERSION}-qt${QT_VERSION}-${target##*-}"
|
||||||
|
local -a cmake_args=(
|
||||||
|
-DCMAKE_BUILD_TYPE=${BUILD_CONFIG:-RelWithDebInfo}
|
||||||
|
-DQT_VERSION=${QT_VERSION}
|
||||||
|
-DCMAKE_PREFIX_PATH="${_plugin_deps}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (( _loglevel == 0 )) cmake_args+=(-Wno_deprecated -Wno-dev --log-level=ERROR)
|
||||||
|
if (( _loglevel > 2 )) cmake_args+=(--debug-output)
|
||||||
|
|
||||||
|
local num_procs
|
||||||
|
|
||||||
|
case ${target} {
|
||||||
|
macos-*)
|
||||||
|
autoload -Uz read_codesign
|
||||||
|
if (( ${+CODESIGN} )) {
|
||||||
|
read_codesign
|
||||||
|
}
|
||||||
|
|
||||||
|
num_procs=$(( $(sysctl -n hw.ncpu) + 1 ))
|
||||||
|
|
||||||
|
cmake_args+=(
|
||||||
|
-DCMAKE_FRAMEWORK_PATH="${_plugin_deps}/Frameworks"
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
|
||||||
|
-DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-10.15}
|
||||||
|
-DOBS_CODESIGN_LINKER=ON
|
||||||
|
-DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}"
|
||||||
|
-DOpenCV_DIR="${opencv_build_dir}"
|
||||||
|
)
|
||||||
|
|
||||||
|
;;
|
||||||
|
linux-*)
|
||||||
|
if (( ${+PORTABLE} )) {
|
||||||
|
cmake_args+=(
|
||||||
|
-DLINUX_PORTABLE=ON
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
cmake_args+=(
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr
|
||||||
|
-DLINUX_PORTABLE=OFF
|
||||||
|
)
|
||||||
|
}
|
||||||
|
num_procs=$(( $(nproc) + 1 ))
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug "Attempting to configure ${product_name} with CMake arguments: ${cmake_args}"
|
||||||
|
cmake -S . -B build_${target##*-} -G ${generator} ${cmake_args}
|
||||||
|
|
||||||
|
log_info "Building ${product_name}..."
|
||||||
|
local -a cmake_args=()
|
||||||
|
if (( _loglevel > 1 )) cmake_args+=(--verbose)
|
||||||
|
if [[ ${generator} == 'Unix Makefiles' ]] cmake_args+=(--parallel ${num_procs})
|
||||||
|
cmake --build build_${target##*-} --config ${BUILD_CONFIG:-RelWithDebInfo} ${cmake_args}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info "Installing ${product_name}..."
|
||||||
|
local -a cmake_args=()
|
||||||
|
if (( _loglevel > 1 )) cmake_args+=(--verbose)
|
||||||
|
cmake --install build_${target##*-} --config ${BUILD_CONFIG:-RelWithDebInfo} --prefix "${project_root}/release" ${cmake_args}
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
build ${@}
|
||||||
201
.github/scripts/.package.zsh
vendored
Executable file
201
.github/scripts/.package.zsh
vendored
Executable file
@@ -0,0 +1,201 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
builtin emulate -L zsh
|
||||||
|
setopt EXTENDED_GLOB
|
||||||
|
setopt PUSHD_SILENT
|
||||||
|
setopt ERR_EXIT
|
||||||
|
setopt ERR_RETURN
|
||||||
|
setopt NO_UNSET
|
||||||
|
setopt PIPE_FAIL
|
||||||
|
setopt NO_AUTO_PUSHD
|
||||||
|
setopt NO_PUSHD_IGNORE_DUPS
|
||||||
|
setopt FUNCTION_ARGZERO
|
||||||
|
|
||||||
|
## Enable for script debugging
|
||||||
|
# setopt WARN_CREATE_GLOBAL
|
||||||
|
# setopt WARN_NESTED_VAR
|
||||||
|
# setopt XTRACE
|
||||||
|
|
||||||
|
autoload -Uz is-at-least && if ! is-at-least 5.2; then
|
||||||
|
print -u2 -PR "%F{1}${funcstack[1]##*/}:%f Running on Zsh version %B${ZSH_VERSION}%b, but Zsh %B5.2%b is the minimum supported version. Upgrade Zsh to fix this issue."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
_trap_error() {
|
||||||
|
print -u2 -PR '%F{1} ✖︎ script execution error%f'
|
||||||
|
print -PR -e "
|
||||||
|
Callstack:
|
||||||
|
${(j:\n :)funcfiletrace}
|
||||||
|
"
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
if (( ! ${+SCRIPT_HOME} )) typeset -g SCRIPT_HOME=${ZSH_ARGZERO:A:h}
|
||||||
|
local host_os=${${(s:-:)ZSH_ARGZERO:t:r}[2]}
|
||||||
|
local target="${host_os}-${CPUTYPE}"
|
||||||
|
local project_root=${SCRIPT_HOME:A:h:h}
|
||||||
|
local buildspec_file="${project_root}/buildspec.json"
|
||||||
|
trap '_trap_error' ZERR
|
||||||
|
|
||||||
|
fpath=("${SCRIPT_HOME}/utils.zsh" ${fpath})
|
||||||
|
autoload -Uz set_loglevel log_info log_error log_output check_${host_os}
|
||||||
|
|
||||||
|
local -i _verbosity=1
|
||||||
|
local -r _version='1.0.0'
|
||||||
|
local -r -a _valid_targets=(
|
||||||
|
macos-x86_64
|
||||||
|
macos-arm64
|
||||||
|
macos-universal
|
||||||
|
linux-x86_64
|
||||||
|
)
|
||||||
|
local -r -a _valid_configs=(Debug RelWithDebInfo Release MinSizeRel)
|
||||||
|
local -r _usage="
|
||||||
|
Usage: %B${functrace[1]%:*}%b <option> [<options>]
|
||||||
|
|
||||||
|
%BOptions%b:
|
||||||
|
|
||||||
|
%F{yellow} Package configuration options%f
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
%B-t | --target%b Specify target - default: %B%F{green}${host_os}-${CPUTYPE}%f%b
|
||||||
|
%B-c | --config%b Build configuration - default: %B%F{green}RelWithDebInfo%f%b
|
||||||
|
%B-s | --codesign%b Enable codesigning (macOS only)
|
||||||
|
%B-n | --notarize%b Enable notarization (macOS only)
|
||||||
|
%B-z | --zip%b Zip only (Linux only)
|
||||||
|
|
||||||
|
%F{yellow} Output options%f
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
%B-q | --quiet%b Quiet (error output only)
|
||||||
|
%B-v | --verbose%b Verbose (more detailed output)
|
||||||
|
%B--debug%b Debug (very detailed and added output)
|
||||||
|
|
||||||
|
%F{yellow} General options%f
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
%B-h | --help%b Print this usage help
|
||||||
|
%B-V | --version%b Print script version information"
|
||||||
|
|
||||||
|
local -a args
|
||||||
|
while (( # )) {
|
||||||
|
case ${1} {
|
||||||
|
-t|--target|-c|--config)
|
||||||
|
if (( # == 1 )) || [[ ${2:0:1} == '-' ]] {
|
||||||
|
log_error "Missing value for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
case ${1} {
|
||||||
|
--)
|
||||||
|
shift
|
||||||
|
args+=($@)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-t|--target)
|
||||||
|
if (( ! ${_valid_targets[(Ie)${2}]} )) {
|
||||||
|
log_error "Invalid value %B${2}%b for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
target=${2}
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-c|--config)
|
||||||
|
if (( ! ${_valid_configs[(Ie)${2}]} )) {
|
||||||
|
log_error "Invalid value %B${2}%b for option %B${1}%b"
|
||||||
|
log_output ${_usage}
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
BUILD_CONFIG=${2}
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-s|--codesign) typeset -g CODESIGN=1; shift ;;
|
||||||
|
-n|--notarize) typeset -g NOTARIZE=1; typeset -g CODESIGN=1; shift ;;
|
||||||
|
-z|--zip) typeset -g ZIP=1; shift ;;
|
||||||
|
-q|--quiet) (( _verbosity -= 1 )) || true; shift ;;
|
||||||
|
-v|--verbose) (( _verbosity += 1 )); shift ;;
|
||||||
|
-h|--help) log_output ${_usage}; exit 0 ;;
|
||||||
|
-V|--version) print -Pr "${_version}"; exit 0 ;;
|
||||||
|
--debug) _verbosity=3; shift ;;
|
||||||
|
*) log_error "Unknown option: %B${1}%b"; log_output ${_usage}; exit 2 ;;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set -- ${(@)args}
|
||||||
|
set_loglevel ${_verbosity}
|
||||||
|
|
||||||
|
check_${host_os}
|
||||||
|
|
||||||
|
local product_name
|
||||||
|
local product_version
|
||||||
|
read -r product_name product_version <<< \
|
||||||
|
"$(jq -r '. | {name, version} | join(" ")' ${project_root}/buildspec.json)"
|
||||||
|
|
||||||
|
if [[ ${host_os} == 'macos' ]] {
|
||||||
|
autoload -Uz check_packages read_codesign read_codesign_installer read_codesign_pass
|
||||||
|
|
||||||
|
local output_name="${product_name}-${host_os}-${target##*-}.pkg"
|
||||||
|
|
||||||
|
if [[ ! -d ${project_root}/release/${product_name}.plugin ]] {
|
||||||
|
log_error 'No release artifact found. Run the build script or the CMake install procedure first.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ ! -f ${project_root}/build_${target##*-}/installer-macos.generated.pkgproj ]] {
|
||||||
|
log_error 'Packages project file not found. Run the build script or the CMake build and install procedures first.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
check_packages
|
||||||
|
|
||||||
|
log_info "Packaging ${product_name}..."
|
||||||
|
pushd ${project_root}
|
||||||
|
packagesbuild \
|
||||||
|
--build-folder ${project_root}/release \
|
||||||
|
${project_root}/build_${target##*-}/installer-macos.generated.pkgproj
|
||||||
|
|
||||||
|
if (( ${+CODESIGN} )) {
|
||||||
|
read_codesign_installer
|
||||||
|
productsign \
|
||||||
|
--sign "${CODESIGN_IDENT_INSTALLER}" \
|
||||||
|
"${project_root}/release/${product_name}.pkg" \
|
||||||
|
"${project_root}/release/${output_name}"
|
||||||
|
|
||||||
|
rm "${project_root}/release/${product_name}.pkg"
|
||||||
|
} else {
|
||||||
|
mv "${project_root}/release/${product_name}.pkg" \
|
||||||
|
"${project_root}/release/${output_name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ${+CODESIGN} && ${+NOTARIZE} )) {
|
||||||
|
if [[ ! -f "${project_root}/release/${output_name}" ]] {
|
||||||
|
log_error "No package for notarization found."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
read_codesign_installer
|
||||||
|
read_codesign_pass
|
||||||
|
|
||||||
|
xcrun notarytool submit "${project_root}/release/${output_name}" \
|
||||||
|
--keychain-profile "OBS-Codesign-Password" --wait
|
||||||
|
xcrun stapler staple "${project_root}/release/${output_name}"
|
||||||
|
}
|
||||||
|
popd
|
||||||
|
} elif [[ ${host_os} == 'linux' ]] {
|
||||||
|
if (( ${+ZIP} )) {
|
||||||
|
local output_name="${product_name}-${host_os}-${target##*-}.zip"
|
||||||
|
pushd ${project_root}/release
|
||||||
|
zip -r "${output_name}" *
|
||||||
|
popd
|
||||||
|
} else {
|
||||||
|
local -a cmake_args=()
|
||||||
|
if (( _loglevel > 1 )) cmake_args+=(--verbose)
|
||||||
|
|
||||||
|
pushd ${project_root}
|
||||||
|
cmake --build build_${target##*-} --config ${BUILD_CONFIG:-RelWithDebInfo} -t package ${cmake_args}
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package ${@}
|
||||||
137
.github/scripts/Build-Windows.ps1
vendored
Normal file
137
.github/scripts/Build-Windows.ps1
vendored
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')]
|
||||||
|
[string] $Configuration = 'RelWithDebInfo',
|
||||||
|
[ValidateSet('x86', 'x64')]
|
||||||
|
[string] $Target,
|
||||||
|
[ValidateSet('Visual Studio 17 2022', 'Visual Studio 16 2019')]
|
||||||
|
[string] $CMakeGenerator,
|
||||||
|
[switch] $SkipAll,
|
||||||
|
[switch] $SkipBuild,
|
||||||
|
[switch] $SkipDeps,
|
||||||
|
[switch] $SkipUnpack
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
if ( $DebugPreference -eq 'Continue' ) {
|
||||||
|
$VerbosePreference = 'Continue'
|
||||||
|
$InformationPreference = 'Continue'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $PSVersionTable.PSVersion -lt '7.0.0' ) {
|
||||||
|
Write-Warning 'The obs-deps PowerShell build script requires PowerShell Core 7. Install or upgrade your PowerShell version: https://aka.ms/pscore6'
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
function Build {
|
||||||
|
trap {
|
||||||
|
Pop-Location -Stack BuildTemp -ErrorAction 'SilentlyContinue'
|
||||||
|
Write-Error $_
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
$ScriptHome = $PSScriptRoot
|
||||||
|
$ProjectRoot = Resolve-Path -Path "$PSScriptRoot/../.."
|
||||||
|
$BuildSpecFile = "${ProjectRoot}/buildspec.json"
|
||||||
|
|
||||||
|
$UtilityFunctions = Get-ChildItem -Path $PSScriptRoot/utils.pwsh/*.ps1 -Recurse
|
||||||
|
|
||||||
|
foreach($Utility in $UtilityFunctions) {
|
||||||
|
Write-Debug "Loading $($Utility.FullName)"
|
||||||
|
. $Utility.FullName
|
||||||
|
}
|
||||||
|
|
||||||
|
$BuildSpec = Get-Content -Path ${BuildSpecFile} -Raw | ConvertFrom-Json
|
||||||
|
$ProductName = $BuildSpec.name
|
||||||
|
$ProductVersion = $BuildSpec.version
|
||||||
|
|
||||||
|
$script:DepsVersion = ''
|
||||||
|
$script:QtVersion = '5'
|
||||||
|
$script:VisualStudioVersion = ''
|
||||||
|
$script:PlatformSDK = '10.0.18363.657'
|
||||||
|
|
||||||
|
Setup-Host
|
||||||
|
|
||||||
|
if ( $CmakeGenerator -eq '' ) {
|
||||||
|
$CmakeGenerator = $script:VisualStudioVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
Push-Location -Stack BuildOpenCVTemp
|
||||||
|
if ( ! ( ( $SkipAll ) -or ( $SkipBuild ) ) ) {
|
||||||
|
Ensure-Location $ProjectRoot
|
||||||
|
|
||||||
|
$OpenCVPath = "${ProjectRoot}/deps/opencv"
|
||||||
|
$OpenCVBuildPath = "${OpenCVPath}/build"
|
||||||
|
$OpenCVCmakeArgs = @(
|
||||||
|
'-G', $CmakeGenerator
|
||||||
|
"-DCMAKE_SYSTEM_VERSION=${script:PlatformSDK}"
|
||||||
|
"-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
|
||||||
|
"-DCMAKE_BUILD_TYPE=Release"
|
||||||
|
"-DCMAKE_PREFIX_PATH:PATH=$(Resolve-Path -Path ${ProjectRoot}/../obs-build-dependencies/${DepsPath})"
|
||||||
|
"-DBUILD_LIST=core,imgproc,objdetect"
|
||||||
|
)
|
||||||
|
|
||||||
|
Log-Information "Configuring OpenCV..."
|
||||||
|
Invoke-External cmake -S ${OpenCVPath} -B ${OpenCVBuildPath} @OpenCVCmakeArgs
|
||||||
|
|
||||||
|
$OpenCVCmakeArgs = @(
|
||||||
|
'--config', "Release"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( $VerbosePreference -eq 'Continue' ) {
|
||||||
|
$OpenCVCmakeArgs+=('--verbose')
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information "Building OpenCV..."
|
||||||
|
Invoke-External cmake --build "${OpenCVBuildPath}" @OpenCVCmakeArgs
|
||||||
|
}
|
||||||
|
Log-Information "Install OpenCV}..."
|
||||||
|
Invoke-External cmake --install "${OpenCVBuildPath}" --prefix "${OpenCVBuildPath}" @OpenCVCmakeArgs
|
||||||
|
|
||||||
|
(Get-Content -Path ${ProjectRoot}/CMakeLists.txt -Raw) `
|
||||||
|
-replace "project\((.*) VERSION (.*)\)", "project(${ProductName} VERSION ${ProductVersion})" `
|
||||||
|
| Out-File -Path ${ProjectRoot}/CMakeLists.txt
|
||||||
|
|
||||||
|
Setup-Obs
|
||||||
|
|
||||||
|
Push-Location -Stack BuildTemp
|
||||||
|
if ( ! ( ( $SkipAll ) -or ( $SkipBuild ) ) ) {
|
||||||
|
Ensure-Location $ProjectRoot
|
||||||
|
|
||||||
|
$OpenCVPath = "${ProjectRoot}/deps/opencv"
|
||||||
|
$OpenCVBuildPath = "${OpenCVPath}/build"
|
||||||
|
|
||||||
|
$DepsPath = "plugin-deps-${script:DepsVersion}-qt${script:QtVersion}-${script:Target}"
|
||||||
|
$CmakeArgs = @(
|
||||||
|
'-G', $CmakeGenerator
|
||||||
|
"-DCMAKE_SYSTEM_VERSION=${script:PlatformSDK}"
|
||||||
|
"-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
|
||||||
|
"-DCMAKE_BUILD_TYPE=${Configuration}"
|
||||||
|
"-DCMAKE_PREFIX_PATH:PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/${DepsPath}")"
|
||||||
|
"-DQT_VERSION=${script:QtVersion}"
|
||||||
|
"-DOpenCV_DIR=${OpenCVBuildPath}"
|
||||||
|
)
|
||||||
|
|
||||||
|
Log-Debug "Attempting to configure OBS with CMake arguments: $($CmakeArgs | Out-String)"
|
||||||
|
Log-Information "Configuring ${ProductName}..."
|
||||||
|
Invoke-External cmake -S . -B build_${script:Target} @CmakeArgs
|
||||||
|
|
||||||
|
$CmakeArgs = @(
|
||||||
|
'--config', "${Configuration}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( $VerbosePreference -eq 'Continue' ) {
|
||||||
|
$CmakeArgs+=('--verbose')
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information "Building ${ProductName}..."
|
||||||
|
Invoke-External cmake --build "build_${script:Target}" @CmakeArgs
|
||||||
|
}
|
||||||
|
Log-Information "Install ${ProductName}..."
|
||||||
|
Invoke-External cmake --install "build_${script:Target}" --prefix "${ProjectRoot}/release" @CmakeArgs
|
||||||
|
|
||||||
|
Pop-Location -Stack BuildTemp
|
||||||
|
}
|
||||||
|
|
||||||
|
Build
|
||||||
91
.github/scripts/Package-Windows.ps1
vendored
Normal file
91
.github/scripts/Package-Windows.ps1
vendored
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[ValidateSet('Debug', 'RelWithDebInfo', 'Release', 'MinSizeRel')]
|
||||||
|
[string] $Configuration = 'RelWithDebInfo',
|
||||||
|
[ValidateSet('x86', 'x64', 'x86+x64')]
|
||||||
|
[string] $Target,
|
||||||
|
[switch] $BuildInstaller = $false
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
if ( $DebugPreference -eq 'Continue' ) {
|
||||||
|
$VerbosePreference = 'Continue'
|
||||||
|
$InformationPreference = 'Continue'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $PSVersionTable.PSVersion -lt '7.0.0' ) {
|
||||||
|
Write-Warning 'The obs-deps PowerShell build script requires PowerShell Core 7. Install or upgrade your PowerShell version: https://aka.ms/pscore6'
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
function Package {
|
||||||
|
trap {
|
||||||
|
Write-Error $_
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
$ScriptHome = $PSScriptRoot
|
||||||
|
$ProjectRoot = Resolve-Path -Path "$PSScriptRoot/../.."
|
||||||
|
$BuildSpecFile = "${ProjectRoot}/buildspec.json"
|
||||||
|
|
||||||
|
$UtilityFunctions = Get-ChildItem -Path $PSScriptRoot/utils.pwsh/*.ps1 -Recurse
|
||||||
|
|
||||||
|
foreach( $Utility in $UtilityFunctions ) {
|
||||||
|
Write-Debug "Loading $($Utility.FullName)"
|
||||||
|
. $Utility.FullName
|
||||||
|
}
|
||||||
|
|
||||||
|
$BuildSpec = Get-Content -Path ${BuildSpecFile} -Raw | ConvertFrom-Json
|
||||||
|
$ProductName = $BuildSpec.name
|
||||||
|
|
||||||
|
$OutputName = "${ProductName}-windows-${Target}"
|
||||||
|
|
||||||
|
Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile"
|
||||||
|
|
||||||
|
Log-Information "Packaging ${ProductName}..."
|
||||||
|
|
||||||
|
$RemoveArgs = @{
|
||||||
|
ErrorAction = 'SilentlyContinue'
|
||||||
|
Path = @(
|
||||||
|
"${ProjectRoot}/release/${ProductName}-*-windows-*.zip"
|
||||||
|
"${ProjectRoot}/release/${ProductName}-*-windows-*.exe"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Remove-Item @RemoveArgs
|
||||||
|
|
||||||
|
if ( ( $BuildInstaller ) ) {
|
||||||
|
if ( $Target -eq 'x86+x64' ) {
|
||||||
|
$IsccCandidates = Get-ChildItem -Recurse -Path '*.iss'
|
||||||
|
|
||||||
|
if ( $IsccCandidates.length -gt 0 ) {
|
||||||
|
$IsccFile = $IsccCandidates[0].FullName
|
||||||
|
} else {
|
||||||
|
$IsccFile = ''
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$IsccFile = "${ProjectRoot}/build_${Target}/installer-Windows.generated.iss"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path -Path $IsccFile ) ) {
|
||||||
|
throw 'InnoSetup install script not found. Run the build script or the CMake build and install procedures first.'
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information 'Creating InnoSetup installer...'
|
||||||
|
Push-Location -Stack BuildTemp
|
||||||
|
Ensure-Location -Path "${ProjectRoot}/release"
|
||||||
|
Invoke-External iscc ${IsccFile} /O. /F"${OutputName}-Installer"
|
||||||
|
Pop-Location -Stack BuildTemp
|
||||||
|
}
|
||||||
|
|
||||||
|
$CompressArgs = @{
|
||||||
|
Path = (Get-ChildItem -Path "${ProjectRoot}/release" -Exclude "${OutputName}*.*")
|
||||||
|
CompressionLevel = 'Optimal'
|
||||||
|
DestinationPath = "${ProjectRoot}/release/${OutputName}.zip"
|
||||||
|
}
|
||||||
|
|
||||||
|
Compress-Archive -Force @CompressArgs
|
||||||
|
}
|
||||||
|
|
||||||
|
Package
|
||||||
13
.github/scripts/build-linux.sh
vendored
Executable file
13
.github/scripts/build-linux.sh
vendored
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if ! type zsh > /dev/null 2>&1; then
|
||||||
|
echo ' => Installing script dependency Zsh.'
|
||||||
|
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install zsh
|
||||||
|
fi
|
||||||
|
|
||||||
|
SCRIPT=$(readlink -f "${0}")
|
||||||
|
SCRIPT_DIR=$(dirname "${SCRIPT}")
|
||||||
|
|
||||||
|
zsh ${SCRIPT_DIR}/build-linux.zsh "${@}"
|
||||||
1
.github/scripts/build-linux.zsh
vendored
Symbolic link
1
.github/scripts/build-linux.zsh
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
.build.zsh
|
||||||
1
.github/scripts/build-macos.zsh
vendored
Symbolic link
1
.github/scripts/build-macos.zsh
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
.build.zsh
|
||||||
53
.github/scripts/check-cmake.sh
vendored
Executable file
53
.github/scripts/check-cmake.sh
vendored
Executable file
@@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
if [ ${#} -eq 1 -a "${1}" = "VERBOSE" ]; then
|
||||||
|
VERBOSITY="-l debug"
|
||||||
|
else
|
||||||
|
VERBOSITY=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${CI}" ]; then
|
||||||
|
MODE="--check"
|
||||||
|
else
|
||||||
|
MODE="-i"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Runs the formatter in parallel on the code base.
|
||||||
|
# Return codes:
|
||||||
|
# - 1 there are files to be formatted
|
||||||
|
# - 0 everything looks fine
|
||||||
|
|
||||||
|
# Get CPU count
|
||||||
|
OS=$(uname)
|
||||||
|
NPROC=1
|
||||||
|
if [[ ${OS} = "Linux" ]] ; then
|
||||||
|
NPROC=$(nproc)
|
||||||
|
elif [[ ${OS} = "Darwin" ]] ; then
|
||||||
|
NPROC=$(sysctl -n hw.physicalcpu)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Discover clang-format
|
||||||
|
if ! type cmake-format 2> /dev/null ; then
|
||||||
|
echo "Required cmake-format not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
find . -type d \( \
|
||||||
|
-path ./\*build -o \
|
||||||
|
-path ./deps/jansson -o \
|
||||||
|
-path ./plugins/decklink/\*/decklink-sdk -o \
|
||||||
|
-path ./plugins/enc-amf -o \
|
||||||
|
-path ./plugins/mac-syphon/syphon-framework -o \
|
||||||
|
-path ./plugins/obs-outputs/ftl-sdk -o \
|
||||||
|
-path ./plugins/obs-vst -o \
|
||||||
|
-path ./plugins/obs-browser -o \
|
||||||
|
-path ./plugins/win-dshow/libdshowcapture -o \
|
||||||
|
-path ./plugins/obs-websocket/deps -o \
|
||||||
|
-path ./deps \
|
||||||
|
\) -prune -false -type f -o \
|
||||||
|
-name 'CMakeLists.txt' -or \
|
||||||
|
-name '*.cmake' \
|
||||||
|
| xargs -L10 -P ${NPROC} cmake-format ${MODE} ${VERBOSITY}
|
||||||
60
.github/scripts/check-format.sh
vendored
Executable file
60
.github/scripts/check-format.sh
vendored
Executable file
@@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Original source https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/format.sh
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o pipefail
|
||||||
|
set -o nounset
|
||||||
|
|
||||||
|
if [ ${#} -eq 1 ]; then
|
||||||
|
VERBOSITY="--verbose"
|
||||||
|
else
|
||||||
|
VERBOSITY=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Runs the Clang Formatter in parallel on the code base.
|
||||||
|
# Return codes:
|
||||||
|
# - 1 there are files to be formatted
|
||||||
|
# - 0 everything looks fine
|
||||||
|
|
||||||
|
# Get CPU count
|
||||||
|
OS=$(uname)
|
||||||
|
NPROC=1
|
||||||
|
if [[ ${OS} = "Linux" ]] ; then
|
||||||
|
NPROC=$(nproc)
|
||||||
|
elif [[ ${OS} = "Darwin" ]] ; then
|
||||||
|
NPROC=$(sysctl -n hw.physicalcpu)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Discover clang-format
|
||||||
|
if type clang-format-13 2> /dev/null ; then
|
||||||
|
CLANG_FORMAT=clang-format-13
|
||||||
|
elif type clang-format 2> /dev/null ; then
|
||||||
|
# Clang format found, but need to check version
|
||||||
|
CLANG_FORMAT=clang-format
|
||||||
|
V=$(clang-format --version)
|
||||||
|
if [[ $V != *"version 13.0"* ]]; then
|
||||||
|
echo "clang-format is not 13.0 (returned ${V})"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "No appropriate clang-format found (expected clang-format-13.0.0, or clang-format)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
find . -type d \( \
|
||||||
|
-path ./\*build -o \
|
||||||
|
-path ./cmake -o \
|
||||||
|
-path ./plugins/decklink/\*/decklink-sdk -o \
|
||||||
|
-path ./plugins/enc-amf -o \
|
||||||
|
-path ./plugins/mac-syphon/syphon-framework -o \
|
||||||
|
-path ./plugins/obs-outputs/ftl-sdk -o \
|
||||||
|
-path ./plugins/obs-websocket/deps -o \
|
||||||
|
-path ./deps \
|
||||||
|
\) -prune -false -type f -o \
|
||||||
|
-name '*.h' -or \
|
||||||
|
-name '*.hpp' -or \
|
||||||
|
-name '*.m' -or \
|
||||||
|
-name '*.mm' -or \
|
||||||
|
-name '*.c' -or \
|
||||||
|
-name '*.cpp' \
|
||||||
|
| xargs -L100 -P ${NPROC} "${CLANG_FORMAT}" ${VERBOSITY} -i -style=file -fallback-style=none
|
||||||
13
.github/scripts/package-linux.sh
vendored
Executable file
13
.github/scripts/package-linux.sh
vendored
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if ! type zsh > /dev/null 2>&1; then
|
||||||
|
echo ' => Installing script dependency Zsh.'
|
||||||
|
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install zsh
|
||||||
|
fi
|
||||||
|
|
||||||
|
SCRIPT=$(readlink -f "${0}")
|
||||||
|
SCRIPT_DIR=$(dirname "${SCRIPT}")
|
||||||
|
|
||||||
|
zsh ${SCRIPT_DIR}/package-linux.zsh "${@}"
|
||||||
1
.github/scripts/package-linux.zsh
vendored
Symbolic link
1
.github/scripts/package-linux.zsh
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
.package.zsh
|
||||||
1
.github/scripts/package-macos.zsh
vendored
Symbolic link
1
.github/scripts/package-macos.zsh
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
.package.zsh
|
||||||
25
.github/scripts/utils.pwsh/Check-Git.ps1
vendored
Normal file
25
.github/scripts/utils.pwsh/Check-Git.ps1
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
function Check-Git {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Ensures available git executable on host system.
|
||||||
|
.DESCRIPTION
|
||||||
|
Checks whether a git command is available on the host system. If none is found,
|
||||||
|
Git is installed via winget.
|
||||||
|
.EXAMPLE
|
||||||
|
Check-Git
|
||||||
|
#>
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Log-Info ) ) {
|
||||||
|
. $PSScriptRoot/Logger.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information 'Checking for Git executable...'
|
||||||
|
|
||||||
|
if ( ! ( Get-Command git ) ) {
|
||||||
|
Log-Warning 'No Git executable found. Will try to install via winget.'
|
||||||
|
winget install git
|
||||||
|
} else {
|
||||||
|
Log-Debug "Git found at $(Get-Command git)."
|
||||||
|
Log-Status "Git found."
|
||||||
|
}
|
||||||
|
}
|
||||||
29
.github/scripts/utils.pwsh/Ensure-Location.ps1
vendored
Normal file
29
.github/scripts/utils.pwsh/Ensure-Location.ps1
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
function Ensure-Location {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Ensures current location to be set to specified directory.
|
||||||
|
.DESCRIPTION
|
||||||
|
If specified directory exists, switch to it. Otherwise create it,
|
||||||
|
then switch.
|
||||||
|
.EXAMPLE
|
||||||
|
Ensure-Location "My-Directory"
|
||||||
|
Ensure-Location -Path "Path-To-My-Directory"
|
||||||
|
#>
|
||||||
|
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string] $Path
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( ! ( Test-Path $Path ) ) {
|
||||||
|
$_Params = @{
|
||||||
|
ItemType = "Directory"
|
||||||
|
Path = ${Path}
|
||||||
|
ErrorAction = "SilentlyContinue"
|
||||||
|
}
|
||||||
|
|
||||||
|
New-Item @_Params | Set-Location
|
||||||
|
} else {
|
||||||
|
Set-Location -Path ${Path}
|
||||||
|
}
|
||||||
|
}
|
||||||
70
.github/scripts/utils.pwsh/Expand-ArchiveExt.ps1
vendored
Normal file
70
.github/scripts/utils.pwsh/Expand-ArchiveExt.ps1
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
function Expand-ArchiveExt {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Expands archive files.
|
||||||
|
.DESCRIPTION
|
||||||
|
Allows extraction of zip, 7z, gz, and xz archives.
|
||||||
|
Requires tar and 7-zip to be available on the system.
|
||||||
|
Archives ending with .zip but created using LZMA compression are
|
||||||
|
expanded using 7-zip as a fallback.
|
||||||
|
.EXAMPLE
|
||||||
|
Expand-ArchiveExt -Path <Path-To-Your-Archive>
|
||||||
|
Expand-ArchiveExt -Path <Path-To-Your-Archive> -DestinationPath <Expansion-Path>
|
||||||
|
#>
|
||||||
|
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string] $Path,
|
||||||
|
[string] $DestinationPath = [System.IO.Path]::GetFileNameWithoutExtension($Path),
|
||||||
|
[switch] $Force
|
||||||
|
)
|
||||||
|
|
||||||
|
switch ( [System.IO.Path]::GetExtension($Path) ) {
|
||||||
|
.zip {
|
||||||
|
try {
|
||||||
|
Expand-Archive -Path $Path -DestinationPath $DestinationPath -Force:$Force
|
||||||
|
} catch {
|
||||||
|
if ( Get-Command 7z ) {
|
||||||
|
Invoke-External 7z x -y $Path "-o${DestinationPath}"
|
||||||
|
} else {
|
||||||
|
throw "Fallback utility 7-zip not found. Please install 7-zip first."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
{ ( $_ -eq ".7z" ) -or ( $_ -eq ".exe" ) } {
|
||||||
|
if ( Get-Command 7z ) {
|
||||||
|
Invoke-External 7z x -y $Path "-o${DestinationPath}"
|
||||||
|
} else {
|
||||||
|
throw "Extraction utility 7-zip not found. Please install 7-zip first."
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
.gz {
|
||||||
|
try {
|
||||||
|
Invoke-External tar -x -o $DestinationPath -f $Path
|
||||||
|
} catch {
|
||||||
|
if ( Get-Command 7z ) {
|
||||||
|
Invoke-External 7z x -y $Path "-o${DestinationPath}"
|
||||||
|
} else {
|
||||||
|
throw "Fallback utility 7-zip not found. Please install 7-zip first."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
.xz {
|
||||||
|
try {
|
||||||
|
Invoke-External tar -x -o $DestinationPath -f $Path
|
||||||
|
} catch {
|
||||||
|
if ( Get-Command 7z ) {
|
||||||
|
Invoke-External 7z x -y $Path "-o${DestinationPath}"
|
||||||
|
} else {
|
||||||
|
throw "Fallback utility 7-zip not found. Please install 7-zip first."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default {
|
||||||
|
throw "Unsupported archive extension provided."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
60
.github/scripts/utils.pwsh/Install-BuildDependencies.ps1
vendored
Normal file
60
.github/scripts/utils.pwsh/Install-BuildDependencies.ps1
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
function Install-BuildDependencies {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Installs required build dependencies.
|
||||||
|
.DESCRIPTION
|
||||||
|
Additional packages might be needed for successful builds. This module contains additional
|
||||||
|
dependencies available for installation via winget and, if possible, adds their locations
|
||||||
|
to the environment path for future invocation.
|
||||||
|
.EXAMPLE
|
||||||
|
Install-BuildDependencies
|
||||||
|
#>
|
||||||
|
|
||||||
|
param(
|
||||||
|
[string] $WingetFile = "$PSScriptRoot/.Wingetfile"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Log-Warning ) ) {
|
||||||
|
. $PSScriptRoot/Logger.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
$Host64Bit = [System.Environment]::Is64BitOperatingSystem
|
||||||
|
|
||||||
|
$Paths = $Env:Path -split [System.IO.Path]::PathSeparator
|
||||||
|
|
||||||
|
$WingetOptions = @('install', '--accept-package-agreements', '--accept-source-agreements')
|
||||||
|
|
||||||
|
if ( $script:Quiet ) {
|
||||||
|
$WingetOptions += '--silent'
|
||||||
|
}
|
||||||
|
|
||||||
|
Get-Content $WingetFile | ForEach-Object {
|
||||||
|
$_, $Package, $_, $Path, $_, $Binary = ([regex]::Split($_, " (?=(?:[^']|'[^']*')*$)")) -replace ',', '' -replace "'",''
|
||||||
|
|
||||||
|
(${Env:ProgramFiles(x86)}, $Env:ProgramFiles) | ForEach-Object {
|
||||||
|
$Prefix = $_
|
||||||
|
$FullPath = "${Prefix}\${Path}"
|
||||||
|
if ( ( Test-Path $FullPath ) -and ! ( $Paths -contains $FullPath ) ) {
|
||||||
|
$Paths += $FullPath
|
||||||
|
$Env:Path = $Paths -join [System.IO.Path]::PathSeparator
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Debug "Checking for command ${Binary}"
|
||||||
|
$Found = Get-Command -ErrorAction SilentlyContinue $Binary
|
||||||
|
|
||||||
|
if ( $Found ) {
|
||||||
|
Log-Status "Found dependency ${Binary} as $($Found.Source)"
|
||||||
|
} else {
|
||||||
|
Log-Status "Installing package ${Package}"
|
||||||
|
|
||||||
|
try {
|
||||||
|
$Params = $WingetOptions + $Package
|
||||||
|
|
||||||
|
winget @Params
|
||||||
|
} catch {
|
||||||
|
throw "Error while installing winget package ${Package}: $_"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
40
.github/scripts/utils.pwsh/Invoke-External.ps1
vendored
Normal file
40
.github/scripts/utils.pwsh/Invoke-External.ps1
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
function Invoke-External {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Invokes a non-PowerShell command.
|
||||||
|
.DESCRIPTION
|
||||||
|
Runs a non-PowerShell command, and captures its return code.
|
||||||
|
Throws an exception if the command returns non-zero.
|
||||||
|
.EXAMPLE
|
||||||
|
Invoke-External 7z x $MyArchive
|
||||||
|
#>
|
||||||
|
|
||||||
|
if ( $args.Count -eq 0 ) {
|
||||||
|
throw 'Invoke-External called without arguments.'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Log-Information ) ) {
|
||||||
|
. $PSScriptRoot/Logger.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
$Command = $args[0]
|
||||||
|
$CommandArgs = @()
|
||||||
|
|
||||||
|
if ( $args.Count -gt 1) {
|
||||||
|
$CommandArgs = $args[1..($args.Count - 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
$_EAP = $ErrorActionPreference
|
||||||
|
$ErrorActionPreference = "Continue"
|
||||||
|
|
||||||
|
Log-Debug "Invoke-External: ${Command} ${CommandArgs}"
|
||||||
|
|
||||||
|
& $command $commandArgs
|
||||||
|
$Result = $LASTEXITCODE
|
||||||
|
|
||||||
|
$ErrorActionPreference = $_EAP
|
||||||
|
|
||||||
|
if ( $Result -ne 0 ) {
|
||||||
|
throw "${Command} ${CommandArgs} exited with non-zero code ${Result}."
|
||||||
|
}
|
||||||
|
}
|
||||||
117
.github/scripts/utils.pwsh/Invoke-GitCheckout.ps1
vendored
Normal file
117
.github/scripts/utils.pwsh/Invoke-GitCheckout.ps1
vendored
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
function Set-GitConfig {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Sets a git config value.
|
||||||
|
.DESCRIPTION
|
||||||
|
Allows setting single or multiple config values in a PowerShell-friendly fashion.
|
||||||
|
.EXAMPLE
|
||||||
|
Set-GitConfig advice.detachedHead false
|
||||||
|
#>
|
||||||
|
|
||||||
|
if ( $args.Count -lt 2 ) {
|
||||||
|
throw 'Set-GitConfig called without required arguments <OPTION> <VALUE>.'
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-External git config @args
|
||||||
|
}
|
||||||
|
|
||||||
|
function Invoke-GitCheckout {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Checks out a specified git repository.
|
||||||
|
.DESCRIPTION
|
||||||
|
Wraps the git executable with PowerShell syntax to check out
|
||||||
|
a specified Git repository with a given commit hash and branch,
|
||||||
|
or a GitHub pull request ID.
|
||||||
|
.EXAMPLE
|
||||||
|
Invoke-GitCheckout -Uri "My-Repo-Uri" -Commit "My-Commit-Hash"
|
||||||
|
Invoke-GitCheckout -Uri "My-Repo-Uri" -Commit "My-Commit-Hash" -Branch "main"
|
||||||
|
Invoke-GitCheckout -Uri "My-Repo-Uri" -Commit "My-Commit-Hash" -PullRequest 250
|
||||||
|
#>
|
||||||
|
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string] $Uri,
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[string] $Commit,
|
||||||
|
[string] $Path,
|
||||||
|
[string] $Branch = "master",
|
||||||
|
[string] $PullRequest
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( ! ( $Uri -like "*github.com*" ) -and ( $PullRequest -ne "" ) ) {
|
||||||
|
throw 'Fetching pull requests is only supported with GitHub-based repositories.'
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Log-Information ) ) {
|
||||||
|
. $PSScriptRoot/Logger.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Invoke-External ) ) {
|
||||||
|
. $PSScriptRoot/Invoke-External.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
$RepositoryName = [System.IO.Path]::GetFileNameWithoutExtension($Uri)
|
||||||
|
|
||||||
|
if ( $Path -eq "" ) {
|
||||||
|
$Path = "$(Get-Location | Convert-Path)\${RepositoryName}"
|
||||||
|
}
|
||||||
|
|
||||||
|
Push-Location -Stack GitCheckoutTemp
|
||||||
|
|
||||||
|
if ( Test-Path $Path/.git ) {
|
||||||
|
Write-Information "Repository ${RepositoryName} found in ${Path}"
|
||||||
|
|
||||||
|
Set-Location $Path
|
||||||
|
|
||||||
|
Set-GitConfig advice.detachedHead false
|
||||||
|
Set-GitConfig remote.origin.url $Uri
|
||||||
|
Set-GitConfig remote.origin.tapOpt --no-tags
|
||||||
|
|
||||||
|
$Ref = "+refs/heads/{0}:refs/remotes/origin/{0}" -f $Branch
|
||||||
|
|
||||||
|
Set-GitConfig --replace-all remote.origin.fetch $Ref
|
||||||
|
|
||||||
|
if ( $PullRequest -ne "" ) {
|
||||||
|
try {
|
||||||
|
Invoke-External git show-ref --quiet --verify refs/heads/pr-$PullRequest
|
||||||
|
} catch {
|
||||||
|
Invoke-External git fetch origin $("pull/{0}/head:pull-{0}" -f $PullRequest)
|
||||||
|
} finally {
|
||||||
|
Invoke-External git checkout -f "pull-${PullRequest}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$null = Invoke-External git rev-parse -q --verify "${Commit}^{commit}"
|
||||||
|
} catch {
|
||||||
|
Invoke-External git fetch origin
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-External git checkout -f $Commit -- | Log-Information
|
||||||
|
} else {
|
||||||
|
Invoke-External git clone $Uri $Path
|
||||||
|
|
||||||
|
Set-Location $Path
|
||||||
|
|
||||||
|
Set-GitConfig advice.detachedHead false
|
||||||
|
|
||||||
|
if ( $PullRequest -ne "" ) {
|
||||||
|
$Ref = "pull/{0}/head:pull-{0}" -f $PullRequest
|
||||||
|
$Branch = "pull-${PullRequest}"
|
||||||
|
Invoke-External git fetch origin $Ref
|
||||||
|
Invoke-External git checkout $Branch
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-External git checkout -f $Commit
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information "Checked out commit ${Commit} on branch ${Branch}"
|
||||||
|
|
||||||
|
if ( Test-Path ${Path}/.gitmodules ) {
|
||||||
|
Invoke-External git submodule foreach --recursive git submodule sync
|
||||||
|
Invoke-External git submodule update --init --recursive
|
||||||
|
}
|
||||||
|
|
||||||
|
Pop-Location -Stack GitCheckoutTemp
|
||||||
|
}
|
||||||
123
.github/scripts/utils.pwsh/Logger.ps1
vendored
Normal file
123
.github/scripts/utils.pwsh/Logger.ps1
vendored
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
function Log-Debug {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Debug $m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Log-Verbose {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Verbose $m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Log-Warning {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Warning $m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Log-Error {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Error $m
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Log-Information {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
if ( ! ( $script:Quiet ) ) {
|
||||||
|
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
|
||||||
|
$Icon = ' =>'
|
||||||
|
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Host -NoNewLine -ForegroundColor Blue " ${StageName} $($Icon.PadRight(5)) "
|
||||||
|
Write-Host "${m}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Log-Status {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
if ( ! ( $script:Quiet ) ) {
|
||||||
|
$StageName = $( if ( $StageName -ne $null ) { $StageName } else { '' })
|
||||||
|
$Icon = ' >'
|
||||||
|
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Host -NoNewLine -ForegroundColor Green " ${StageName} $($Icon.PadRight(5)) "
|
||||||
|
Write-Host "${m}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Log-Output {
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,ValueFromPipeline)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string[]] $Message
|
||||||
|
)
|
||||||
|
|
||||||
|
Process {
|
||||||
|
if ( ! ( $script:Quiet ) ) {
|
||||||
|
$StageName = $( if ( $script:StageName -ne $null ) { $script:StageName } else { '' })
|
||||||
|
$Icon = ''
|
||||||
|
|
||||||
|
foreach($m in $Message) {
|
||||||
|
Write-Output " ${StageName} $($Icon.PadRight(5)) ${m}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Columns = (Get-Host).UI.RawUI.WindowSize.Width - 5
|
||||||
103
.github/scripts/utils.pwsh/Setup-Host.ps1
vendored
Normal file
103
.github/scripts/utils.pwsh/Setup-Host.ps1
vendored
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
function Setup-Host {
|
||||||
|
if ( ! ( Test-Path function:Log-Output ) ) {
|
||||||
|
. $PSScriptRoot/Logger.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Ensure-Location ) ) {
|
||||||
|
. $PSScriptRoot/Ensure-Location.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Install-BuildDependencies ) ) {
|
||||||
|
. $PSScriptRoot/Install-BuildDependencies.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Expand-ArchiveExt ) ) {
|
||||||
|
. $PSScriptRoot/Expand-ArchiveExt.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
Install-BuildDependencies -WingetFile "${ScriptHome}/.Wingetfile"
|
||||||
|
|
||||||
|
if ( $script:Target -eq '' ) { $script:Target = $script:HostArchitecture }
|
||||||
|
|
||||||
|
$script:QtVersion = $BuildSpec.platformConfig."windows-${script:Target}".qtVersion
|
||||||
|
$script:VisualStudioVersion = $BuildSpec.platformConfig."windows-${script:Target}".visualStudio
|
||||||
|
$script:PlatformSDK = $BuildSpec.platformConfig."windows-${script:Target}".platformSDK
|
||||||
|
|
||||||
|
if ( ! ( ( $script:SkipAll ) -or ( $script:SkipDeps ) ) ) {
|
||||||
|
('prebuilt', "qt${script:QtVersion}") | ForEach-Object {
|
||||||
|
$_Dependency = $_
|
||||||
|
$_Version = $BuildSpec.dependencies."${_Dependency}".version
|
||||||
|
$_BaseUrl = $BuildSpec.dependencies."${_Dependency}".baseUrl
|
||||||
|
$_Label = $BuildSpec.dependencies."${_Dependency}".label
|
||||||
|
$_Hash = $BuildSpec.dependencies."${_Dependency}".hashes."windows-${script:Target}"
|
||||||
|
|
||||||
|
if ( $BuildSpec.dependencies."${_Dependency}".PSobject.Properties.Name -contains "pdb-hashes" ) {
|
||||||
|
$_PdbHash = $BuildSpec.dependencies."${_Dependency}".'pdb-hashes'."$windows-${script:Target}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $_Version -eq '' ) {
|
||||||
|
throw "No ${_Dependency} spec found in ${script:BuildSpecFile}."
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information "Setting up ${_Label}..."
|
||||||
|
|
||||||
|
Push-Location -Stack BuildTemp
|
||||||
|
Ensure-Location -Path "$(Resolve-Path -Path "${ProjectRoot}/..")/obs-build-dependencies"
|
||||||
|
|
||||||
|
switch -wildcard ( $_Dependency ) {
|
||||||
|
prebuilt {
|
||||||
|
$_Filename = "windows-deps-${_Version}-${script:Target}.zip"
|
||||||
|
$_Uri = "${_BaseUrl}/${_Version}/${_Filename}"
|
||||||
|
$_Target = "plugin-deps-${_Version}-qt${script:QtVersion}-${script:Target}"
|
||||||
|
$script:DepsVersion = ${_Version}
|
||||||
|
}
|
||||||
|
"qt*" {
|
||||||
|
$_Filename = "windows-deps-qt${script:QtVersion}-${_Version}-${script:Target}.zip"
|
||||||
|
$_Uri = "${_BaseUrl}/${_Version}/${_Filename}"
|
||||||
|
$_Target = "plugin-deps-${_Version}-qt${script:QtVersion}-${script:Target}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path -Path $_Filename ) ) {
|
||||||
|
$Params = @{
|
||||||
|
UserAgent = 'NativeHost'
|
||||||
|
Uri = $_Uri
|
||||||
|
OutFile = $_Filename
|
||||||
|
UseBasicParsing = $true
|
||||||
|
ErrorAction = 'Stop'
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-WebRequest @Params
|
||||||
|
Log-Status "Downloaded ${_Label} for ${script:Target}."
|
||||||
|
} else {
|
||||||
|
Log-Status "Found downloaded ${_Label}."
|
||||||
|
}
|
||||||
|
|
||||||
|
$_FileHash = Get-FileHash -Path $_Filename -Algorithm SHA256
|
||||||
|
|
||||||
|
if ( $_FileHash.Hash.ToLower() -ne $_Hash ) {
|
||||||
|
throw "Checksum of downloaded ${_Label} does not match specification. Expected '${_Hash}', 'found $(${_FileHash}.Hash.ToLower())'"
|
||||||
|
}
|
||||||
|
Log-Status "Checksum of downloaded ${_Label} matches."
|
||||||
|
|
||||||
|
if ( ! ( ( $script:SkipAll ) -or ( $script:SkipUnpack ) ) ) {
|
||||||
|
Push-Location -Stack BuildTemp
|
||||||
|
Ensure-Location -Path $_Target
|
||||||
|
|
||||||
|
Expand-ArchiveExt -Path "../${_Filename}" -DestinationPath . -Force
|
||||||
|
|
||||||
|
Pop-Location -Stack BuildTemp
|
||||||
|
}
|
||||||
|
Pop-Location -Stack BuildTemp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Get-HostArchitecture {
|
||||||
|
$Host64Bit = [System.Environment]::Is64BitOperatingSystem
|
||||||
|
$HostArchitecture = ('x86', 'x64')[$Host64Bit]
|
||||||
|
|
||||||
|
return $HostArchitecture
|
||||||
|
}
|
||||||
|
|
||||||
|
$script:HostArchitecture = Get-HostArchitecture
|
||||||
84
.github/scripts/utils.pwsh/Setup-Obs.ps1
vendored
Normal file
84
.github/scripts/utils.pwsh/Setup-Obs.ps1
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
function Setup-Obs {
|
||||||
|
if ( ! ( Test-Path function:Log-Output ) ) {
|
||||||
|
. $PSScriptRoot/Logger.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Check-Git ) ) {
|
||||||
|
. $PSScriptRoot/Check-Git.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
Check-Git
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Ensure-Location ) ) {
|
||||||
|
. $PSScriptRoot/Ensure-Location.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Invoke-GitCheckout ) ) {
|
||||||
|
. $PSScriptRoot/Invoke-GitCheckout.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( Test-Path function:Invoke-External ) ) {
|
||||||
|
. $PSScriptRoot/Invoke-External.ps1
|
||||||
|
}
|
||||||
|
|
||||||
|
Log-Information 'Setting up OBS Studio...'
|
||||||
|
|
||||||
|
$ObsVersion = $BuildSpec.dependencies.'obs-studio'.version
|
||||||
|
$ObsRepository = $BuildSpec.dependencies.'obs-studio'.repository
|
||||||
|
$ObsBranch = $BuildSpec.dependencies.'obs-studio'.branch
|
||||||
|
$ObsHash = $BuildSpec.dependencies.'obs-studio'.hash
|
||||||
|
|
||||||
|
if ( $ObsVersion -eq '' ) {
|
||||||
|
throw 'No obs-studio version found in buildspec.json.'
|
||||||
|
}
|
||||||
|
|
||||||
|
Push-Location -Stack BuildTemp
|
||||||
|
Ensure-Location -Path "$(Resolve-Path -Path "${ProjectRoot}/../")/obs-studio"
|
||||||
|
|
||||||
|
if ( ! ( ( $script:SkipAll ) -or ( $script:SkipUnpack ) ) ) {
|
||||||
|
Invoke-GitCheckout -Uri $ObsRepository -Commit $ObsHash -Path . -Branch $ObsBranch
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! ( ( $script:SkipAll ) -or ( $script:SkipBuild ) ) ) {
|
||||||
|
Log-Information 'Configuring OBS Studio...'
|
||||||
|
|
||||||
|
$NumProcessors = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
|
||||||
|
|
||||||
|
if ( $NumProcessors -gt 1 ) {
|
||||||
|
$env:UseMultiToolTask = $true
|
||||||
|
$env:EnforceProcessCountAcrossBuilds = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
$DepsPath = "plugin-deps-${script:DepsVersion}-qt${script:QtVersion}-${script:Target}"
|
||||||
|
|
||||||
|
$CmakeArgs = @(
|
||||||
|
'-G', $CmakeGenerator
|
||||||
|
"-DCMAKE_SYSTEM_VERSION=${script:PlatformSDK}"
|
||||||
|
"-DCMAKE_GENERATOR_PLATFORM=$(if (${script:Target} -eq "x86") { "Win32" } else { "x64" })"
|
||||||
|
"-DCMAKE_BUILD_TYPE=${script:Configuration}"
|
||||||
|
"-DQT_VERSION=${script:QtVersion}"
|
||||||
|
'-DENABLE_PLUGINS=OFF'
|
||||||
|
'-DENABLE_UI=OFF'
|
||||||
|
'-DENABLE_SCRIPTING=OFF'
|
||||||
|
"-DCMAKE_INSTALL_PREFIX:PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/${DepsPath}")"
|
||||||
|
"-DCMAKE_PREFIX_PATH:PATH=$(Resolve-Path -Path "${ProjectRoot}/../obs-build-dependencies/${DepsPath}")"
|
||||||
|
)
|
||||||
|
|
||||||
|
Log-Debug "Attempting to configure OBS with CMake arguments: $($CmakeArgs | Out-String)"
|
||||||
|
Log-Information "Configuring OBS..."
|
||||||
|
Invoke-External cmake -S . -B plugin_build_${script:Target} @CmakeArgs
|
||||||
|
|
||||||
|
Log-Information 'Building libobs and obs-frontend-api...'
|
||||||
|
$CmakeArgs = @(
|
||||||
|
'--config', "$( if ( $script:Configuration -eq '' ) { 'RelWithDebInfo' } else { $script:Configuration })"
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( $VerbosePreference -eq 'Continue' ) {
|
||||||
|
$CmakeArgs+=('--verbose')
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-External cmake --build plugin_build_${script:Target} @CmakeArgs -t obs-frontend-api
|
||||||
|
Invoke-External cmake --install plugin_build_${script:Target} @CmakeArgs --component obs_libraries
|
||||||
|
}
|
||||||
|
Pop-Location -Stack BuildTemp
|
||||||
|
}
|
||||||
36
.github/scripts/utils.zsh/check_linux
vendored
Executable file
36
.github/scripts/utils.zsh/check_linux
vendored
Executable file
@@ -0,0 +1,36 @@
|
|||||||
|
autoload -Uz log_info log_status log_error log_debug log_warning
|
||||||
|
|
||||||
|
log_debug 'Checking for apt-get...'
|
||||||
|
if (( ! ${+commands[apt-get]} )) {
|
||||||
|
log_error 'No apt-get command found. Please install apt'
|
||||||
|
return 2
|
||||||
|
} else {
|
||||||
|
log_debug "Apt-get located at ${commands[apt-get]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
local -a dependencies=("${(f)$(<${SCRIPT_HOME}/.Aptfile)}")
|
||||||
|
local -a install_list
|
||||||
|
local binary
|
||||||
|
|
||||||
|
for dependency (${dependencies}) {
|
||||||
|
local -a tokens=(${(s: :)dependency//(,|:|\')/})
|
||||||
|
|
||||||
|
if [[ ! ${tokens[1]} == 'package' ]] continue
|
||||||
|
|
||||||
|
if [[ ${#tokens} -gt 2 && ${tokens[3]} == 'bin' ]] {
|
||||||
|
binary=${tokens[4]}
|
||||||
|
} else {
|
||||||
|
binary=${tokens[2]}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+commands[${binary}]} )) install_list+=(${tokens[2]})
|
||||||
|
}
|
||||||
|
|
||||||
|
local -a _quiet=('' '--quiet')
|
||||||
|
|
||||||
|
log_debug "List of dependencies to install: ${install_list}"
|
||||||
|
if (( ${#install_list} )) {
|
||||||
|
if (( ! ${+CI} )) log_warning 'Dependency installation via apt may require elevated privileges'
|
||||||
|
|
||||||
|
sudo apt-get -y install ${install_list} ${_quiet[(( (_loglevel == 0) + 1 ))]}
|
||||||
|
}
|
||||||
20
.github/scripts/utils.zsh/check_macos
vendored
Executable file
20
.github/scripts/utils.zsh/check_macos
vendored
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
autoload -Uz is-at-least log_info log_error log_status read_codesign
|
||||||
|
|
||||||
|
local macos_version=$(sw_vers -productVersion)
|
||||||
|
|
||||||
|
log_info 'Checking macOS version...'
|
||||||
|
if ! is-at-least 11.0 "${macos_version}"; then
|
||||||
|
log_error "Minimum required macOS version is 11.0, but running on macOS ${macos_version}"
|
||||||
|
return 2
|
||||||
|
else
|
||||||
|
log_status "macOS ${macos_version} is recent"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info 'Checking for Homebrew...'
|
||||||
|
if (( ! ${+commands[brew]} )) {
|
||||||
|
log_error 'No Homebrew command found. Please install Homebrew (https://brew.sh)'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
brew bundle --file "${SCRIPT_HOME}/.Brewfile"
|
||||||
|
rehash
|
||||||
52
.github/scripts/utils.zsh/check_packages
vendored
Executable file
52
.github/scripts/utils.zsh/check_packages
vendored
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
if (( ! ${+commands[packagesbuild]} )) {
|
||||||
|
autoload -Uz log_info log_status mkcd
|
||||||
|
|
||||||
|
if (( ! ${+commands[curl]} )) {
|
||||||
|
log_error 'curl not found. Please install curl.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+project_root} )) {
|
||||||
|
log_error "'project_root' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
local -a curl_opts=()
|
||||||
|
if (( ! ${+CI} )) {
|
||||||
|
curl_opts+=(--progress-bar)
|
||||||
|
} else {
|
||||||
|
curl_opts+=(--show-error --silent)
|
||||||
|
}
|
||||||
|
curl_opts+=(--location -O ${@})
|
||||||
|
|
||||||
|
log_info 'Installing Packages.app...'
|
||||||
|
|
||||||
|
pushd
|
||||||
|
mkcd ${project_root:h}/obs-build-dependencies
|
||||||
|
|
||||||
|
local packages_url='http://s.sudre.free.fr/Software/files/Packages.dmg'
|
||||||
|
local packages_hash='6afdd25386295974dad8f078b8f1e41cabebd08e72d970bf92f707c7e48b16c9'
|
||||||
|
|
||||||
|
if [[ ! -f Packages.dmg ]] {
|
||||||
|
log_status 'Download Packages.app'
|
||||||
|
curl ${curl_opts} ${packages_url}
|
||||||
|
}
|
||||||
|
|
||||||
|
local image_checksum
|
||||||
|
read -r image_checksum _ <<< "$(sha256sum Packages.dmg)"
|
||||||
|
|
||||||
|
if [[ ${packages_hash} != ${image_checksum} ]] {
|
||||||
|
log_error "Checksum mismatch of Packages.app download.
|
||||||
|
Expected : ${packages_hash}
|
||||||
|
Actual : ${image_checksum}"
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
hdiutil attach -noverify Packages.dmg &> /dev/null && log_status 'Packages.dmg image mounted.'
|
||||||
|
|
||||||
|
log_info 'Installing Packages.app...'
|
||||||
|
packages_volume=$(hdiutil info -plist | grep '<string>/Volumes/Packages' | sed 's/.*<string>\(\/Volumes\/[^<]*\)<\/string>/\1/')
|
||||||
|
|
||||||
|
sudo installer -pkg "${packages_volume}/packages/Packages.pkg" -target / && rehash
|
||||||
|
hdiutil detach ${packages_volume} &> /dev/null && log_status 'Packages.dmg image unmounted.'
|
||||||
|
}
|
||||||
3
.github/scripts/utils.zsh/log_debug
vendored
Executable file
3
.github/scripts/utils.zsh/log_debug
vendored
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
if (( ! ${+_loglevel} )) typeset -g _loglevel=1
|
||||||
|
|
||||||
|
if (( _loglevel > 2 )) print -PR -e -- "%F{220}DEBUG: ${@}%f"
|
||||||
3
.github/scripts/utils.zsh/log_error
vendored
Executable file
3
.github/scripts/utils.zsh/log_error
vendored
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
local icon=' ✖︎ '
|
||||||
|
|
||||||
|
print -u2 -PR "%F{1} ${icon} %f ${@}"
|
||||||
7
.github/scripts/utils.zsh/log_info
vendored
Executable file
7
.github/scripts/utils.zsh/log_info
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
if (( ! ${+_loglevel} )) typeset -g _loglevel=1
|
||||||
|
|
||||||
|
if (( _loglevel > 0 )) {
|
||||||
|
local icon=' =>'
|
||||||
|
|
||||||
|
print -PR "%F{4} ${(r:5:)icon}%f %B${@}%b"
|
||||||
|
}
|
||||||
7
.github/scripts/utils.zsh/log_output
vendored
Executable file
7
.github/scripts/utils.zsh/log_output
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
if (( ! ${+_loglevel} )) typeset -g _loglevel=1
|
||||||
|
|
||||||
|
if (( _loglevel > 0 )) {
|
||||||
|
local icon=''
|
||||||
|
|
||||||
|
print -PR " ${(r:5:)icon} ${@}"
|
||||||
|
}
|
||||||
7
.github/scripts/utils.zsh/log_status
vendored
Executable file
7
.github/scripts/utils.zsh/log_status
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
if (( ! ${+_loglevel} )) typeset -g _loglevel=1
|
||||||
|
|
||||||
|
if (( _loglevel > 0 )) {
|
||||||
|
local icon=' >'
|
||||||
|
|
||||||
|
print -PR "%F{2} ${(r:5:)icon}%f ${@}"
|
||||||
|
}
|
||||||
5
.github/scripts/utils.zsh/log_warning
vendored
Executable file
5
.github/scripts/utils.zsh/log_warning
vendored
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
if (( _loglevel > 0 )) {
|
||||||
|
local icon=' =>'
|
||||||
|
|
||||||
|
print -PR "%F{3} ${(r:5:)icon} ${@}%f"
|
||||||
|
}
|
||||||
1
.github/scripts/utils.zsh/mkcd
vendored
Executable file
1
.github/scripts/utils.zsh/mkcd
vendored
Executable file
@@ -0,0 +1 @@
|
|||||||
|
[[ -n ${1} ]] && mkdir -p ${1} && builtin cd ${1}
|
||||||
7
.github/scripts/utils.zsh/read_codesign
vendored
Executable file
7
.github/scripts/utils.zsh/read_codesign
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
autoload -Uz log_info
|
||||||
|
|
||||||
|
if (( ! ${+CODESIGN_IDENT} )) {
|
||||||
|
typeset -g CODESIGN_IDENT
|
||||||
|
log_info 'Setting up identity for application codesigning...'
|
||||||
|
read CODESIGN_IDENT'?Apple Developer Application ID: '
|
||||||
|
}
|
||||||
7
.github/scripts/utils.zsh/read_codesign_installer
vendored
Executable file
7
.github/scripts/utils.zsh/read_codesign_installer
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
autoload -Uz log_info
|
||||||
|
|
||||||
|
if (( ! ${+CODESIGN_IDENT_INSTALLER} )) {
|
||||||
|
typeset -g CODESIGN_IDENT_INSTALLER
|
||||||
|
log_info 'Setting up identity for installer package codesigning...'
|
||||||
|
read CODESIGN_IDENT_INSTALLER'?Apple Developer Installer ID: '
|
||||||
|
}
|
||||||
33
.github/scripts/utils.zsh/read_codesign_pass
vendored
Executable file
33
.github/scripts/utils.zsh/read_codesign_pass
vendored
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
##############################################################################
|
||||||
|
# Apple Developer credentials necessary:
|
||||||
|
#
|
||||||
|
# + Signing for distribution and notarization require an active Apple
|
||||||
|
# Developer membership
|
||||||
|
# + An Apple Development identity is needed for code signing
|
||||||
|
# (i.e. 'Apple Development: YOUR APPLE ID (PROVIDER)')
|
||||||
|
# + Your Apple developer ID is needed for notarization
|
||||||
|
# + An app-specific password is necessary for notarization from CLI
|
||||||
|
# + This password will be stored in your macOS keychain under the identifier
|
||||||
|
# 'OBS-Codesign-Password'with access Apple's 'altool' only.
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
autoload -Uz read_codesign read_codesign_user log_info
|
||||||
|
|
||||||
|
if (( ! ${+CODESIGN_IDENT} )) {
|
||||||
|
read_codesign
|
||||||
|
}
|
||||||
|
|
||||||
|
local codesign_ident_short=$(print "${CODESIGN_IDENT}" | /usr/bin/sed -En 's/.+\((.+)\)/\1/p')
|
||||||
|
|
||||||
|
if (( ! ${+CODESIGN_IDENT_USER} )) {
|
||||||
|
read_codesign_user
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info 'Setting up password for notarization keychain...'
|
||||||
|
if (( ! ${+CODESIGN_IDENT_PASS} )) {
|
||||||
|
read -s CODESIGN_IDENT_PASS'?Apple Developer ID password: '
|
||||||
|
}
|
||||||
|
|
||||||
|
print ''
|
||||||
|
log_info 'Setting up notarization keychain...'
|
||||||
|
xcrun notarytool store-credentials 'OBS-Codesign-Password' --apple-id "${CODESIGN_IDENT_USER}" --team-id "${codesign_ident_short}" --password "${CODESIGN_IDENT_PASS}"
|
||||||
7
.github/scripts/utils.zsh/read_codesign_user
vendored
Executable file
7
.github/scripts/utils.zsh/read_codesign_user
vendored
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
autoload -Uz log_info
|
||||||
|
|
||||||
|
if (( ! ${+CODESIGN_IDENT_USER} )) {
|
||||||
|
typeset -g CODESIGN_IDENT_USER
|
||||||
|
log_info 'Setting up developer id for codesigning...'
|
||||||
|
read CODESIGN_IDENT_USER'?Apple Developer ID: '
|
||||||
|
}
|
||||||
17
.github/scripts/utils.zsh/set_loglevel
vendored
Executable file
17
.github/scripts/utils.zsh/set_loglevel
vendored
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
autoload -Uz log_debug log_error
|
||||||
|
|
||||||
|
local -r _usage="Usage: %B${0}%b <loglevel>
|
||||||
|
|
||||||
|
Set log level, following levels are supported: 0 (quiet), 1 (normal), 2 (verbose), 3 (debug)"
|
||||||
|
|
||||||
|
if (( ! # )); then
|
||||||
|
log_error 'Called without arguments.'
|
||||||
|
log_output ${_usage}
|
||||||
|
return 2
|
||||||
|
elif (( ${1} >= 4 )); then
|
||||||
|
log_error 'Called with loglevel > 3.'
|
||||||
|
log_output ${_usage}
|
||||||
|
fi
|
||||||
|
|
||||||
|
typeset -g -i -r _loglevel=${1}
|
||||||
|
log_debug "Log level set to '${1}'"
|
||||||
14
.github/scripts/utils.zsh/setup_ccache
vendored
Executable file
14
.github/scripts/utils.zsh/setup_ccache
vendored
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
autoload -Uz log_debug log_warning
|
||||||
|
|
||||||
|
if (( ${+commands[ccache]} )) {
|
||||||
|
log_debug "Found ccache at ${commands[ccache]}"
|
||||||
|
|
||||||
|
if (( ${+CI} )) {
|
||||||
|
ccache --set-config=cache_dir="${GITHUB_WORKSPACE:-${HOME}}/.ccache"
|
||||||
|
ccache --set-config=max_size="${CCACHE_SIZE:-500M}"
|
||||||
|
ccache --set-config=compression=true
|
||||||
|
ccache -z > /dev/null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log_warning "No ccache found on the system"
|
||||||
|
}
|
||||||
70
.github/scripts/utils.zsh/setup_linux
vendored
Executable file
70
.github/scripts/utils.zsh/setup_linux
vendored
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
autoload -Uz log_error log_status log_info mkcd
|
||||||
|
|
||||||
|
if (( ! ${+project_root} )) {
|
||||||
|
log_error "'project_root' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+target} )) {
|
||||||
|
log_error "'target' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
pushd ${project_root}
|
||||||
|
|
||||||
|
typeset -g QT_VERSION
|
||||||
|
read -r QT_VERSION <<< \
|
||||||
|
"$(jq -r --arg target "${target}" \
|
||||||
|
'.platformConfig[$target] | { qtVersion } | join(" ")' \
|
||||||
|
${project_root}/buildspec.json)"
|
||||||
|
|
||||||
|
if (( ! (${skips[(Ie)all]} + ${skips[(Ie)deps]}) )) {
|
||||||
|
log_info 'Installing obs build dependencies...'
|
||||||
|
|
||||||
|
sudo apt-get install -y \
|
||||||
|
build-essential \
|
||||||
|
libcurl4-openssl-dev \
|
||||||
|
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
|
||||||
|
libswresample-dev libswscale-dev \
|
||||||
|
libjansson-dev \
|
||||||
|
libx11-xcb-dev \
|
||||||
|
libgles2-mesa-dev \
|
||||||
|
libwayland-dev \
|
||||||
|
libpulse-dev
|
||||||
|
|
||||||
|
log_info 'Installing obs plugin dependencies...'
|
||||||
|
|
||||||
|
sudo apt-get install -y \
|
||||||
|
libxtst-dev \
|
||||||
|
libxss-dev \
|
||||||
|
libopencv-dev \
|
||||||
|
libprocps-dev
|
||||||
|
|
||||||
|
local -a _qt_packages=()
|
||||||
|
|
||||||
|
if (( QT_VERSION == 5 )) {
|
||||||
|
_qt_packages+=(
|
||||||
|
qtbase5-dev
|
||||||
|
libqt5svg5-dev
|
||||||
|
qtbase5-private-dev
|
||||||
|
libqt5x11extras5-dev
|
||||||
|
)
|
||||||
|
} elif (( QT_VERSION == 6 )) {
|
||||||
|
_qt_packages+=(
|
||||||
|
qt6-base-dev
|
||||||
|
libqt6svg6-dev
|
||||||
|
qt6-base-private-dev
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
log_error "Unsupported Qt version '${QT_VERSION}' specified."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
sudo apt-get install -y ${_qt_packages}
|
||||||
|
}
|
||||||
|
|
||||||
|
local deps_version
|
||||||
|
read -r deps_version <<< \
|
||||||
|
"$(jq -r '.dependencies.prebuilt.version' ${buildspec_file})"
|
||||||
|
|
||||||
|
typeset -g OBS_DEPS_VERSION=${deps_version}
|
||||||
127
.github/scripts/utils.zsh/setup_macos
vendored
Executable file
127
.github/scripts/utils.zsh/setup_macos
vendored
Executable file
@@ -0,0 +1,127 @@
|
|||||||
|
autoload -Uz log_error log_status log_info mkcd
|
||||||
|
|
||||||
|
if (( ! ${+commands[curl]} )) {
|
||||||
|
log_error 'curl not found. Please install curl.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+commands[jq]} )) {
|
||||||
|
log_error 'jq not found. Please install jq.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+project_root} )) {
|
||||||
|
log_error "'project_root' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+target} )) {
|
||||||
|
log_error "'target' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
local -a curl_opts=()
|
||||||
|
if (( ! ${+CI} )) {
|
||||||
|
curl_opts+=(--progress-bar)
|
||||||
|
} else {
|
||||||
|
curl_opts+=(--show-error --silent)
|
||||||
|
}
|
||||||
|
curl_opts+=(--location -O ${@})
|
||||||
|
|
||||||
|
pushd ${project_root}
|
||||||
|
|
||||||
|
local _qt_version
|
||||||
|
local _deployment_target
|
||||||
|
read -r _qt_version _deployment_target <<< \
|
||||||
|
"$(jq -r --arg target "${target}" \
|
||||||
|
'.platformConfig[$target] | { qtVersion, deploymentTarget } | join (" ")' \
|
||||||
|
${buildspec_file})"
|
||||||
|
|
||||||
|
typeset -g QT_VERSION=${_qt_version}
|
||||||
|
typeset -g DEPLOYMENT_TARGET=${_deployment_target}
|
||||||
|
|
||||||
|
if (( ! (${skips[(Ie)all]} + ${skips[(Ie)deps]}) )) {
|
||||||
|
mkdir -p ${project_root:h}/obs-build-dependencies
|
||||||
|
|
||||||
|
local dependency
|
||||||
|
local deps_version
|
||||||
|
local deps_baseurl
|
||||||
|
local deps_label
|
||||||
|
local deps_hash
|
||||||
|
local _filename
|
||||||
|
local _url
|
||||||
|
local _target
|
||||||
|
local artifact_checksum
|
||||||
|
|
||||||
|
for dependency ('prebuilt' "qt${QT_VERSION}") {
|
||||||
|
IFS=';' read -r deps_version deps_baseurl deps_label deps_hash <<< \
|
||||||
|
"$(jq -r --arg dependency "${dependency}" --arg target "${target}" \
|
||||||
|
'.dependencies[$dependency] | {version, baseUrl, "label", "hash": .hashes[$target]} | join(";")' \
|
||||||
|
${buildspec_file})"
|
||||||
|
|
||||||
|
if [[ -z "${deps_version}" ]] {
|
||||||
|
log_error "No ${dependency} spec found in ${buildspec_file}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
log_info "Setting up ${deps_label}..."
|
||||||
|
|
||||||
|
pushd ${project_root:h}/obs-build-dependencies
|
||||||
|
|
||||||
|
case ${dependency} {
|
||||||
|
prebuilt)
|
||||||
|
_filename="macos-deps-${deps_version}-${target##*-}.tar.xz"
|
||||||
|
_url="${deps_baseurl}/${deps_version}/${_filename}"
|
||||||
|
_target="plugin-deps-${deps_version}-qt${QT_VERSION}-${target##*-}"
|
||||||
|
typeset -g OBS_DEPS_VERSION=${deps_version}
|
||||||
|
;;
|
||||||
|
qt*)
|
||||||
|
if (( ${+CI} )) {
|
||||||
|
_filename="macos-deps-qt${QT_VERSION}-${deps_version}-universal.tar.xz"
|
||||||
|
deps_hash="$(jq -r --arg dependency "${dependency}" \
|
||||||
|
'.dependencies[$dependency].hashes["macos-universal"]' \
|
||||||
|
${buildspec_file})"
|
||||||
|
} else {
|
||||||
|
_filename="macos-deps-qt${QT_VERSION}-${deps_version}-${target##*-}.tar.xz"
|
||||||
|
}
|
||||||
|
_url="${deps_baseurl}/${deps_version}/${_filename}"
|
||||||
|
_target="plugin-deps-${deps_version}-qt${QT_VERSION}-${target##*-}"
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ ! -f ${_filename} ]] {
|
||||||
|
log_debug "Running curl ${curl_opts} ${_url}"
|
||||||
|
curl ${curl_opts} ${_url} && \
|
||||||
|
log_status "Downloaded ${deps_label} for ${target}."
|
||||||
|
} else {
|
||||||
|
log_status "Found downloaded ${deps_label}"
|
||||||
|
}
|
||||||
|
|
||||||
|
read -r artifact_checksum _ <<< "$(sha256sum ${_filename})"
|
||||||
|
if [[ ${deps_hash} != ${artifact_checksum} ]] {
|
||||||
|
log_error "Checksum of downloaded ${deps_label} does not match specification.
|
||||||
|
Expected : ${deps_hash}
|
||||||
|
Actual : ${artifact_checksum}"
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
log_status "Checksum of downloaded ${deps_label} matches."
|
||||||
|
|
||||||
|
if (( ! (${skips[(Ie)all]} + ${skips[(Ie)unpack]}) )) {
|
||||||
|
mkdir -p ${_target} && pushd ${_target}
|
||||||
|
|
||||||
|
XZ_OPT=-T0 tar -xzf ../${_filename} && log_status "${deps_label} extracted."
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
popd
|
||||||
|
pushd ${project_root:h}/obs-build-dependencies
|
||||||
|
xattr -r -d com.apple.quarantine *
|
||||||
|
log_status 'Removed quarantine flag from downloaded dependencies...'
|
||||||
|
popd
|
||||||
|
} else {
|
||||||
|
local deps_version
|
||||||
|
read -r deps_version <<< \
|
||||||
|
"$(jq -r '.dependencies.prebuilt.version' ${buildspec_file})"
|
||||||
|
|
||||||
|
typeset -g OBS_DEPS_VERSION=${deps_version}
|
||||||
|
}
|
||||||
122
.github/scripts/utils.zsh/setup_obs
vendored
Executable file
122
.github/scripts/utils.zsh/setup_obs
vendored
Executable file
@@ -0,0 +1,122 @@
|
|||||||
|
autoload -Uz log_error log_info log_status
|
||||||
|
|
||||||
|
if (( ! ${+buildspec_file} )) {
|
||||||
|
log_error "'buildspec_file' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+commands[git]} )) {
|
||||||
|
log_error 'git not found. Please install git.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+commands[jq]} )) {
|
||||||
|
log_error 'jq not found. Please install jq.'
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+project_root} )) {
|
||||||
|
log_error "'project_root' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! ${+target} )) {
|
||||||
|
log_error "'target' not set. Please set before running ${0}."
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info 'Setting up OBS-Studio...'
|
||||||
|
|
||||||
|
local obs_version
|
||||||
|
local obs_repo
|
||||||
|
local obs_branch
|
||||||
|
local obs_hash
|
||||||
|
|
||||||
|
read -r obs_version obs_repo obs_branch obs_hash <<< \
|
||||||
|
"$(jq -r --arg key "obs-studio" \
|
||||||
|
'.dependencies[$key] | {version, repository, branch, hash} | join(" ")' \
|
||||||
|
${buildspec_file})"
|
||||||
|
|
||||||
|
if [[ -z ${obs_version} ]] {
|
||||||
|
log_error "No obs-studio version found in buildspec.json"
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
pushd
|
||||||
|
mkcd ${project_root:h}/obs-studio
|
||||||
|
|
||||||
|
if (( ! (${skips[(Ie)all]} + ${skips[(Ie)unpack]}) )) {
|
||||||
|
if [[ -d .git ]] {
|
||||||
|
git config advice.detachedHead false
|
||||||
|
git config remote.pluginbuild.url "${obs_repo:-https://github.com/obsproject/obs-studio.git}"
|
||||||
|
git config remote.pluginbuild.fetch "+refs/heads/${obs_branch:-master}:refs/remotes/origin/${obs_branch:-master}"
|
||||||
|
|
||||||
|
git rev-parse -q --verify "${obs_hash}^{commit}" > /dev/null || git fetch pluginbuild
|
||||||
|
git checkout ${obs_branch:-master} -B ${product_name}
|
||||||
|
git reset --hard "${obs_hash}"
|
||||||
|
log_status 'Found existing obs-studio repository.'
|
||||||
|
} else {
|
||||||
|
git clone "${obs_repo:-https://github.com/obsproject/obs-studio.git}" "${PWD}"
|
||||||
|
git config advice.detachedHead false
|
||||||
|
git checkout -f "${obs_hash}" --
|
||||||
|
git checkout ${obs_branch:-master} -b ${product_name}
|
||||||
|
log_status 'obs-studio checked out.'
|
||||||
|
}
|
||||||
|
|
||||||
|
git submodule foreach --recursive git submodule sync
|
||||||
|
git submodule update --init --recursive
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( ! (${skips[(Ie)all]} + ${skips[(Ie)build]}) )) {
|
||||||
|
log_info 'Configuring obs-studio...'
|
||||||
|
|
||||||
|
local -a cmake_args=(
|
||||||
|
-DCMAKE_BUILD_TYPE=${BUILD_CONFIG:-Release}
|
||||||
|
-DQT_VERSION=${QT_VERSION}
|
||||||
|
-DENABLE_PLUGINS=OFF
|
||||||
|
-DENABLE_UI=OFF
|
||||||
|
-DENABLE_SCRIPTING=OFF
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${project_root:h}/obs-build-dependencies/plugin-deps-${OBS_DEPS_VERSION}-qt${QT_VERSION}-${target##*-}"
|
||||||
|
-DCMAKE_PREFIX_PATH="${project_root:h}/obs-build-dependencies/plugin-deps-${OBS_DEPS_VERSION}-qt${QT_VERSION}-${target##*-}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (( _loglevel == 0 )) cmake_args+=(-Wno_deprecated -Wno-dev --log-level=ERROR)
|
||||||
|
if (( _loglevel > 2 )) cmake_args+=(--debug-output)
|
||||||
|
|
||||||
|
local num_procs
|
||||||
|
|
||||||
|
case ${target} {
|
||||||
|
macos-*)
|
||||||
|
autoload -Uz read_codesign
|
||||||
|
if (( ${+CODESIGN} )) {
|
||||||
|
read_codesign
|
||||||
|
}
|
||||||
|
|
||||||
|
cmake_args+=(
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=${${target##*-}//universal/x86_64;arm64}
|
||||||
|
-DCMAKE_OSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-10.15}
|
||||||
|
-DOBS_CODESIGN_LINKER=ON
|
||||||
|
-DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}"
|
||||||
|
)
|
||||||
|
num_procs=$(( $(sysctl -n hw.ncpu) + 1 ))
|
||||||
|
;;
|
||||||
|
linux-*)
|
||||||
|
cmake_args+=(
|
||||||
|
-DENABLE_PIPEWIRE=OFF
|
||||||
|
)
|
||||||
|
num_procs=$(( $(nproc) + 1 ))
|
||||||
|
;;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug "Attempting to configure OBS with CMake arguments: ${cmake_args}"
|
||||||
|
cmake -S . -B plugin_build_${target##*-} -G ${generator} ${cmake_args}
|
||||||
|
|
||||||
|
log_info 'Building libobs and obs-frontend-api...'
|
||||||
|
local -a cmake_args=()
|
||||||
|
if (( _loglevel > 1 )) cmake_args+=(--verbose)
|
||||||
|
if [[ ${generator} == 'Unix Makefiles' ]] cmake_args+=(--parallel ${num_procs})
|
||||||
|
cmake --build plugin_build_${target##*-} --config ${BUILD_CONFIG:-Release} ${cmake_args} -t obs-frontend-api
|
||||||
|
cmake --install plugin_build_${target##*-} --config ${BUILD_CONFIG:-Release} --component obs_libraries ${cmake_args}
|
||||||
|
}
|
||||||
|
|
||||||
|
popd
|
||||||
16
.github/workflows/build-debian.yml
vendored
16
.github/workflows/build-debian.yml
vendored
@@ -1,6 +1,20 @@
|
|||||||
name: debian-build
|
name: debian-build
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
- 'data/locale/**'
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
- 'data/locale/**'
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
380
.github/workflows/build.yml
vendored
380
.github/workflows/build.yml
vendored
@@ -1,380 +0,0 @@
|
|||||||
name: build obs plugin
|
|
||||||
|
|
||||||
on: [push, pull_request, workflow_dispatch]
|
|
||||||
|
|
||||||
env:
|
|
||||||
PLUGIN_NAME: SceneSwitcher
|
|
||||||
LIB_NAME: advanced-scene-switcher
|
|
||||||
OBS_TAG: 27.2.0
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
macos64:
|
|
||||||
name: "macOS 64-bit"
|
|
||||||
runs-on: [macos-latest]
|
|
||||||
env:
|
|
||||||
QT_VERSION: "5.15.2"
|
|
||||||
MACOS_DEPS_VERSION: "2020-12-11"
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
repository: obsproject/obs-studio
|
|
||||||
submodules: "recursive"
|
|
||||||
ref: "refs/tags/${{ env.OBS_TAG }}"
|
|
||||||
- name: "Checkout plugin"
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
path: UI/frontend-plugins/${{ env.PLUGIN_NAME }}
|
|
||||||
submodules: "recursive"
|
|
||||||
- name: Fetch Git Tags
|
|
||||||
run: |
|
|
||||||
cd UI/frontend-plugins/${{ env.PLUGIN_NAME }}
|
|
||||||
git fetch --prune --tags --unshallow
|
|
||||||
- name: "Install prerequisites (Homebrew)"
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [ -d /usr/local/opt/openssl@1.0.2t ]; then
|
|
||||||
brew uninstall openssl@1.0.2t
|
|
||||||
brew untap local/openssl
|
|
||||||
fi
|
|
||||||
if [ -d /usr/local/opt/python@2.7.17 ]; then
|
|
||||||
brew uninstall python@2.7.17
|
|
||||||
brew untap local/python2
|
|
||||||
fi
|
|
||||||
brew bundle --file ./CI/scripts/macos/Brewfile
|
|
||||||
- name: "Install prerequisite: Pre-built dependencies"
|
|
||||||
if: steps.deps-cache.outputs.cache-hit != 'true'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-deps-${{ env.MACOS_DEPS_VERSION }}.tar.gz
|
|
||||||
tar -xf ./macos-deps-${{ env.MACOS_DEPS_VERSION }}.tar.gz -C "/tmp"
|
|
||||||
- name: "Install prerequisite: Pre-built dependency Qt"
|
|
||||||
if: steps.deps-qt-cache.outputs.cache-hit != 'true'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-qt-${{ env.QT_VERSION }}-${{ env.MACOS_DEPS_VERSION }}.tar.gz
|
|
||||||
tar -xf ./macos-qt-${{ env.QT_VERSION }}-${{ env.MACOS_DEPS_VERSION }}.tar.gz -C "/tmp"
|
|
||||||
xattr -r -d com.apple.quarantine /tmp/obsdeps
|
|
||||||
- name: "Build prerequisite: OpenCV"
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
cd UI/frontend-plugins/${{ env.PLUGIN_NAME }}/deps/opencv
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DBUILD_LIST="core,imgproc,objdetect" ..
|
|
||||||
make -j4
|
|
||||||
make install
|
|
||||||
- name: Configure
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "add_subdirectory(${{ env.PLUGIN_NAME }})" >> UI/frontend-plugins/CMakeLists.txt
|
|
||||||
mkdir ./build
|
|
||||||
cd ./build
|
|
||||||
cmake -DBUILD_BROWSER=OFF -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DDISABLE_PYTHON=ON -DDepsPath="/tmp/obsdeps" -DQTDIR="/tmp/obsdeps" ..
|
|
||||||
cd -
|
|
||||||
- name: Build
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
cd ./build
|
|
||||||
make -j4
|
|
||||||
cd -
|
|
||||||
- name: "Install prerequisite: Packages app"
|
|
||||||
if: success()
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl -L -O http://s.sudre.free.fr/Software/files/Packages.dmg
|
|
||||||
sudo hdiutil attach ./Packages.dmg
|
|
||||||
sudo installer -pkg /Volumes/Packages\ 1.2.10/Install\ Packages.pkg -target /
|
|
||||||
- name: Package
|
|
||||||
if: success()
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
fix_linker_paths() {
|
|
||||||
install_name_tool -change @rpath/libobs-frontend-api.dylib @executable_path/../Frameworks/libobs-frontend-api.dylib $1
|
|
||||||
install_name_tool -change @rpath/libobs.0.dylib @executable_path/../Frameworks/libobs.0.dylib $1
|
|
||||||
install_name_tool -change /tmp/obsdeps/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets $1
|
|
||||||
install_name_tool -change /tmp/obsdeps/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui $1
|
|
||||||
install_name_tool -change /tmp/obsdeps/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore $1
|
|
||||||
}
|
|
||||||
cd UI/frontend-plugins/${{ env.PLUGIN_NAME }}
|
|
||||||
fix_linker_paths ../../../build/UI/frontend-plugins/SceneSwitcher/advanced-scene-switcher.so
|
|
||||||
fix_linker_paths ../../../build/UI/frontend-plugins/SceneSwitcher/src/external-macro-modules/opencv/advanced-scene-switcher-opencv.so
|
|
||||||
FILE_DATE=$(date +%Y-%m-%d)
|
|
||||||
FILE_NAME=${{ env.PLUGIN_NAME }}-$FILE_DATE-${{ github.sha }}-macos.pkg
|
|
||||||
echo "FILE_NAME=${FILE_NAME}" >> $GITHUB_ENV
|
|
||||||
packagesbuild ./CI/macos/${{ env.PLUGIN_NAME }}.pkgproj
|
|
||||||
cd -
|
|
||||||
mkdir ./nightly
|
|
||||||
mv UI/frontend-plugins/${{ env.PLUGIN_NAME }}/${{ env.PLUGIN_NAME }}.pkg ./nightly/${FILE_NAME}
|
|
||||||
- name: Publish
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2.2.1
|
|
||||||
with:
|
|
||||||
name: "${{ env.FILE_NAME }}"
|
|
||||||
path: ./nightly/*.pkg
|
|
||||||
ubuntu64:
|
|
||||||
name: "Linux/Ubuntu 64-bit"
|
|
||||||
runs-on: [ubuntu-latest]
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
repository: obsproject/obs-studio
|
|
||||||
submodules: "recursive"
|
|
||||||
ref: "refs/tags/${{ env.OBS_TAG }}"
|
|
||||||
- name: "Checkout plugin"
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
path: UI/frontend-plugins/${{ env.PLUGIN_NAME }}
|
|
||||||
submodules: "recursive"
|
|
||||||
- name: Add plugin to obs cmake
|
|
||||||
shell: bash
|
|
||||||
run: echo "add_subdirectory(${{ env.PLUGIN_NAME }})" >> UI/frontend-plugins/CMakeLists.txt
|
|
||||||
- name: Fetch Git Tags
|
|
||||||
run: git fetch --prune --tags --unshallow
|
|
||||||
- name: Install prerequisites (Apt)
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
sudo dpkg --add-architecture amd64
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
build-essential \
|
|
||||||
checkinstall \
|
|
||||||
cmake \
|
|
||||||
libasound2-dev \
|
|
||||||
libavcodec-dev \
|
|
||||||
libavdevice-dev \
|
|
||||||
libavfilter-dev \
|
|
||||||
libavformat-dev \
|
|
||||||
libavutil-dev \
|
|
||||||
libcurl4-openssl-dev \
|
|
||||||
libfdk-aac-dev \
|
|
||||||
libfontconfig-dev \
|
|
||||||
libfreetype6-dev \
|
|
||||||
libgl1-mesa-dev \
|
|
||||||
libjack-jackd2-dev \
|
|
||||||
libjansson-dev \
|
|
||||||
libluajit-5.1-dev \
|
|
||||||
libpulse-dev \
|
|
||||||
libqt5x11extras5-dev \
|
|
||||||
libspeexdsp-dev \
|
|
||||||
libswresample-dev \
|
|
||||||
libswscale-dev \
|
|
||||||
libudev-dev \
|
|
||||||
libv4l-dev \
|
|
||||||
libva-dev \
|
|
||||||
libvlc-dev \
|
|
||||||
libx11-dev \
|
|
||||||
libx264-dev \
|
|
||||||
libxcb-randr0-dev \
|
|
||||||
libxcb-shm0-dev \
|
|
||||||
libxcb-xinerama0-dev \
|
|
||||||
libxcomposite-dev \
|
|
||||||
libxinerama-dev \
|
|
||||||
libxtst-dev \
|
|
||||||
libmbedtls-dev \
|
|
||||||
pkg-config \
|
|
||||||
python3-dev \
|
|
||||||
qtbase5-dev \
|
|
||||||
qtbase5-private-dev \
|
|
||||||
libqt5svg5-dev \
|
|
||||||
swig \
|
|
||||||
libxss-dev \
|
|
||||||
libx11-xcb-dev \
|
|
||||||
libxcb-xfixes0-dev \
|
|
||||||
libopencv-dev \
|
|
||||||
libprocps-dev \
|
|
||||||
libpci-dev
|
|
||||||
- name: "Configure"
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir ./build
|
|
||||||
cd ./build
|
|
||||||
cmake -DENABLE_PIPEWIRE=OFF -DUNIX_STRUCTURE=0 -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/obs-studio-portable" -DWITH_RTMPS=OFF -DBUILD_BROWSER=OFF ..
|
|
||||||
- name: "Build"
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/build
|
|
||||||
run: make -j4
|
|
||||||
- name: "Package"
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
FILE_DATE=$(date +%Y-%m-%d)
|
|
||||||
FILE_NAME=${{ env.PLUGIN_NAME }}-$FILE_DATE-${{ github.sha }}-linux64.tar.gz
|
|
||||||
echo "FILE_NAME=${FILE_NAME}" >> $GITHUB_ENV
|
|
||||||
mkdir -p ./${{ env.LIB_NAME }}/bin/64bit/
|
|
||||||
strip -d ./build/UI/frontend-plugins/${{ env.PLUGIN_NAME }}/${{ env.LIB_NAME }}.so
|
|
||||||
mv ./build/UI/frontend-plugins/${{ env.PLUGIN_NAME }}/${{ env.LIB_NAME }}.so ./${{ env.LIB_NAME }}/bin/64bit/${{ env.LIB_NAME }}.so
|
|
||||||
mv ./UI/frontend-plugins/${{ env.PLUGIN_NAME }}/data ./${{ env.LIB_NAME }}/data
|
|
||||||
# Macro modules
|
|
||||||
mkdir -p ./${{ env.LIB_NAME }}/bin/64bit/adv-ss-plugins
|
|
||||||
strip -d ./build/UI/frontend-plugins/${{ env.PLUGIN_NAME }}/src/external-macro-modules/opencv/advanced-scene-switcher-opencv.so
|
|
||||||
mv ./build/UI/frontend-plugins/${{ env.PLUGIN_NAME }}/src/external-macro-modules/opencv/advanced-scene-switcher-opencv.so ./${{ env.LIB_NAME }}/bin/64bit/adv-ss-plugins
|
|
||||||
tar -cvzf "${FILE_NAME}" ${{ env.LIB_NAME }}
|
|
||||||
- name: "Publish"
|
|
||||||
uses: actions/upload-artifact@v2.2.1
|
|
||||||
with:
|
|
||||||
name: "${{ env.FILE_NAME }}"
|
|
||||||
path: "*.tar.gz"
|
|
||||||
windows:
|
|
||||||
name: Windows
|
|
||||||
runs-on: [windows-latest]
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
arch: [32, 64]
|
|
||||||
env:
|
|
||||||
QT_VERSION: 5.15.2
|
|
||||||
CMAKE_GENERATOR: "Visual Studio 17 2022"
|
|
||||||
CMAKE_SYSTEM_VERSION: "10.0.18363.657"
|
|
||||||
WINDOWS_DEPS_VERSION: "2019"
|
|
||||||
steps:
|
|
||||||
- name: Add msbuild to PATH
|
|
||||||
uses: microsoft/setup-msbuild@v1.0.2
|
|
||||||
- name: Checkout obs
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
repository: obsproject/obs-studio
|
|
||||||
submodules: "recursive"
|
|
||||||
ref: "refs/tags/${{ env.OBS_TAG }}"
|
|
||||||
- name: Checkout plugin
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
path: UI/frontend-plugins/${{ env.PLUGIN_NAME}}
|
|
||||||
submodules: "recursive"
|
|
||||||
- name: Add plugin to obs cmake
|
|
||||||
shell: cmd
|
|
||||||
run: echo add_subdirectory(${{ env.PLUGIN_NAME }}) >> UI/frontend-plugins/CMakeLists.txt
|
|
||||||
- name: Fetch Git Tags
|
|
||||||
run: git fetch --prune --tags --unshallow
|
|
||||||
- name: "Install prerequisite: QT"
|
|
||||||
run: |
|
|
||||||
curl -kLO https://cdn-fastly.obsproject.com/downloads/Qt_${{ env.QT_VERSION }}.7z -f --retry 5 -C -
|
|
||||||
7z x Qt_${{ env.QT_VERSION }}.7z -o"${{ github.workspace }}/cmbuild/QT"
|
|
||||||
- name: "Install prerequisite: Pre-built dependencies"
|
|
||||||
run: |
|
|
||||||
curl -kLO https://cdn-fastly.obsproject.com/downloads/dependencies${{ env.WINDOWS_DEPS_VERSION }}.zip -f --retry 5 -C -
|
|
||||||
7z x dependencies${{ env.WINDOWS_DEPS_VERSION }}.zip -o"${{ github.workspace }}/cmbuild/deps"
|
|
||||||
- name: "Build prerequisite: OpenCV"
|
|
||||||
run: |
|
|
||||||
cd UI/frontend-plugins/${{ env.PLUGIN_NAME }}/deps/opencv
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
if ( ${{ matrix.arch }} -eq 32 )
|
|
||||||
{
|
|
||||||
cmake -G"${{ env.CMAKE_GENERATOR }}" -A"Win32" -DBUILD_LIST="core,imgproc,objdetect" ..
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cmake -G"${{ env.CMAKE_GENERATOR }}" -A"x64" -DBUILD_LIST="core,imgproc,objdetect" ..
|
|
||||||
}
|
|
||||||
msbuild /m /p:Configuration=Release OpenCV.sln
|
|
||||||
msbuild INSTALL.vcxproj
|
|
||||||
- name: Configure
|
|
||||||
run: |
|
|
||||||
mkdir ./package
|
|
||||||
mkdir ./build${{ matrix.arch }}
|
|
||||||
cd ./build${{ matrix.arch }}
|
|
||||||
Get-Location
|
|
||||||
if ( ${{ matrix.arch }} -eq 32 )
|
|
||||||
{
|
|
||||||
cmake -G"${{ env.CMAKE_GENERATOR }}" -A"Win32" -DOpenCV_DIR="${{ github.workspace }}/UI/frontend-plugins/SceneSwitcher/deps/opencv/build/" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=false -DBUILD_CAPTIONS=false -DCOMPILE_D3D12_HOOK=false -DDepsPath="${{ github.workspace }}/cmbuild/deps/win32" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE ..
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cmake -G"${{ env.CMAKE_GENERATOR }}" -A"x64" -DOpenCV_DIR="${{ github.workspace }}/UI/frontend-plugins/SceneSwitcher/deps/opencv/build/" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=false -DBUILD_CAPTIONS=false -DCOMPILE_D3D12_HOOK=false -DDepsPath="${{ github.workspace }}/cmbuild/deps/win64" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019_64" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE ..
|
|
||||||
}
|
|
||||||
- name: Build
|
|
||||||
run: |
|
|
||||||
msbuild /m /p:Configuration=RelWithDebInfo .\build${{ matrix.arch }}\obs-studio.sln
|
|
||||||
- name: Package
|
|
||||||
if: success()
|
|
||||||
run: |
|
|
||||||
$env:FILE_DATE=(Get-Date -UFormat "%F")
|
|
||||||
$env:FILE_NAME="${{ env.PLUGIN_NAME }}-${env:FILE_DATE}-${{ github.sha }}-windows"
|
|
||||||
echo "FILE_NAME=${env:FILE_NAME}" >> ${env:GITHUB_ENV}
|
|
||||||
robocopy .\build${{ matrix.arch }}\rundir\RelWithDebInfo\obs-plugins\${{ matrix.arch }}bit\ .\package\obs-plugins\${{ matrix.arch }}bit ${{ env.LIB_NAME }}* /E /XF .gitignore
|
|
||||||
robocopy .\build${{ matrix.arch }}\rundir\RelWithDebInfo\obs-plugins\${{ matrix.arch }}bit\ .\package\obs-plugins\${{ matrix.arch }}bit adv-ss-plugins /E /XF .gitignore
|
|
||||||
robocopy .\build${{ matrix.arch }}\rundir\RelWithDebInfo\data\obs-plugins\${{ env.LIB_NAME }}\ .\package\data\obs-plugins\${{ env.LIB_NAME }}\ /E /XF .gitignore
|
|
||||||
cp UI/frontend-plugins/${{ env.PLUGIN_NAME }}/deps/opencv/build/bin/Release/*dll package/obs-plugins/${{ matrix.arch }}bit/adv-ss-plugins
|
|
||||||
cp UI/frontend-plugins/${{ env.PLUGIN_NAME }}/deps/openvr/bin/win${{ matrix.arch }}/*dll package/obs-plugins/${{ matrix.arch }}bit/adv-ss-plugins
|
|
||||||
exit 0
|
|
||||||
- name: Publish zip
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2.2.1
|
|
||||||
with:
|
|
||||||
name: "${{ env.FILE_NAME }}-${{ matrix.arch }}bit"
|
|
||||||
path: package/*
|
|
||||||
windows-installer:
|
|
||||||
needs: [windows]
|
|
||||||
name: "Create Windows Installer"
|
|
||||||
runs-on: [windows-latest]
|
|
||||||
steps:
|
|
||||||
- name: "Checkout plugin"
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
- name: Add msbuild to PATH
|
|
||||||
uses: microsoft/setup-msbuild@v1.0.2
|
|
||||||
- name: "Prepare innosetup"
|
|
||||||
run: |
|
|
||||||
curl "-kL" "https://files.jrsoftware.org/is/6/innosetup-6.0.3.exe" "-f" "--retry" "5" "-o" "inno.exe"
|
|
||||||
.\inno.exe /VERYSILENT /SP- /SUPPRESSMSGBOXES /NORESTART
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
continue-on-error: true
|
|
||||||
- name: Download artifacts
|
|
||||||
uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
path: artifacts
|
|
||||||
- name: "Prepare package dir"
|
|
||||||
run: |
|
|
||||||
curl "-kL" "https://github.com/Xaymar/msvc-redist-helper/releases/download/0.1/msvc-redist-helper-64.exe" "-f" "--retry" "5" "-o" "msvc-redist-helper-64.exe"
|
|
||||||
curl "-kL" "https://github.com/Xaymar/msvc-redist-helper/releases/download/0.1/msvc-redist-helper-32.exe" "-f" "--retry" "5" "-o" "msvc-redist-helper-32.exe"
|
|
||||||
$env:FILE_DATE=(Get-Date -UFormat "%F")
|
|
||||||
$env:FILE_NAME="${{ env.PLUGIN_NAME }}-${env:FILE_DATE}-${{ github.sha }}-windows"
|
|
||||||
echo "FILE_NAME=${env:FILE_NAME}" >> ${env:GITHUB_ENV}
|
|
||||||
mkdir package
|
|
||||||
cd package
|
|
||||||
cp -r ../artifacts/${env:FILE_NAME}-32bit/* .
|
|
||||||
cp -r ../artifacts/${env:FILE_NAME}-64bit/obs-plugins/* obs-plugins
|
|
||||||
- name: "Compile"
|
|
||||||
run: |
|
|
||||||
& 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' /Qp ".\build\CI\windows\setup.iss"
|
|
||||||
- name: "Publish"
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2.2.0
|
|
||||||
with:
|
|
||||||
name: "${{ env.FILE_NAME }}-installer"
|
|
||||||
path: build/CI/windows/Output/*.exe
|
|
||||||
release:
|
|
||||||
needs: [macos64, ubuntu64, windows, windows-installer]
|
|
||||||
name: "Create Release"
|
|
||||||
runs-on: [ubuntu-latest]
|
|
||||||
steps:
|
|
||||||
- name: "Checkout plugin"
|
|
||||||
uses: actions/checkout@v2.3.4
|
|
||||||
with:
|
|
||||||
path: plugin/${{ env.PLUGIN_NAME }}
|
|
||||||
- name: Download artifacts
|
|
||||||
uses: actions/download-artifact@v2
|
|
||||||
with:
|
|
||||||
path: artifacts
|
|
||||||
- name: "Package"
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p ${{ env.PLUGIN_NAME }}/Linux ${{ env.PLUGIN_NAME }}/MacOs ${{ env.PLUGIN_NAME }}/Windows
|
|
||||||
tar xf artifacts/${{ env.PLUGIN_NAME }}*-linux64.tar.gz/${{ env.PLUGIN_NAME }}*-linux64.tar.gz -C ${{ env.PLUGIN_NAME }}/Linux/
|
|
||||||
mv artifacts/${{ env.PLUGIN_NAME }}*-macos.pkg/${{ env.PLUGIN_NAME }}*-macos.pkg ${{ env.PLUGIN_NAME }}/MacOs/${{ env.PLUGIN_NAME }}.pkg
|
|
||||||
mv ./artifacts/${{ env.PLUGIN_NAME }}*-windows-32bit/* ${{ env.PLUGIN_NAME }}/Windows/
|
|
||||||
mv ./artifacts/${{ env.PLUGIN_NAME }}*-windows-64bit/obs-plugins/* ${{ env.PLUGIN_NAME }}/Windows/obs-plugins
|
|
||||||
mv ./artifacts/${{ env.PLUGIN_NAME }}*-windows-installer/*.exe ${{ env.PLUGIN_NAME }}/Windows/
|
|
||||||
rm ${{ env.PLUGIN_NAME }}/Windows/obs-plugins/32bit/advanced-scene-switcher.pdb
|
|
||||||
rm ${{ env.PLUGIN_NAME }}/Windows/obs-plugins/64bit/advanced-scene-switcher.pdb
|
|
||||||
cp plugin/${{ env.PLUGIN_NAME }}/CI/release/README.txt ${{ env.PLUGIN_NAME }}/
|
|
||||||
FILE_NAME=${{ env.PLUGIN_NAME }}.zip
|
|
||||||
zip -r ${FILE_NAME} ${{ env.PLUGIN_NAME }}/
|
|
||||||
- name: Publish
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2.2.1
|
|
||||||
with:
|
|
||||||
name: "Release"
|
|
||||||
path: "*.zip"
|
|
||||||
19
.github/workflows/clang-format.yml
vendored
19
.github/workflows/clang-format.yml
vendored
@@ -1,19 +0,0 @@
|
|||||||
name: Clang Format Check
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ubuntu64:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install clang format
|
|
||||||
run: |
|
|
||||||
sudo apt-get install -y clang-format-10
|
|
||||||
|
|
||||||
- name: Check the Formatting
|
|
||||||
run: |
|
|
||||||
./CI/formatcode.sh
|
|
||||||
./CI/check-format.sh
|
|
||||||
16
.github/workflows/locale-check.yml
vendored
16
.github/workflows/locale-check.yml
vendored
@@ -1,13 +1,25 @@
|
|||||||
name: Check locale
|
name: Check locale
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
paths:
|
||||||
|
- 'data/locale/**'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- 'data/locale/**'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ubuntu64:
|
ubuntu64:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Check locale files
|
- name: Check locale files
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
397
.github/workflows/main.yml
vendored
Normal file
397
.github/workflows/main.yml
vendored
Normal file
@@ -0,0 +1,397 @@
|
|||||||
|
name: Plugin Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- '**.md'
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
env:
|
||||||
|
PLUGIN_NAME: SceneSwitcher
|
||||||
|
LIB_NAME: advanced-scene-switcher
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clang_check:
|
||||||
|
name: 01 - Code Format Check
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Install clang-format
|
||||||
|
run: sudo apt-get install -y clang-format-13
|
||||||
|
|
||||||
|
- name: Run clang-format
|
||||||
|
run: ./.github/scripts/check-format.sh && ./.github/scripts/check-changes.sh
|
||||||
|
|
||||||
|
- name: Install cmake-format
|
||||||
|
run: sudo pip install cmakelang
|
||||||
|
|
||||||
|
- name: Run cmake-format
|
||||||
|
run: ./.github/scripts/check-cmake.sh
|
||||||
|
|
||||||
|
macos_build:
|
||||||
|
name: 02 - macOS
|
||||||
|
runs-on: macos-12
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
arch: [x86_64, arm64, universal]
|
||||||
|
if: always()
|
||||||
|
needs: [clang_check]
|
||||||
|
outputs:
|
||||||
|
commitHash: ${{ steps.setup.outputs.commitHash }}
|
||||||
|
env:
|
||||||
|
CODESIGN_IDENT: '-'
|
||||||
|
CODESIGN_IDENT_INSTALLER: ''
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: '10.15'
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: zsh {0}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: plugin
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Checkout obs-studio
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: 'obsproject/obs-studio'
|
||||||
|
path: obs-studio
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Setup Environment
|
||||||
|
id: setup
|
||||||
|
working-directory: ${{ github.workspace }}/plugin
|
||||||
|
run: |
|
||||||
|
## SETUP ENVIRONMENT SCRIPT
|
||||||
|
print '::group::Clean Homebrew Environment'
|
||||||
|
typeset -a to_remove=()
|
||||||
|
|
||||||
|
for formula (speexdsp curl php) {
|
||||||
|
if [[ -d ${HOMEBREW_PREFIX}/opt/${formula} ]] to_remove+=(${formula})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( #to_remove > 0 )) brew uninstall --ignore-dependencies ${to_remove}
|
||||||
|
print '::endgroup::'
|
||||||
|
|
||||||
|
print '::group::Set up code signing'
|
||||||
|
if [[ '${{ secrets.MACOS_SIGNING_APPLICATION_IDENTITY }}' != '' && \
|
||||||
|
'${{ secrets.MACOS_SIGNING_INSTALLER_IDENTITY }}' != '' && \
|
||||||
|
'${{ secrets.MACOS_SIGNING_CERT }}' != '' ]] {
|
||||||
|
print '::set-output name=haveCodesignIdent::true'
|
||||||
|
} else {
|
||||||
|
print '::set-output name=haveCodesignIdent::false'
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ '${{ secrets.MACOS_NOTARIZATION_USERNAME }}' != '' && \
|
||||||
|
'${{ secrets.MACOS_NOTARIZATION_PASSWORD }}' != '' ]] {
|
||||||
|
print '::set-output name=haveNotarizationUser::true'
|
||||||
|
} else {
|
||||||
|
print '::set-output name=haveNotarizationUser::false'
|
||||||
|
}
|
||||||
|
print '::endgroup::'
|
||||||
|
|
||||||
|
print "::set-output name=ccacheDate::$(date +"%Y-%m-%d")"
|
||||||
|
print "::set-output name=commitHash::${"$(git rev-parse HEAD)"[0,9]}"
|
||||||
|
echo "$PWD/.github/scripts" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
- name: Restore Compilation Cache
|
||||||
|
id: ccache-cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/.ccache
|
||||||
|
key: macos-${{ matrix.arch }}-ccache-plugin-${{ steps.setup.outputs.ccacheDate }}
|
||||||
|
restore-keys: |
|
||||||
|
macos-${{ matrix.arch }}-ccache-plugin-
|
||||||
|
|
||||||
|
- name: Check for GitHub Labels
|
||||||
|
id: seekingTesters
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
run: |
|
||||||
|
if [[ -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')" ]] {
|
||||||
|
print '::set-output name=found::true'
|
||||||
|
} else {
|
||||||
|
print '::set-output name=found::false'
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Install Apple Developer Certificate
|
||||||
|
if: ${{ steps.setup.outputs.haveCodesignIdent == 'true' }}
|
||||||
|
uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071
|
||||||
|
with:
|
||||||
|
keychain-password: ${{ github.run_id }}
|
||||||
|
p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }}
|
||||||
|
p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Set Signing Identity
|
||||||
|
if: ${{ steps.setup.outputs.haveCodesignIdent == 'true' }}
|
||||||
|
run: |
|
||||||
|
print "CODESIGN_IDENT=${{ secrets.MACOS_SIGNING_APPLICATION_IDENTITY }}" >> $GITHUB_ENV
|
||||||
|
print "CODESIGN_IDENT_INSTALLER=${{ secrets.MACOS_SIGNING_INSTALLER_IDENTITY }}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Build Plugin
|
||||||
|
uses: ./plugin/.github/actions/build-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
codesign: 'true'
|
||||||
|
codesignIdent: ${{ env.CODESIGN_IDENT }}
|
||||||
|
|
||||||
|
- name: Package Plugin
|
||||||
|
uses: ./plugin/.github/actions/package-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
codesign: ${{ steps.setup.outputs.haveCodesignIdent == 'true' }}
|
||||||
|
notarize: ${{ startsWith(github.ref, 'refs/tags/') && steps.setup.outputs.haveNotarizationUser == 'true' }}
|
||||||
|
codesignIdent: ${{ env.CODESIGN_IDENT }}
|
||||||
|
installerIdent: ${{ env.CODESIGN_IDENT_INSTALLER }}
|
||||||
|
codesignUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
|
||||||
|
codesignPass: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Upload Build Artifact
|
||||||
|
if: ${{ success() }}
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ env.PLUGIN_NAME }}-macos-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}
|
||||||
|
path: ${{ github.workspace }}/plugin/release/${{ env.LIB_NAME }}*-macos-${{ matrix.arch }}.pkg
|
||||||
|
|
||||||
|
linux_build:
|
||||||
|
name: 02 - Linux
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
arch: [x86_64]
|
||||||
|
portable: [true, false]
|
||||||
|
if: always()
|
||||||
|
needs: [clang_check]
|
||||||
|
outputs:
|
||||||
|
commitHash: ${{ steps.setup.outputs.commitHash }}
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: plugin
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Checkout obs-studio
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: 'obsproject/obs-studio'
|
||||||
|
path: obs-studio
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Setup Environment
|
||||||
|
working-directory: ${{ github.workspace }}/plugin
|
||||||
|
id: setup
|
||||||
|
run: |
|
||||||
|
## SETUP ENVIRONMENT SCRIPT
|
||||||
|
echo "::set-output name=ccacheDate::$(date +"%Y-%m-%d")"
|
||||||
|
echo "::set-output name=commitHash::$(git rev-parse HEAD | cut -c1-9)"
|
||||||
|
echo "$PWD/.github/scripts" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
- name: Restore Compilation Cache
|
||||||
|
id: ccache-cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/.ccache
|
||||||
|
key: linux-${{ matrix.arch }}-ccache-plugin-${{ steps.setup.outputs.ccacheDate }}
|
||||||
|
restore-keys: |
|
||||||
|
linux-${{ matrix.arch }}-ccache-plugin-
|
||||||
|
|
||||||
|
- name: Check for GitHub Labels
|
||||||
|
id: seekingTesters
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
run: |
|
||||||
|
## GITHUB LABEL SCRIPT
|
||||||
|
if [[ -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')" ]]; then
|
||||||
|
echo '::set-output name=found::true'
|
||||||
|
else
|
||||||
|
echo '::set-output name=found::false'
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Build Plugin
|
||||||
|
uses: ./plugin/.github/actions/build-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
portable: ${{ matrix.portable }}
|
||||||
|
|
||||||
|
- name: Package Plugin
|
||||||
|
uses: ./plugin/.github/actions/package-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
portable: ${{ matrix.portable }}
|
||||||
|
|
||||||
|
- name: Upload Package Artifact
|
||||||
|
if: ${{ matrix.portable }}
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ env.PLUGIN_NAME }}-linux-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}-portable
|
||||||
|
path: ${{ github.workspace }}/plugin/release/${{ env.LIB_NAME }}*-linux-${{ matrix.arch }}.*
|
||||||
|
|
||||||
|
- name: Upload Build Artifact
|
||||||
|
if: ${{ ! matrix.portable }}
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ env.PLUGIN_NAME }}-linux-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}
|
||||||
|
path: ${{ github.workspace }}/plugin/release/${{ env.LIB_NAME }}*-linux-${{ matrix.arch }}.*
|
||||||
|
|
||||||
|
windows_build:
|
||||||
|
name: 02 - Windows
|
||||||
|
runs-on: windows-2022
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
arch: [x64]
|
||||||
|
if: always()
|
||||||
|
needs: [clang_check]
|
||||||
|
outputs:
|
||||||
|
commitHash: ${{ steps.setup.outputs.commitHash }}
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: pwsh
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: plugin
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Checkout obs-studio
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: 'obsproject/obs-studio'
|
||||||
|
path: obs-studio
|
||||||
|
fetch-depth: 0
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Setup Environment
|
||||||
|
working-directory: ${{ github.workspace }}/plugin
|
||||||
|
id: setup
|
||||||
|
run: |
|
||||||
|
## SETUP ENVIRONMENT SCRIPT
|
||||||
|
$CommitHash = (git rev-parse HEAD)[0..8] -join ''
|
||||||
|
Write-Output "::set-output name=commitHash::${CommitHash}"
|
||||||
|
|
||||||
|
- name: Check for GitHub Labels
|
||||||
|
id: seekingTesters
|
||||||
|
working-directory: ${{ github.workspace }}/plugin
|
||||||
|
if: ${{ github.event_name == 'pull_request' }}
|
||||||
|
run: |
|
||||||
|
## GITHUB LABEL SCRIPT
|
||||||
|
$LabelFound = try {
|
||||||
|
$Params = @{
|
||||||
|
Authentication = 'Bearer'
|
||||||
|
Token = (ConvertTo-SecureString '${{ secrets.GITHUB_TOKEN }}' -AsPlainText)
|
||||||
|
Uri = '${{ github.event.pull_request.url }}'
|
||||||
|
UseBasicParsing = $true
|
||||||
|
}
|
||||||
|
|
||||||
|
(Invoke-RestMethod @Params).labels.name.contains('Seeking Testers')
|
||||||
|
} catch {
|
||||||
|
$false
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Output "::set-output name=found::$(([string]${LabelFound}).ToLower())"
|
||||||
|
|
||||||
|
- name: Build Plugin
|
||||||
|
uses: ./plugin/.github/actions/build-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
visualStudio: 'Visual Studio 17 2022'
|
||||||
|
|
||||||
|
- name: Package Plugin
|
||||||
|
uses: ./plugin/.github/actions/package-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
|
||||||
|
- name: Upload Build Artifact
|
||||||
|
if: ${{ success() }}
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ env.PLUGIN_NAME }}-windows-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}
|
||||||
|
path: ${{ github.workspace }}/plugin/release/${{ env.LIB_NAME }}-*.zip
|
||||||
|
|
||||||
|
- name: Package Plugin Installer
|
||||||
|
uses: ./plugin/.github/actions/package-plugin
|
||||||
|
with:
|
||||||
|
workingDirectory: ${{ github.workspace }}/plugin
|
||||||
|
target: ${{ matrix.arch }}
|
||||||
|
config: RelWithDebInfo
|
||||||
|
createInstaller: true
|
||||||
|
|
||||||
|
- name: Upload Installer Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ env.PLUGIN_NAME }}-windows-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}-installer
|
||||||
|
path: ${{ github.workspace }}/plugin/release/${{ env.LIB_NAME }}-*.exe
|
||||||
|
|
||||||
|
make-release:
|
||||||
|
name: 03 - Create and upload release
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/')
|
||||||
|
needs: [macos_build, linux_build, windows_build]
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
steps:
|
||||||
|
- name: Get Metadata
|
||||||
|
id: metadata
|
||||||
|
run: |
|
||||||
|
## METADATA SCRIPT
|
||||||
|
echo "::set-output name=version::${GITHUB_REF/refs\/tags\//}"
|
||||||
|
|
||||||
|
- name: Download build artifacts
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
|
||||||
|
- name: Generate Checksums
|
||||||
|
run: |
|
||||||
|
## CHECKSUM GENERATION SCRIPT
|
||||||
|
shopt -s extglob
|
||||||
|
echo "### Checksums" > ${{ github.workspace }}/CHECKSUMS.txt
|
||||||
|
for file in ${{ github.workspace }}/**/@(*.pkg|*.exe|*.deb|*.zip); do
|
||||||
|
echo " ${file##*/}: $(sha256sum "${file}" | cut -d " " -f 1)" >> ${{ github.workspace }}/CHECKSUMS.txt
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Create Release
|
||||||
|
id: create_release
|
||||||
|
uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5
|
||||||
|
with:
|
||||||
|
draft: true
|
||||||
|
prerelease: true
|
||||||
|
tag_name: ${{ steps.metadata.outputs.version }}
|
||||||
|
name: "${{ env.PLUGIN_NAME }} ${{ steps.metadata.outputs.version }}"
|
||||||
|
body_path: ${{ github.workspace }}/CHECKSUMS.txt
|
||||||
|
files: |
|
||||||
|
${{ github.workspace }}/**/*.zip
|
||||||
|
${{ github.workspace }}/**/*.exe
|
||||||
|
${{ github.workspace }}/**/*.deb
|
||||||
|
${{ github.workspace }}/**/*.pkg
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -77,6 +77,8 @@ CTestTestfile.cmake_install
|
|||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
*.directory
|
*.directory
|
||||||
|
*.generated.*
|
||||||
|
**/.Brewfile.lock.json
|
||||||
|
|
||||||
# backup text files generated by an editor #
|
# backup text files generated by an editor #
|
||||||
############################################
|
############################################
|
||||||
@@ -104,4 +106,9 @@ forms/advanced-scene-switcher.ui.autosave
|
|||||||
|
|
||||||
# Directories #
|
# Directories #
|
||||||
###############
|
###############
|
||||||
build/
|
*~
|
||||||
|
.DS_Store
|
||||||
|
/build/
|
||||||
|
/build_*/
|
||||||
|
/release/
|
||||||
|
/installer/Output/
|
||||||
|
|||||||
162
BUILDING.md
162
BUILDING.md
@@ -4,11 +4,11 @@ You have the option to ...
|
|||||||
- either add the plugin to the OBS source tree directly and build the plugin while building OBS itself. (**in tree**)
|
- either add the plugin to the OBS source tree directly and build the plugin while building OBS itself. (**in tree**)
|
||||||
- or you can move the sources of this plugin outside of the OBS source tree and build it separately from OBS. (**out of tree**)
|
- or you can move the sources of this plugin outside of the OBS source tree and build it separately from OBS. (**out of tree**)
|
||||||
|
|
||||||
As both methods require you to have a working [OBS Studio development environment](https://obsproject.com/wiki/install-instructions), [Qt](https://download.qt.io/official_releases/qt/5.15/5.15.2/) and [CMake](https://cmake.org/download/) it is recommended to build the plugin in tree as it is easier to set up and will enable straightforward debugging.
|
As both methods require you to have a working [OBS Studio development environment](https://obsproject.com/wiki/Building-OBS-Studio) and [CMake](https://cmake.org/download/) it is recommended to build the plugin in tree as it is easier to set up and will enable straightforward debugging.
|
||||||
|
|
||||||
Note that your Qt install must include the QtConcurrent module.
|
The plugin can be compiled for OBS 25 and above, although using the latest version of OBS is recommended to support all features.
|
||||||
|
|
||||||
## Compiling in tree (recommended)
|
## Compiling in tree (recommended for development)
|
||||||
Add the "SceneSwitcher" source directory to your obs-studio source directory under obs-studio/UI/frontend-plugins/:
|
Add the "SceneSwitcher" source directory to your obs-studio source directory under obs-studio/UI/frontend-plugins/:
|
||||||
```
|
```
|
||||||
cd obs-studio/UI/frontend-plugins/
|
cd obs-studio/UI/frontend-plugins/
|
||||||
@@ -20,133 +20,67 @@ Then modify the obs-studio/UI/frontend-plugins/CMakeLists.txt file and add an en
|
|||||||
add_subdirectory(SceneSwitcher)
|
add_subdirectory(SceneSwitcher)
|
||||||
```
|
```
|
||||||
|
|
||||||
Now follow the [build instructions for obs-studio](https://obsproject.com/wiki/install-instructions) for your particular platform.
|
Now follow the [build instructions for obs-studio](https://obsproject.com/wiki/Building-OBS-Studio) for your particular platform.
|
||||||
|
|
||||||
Note that on Linux systems it might be necessary to additionally install the following packages to fulfill the dependencies to `XTest`, `XScreensaver` and `OpenCV` - exact command may differ:
|
Note that on Linux systems it might be necessary to additionally install the following packages to fulfill the dependencies to `XTest`, `XScreensaver` and `OpenCV` - exact command may differ:
|
||||||
```
|
```
|
||||||
sudo apt-get install \
|
sudo apt-get install \
|
||||||
libxtst-dev \
|
libxtst-dev \
|
||||||
libxss-dev \
|
libxss-dev \
|
||||||
|
libprocps-dev \
|
||||||
libopencv-dev
|
libopencv-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Compiling out of tree
|
## Compiling out of tree
|
||||||
### Prerequisites
|
|
||||||
You'll need [Qt](https://download.qt.io/official_releases/qt/5.15/5.15.2/), [CMake](https://cmake.org/download/) and a working [OBS Studio development environment](https://obsproject.com/wiki/install-instructions) installed on your computer.
|
First you will need to clone the plugin sources by running the following command:
|
||||||
Once you've set this up, do the following:
|
|
||||||
```
|
```
|
||||||
git clone --recursive https://github.com/WarmUpTill/SceneSwitcher.git
|
git clone --recursive https://github.com/WarmUpTill/SceneSwitcher.git
|
||||||
cd SceneSwitcher
|
cd SceneSwitcher
|
||||||
|
```
|
||||||
|
|
||||||
|
You'll need [CMake](https://cmake.org/download/) and a working [OBS Studio development environment](https://obsproject.com/wiki/Building-OBS-Studio) installed on your computer.
|
||||||
|
The easiest way to set this up is to call the corresponding CI scripts, as they will automatically download all required dependencies and start build of the plugin:
|
||||||
|
|
||||||
|
| Platform | Command |
|
||||||
|
| ----------- | ----------- |
|
||||||
|
| Windows | `./.github/scripts/Build-Windows.ps1` |
|
||||||
|
| Linux | `./.github/scripts/build-linux.sh` |
|
||||||
|
| MacOS | `./.github/scripts/build-macos.zsh` |
|
||||||
|
|
||||||
|
Alternatively you can download the OBS dependencies from https://github.com/obsproject/obs-deps/releases and manually configure and start the build.
|
||||||
|
|
||||||
|
Start by creating a build directory:
|
||||||
|
```
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
```
|
```
|
||||||
|
Next configure the build.
|
||||||
### Windows
|
|
||||||
In cmake-gui, you'll have to set these CMake variables :
|
|
||||||
- **BUILD_OUT_OF_TREE** (bool) : true
|
|
||||||
|
|
||||||
- **LIBOBS_LIB** (filepath) : location of the obs.lib file
|
|
||||||
- **LIBOBS_INCLUDE_DIR** (path) : location of the libobs subfolder in the source
|
|
||||||
code of OBS Studio, located at [source_directory]/libobs/.
|
|
||||||
|
|
||||||
- **LIBOBS_FRONTEND_API_LIB** (filepath) : location of the obs-frontend-api.lib file
|
|
||||||
(usually in the same place as LIBOBS_LIB)
|
|
||||||
- **LIBOBS_FRONTEND_INCLUDE_DIR** (path) : location of the obs-frontend-api
|
|
||||||
subfolder in the source code of OBS Studio, located at [source_directory]/UI/obs-frontend-api.
|
|
||||||
|
|
||||||
- **CURL_LIBRARY** (filepath) : location of the libcurl.lib file
|
|
||||||
(part of the dependencies2019/win64/bin folder used to build OBS)
|
|
||||||
- **CURL_INCLUDE_DIR** (path) : location of the curl
|
|
||||||
subfolder in OBS dependencies folder: ".../dependencies2019/win64/include/"
|
|
||||||
|
|
||||||
|
|
||||||
Assuming that you set up Qt via QT installer:
|
|
||||||
- **Qt5Core_DIR** (path) : C:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5Core
|
|
||||||
- **Qt5Gui_DIR** (path): C:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5Gui
|
|
||||||
- **Qt5Widgets_DIR** (path) : C:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5Widgets
|
|
||||||
|
|
||||||
Just keep hitting configure until all the vars are filled out. Then hit generate.
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
Install dependencies `XTest`, `XScreensaver` and `OpenCV` - exact command may differ:
|
|
||||||
```
|
```
|
||||||
sudo apt-get install \
|
cmake -DCMAKE_PREFIX_PATH=<path-to-obs-deps> -Dlibobs_DIR=<path-to-libobs-dir> -Dobs-frontend-api_DIR=<path-to-frontend-api-dir> ..
|
||||||
libxtst-dev \
|
```
|
||||||
libxss-dev \
|
It might be necessary to provide additional variables depending on your build setup.
|
||||||
libopencv-dev
|
Finally, start the plugin build using your provided generator. (E.g. Ninja on Linux or a Visual Studio solution on Windows)
|
||||||
|
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
Contributions to the plugin are always welcome and if you need any assistance do not hesitate to reach out.
|
||||||
|
|
||||||
|
In general changes in the `src/legacy` folder should be avoided.
|
||||||
|
|
||||||
|
If you would like to expand upon the macro system by adding a new condition or action type have a loot at the examples in `src/macro-core`.
|
||||||
|
The key functions to add conditions or are the Register() functions.
|
||||||
|
|
||||||
|
```
|
||||||
|
MacroActionFactory::Register(
|
||||||
|
MacroActionExample::id, // Unique string identifying this action type
|
||||||
|
{
|
||||||
|
MacroActionExample::Create, // Function called to create the object performing the action
|
||||||
|
MacroActionExampleEdit::Create, // Function called to create the widget configure the action
|
||||||
|
"AdvSceneSwitcher.action.example" // User facing name of the action type
|
||||||
|
}
|
||||||
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
Most versions of Linux you can use cmake-gui or the command line.
|
If your intention is to add macro functionality which depends on external libraries, which is likely not to exist on all user setups, try to follow the examples under `src/macro-external`.
|
||||||
|
These are basically plugins themselves that get attempted to be loaded on startup of the advanced scene switcher.
|
||||||
**For the command line:**
|
|
||||||
```
|
|
||||||
# [...] are placeholders
|
|
||||||
cmake -DBUILD_OUT_OF_TREE=1 \
|
|
||||||
-DLIBOBS_INCLUDE_DIR=[...]/obs-studio/libobs/ \
|
|
||||||
-DLIBOBS_LIB=[...]/libobs.so \
|
|
||||||
-DLIBOBS_FRONTEND_INCLUDE_DIR=[...]/obs-studio/UI/obs-frontend-api/ \
|
|
||||||
-DLIBOBS_FRONTEND_API_LIB=[...]/libobs-frontend-api.so \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=/usr ..
|
|
||||||
make -j4
|
|
||||||
sudo make install
|
|
||||||
```
|
|
||||||
|
|
||||||
For cmake-gui you'll have to set the following variables:
|
|
||||||
- **BUILD_OUT_OF_TREE** (bool) : true
|
|
||||||
- **LIBOBS_INCLUDE_DIR** (path) : location of the libobs subfolder in the source
|
|
||||||
code of OBS Studio, located at [source_directory]/libobs/.
|
|
||||||
- **LIBOBS_LIB** (filepath) : location of the libobs.so file (usually CMake finds
|
|
||||||
this, but if not it'll usually be in /usr/lib/libobs.so)
|
|
||||||
- **LIBOBS_FRONTEND_API_LIB** (filepath) : location of the libobs-frontend-api.so
|
|
||||||
file (usually in the same place as LIBOBS_LIB)
|
|
||||||
- **LIBOBS_FRONTEND_INCLUDE_DIR** (path) : location of the obs-frontend-api
|
|
||||||
subfolder in the source code of OBS Studio, located at
|
|
||||||
[source_directory]/UI/obs-frontend-api.
|
|
||||||
|
|
||||||
Assuming that you installed Qt via your system package manager, it should be
|
|
||||||
found automatically. If not, then usually you'll find it in something like:
|
|
||||||
- **Qt5Core_DIR** (path) : /usr/lib64/cmake/Qt5Core
|
|
||||||
- **Qt5Gui_DIR** (path): /usr/lib64/cmake/Qt5Gui
|
|
||||||
- **Qt5Widgets_DIR** (path) : /usr/lib64/cmake/Qt5Widgets
|
|
||||||
|
|
||||||
Just keep hitting configure until all the vars are filled out. Then hit generate.
|
|
||||||
|
|
||||||
Then open a terminal in the build folder and type:
|
|
||||||
```
|
|
||||||
make -j4
|
|
||||||
sudo make install
|
|
||||||
```
|
|
||||||
NOTE: The Linux version of this plugin is dependent on libXScrnSaver, libcurl and libXtst.
|
|
||||||
|
|
||||||
### OS X
|
|
||||||
In cmake-gui, you'll have to set these CMake variables :
|
|
||||||
- **BUILD_OUT_OF_TREE** (bool) : true
|
|
||||||
- **LIBOBS_INCLUDE_DIR** (path) : location of the libobs subfolder in the source
|
|
||||||
code of OBS Studio, located at [source_directory]/libobs/.
|
|
||||||
- **LIBOBS_LIB** (filepath) : location of the libobs.0.dylib file (usually
|
|
||||||
in /Applications/OBS.app/Contents/Resources/bin/libobs.0.dylib)
|
|
||||||
- **LIBOBS_FRONTEND_API_LIB** (filepath) : location of the libobs-frontend-api.0.dylib
|
|
||||||
file (usually in usually in /Applications/OBS.app/Contents/Resources/bin/libobs-frontend-api.0.dylib)
|
|
||||||
- **LIBOBS_FRONTEND_INCLUDE_DIR** (path) : location of the obs-frontend-api subfolder
|
|
||||||
in the source code of OBS Studio, located at [source_directory]/UI/obs-frontend-api.
|
|
||||||
|
|
||||||
Assuming that you installed Qt via the regular Qt App way:
|
|
||||||
- **Qt5Core_DIR** (path) : Usually /Applications/Qt/5.10.1/clang_64/lib/cmake/Qt5Core
|
|
||||||
- **Qt5Widgets_DIR** (path) : Usually /Applications/Qt/5.10.1/clang_64/lib/cmake/Qt5Widgets
|
|
||||||
- **Qt5MacExtras_DIR** (path) : Usually /Applications/Qt/5.10.1/clang_64/lib/cmake/Qt5MacExtras
|
|
||||||
|
|
||||||
|
|
||||||
Just keep hitting configure until all the vars are filled out. Then hit generate.
|
|
||||||
|
|
||||||
Open xcode (or a terminal, depending on the build type you chose), build and copy
|
|
||||||
the advanced-scene-switcher.so file to 'Library/Application Support/obs-studio/plugins/advanced-scene-switcher/bin/'
|
|
||||||
And the 'data' folder to 'Library/Application Support/obs-studio/plugins/advanced-scene-switcher/'.
|
|
||||||
|
|
||||||
Note that you might have to adjust the library search paths using the install_name_tool if you want the plugin to run on machines other than your build machine:
|
|
||||||
```
|
|
||||||
install_name_tool -change @rpath/libobs-frontend-api.dylib @executable_path/../Frameworks/libobs-frontend-api.dylib UI/frontend-plugins/SceneSwitcher/advanced-scene-switcher.so
|
|
||||||
install_name_tool -change @rpath/libobs.0.dylib @executable_path/../Frameworks/libobs.0.dylib UI/frontend-plugins/SceneSwitcher/advanced-scene-switcher.so
|
|
||||||
install_name_tool -change /usr/local/opt/qt5/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets UI/frontend-plugins/SceneSwitcher/advanced-scene-switcher.so
|
|
||||||
install_name_tool -change /usr/local/opt/qt5/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui UI/frontend-plugins/SceneSwitcher/advanced-scene-switcher.so
|
|
||||||
install_name_tool -change /usr/local/opt/qt5/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore UI/frontend-plugins/SceneSwitcher/advanced-scene-switcher.so
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Original source https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/format.sh
|
|
||||||
|
|
||||||
set +x
|
|
||||||
set -o errexit
|
|
||||||
set -o pipefail
|
|
||||||
set -o nounset
|
|
||||||
|
|
||||||
SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
|
|
||||||
|
|
||||||
# Runs the Clang Formatter in parallel on the code base.
|
|
||||||
# Return codes:
|
|
||||||
# - 1 there are files to be formatted
|
|
||||||
# - 0 everything looks fine
|
|
||||||
|
|
||||||
# Get CPU count
|
|
||||||
OS=$(uname)
|
|
||||||
NPROC=1
|
|
||||||
if [[ $OS = "Linux" || $OS = "Darwin" ]] ; then
|
|
||||||
NPROC=$(getconf _NPROCESSORS_ONLN)
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Discover clang-format
|
|
||||||
if type clang-format-10 2> /dev/null ; then
|
|
||||||
CLANG_FORMAT=clang-format-10
|
|
||||||
elif type clang-format-8 2> /dev/null ; then
|
|
||||||
CLANG_FORMAT=clang-format-8
|
|
||||||
else
|
|
||||||
CLANG_FORMAT=clang-format
|
|
||||||
fi
|
|
||||||
|
|
||||||
find $SCRIPTPATH/.. -type d \( -path $SCRIPTPATH/../deps \
|
|
||||||
-o -path $SCRIPTPATH/../cmake \
|
|
||||||
-o -path $SCRIPTPATH/../build \) -prune -type f -o -name '*.h' -or -name '*.hpp' -or -name '*.m' -or -name '*.mm' -or -name '*.c' -or -name '*.cpp' \
|
|
||||||
| xargs -L100 -P${NPROC} ${CLANG_FORMAT} -i -style=file -fallback-style=none
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
brew "jack"
|
|
||||||
brew "speexdsp"
|
|
||||||
brew "cmake"
|
|
||||||
brew "freetype"
|
|
||||||
brew "fdk-aac"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,75 +0,0 @@
|
|||||||
Note that you will have to use OBS version 27 or newer!
|
|
||||||
|
|
||||||
--- Windows ---
|
|
||||||
Recommended: Run the provided installer. (You might have to click 'More info' and select 'Run anyway' if it is blocked by Windows)
|
|
||||||
|
|
||||||
Alternatively manually copy the 'obs-plugins' and 'data' folders in the respective OBS Studio installation directory.
|
|
||||||
It is usually located at 'C:\Program Files (x86)\obs-studio\'.
|
|
||||||
Remember to install the Visual C++ Redistributable for Visual Studio 2019, if you have not done so already. (See plugin overview page)
|
|
||||||
|
|
||||||
--- macOS ---
|
|
||||||
Run the provided installer. (You might have to right-click or control-click and select 'open' if it is blocked)
|
|
||||||
|
|
||||||
--- Linux ---
|
|
||||||
Note that the plugin has dependencies to:
|
|
||||||
* libXss
|
|
||||||
* libopencv-imgproc
|
|
||||||
* libopencv-objdetect
|
|
||||||
Optional:
|
|
||||||
* libXtst
|
|
||||||
* libcurl
|
|
||||||
|
|
||||||
If you are using snap you can install the following package for an OBS installation which comes bundled with the plugin:
|
|
||||||
sudo snap install obs-studio
|
|
||||||
|
|
||||||
The plugin is also available via the Flatpak package manager for users who installed OBS via Flatpak:
|
|
||||||
flatpak install com.obsproject.Studio.Plugin.SceneSwitcher
|
|
||||||
|
|
||||||
If you have installed OBS via other means, it is most likely necessary to install the plugin manually.
|
|
||||||
To do so copy the advanced-scene-switcher.so file and into the OBS Studio plugin folder.
|
|
||||||
The location of this folder can vary, so you might have to look around a bit.
|
|
||||||
|
|
||||||
Examples are ...
|
|
||||||
/usr/lib/obs-plugins/
|
|
||||||
/usr/lib/x86_64-linux-gnu/obs-plugins/
|
|
||||||
/usr/share/obs/obs-plugins/
|
|
||||||
~/.config/obs-studio/plugins/advanced-scene-switcher/bin/64bit/
|
|
||||||
~/.local/share/flatpak/app/com.obsproject.Studio/x86_64/stable/active/files/lib/obs-plugins/
|
|
||||||
/var/lib/flatpak/app/com.obsproject.Studio/x86_64/stable/active/files/lib/obs-plugins/
|
|
||||||
|
|
||||||
Unfortunately the expected location of the "locale" and "res" folder, which can be found in the data folder, can vary also.
|
|
||||||
The data folder usually should be copied to "~/.config/obs-studio/plugins/advanced-scene-switcher/" and reflect the following structure:
|
|
||||||
|
|
||||||
/home/user/.config/obs-studio/plugins/
|
|
||||||
└── advanced-scene-switcher
|
|
||||||
├── bin
|
|
||||||
│ └── 64bit
|
|
||||||
│ └── advanced-scene-switcher.so
|
|
||||||
└── data
|
|
||||||
├── locale
|
|
||||||
│ ├── de-DE.ini
|
|
||||||
│ ├── en-US.ini
|
|
||||||
│ ├── ru-RU.ini
|
|
||||||
│ └── zh-CN.ini
|
|
||||||
└── res
|
|
||||||
├── cascadeClassifiers
|
|
||||||
│ ├── haarcascade_eye_tree_eyeglasses.xml
|
|
||||||
│ ├── haarcascade_eye.xml
|
|
||||||
│ ├── haarcascade_frontalface_alt2.xml
|
|
||||||
│ ├── haarcascade_frontalface_alt_tree.xml
|
|
||||||
│ ├── haarcascade_frontalface_alt.xml
|
|
||||||
│ ├── haarcascade_frontalface_default.xml
|
|
||||||
│ ├── haarcascade_fullbody.xml
|
|
||||||
│ ├── haarcascade_lefteye_2splits.xml
|
|
||||||
│ ├── haarcascade_lowerbody.xml
|
|
||||||
│ ├── haarcascade_profileface.xml
|
|
||||||
│ ├── haarcascade_righteye_2splits.xml
|
|
||||||
│ └── haarcascade_upperbody.xml
|
|
||||||
└── time.svg
|
|
||||||
|
|
||||||
If this does not work you can try to copy the "locale" folder found inside the data folder to:
|
|
||||||
/usr/share/obs/obs-plugins/advanced-scene-switcher/locale
|
|
||||||
~/.local/share/flatpak/app/com.obsproject.Studio/x86_64/stable/active/files/share/obs/obs-plugins/advanced-scene-switcher/locale
|
|
||||||
/var/lib/flatpak/app/com.obsproject.Studio/x86_64/stable/active/files/share/obs/obs-plugins/advanced-scene-switcher/locale
|
|
||||||
|
|
||||||
In doubt, please check where other "en-US.ini" files are located on your system.
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
; Script generated by the Inno Setup Script Wizard.
|
|
||||||
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
|
|
||||||
|
|
||||||
#define MyAppName "Advanced Scene Switcher"
|
|
||||||
#define MyAppVersion "@GIT_SHA1@"
|
|
||||||
#define MyAppURL "https://github.com/WarmUpTill/SceneSwitcher"
|
|
||||||
|
|
||||||
[Setup]
|
|
||||||
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
|
|
||||||
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
|
||||||
AppId={{A4ADDF26-4426-4D2E-B26A-C7C878DA8FC9}
|
|
||||||
AppName={#MyAppName}
|
|
||||||
AppVersion={#MyAppVersion}
|
|
||||||
AppPublisherURL={#MyAppURL}
|
|
||||||
AppSupportURL={#MyAppURL}
|
|
||||||
AppUpdatesURL={#MyAppURL}
|
|
||||||
DefaultDirName={code:GetDefaultDirectory}
|
|
||||||
DefaultGroupName={#MyAppName}
|
|
||||||
AllowNoIcons=yes
|
|
||||||
; Uncomment the following line to run in non administrative install mode (install for current user only.)
|
|
||||||
;PrivilegesRequired=lowest
|
|
||||||
OutputBaseFilename=AdvancedSceneSwitcherSetup
|
|
||||||
Compression=lzma
|
|
||||||
SolidCompression=yes
|
|
||||||
WizardStyle=modern
|
|
||||||
ArchitecturesInstallIn64BitMode=x64
|
|
||||||
|
|
||||||
[Languages]
|
|
||||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
||||||
|
|
||||||
[Files]
|
|
||||||
Source: "@ISS_MSVC_REDIST_HELPER_DIR@\msvc-redist-helper-64.exe"; DestDir: "{app}"; DestName: "msvc-redist-helper.exe"; Flags: ignoreversion dontcopy; Check: Is64BitInstallMode
|
|
||||||
Source: "@ISS_MSVC_REDIST_HELPER_DIR@\msvc-redist-helper-32.exe"; DestDir: "{app}"; DestName: "msvc-redist-helper.exe"; Flags: ignoreversion dontcopy; Check: not Is64BitInstallMode
|
|
||||||
Source: "@ISS_PLUGIN_FILES_DIR@\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
|
||||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
|
||||||
|
|
||||||
[Icons]
|
|
||||||
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
|
|
||||||
|
|
||||||
[Code]
|
|
||||||
function GetDefaultDirectory(Value: String): String;
|
|
||||||
var
|
|
||||||
sInstallPath: String;
|
|
||||||
begin
|
|
||||||
sInstallPath := Value;
|
|
||||||
if (sInstallPath = '') then
|
|
||||||
RegQueryStringValue(HKLM64, 'SOFTWARE\OBS Studio', '', sInstallPath);
|
|
||||||
if (sInstallPath = '') then
|
|
||||||
RegQueryStringValue(HKCU64, 'SOFTWARE\OBS Studio', '', sInstallPath);
|
|
||||||
if (sInstallPath = '') then
|
|
||||||
sInstallPath := ExpandConstant('{commonpf}\obs-studio');
|
|
||||||
Result := sInstallPath
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure CurStepChanged(CurStep: TSetupStep);
|
|
||||||
var
|
|
||||||
ResultCode: Integer;
|
|
||||||
begin
|
|
||||||
if (CurStep=ssPostInstall) then
|
|
||||||
begin
|
|
||||||
ExtractTemporaryFile('msvc-redist-helper.exe');
|
|
||||||
Exec(ExpandConstant('{tmp}\msvc-redist-helper.exe'), '2019', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
792
CMakeLists.txt
792
CMakeLists.txt
@@ -1,45 +1,27 @@
|
|||||||
cmake_minimum_required(VERSION 3.14)
|
cmake_minimum_required(VERSION 3.16.3)
|
||||||
project(advanced-scene-switcher)
|
|
||||||
|
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
project(advanced-scene-switcher VERSION 1.0.0)
|
||||||
set(CMAKE_BUILD_TYPE RELWITHDEBINFO)
|
set(LIB_NAME "${PROJECT_NAME}-lib")
|
||||||
|
add_library(${PROJECT_NAME} MODULE)
|
||||||
|
add_library(${LIB_NAME} SHARED)
|
||||||
|
|
||||||
|
set(PLUGIN_AUTHOR "WarmUpTill")
|
||||||
|
set(MACOS_BUNDLEID "com.warmuptill.${PROJECT_NAME}")
|
||||||
|
set(LINUX_MAINTAINER_EMAIL "noone@nothing.com")
|
||||||
|
set(MACOS_PACKAGE_UUID "3F0D2A6A-2583-11ED-861D-0242AC120002")
|
||||||
|
set(MACOS_INSTALLER_UUID "B7F15A6E-2583-11ED-861D-0242AC120002")
|
||||||
|
set(WINDOWS_INSTALLER_UUID "A4ADDF26-4426-4D2E-B26A-C7C878DA8FC9")
|
||||||
|
|
||||||
|
message(STATUS "CMAKE_PROJECT_NAME is ${CMAKE_PROJECT_NAME}")
|
||||||
|
if(${CMAKE_PROJECT_NAME} STREQUAL "obs-studio")
|
||||||
|
if(NOT DEFINED BUILD_OUT_OF_TREE)
|
||||||
|
message(STATUS "${PROJECT_NAME} configured for in-tree build")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(BUILD_OUT_OF_TREE ON)
|
||||||
|
message(STATUS "${PROJECT_NAME} configured for out-of-tree build")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Compiler settings
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
|
||||||
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCC
|
|
||||||
OR CMAKE_COMPILER_IS_GNUCXX
|
|
||||||
OR CMAKE_COMPILER_IS_CLANG)
|
|
||||||
set(CMAKE_CXX_FLAGS
|
|
||||||
"-Wall -Wextra -Wvla -Wno-unused-function -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing"
|
|
||||||
)
|
|
||||||
set(CMAKE_C_FLAGS
|
|
||||||
"-Wall -Wextra -Wvla -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-braces -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing"
|
|
||||||
)
|
|
||||||
|
|
||||||
option(USE_LIBC++ "Use libc++ instead of libstdc++" ${APPLE})
|
|
||||||
if(USE_LIBC++)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
|
||||||
endif()
|
|
||||||
elseif(MSVC)
|
|
||||||
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
|
|
||||||
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Disable pointless constant condition warnings
|
|
||||||
set(CMAKE_CXX_FLAGS
|
|
||||||
"${CMAKE_CXX_FLAGS} /wd4127 /wd4201 /wd4456 /wd4457 /wd4458 /wd4459 /wd4595"
|
|
||||||
)
|
|
||||||
add_definitions(-DUNICODE -D_UNICODE -D_CRT_SECURE_NO_WARNINGS
|
|
||||||
-D_CRT_NONSTDC_NO_WARNINGS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Generate version info
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
|
||||||
include(GetGitRevisionDescription)
|
include(GetGitRevisionDescription)
|
||||||
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
||||||
@@ -47,79 +29,345 @@ git_describe(GIT_TAG)
|
|||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cpp.in"
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cpp.in"
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp" @ONLY)
|
"${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp" @ONLY)
|
||||||
|
|
||||||
# Windows installer
|
# --- Set target sources ---
|
||||||
if(WIN32)
|
|
||||||
get_filename_component(ISS_PLUGIN_FILES_DIR
|
# Module sources
|
||||||
"${CMAKE_BINARY_DIR}\\..\\package" ABSOLUTE)
|
target_sources(${PROJECT_NAME} PRIVATE src/advanced-scene-switcher-module.c)
|
||||||
file(TO_NATIVE_PATH "${ISS_PLUGIN_FILES_DIR}" ISS_PLUGIN_FILES_DIR)
|
|
||||||
get_filename_component(ISS_MSVC_REDIST_HELPER_DIR "${CMAKE_BINARY_DIR}\\.."
|
# Generic sources
|
||||||
ABSOLUTE)
|
target_sources(
|
||||||
file(TO_NATIVE_PATH "${ISS_MSVC_REDIST_HELPER_DIR}"
|
${LIB_NAME}
|
||||||
ISS_MSVC_REDIST_HELPER_DIR)
|
PRIVATE src/advanced-scene-switcher.cpp
|
||||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/CI/windows/setup.iss.in"
|
src/advanced-scene-switcher.hpp
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/CI/windows/setup.iss" @ONLY)
|
src/general.cpp
|
||||||
endif()
|
src/hotkey.cpp
|
||||||
|
src/hotkey.hpp
|
||||||
|
src/hotkey.hpp
|
||||||
|
src/platform-funcs.hpp
|
||||||
|
src/scene-group.cpp
|
||||||
|
src/scene-group.hpp
|
||||||
|
src/status-control.cpp
|
||||||
|
src/status-control.hpp
|
||||||
|
src/switcher-data-structs.cpp
|
||||||
|
src/switcher-data-structs.hpp
|
||||||
|
src/version.cpp
|
||||||
|
src/version.h)
|
||||||
|
|
||||||
|
# Legacy function sources
|
||||||
|
target_sources(
|
||||||
|
${LIB_NAME}
|
||||||
|
PRIVATE src/legacy/scene-trigger.cpp
|
||||||
|
src/legacy/scene-trigger.hpp
|
||||||
|
src/legacy/switch-audio.cpp
|
||||||
|
src/legacy/switch-audio.hpp
|
||||||
|
src/legacy/switch-executable.cpp
|
||||||
|
src/legacy/switch-executable.hpp
|
||||||
|
src/legacy/switch-file.cpp
|
||||||
|
src/legacy/switch-file.hpp
|
||||||
|
src/legacy/switch-generic.cpp
|
||||||
|
src/legacy/switch-generic.hpp
|
||||||
|
src/legacy/switch-idle.cpp
|
||||||
|
src/legacy/switch-idle.hpp
|
||||||
|
src/legacy/switch-media.cpp
|
||||||
|
src/legacy/switch-media.hpp
|
||||||
|
src/legacy/switch-network.cpp
|
||||||
|
src/legacy/switch-network.hpp
|
||||||
|
src/legacy/switch-pause.cpp
|
||||||
|
src/legacy/switch-pause.hpp
|
||||||
|
src/legacy/switch-priority.cpp
|
||||||
|
src/legacy/switch-random.cpp
|
||||||
|
src/legacy/switch-random.hpp
|
||||||
|
src/legacy/switch-screen-region.cpp
|
||||||
|
src/legacy/switch-screen-region.hpp
|
||||||
|
src/legacy/switch-sequence.cpp
|
||||||
|
src/legacy/switch-sequence.hpp
|
||||||
|
src/legacy/switch-time.cpp
|
||||||
|
src/legacy/switch-time.hpp
|
||||||
|
src/legacy/switch-transitions.cpp
|
||||||
|
src/legacy/switch-transitions.hpp
|
||||||
|
src/legacy/switch-video.cpp
|
||||||
|
src/legacy/switch-video.hpp
|
||||||
|
src/legacy/switch-window.cpp
|
||||||
|
src/legacy/switch-window.hpp)
|
||||||
|
|
||||||
|
# Maro sources
|
||||||
|
target_sources(
|
||||||
|
${LIB_NAME}
|
||||||
|
PRIVATE src/macro-core/macro-action-audio.cpp
|
||||||
|
src/macro-core/macro-action-audio.hpp
|
||||||
|
src/macro-core/macro-action-edit.cpp
|
||||||
|
src/macro-core/macro-action-edit.hpp
|
||||||
|
src/macro-core/macro-action-file.cpp
|
||||||
|
src/macro-core/macro-action-file.hpp
|
||||||
|
src/macro-core/macro-action-filter.cpp
|
||||||
|
src/macro-core/macro-action-filter.hpp
|
||||||
|
src/macro-core/macro-action-hotkey.cpp
|
||||||
|
src/macro-core/macro-action-hotkey.hpp
|
||||||
|
src/macro-core/macro-action-http.cpp
|
||||||
|
src/macro-core/macro-action-http.hpp
|
||||||
|
src/macro-core/macro-action-macro.cpp
|
||||||
|
src/macro-core/macro-action-macro.hpp
|
||||||
|
src/macro-core/macro-action-media.cpp
|
||||||
|
src/macro-core/macro-action-media.hpp
|
||||||
|
src/macro-core/macro-action-plugin-state.cpp
|
||||||
|
src/macro-core/macro-action-plugin-state.hpp
|
||||||
|
src/macro-core/macro-action-profile.cpp
|
||||||
|
src/macro-core/macro-action-profile.hpp
|
||||||
|
src/macro-core/macro-action-random.cpp
|
||||||
|
src/macro-core/macro-action-random.hpp
|
||||||
|
src/macro-core/macro-action-recording.cpp
|
||||||
|
src/macro-core/macro-action-recording.hpp
|
||||||
|
src/macro-core/macro-action-replay-buffer.cpp
|
||||||
|
src/macro-core/macro-action-replay-buffer.hpp
|
||||||
|
src/macro-core/macro-action-run.cpp
|
||||||
|
src/macro-core/macro-action-run.hpp
|
||||||
|
src/macro-core/macro-action-scene-collection.cpp
|
||||||
|
src/macro-core/macro-action-scene-collection.hpp
|
||||||
|
src/macro-core/macro-action-scene-order.cpp
|
||||||
|
src/macro-core/macro-action-scene-order.hpp
|
||||||
|
src/macro-core/macro-action-scene-switch.cpp
|
||||||
|
src/macro-core/macro-action-scene-switch.hpp
|
||||||
|
src/macro-core/macro-action-scene-transform.cpp
|
||||||
|
src/macro-core/macro-action-scene-transform.hpp
|
||||||
|
src/macro-core/macro-action-scene-visibility.cpp
|
||||||
|
src/macro-core/macro-action-scene-visibility.hpp
|
||||||
|
src/macro-core/macro-action-screenshot.cpp
|
||||||
|
src/macro-core/macro-action-screenshot.hpp
|
||||||
|
src/macro-core/macro-action-sequence.cpp
|
||||||
|
src/macro-core/macro-action-sequence.hpp
|
||||||
|
src/macro-core/macro-action-source.cpp
|
||||||
|
src/macro-core/macro-action-source.hpp
|
||||||
|
src/macro-core/macro-action-streaming.cpp
|
||||||
|
src/macro-core/macro-action-streaming.hpp
|
||||||
|
src/macro-core/macro-action-studio-mode.cpp
|
||||||
|
src/macro-core/macro-action-studio-mode.hpp
|
||||||
|
src/macro-core/macro-action-systray.cpp
|
||||||
|
src/macro-core/macro-action-systray.hpp
|
||||||
|
src/macro-core/macro-action-timer.cpp
|
||||||
|
src/macro-core/macro-action-timer.hpp
|
||||||
|
src/macro-core/macro-action-transition.cpp
|
||||||
|
src/macro-core/macro-action-transition.hpp
|
||||||
|
src/macro-core/macro-action-variable.cpp
|
||||||
|
src/macro-core/macro-action-variable.hpp
|
||||||
|
src/macro-core/macro-action-virtual-cam.cpp
|
||||||
|
src/macro-core/macro-action-virtual-cam.hpp
|
||||||
|
src/macro-core/macro-action-wait.cpp
|
||||||
|
src/macro-core/macro-action-wait.hpp
|
||||||
|
src/macro-core/macro-action-websocket.cpp
|
||||||
|
src/macro-core/macro-action-websocket.hpp
|
||||||
|
src/macro-core/macro-action.cpp
|
||||||
|
src/macro-core/macro-action.hpp
|
||||||
|
src/macro-core/macro-condition-audio.cpp
|
||||||
|
src/macro-core/macro-condition-audio.hpp
|
||||||
|
src/macro-core/macro-condition-cursor.cpp
|
||||||
|
src/macro-core/macro-condition-cursor.hpp
|
||||||
|
src/macro-core/macro-condition-date.cpp
|
||||||
|
src/macro-core/macro-condition-date.hpp
|
||||||
|
src/macro-core/macro-condition-edit.cpp
|
||||||
|
src/macro-core/macro-condition-edit.hpp
|
||||||
|
src/macro-core/macro-condition-file.cpp
|
||||||
|
src/macro-core/macro-condition-file.hpp
|
||||||
|
src/macro-core/macro-condition-filter.cpp
|
||||||
|
src/macro-core/macro-condition-filter.hpp
|
||||||
|
src/macro-core/macro-condition-hotkey.cpp
|
||||||
|
src/macro-core/macro-condition-hotkey.hpp
|
||||||
|
src/macro-core/macro-condition-idle.cpp
|
||||||
|
src/macro-core/macro-condition-idle.hpp
|
||||||
|
src/macro-core/macro-condition-macro.cpp
|
||||||
|
src/macro-core/macro-condition-macro.hpp
|
||||||
|
src/macro-core/macro-condition-media.cpp
|
||||||
|
src/macro-core/macro-condition-media.hpp
|
||||||
|
src/macro-core/macro-condition-obs-stats.cpp
|
||||||
|
src/macro-core/macro-condition-obs-stats.hpp
|
||||||
|
src/macro-core/macro-condition-plugin-state.cpp
|
||||||
|
src/macro-core/macro-condition-plugin-state.hpp
|
||||||
|
src/macro-core/macro-condition-process.cpp
|
||||||
|
src/macro-core/macro-condition-process.hpp
|
||||||
|
src/macro-core/macro-condition-profile.cpp
|
||||||
|
src/macro-core/macro-condition-profile.hpp
|
||||||
|
src/macro-core/macro-condition-recording.cpp
|
||||||
|
src/macro-core/macro-condition-recording.hpp
|
||||||
|
src/macro-core/macro-condition-replay-buffer.cpp
|
||||||
|
src/macro-core/macro-condition-replay-buffer.hpp
|
||||||
|
src/macro-core/macro-condition-scene-order.cpp
|
||||||
|
src/macro-core/macro-condition-scene-order.hpp
|
||||||
|
src/macro-core/macro-condition-scene-transform.cpp
|
||||||
|
src/macro-core/macro-condition-scene-transform.hpp
|
||||||
|
src/macro-core/macro-condition-scene-visibility.cpp
|
||||||
|
src/macro-core/macro-condition-scene-visibility.hpp
|
||||||
|
src/macro-core/macro-condition-scene.cpp
|
||||||
|
src/macro-core/macro-condition-scene.hpp
|
||||||
|
src/macro-core/macro-condition-source.cpp
|
||||||
|
src/macro-core/macro-condition-source.hpp
|
||||||
|
src/macro-core/macro-condition-streaming.cpp
|
||||||
|
src/macro-core/macro-condition-streaming.hpp
|
||||||
|
src/macro-core/macro-condition-studio-mode.cpp
|
||||||
|
src/macro-core/macro-condition-studio-mode.hpp
|
||||||
|
src/macro-core/macro-condition-timer.cpp
|
||||||
|
src/macro-core/macro-condition-timer.hpp
|
||||||
|
src/macro-core/macro-condition-transition.cpp
|
||||||
|
src/macro-core/macro-condition-transition.hpp
|
||||||
|
src/macro-core/macro-condition-variable.cpp
|
||||||
|
src/macro-core/macro-condition-variable.hpp
|
||||||
|
src/macro-core/macro-condition-virtual-cam.cpp
|
||||||
|
src/macro-core/macro-condition-virtual-cam.hpp
|
||||||
|
src/macro-core/macro-condition-websocket.cpp
|
||||||
|
src/macro-core/macro-condition-websocket.hpp
|
||||||
|
src/macro-core/macro-condition-window.cpp
|
||||||
|
src/macro-core/macro-condition-window.hpp
|
||||||
|
src/macro-core/macro-condition.cpp
|
||||||
|
src/macro-core/macro-condition.hpp
|
||||||
|
src/macro-core/macro-list-entry-widget.cpp
|
||||||
|
src/macro-core/macro-list-entry-widget.hpp
|
||||||
|
src/macro-core/macro-properties.cpp
|
||||||
|
src/macro-core/macro-properties.hpp
|
||||||
|
src/macro-core/macro-ref.cpp
|
||||||
|
src/macro-core/macro-ref.hpp
|
||||||
|
src/macro-core/macro-segment-list.cpp
|
||||||
|
src/macro-core/macro-segment-list.hpp
|
||||||
|
src/macro-core/macro-segment.cpp
|
||||||
|
src/macro-core/macro-segment.hpp
|
||||||
|
src/macro-core/macro-selection.cpp
|
||||||
|
src/macro-core/macro-selection.hpp
|
||||||
|
src/macro-core/macro-tab.cpp
|
||||||
|
src/macro-core/macro.cpp
|
||||||
|
src/macro-core/macro.hpp)
|
||||||
|
|
||||||
|
# Utility function sources
|
||||||
|
target_sources(
|
||||||
|
${LIB_NAME}
|
||||||
|
PRIVATE src/utils/connection-manager.cpp
|
||||||
|
src/utils/connection-manager.hpp
|
||||||
|
src/utils/curl-helper.cpp
|
||||||
|
src/utils/curl-helper.hpp
|
||||||
|
src/utils/duration-control.cpp
|
||||||
|
src/utils/duration-control.hpp
|
||||||
|
src/utils/item-selection-helpers.cpp
|
||||||
|
src/utils/item-selection-helpers.hpp
|
||||||
|
src/utils/file-selection.cpp
|
||||||
|
src/utils/file-selection.hpp
|
||||||
|
src/utils/macro-list.cpp
|
||||||
|
src/utils/macro-list.hpp
|
||||||
|
src/utils/name-dialog.cpp
|
||||||
|
src/utils/name-dialog.hpp
|
||||||
|
src/utils/regex-config.cpp
|
||||||
|
src/utils/regex-config.hpp
|
||||||
|
src/utils/resizing-text-edit.cpp
|
||||||
|
src/utils/resizing-text-edit.hpp
|
||||||
|
src/utils/scene-item-selection.cpp
|
||||||
|
src/utils/scene-item-selection.hpp
|
||||||
|
src/utils/scene-selection.cpp
|
||||||
|
src/utils/scene-selection.hpp
|
||||||
|
src/utils/screenshot-helper.cpp
|
||||||
|
src/utils/screenshot-helper.hpp
|
||||||
|
src/utils/section.cpp
|
||||||
|
src/utils/section.hpp
|
||||||
|
src/utils/transition-selection.cpp
|
||||||
|
src/utils/transition-selection.hpp
|
||||||
|
src/utils/utility.cpp
|
||||||
|
src/utils/utility.hpp
|
||||||
|
src/utils/variable.cpp
|
||||||
|
src/utils/variable.hpp
|
||||||
|
src/utils/volume-control.cpp
|
||||||
|
src/utils/volume-control.hpp
|
||||||
|
src/utils/websocket-helpers.cpp
|
||||||
|
src/utils/websocket-helpers.hpp)
|
||||||
|
|
||||||
|
# --- End of section ---
|
||||||
|
|
||||||
# Out of tree specific settings
|
|
||||||
if(BUILD_OUT_OF_TREE)
|
if(BUILD_OUT_OF_TREE)
|
||||||
set(CMAKE_PREFIX_PATH "${QTDIR}")
|
include(cmake/ObsPluginHelpers.cmake)
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
||||||
find_package(Qt5Core REQUIRED)
|
|
||||||
find_package(Qt5Widgets REQUIRED)
|
|
||||||
find_package(LibObs)
|
|
||||||
find_package(LibObs-frontend-api)
|
|
||||||
if(LibObs_FOUND)
|
|
||||||
set(LIBOBS_LIB ${LIBOBS_LIBRARIES})
|
|
||||||
set(LIBOBS_INCLUDE_DIR ${LIBOBS_INCLUDE_DIRS})
|
|
||||||
endif()
|
|
||||||
if(LibObs-frontend-api_FOUND)
|
|
||||||
set(LIBOBS_FRONTEND_API_LIB ${LIBOBS-FRONTEND-API_LIBRARIES})
|
|
||||||
set(LIBOBS_FRONTEND_INCLUDE_DIR ${LIBOBS-FRONTEND-API_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT LIBOBS_LIB)
|
|
||||||
message(FATAL_ERROR "obs library not found - please set LIBOBS_LIB")
|
|
||||||
endif()
|
|
||||||
if(NOT LIBOBS_FRONTEND_API_LIB)
|
|
||||||
message(
|
|
||||||
FATAL_ERROR
|
|
||||||
"libobs frontend-api library not found - please set LIBOBS_FRONTEND_API_LIB"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if(NOT LIBOBS_INCLUDE_DIR)
|
|
||||||
message(
|
|
||||||
FATAL_ERROR "obs.hpp header not found - please set LIBOBS_INCLUDE_DIR")
|
|
||||||
endif()
|
|
||||||
if(NOT LIBOBS_FRONTEND_INCLUDE_DIR)
|
|
||||||
message(
|
|
||||||
FATAL_ERROR
|
|
||||||
" obs-frontend-api.h not found - please set LIBOBS_FRONTEND_INCLUDE_DIR"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories("${LIBOBS_INCLUDE_DIR}" "${LIBOBS_FRONTEND_INCLUDE_DIR}"
|
|
||||||
${Qt5Core_INCLUDES} ${Qt5Widgets_INCLUDES})
|
|
||||||
|
|
||||||
find_package(CURL REQUIRED)
|
|
||||||
include_directories("${CURL_INCLUDE_DIRS}")
|
|
||||||
else()
|
|
||||||
find_package(Libcurl REQUIRED)
|
|
||||||
include_directories("${LIBCURL_INCLUDE_DIRS}")
|
|
||||||
add_definitions(-DVCAM_SUPPORTED)
|
|
||||||
add_definitions(-DREPLAYBUFFER_SUPPORTED)
|
|
||||||
endif()
|
endif()
|
||||||
|
include(cmake/AdvSSHelpers.cmake)
|
||||||
|
setup_obs_lib_dependency(${LIB_NAME})
|
||||||
|
setup_obs_lib_dependency(${PROJECT_NAME})
|
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME} PUBLIC ${LIB_NAME})
|
||||||
|
|
||||||
|
find_qt(COMPONENTS Widgets Core)
|
||||||
|
target_link_libraries(${LIB_NAME} PUBLIC Qt::Core Qt::Widgets)
|
||||||
|
|
||||||
|
# --- Platform-independent build settings ---
|
||||||
|
|
||||||
|
target_include_directories(
|
||||||
|
${LIB_NAME}
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/legacy"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/macro-core"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/src/utils"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/forms")
|
||||||
|
|
||||||
|
set_target_properties(
|
||||||
|
${LIB_NAME}
|
||||||
|
PROPERTIES AUTOMOC ON
|
||||||
|
AUTOUIC ON
|
||||||
|
AUTORCC ON
|
||||||
|
AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/forms")
|
||||||
|
|
||||||
|
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_17)
|
||||||
|
target_compile_features(${LIB_NAME} PUBLIC cxx_std_17)
|
||||||
|
|
||||||
|
add_definitions(-DASIO_STANDALONE)
|
||||||
|
target_include_directories(
|
||||||
|
${LIB_NAME}
|
||||||
|
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/deps/obs-websocket/lib")
|
||||||
|
|
||||||
|
# --- End of section ---
|
||||||
|
|
||||||
|
# --- Windows-specific build settings and tasks ---
|
||||||
|
if(OS_WINDOWS)
|
||||||
|
configure_file(cmake/bundle/windows/installer-Windows.iss.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/installer-Windows.generated.iss)
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
target_compile_options(${LIB_NAME} PUBLIC /MP /d2FH4- /wd4267 /wd4267)
|
||||||
|
endif()
|
||||||
|
target_sources(${LIB_NAME} PRIVATE src/win/advanced-scene-switcher-win.cpp)
|
||||||
|
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
|
||||||
|
set_property(TARGET ${LIB_NAME} PROPERTY WINDOWS_EXPORT_ALL_SYMBOLS true)
|
||||||
|
# --- End of section ---
|
||||||
|
|
||||||
|
# -- macOS specific build settings and tasks --
|
||||||
|
elseif(OS_MACOS)
|
||||||
|
configure_file(cmake/bundle/macos/installer-macos.pkgproj.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/installer-macos.generated.pkgproj)
|
||||||
|
|
||||||
|
set(MACOSX_PLUGIN_GUI_IDENTIFIER "${MACOS_BUNDLEID}")
|
||||||
|
set(MACOSX_PLUGIN_BUNDLE_VERSION "${PROJECT_VERSION}")
|
||||||
|
set(MACOSX_PLUGIN_SHORT_VERSION_STRING "1")
|
||||||
|
|
||||||
|
target_compile_options(
|
||||||
|
${LIB_NAME} PRIVATE -Wall -Wextra -Werror-implicit-function-declaration
|
||||||
|
-stdlib=libc++ -fvisibility=default)
|
||||||
|
|
||||||
|
set_target_properties(${LIB_NAME} PROPERTIES PREFIX "" SUFFIX ".so")
|
||||||
|
|
||||||
# Platform specific settings
|
|
||||||
if(APPLE)
|
|
||||||
set(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
|
|
||||||
find_library(COCOA Cocoa)
|
find_library(COCOA Cocoa)
|
||||||
if(BUILD_OUT_OF_TREE)
|
target_include_directories(${LIB_NAME} PRIVATE ${COCOA})
|
||||||
find_package(Qt5MacExtras REQUIRED)
|
target_sources(${LIB_NAME} PRIVATE src/osx/advanced-scene-switcher-osx.mm)
|
||||||
|
set_source_files_properties(advanced-scene-switcher-osx.mm
|
||||||
|
PROPERTIES COMPILE_FLAGS "-fobjc-arc")
|
||||||
|
set("${PROJECT_NAME}_PLATFORM_LIBS" ${COCOA})
|
||||||
|
find_package(CURL)
|
||||||
|
find_package(Libcurl)
|
||||||
|
if(CURL_FOUND)
|
||||||
|
target_include_directories(${LIB_NAME} PRIVATE "${CURL_INCLUDE_DIRS}")
|
||||||
|
elseif(Libcurl_FOUND)
|
||||||
|
target_include_directories(${LIB_NAME} PRIVATE "${LIBCURL_INCLUDE_DIRS}")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Couldn't find CURL or Libcurl - abort")
|
||||||
endif()
|
endif()
|
||||||
include_directories(${COCOA})
|
# --- End of section ---
|
||||||
endif()
|
|
||||||
|
# --- Linux-specific build settings and tasks ---
|
||||||
|
else()
|
||||||
|
set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "$ORIGIN")
|
||||||
|
target_compile_options(${LIB_NAME} PRIVATE -Wall -Wextra)
|
||||||
|
set_target_properties(${LIB_NAME} PROPERTIES PREFIX "")
|
||||||
|
set_target_properties(${LIB_NAME} PROPERTIES SOVERSION 1)
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE)
|
|
||||||
find_package(X11 REQUIRED COMPONENTS Xtst Xss)
|
find_package(X11 REQUIRED COMPONENTS Xtst Xss)
|
||||||
find_path(PROCPS_INCLUDE_DIR NAMES proc/procps.h)
|
find_path(PROCPS_INCLUDE_DIR NAMES proc/procps.h)
|
||||||
if(NOT PROCPS_INCLUDE_DIR)
|
if(NOT PROCPS_INCLUDE_DIR)
|
||||||
@@ -131,314 +379,48 @@ if(UNIX AND NOT APPLE)
|
|||||||
if(NOT PROCPS_LIBRARY)
|
if(NOT PROCPS_LIBRARY)
|
||||||
message(FATAL_ERROR "procps lib not found - please set PROCPS_LIBRARY")
|
message(FATAL_ERROR "procps lib not found - please set PROCPS_LIBRARY")
|
||||||
endif()
|
endif()
|
||||||
link_libraries(${X11_LIBRARIES} ${procps_LIBRARIES})
|
target_link_libraries(${LIB_NAME} PRIVATE ${X11_LIBRARIES}
|
||||||
include_directories("${X11_INCLUDE_DIR}" "${X11_Xtst_INCLUDE_PATH}"
|
${procps_LIBRARIES})
|
||||||
"${X11_Xss_INCLUDE_PATH}" "${PROCPS_INCLUDE_DIR}")
|
target_include_directories(
|
||||||
endif()
|
${LIB_NAME} PRIVATE "${X11_INCLUDE_DIR}" "${X11_Xtst_INCLUDE_PATH}"
|
||||||
|
"${X11_Xss_INCLUDE_PATH}" "${PROCPS_INCLUDE_DIR}")
|
||||||
if(WIN32)
|
target_sources(${LIB_NAME} PRIVATE src/linux/advanced-scene-switcher-nix.cpp)
|
||||||
set(advanced-scene-switcher_PLATFORM_SOURCES
|
set("${PROJECT_NAME}_PLATFORM_LIBS" Xss ${PROCPS_LIBRARY})
|
||||||
src/win/advanced-scene-switcher-win.cpp)
|
find_package(CURL)
|
||||||
elseif(APPLE)
|
find_package(Libcurl)
|
||||||
set(advanced-scene-switcher_PLATFORM_SOURCES
|
if(CURL_FOUND)
|
||||||
src/osx/advanced-scene-switcher-osx.mm)
|
target_include_directories(${LIB_NAME} PRIVATE "${CURL_INCLUDE_DIRS}")
|
||||||
set_source_files_properties(advanced-scene-switcher-osx.mm
|
elseif(Libcurl_FOUND)
|
||||||
PROPERTIES COMPILE_FLAGS "-fobjc-arc")
|
target_include_directories(${LIB_NAME} PRIVATE "${LIBCURL_INCLUDE_DIRS}")
|
||||||
set(advanced-scene-switcher_PLATFORM_LIBS ${COCOA})
|
|
||||||
else()
|
|
||||||
set(advanced-scene-switcher_PLATFORM_SOURCES
|
|
||||||
src/linux/advanced-scene-switcher-nix.cpp)
|
|
||||||
set(advanced-scene-switcher_PLATFORM_LIBS Xss ${PROCPS_LIBRARY})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# asio and websocketpp
|
|
||||||
add_definitions(-DASIO_STANDALONE)
|
|
||||||
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp")
|
|
||||||
if(WIN32)
|
|
||||||
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Setup QT tools
|
|
||||||
set(CMAKE_AUTOMOC ON)
|
|
||||||
set(CMAKE_AUTOUIC ON)
|
|
||||||
set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/forms")
|
|
||||||
set(advanced-scene-switcher_UI ${advanced-scene-switcher_UI}
|
|
||||||
forms/advanced-scene-switcher.ui)
|
|
||||||
qt5_wrap_ui(advanced-scene-switcher_UI_HEADERS ${advanced-scene-switcher_UI}
|
|
||||||
${advanced-scene-switcher_PLATFORM_UI})
|
|
||||||
|
|
||||||
# The plugin sources
|
|
||||||
set(advanced-scene-switcher_HEADERS
|
|
||||||
${advanced-scene-switcher_HEADERS}
|
|
||||||
src/headers/advanced-scene-switcher.hpp
|
|
||||||
src/headers/switcher-data-structs.hpp
|
|
||||||
src/headers/scene-group.hpp
|
|
||||||
src/headers/scene-trigger.hpp
|
|
||||||
src/headers/switch-audio.hpp
|
|
||||||
src/headers/switch-executable.hpp
|
|
||||||
src/headers/switch-file.hpp
|
|
||||||
src/headers/switch-idle.hpp
|
|
||||||
src/headers/switch-media.hpp
|
|
||||||
src/headers/switch-network.hpp
|
|
||||||
src/headers/switch-pause.hpp
|
|
||||||
src/headers/switch-random.hpp
|
|
||||||
src/headers/switch-screen-region.hpp
|
|
||||||
src/headers/switch-time.hpp
|
|
||||||
src/headers/switch-transitions.hpp
|
|
||||||
src/headers/switch-window.hpp
|
|
||||||
src/headers/switch-sequence.hpp
|
|
||||||
src/headers/switch-video.hpp
|
|
||||||
src/headers/switch-generic.hpp
|
|
||||||
src/headers/macro-action-edit.hpp
|
|
||||||
src/headers/macro-action-audio.hpp
|
|
||||||
src/headers/macro-action-file.hpp
|
|
||||||
src/headers/macro-action-filter.hpp
|
|
||||||
src/headers/macro-action-hotkey.hpp
|
|
||||||
src/headers/macro-action-macro.hpp
|
|
||||||
src/headers/macro-action-media.hpp
|
|
||||||
src/headers/macro-action-plugin-state.hpp
|
|
||||||
src/headers/macro-action-preview-scene.hpp
|
|
||||||
src/headers/macro-action-profile.hpp
|
|
||||||
src/headers/macro-action-random.hpp
|
|
||||||
src/headers/macro-action-recording.hpp
|
|
||||||
src/headers/macro-action-replay-buffer.hpp
|
|
||||||
src/headers/macro-action-run.hpp
|
|
||||||
src/headers/macro-action-scene-collection.hpp
|
|
||||||
src/headers/macro-action-scene-order.hpp
|
|
||||||
src/headers/macro-action-scene-swap.hpp
|
|
||||||
src/headers/macro-action-scene-switch.hpp
|
|
||||||
src/headers/macro-action-scene-transform.hpp
|
|
||||||
src/headers/macro-action-scene-visibility.hpp
|
|
||||||
src/headers/macro-action-screenshot.hpp
|
|
||||||
src/headers/macro-action-sequence.hpp
|
|
||||||
src/headers/macro-action-source.hpp
|
|
||||||
src/headers/macro-action-streaming.hpp
|
|
||||||
src/headers/macro-action-systray.hpp
|
|
||||||
src/headers/macro-action-timer.hpp
|
|
||||||
src/headers/macro-action-transition.hpp
|
|
||||||
src/headers/macro-action-virtual-cam.hpp
|
|
||||||
src/headers/macro-action-wait.hpp
|
|
||||||
src/headers/macro-condition-edit.hpp
|
|
||||||
src/headers/macro-condition-audio.hpp
|
|
||||||
src/headers/macro-condition-cursor.hpp
|
|
||||||
src/headers/macro-condition-date.hpp
|
|
||||||
src/headers/macro-condition-file.hpp
|
|
||||||
src/headers/macro-condition-filter.hpp
|
|
||||||
src/headers/macro-condition-hotkey.hpp
|
|
||||||
src/headers/macro-condition-idle.hpp
|
|
||||||
src/headers/macro-condition-macro.hpp
|
|
||||||
src/headers/macro-condition-media.hpp
|
|
||||||
src/headers/macro-condition-obs-stats.hpp
|
|
||||||
src/headers/macro-condition-plugin-state.hpp
|
|
||||||
src/headers/macro-condition-process.hpp
|
|
||||||
src/headers/macro-condition-recording.hpp
|
|
||||||
src/headers/macro-condition-replay-buffer.hpp
|
|
||||||
src/headers/macro-condition-scene-order.hpp
|
|
||||||
src/headers/macro-condition-scene-transform.hpp
|
|
||||||
src/headers/macro-condition-scene-visibility.hpp
|
|
||||||
src/headers/macro-condition-scene.hpp
|
|
||||||
src/headers/macro-condition-source.hpp
|
|
||||||
src/headers/macro-condition-streaming.hpp
|
|
||||||
src/headers/macro-condition-studio-mode.hpp
|
|
||||||
src/headers/macro-condition-timer.hpp
|
|
||||||
src/headers/macro-condition-transition.hpp
|
|
||||||
src/headers/macro-condition-virtual-cam.hpp
|
|
||||||
src/headers/macro-condition-window.hpp
|
|
||||||
src/headers/macro.hpp
|
|
||||||
src/headers/macro-list-entry-widget.hpp
|
|
||||||
src/headers/macro-properties.hpp
|
|
||||||
src/headers/macro-segment.hpp
|
|
||||||
src/headers/macro-segment-list.hpp
|
|
||||||
src/headers/macro-selection.hpp
|
|
||||||
src/headers/curl-helper.hpp
|
|
||||||
src/headers/hotkey.hpp
|
|
||||||
src/headers/scene-item-selection.hpp
|
|
||||||
src/headers/scene-selection.hpp
|
|
||||||
src/headers/screenshot-helper.hpp
|
|
||||||
src/headers/transition-selection.hpp
|
|
||||||
src/headers/name-dialog.hpp
|
|
||||||
src/headers/duration-control.hpp
|
|
||||||
src/headers/file-selection.hpp
|
|
||||||
src/headers/section.hpp
|
|
||||||
src/headers/status-control.hpp
|
|
||||||
src/headers/platform-funcs.hpp
|
|
||||||
src/headers/resizing-text-edit.hpp
|
|
||||||
src/headers/utility.hpp
|
|
||||||
src/headers/volume-control.hpp
|
|
||||||
src/headers/version.h)
|
|
||||||
|
|
||||||
set(advanced-scene-switcher_SOURCES
|
|
||||||
${advanced-scene-switcher_SOURCES}
|
|
||||||
src/advanced-scene-switcher.cpp
|
|
||||||
src/advanced-scene-switcher-module.c
|
|
||||||
src/switcher-data-structs.cpp
|
|
||||||
src/scene-group.cpp
|
|
||||||
src/scene-trigger.cpp
|
|
||||||
src/switch-transitions.cpp
|
|
||||||
src/switch-screen-region.cpp
|
|
||||||
src/switch-priority.cpp
|
|
||||||
src/switch-executable.cpp
|
|
||||||
src/switch-idle.cpp
|
|
||||||
src/switch-sequence.cpp
|
|
||||||
src/switch-file.cpp
|
|
||||||
src/switch-window.cpp
|
|
||||||
src/switch-media.cpp
|
|
||||||
src/switch-network.cpp
|
|
||||||
src/file-selection.cpp
|
|
||||||
src/hotkey.cpp
|
|
||||||
src/general.cpp
|
|
||||||
src/switch-pause.cpp
|
|
||||||
src/switch-random.cpp
|
|
||||||
src/switch-time.cpp
|
|
||||||
src/switch-audio.cpp
|
|
||||||
src/switch-video.cpp
|
|
||||||
src/switch-generic.cpp
|
|
||||||
src/macro-action-edit.cpp
|
|
||||||
src/macro-action-audio.cpp
|
|
||||||
src/macro-action-file.cpp
|
|
||||||
src/macro-action-filter.cpp
|
|
||||||
src/macro-action-hotkey.cpp
|
|
||||||
src/macro-action-macro.cpp
|
|
||||||
src/macro-action-media.cpp
|
|
||||||
src/macro-action-plugin-state.cpp
|
|
||||||
src/macro-action-preview-scene.cpp
|
|
||||||
src/macro-action-profile.cpp
|
|
||||||
src/macro-action-random.cpp
|
|
||||||
src/macro-action-recording.cpp
|
|
||||||
src/macro-action-replay-buffer.cpp
|
|
||||||
src/macro-action-run.cpp
|
|
||||||
src/macro-action-scene-collection.cpp
|
|
||||||
src/macro-action-scene-order.cpp
|
|
||||||
src/macro-action-scene-swap.cpp
|
|
||||||
src/macro-action-scene-switch.cpp
|
|
||||||
src/macro-action-scene-transform.cpp
|
|
||||||
src/macro-action-scene-visibility.cpp
|
|
||||||
src/macro-action-screenshot.cpp
|
|
||||||
src/macro-action-sequence.cpp
|
|
||||||
src/macro-action-source.cpp
|
|
||||||
src/macro-action-streaming.cpp
|
|
||||||
src/macro-action-systray.cpp
|
|
||||||
src/macro-action-timer.cpp
|
|
||||||
src/macro-action-transition.cpp
|
|
||||||
src/macro-action-virtual-cam.cpp
|
|
||||||
src/macro-action-wait.cpp
|
|
||||||
src/macro-condition-edit.cpp
|
|
||||||
src/macro-condition-audio.cpp
|
|
||||||
src/macro-condition-cursor.cpp
|
|
||||||
src/macro-condition-date.cpp
|
|
||||||
src/macro-condition-file.cpp
|
|
||||||
src/macro-condition-filter.cpp
|
|
||||||
src/macro-condition-hotkey.cpp
|
|
||||||
src/macro-condition-idle.cpp
|
|
||||||
src/macro-condition-macro.cpp
|
|
||||||
src/macro-condition-media.cpp
|
|
||||||
src/macro-condition-obs-stats.cpp
|
|
||||||
src/macro-condition-plugin-state.cpp
|
|
||||||
src/macro-condition-process.cpp
|
|
||||||
src/macro-condition-recording.cpp
|
|
||||||
src/macro-condition-replay-buffer.cpp
|
|
||||||
src/macro-condition-scene-order.cpp
|
|
||||||
src/macro-condition-scene-transform.cpp
|
|
||||||
src/macro-condition-scene-visibility.cpp
|
|
||||||
src/macro-condition-scene.cpp
|
|
||||||
src/macro-condition-source.cpp
|
|
||||||
src/macro-condition-streaming.cpp
|
|
||||||
src/macro-condition-studio-mode.cpp
|
|
||||||
src/macro-condition-timer.cpp
|
|
||||||
src/macro-condition-transition.cpp
|
|
||||||
src/macro-condition-virtual-cam.cpp
|
|
||||||
src/macro-condition-window.cpp
|
|
||||||
src/macro.cpp
|
|
||||||
src/macro-list-entry-widget.cpp
|
|
||||||
src/macro-properties.cpp
|
|
||||||
src/macro-segment.cpp
|
|
||||||
src/macro-segment-list.cpp
|
|
||||||
src/macro-selection.cpp
|
|
||||||
src/macro-tab.cpp
|
|
||||||
src/curl-helper.cpp
|
|
||||||
src/scene-item-selection.cpp
|
|
||||||
src/scene-selection.cpp
|
|
||||||
src/screenshot-helper.cpp
|
|
||||||
src/transition-selection.cpp
|
|
||||||
src/name-dialog.cpp
|
|
||||||
src/resizing-text-edit.cpp
|
|
||||||
src/duration-control.cpp
|
|
||||||
src/status-control.cpp
|
|
||||||
src/section.cpp
|
|
||||||
src/utility.cpp
|
|
||||||
src/volume-control.cpp
|
|
||||||
src/version.cpp)
|
|
||||||
|
|
||||||
# Backwards compatability checks with older OBS versions
|
|
||||||
if(DEFINED LibObs_VERSION_MAJOR)
|
|
||||||
if(LibObs_VERSION_MAJOR GREATER_EQUAL 27)
|
|
||||||
add_definitions(-DVCAM_SUPPORTED)
|
|
||||||
else()
|
else()
|
||||||
message(
|
message(FATAL_ERROR "Couldn't find CURL or Libcurl - abort")
|
||||||
WARNING
|
|
||||||
"OBS version ${LibObs_VERSION_MAJOR} found - disabling virtual camera functionality"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if(LibObs_VERSION_MAJOR GREATER_EQUAL 26)
|
|
||||||
add_definitions(-DREPLAYBUFFER_SUPPORTED)
|
|
||||||
else()
|
|
||||||
message(
|
|
||||||
WARNING
|
|
||||||
"OBS version ${LibObs_VERSION_MAJOR} found - disabling replay buffer and screenshot functionality"
|
|
||||||
)
|
|
||||||
list(REMOVE_ITEM advanced-scene-switcher_SOURCES
|
|
||||||
src/macro-action-screenshot.cpp)
|
|
||||||
list(REMOVE_ITEM advanced-scene-switcher_HEADERS
|
|
||||||
src/headers/macro-action-screenshot.hpp)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
# --- End of section ---
|
||||||
|
|
||||||
add_library(
|
target_link_libraries(${LIB_NAME} PUBLIC ${${PROJECT_NAME}_PLATFORM_LIBS})
|
||||||
advanced-scene-switcher SHARED
|
|
||||||
${advanced-scene-switcher_HEADERS}
|
|
||||||
${advanced-scene-switcher_SOURCES}
|
|
||||||
${advanced-scene-switcher_UI_HEADERS}
|
|
||||||
${advanced-scene-switcher_PLATFORM_SOURCES}
|
|
||||||
${advanced-scene-switcher_PLATFORM_HEADERS})
|
|
||||||
|
|
||||||
# Out of tree build
|
if(DEB_INSTALL)
|
||||||
if(BUILD_OUT_OF_TREE)
|
|
||||||
target_link_libraries(
|
|
||||||
advanced-scene-switcher ${advanced-scene-switcher_PLATFORM_LIBS}
|
|
||||||
${LIBOBS_LIB} ${LIBOBS_FRONTEND_API_LIB} Qt5::Core Qt5::Widgets)
|
|
||||||
|
|
||||||
# Additional commands to install the module in the correct place. Find all the
|
|
||||||
# translation files so we can copy them to the correct place later on.
|
|
||||||
file(GLOB ASS_TRANSLATION_FILES "data/locale/*.ini")
|
file(GLOB ASS_TRANSLATION_FILES "data/locale/*.ini")
|
||||||
|
if(NOT LIB_OUT_DIR)
|
||||||
# OSX
|
set(LIB_OUT_DIR "/lib/obs-plugins")
|
||||||
if(APPLE)
|
|
||||||
set_target_properties(advanced-scene-switcher PROPERTIES PREFIX "")
|
|
||||||
endif()
|
endif()
|
||||||
|
if(NOT DATA_OUT_DIR)
|
||||||
# Linux
|
set(DATA_OUT_DIR "/share/obs/obs-plugins/${PROJECT_NAME}")
|
||||||
if(UNIX AND NOT APPLE)
|
|
||||||
if(NOT LIB_OUT_DIR)
|
|
||||||
set(LIB_OUT_DIR "/lib/obs-plugins")
|
|
||||||
endif()
|
|
||||||
if(NOT DATA_OUT_DIR)
|
|
||||||
set(DATA_OUT_DIR "/share/obs/obs-plugins/advanced-scene-switcher")
|
|
||||||
endif()
|
|
||||||
set_target_properties(advanced-scene-switcher PROPERTIES PREFIX "")
|
|
||||||
install(TARGETS advanced-scene-switcher
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_OUT_DIR})
|
|
||||||
install(DIRECTORY data/locale
|
|
||||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${DATA_OUT_DIR})
|
|
||||||
install(DIRECTORY data/res
|
|
||||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/${DATA_OUT_DIR})
|
|
||||||
endif()
|
endif()
|
||||||
|
install(TARGETS ${PROJECT_NAME}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_OUT_DIR})
|
||||||
|
install(TARGETS ${LIB_NAME}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_OUT_DIR})
|
||||||
|
install(DIRECTORY data/locale
|
||||||
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/${DATA_OUT_DIR})
|
||||||
|
install(DIRECTORY data/res
|
||||||
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/${DATA_OUT_DIR})
|
||||||
else()
|
else()
|
||||||
# In tree build
|
setup_plugin_target(${PROJECT_NAME})
|
||||||
target_link_libraries(
|
install_advss_lib(${LIB_NAME})
|
||||||
advanced-scene-switcher ${advanced-scene-switcher_PLATFORM_LIBS}
|
|
||||||
obs-frontend-api Qt5::Widgets libobs)
|
|
||||||
install_obs_plugin_with_data(advanced-scene-switcher data)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(src/external-macro-modules)
|
# --- End of section ---
|
||||||
|
|
||||||
|
add_subdirectory(src/macro-external)
|
||||||
|
|||||||
26
README.md
26
README.md
@@ -1,5 +1,5 @@
|
|||||||
# SceneSwitcher
|
# SceneSwitcher
|
||||||
An automated scene switcher for OBS Studio.
|
An automation plugin for OBS Studio.
|
||||||
|
|
||||||
More information can be found on https://obsproject.com/forum/resources/automatic-scene-switching.395/.
|
More information can be found on https://obsproject.com/forum/resources/automatic-scene-switching.395/.
|
||||||
|
|
||||||
@@ -9,23 +9,29 @@ Binaries for Windows, MacOS, and Linux are available in the [Releases](https://g
|
|||||||
|
|
||||||
## Installing the plugin
|
## Installing the plugin
|
||||||
|
|
||||||
For the Windows and MacOS platforms, it is recommended to run the provided installers.
|
For the **Windows** and **MacOS** platforms, it is recommended to run the provided installers.
|
||||||
|
|
||||||
For Linux the Snap package manager offers an OBS Studio installation which is bundled with the plugin:
|
For **Linux** the **Snap** package manager offers an OBS Studio installation which is bundled with the plugin:
|
||||||
```
|
```
|
||||||
sudo snap install obs-studio
|
sudo snap install obs-studio
|
||||||
```
|
```
|
||||||
The plugin is also available via the Flatpak package manager for users who installed OBS via Flatpak:
|
The plugin is also available via the **Flatpak** package manager for users who installed OBS via Flatpak:
|
||||||
```
|
```
|
||||||
flatpak install com.obsproject.Studio.Plugin.SceneSwitcher
|
flatpak install com.obsproject.Studio.Plugin.SceneSwitcher
|
||||||
```
|
```
|
||||||
|
|
||||||
If that is not an option you will have to ...
|
Also note that the Linux version of this plugin has the following dependencies to `XTest`, `XScreensaver` and optionally `OpenCV`.
|
||||||
1. Copy the library to the plugins folder of you obs installation.
|
If `apt` is supported on your system they can be installed using:
|
||||||
2. Copy the contents of the data directory to its respective folders of your obs installation.
|
```
|
||||||
|
sudo apt-get install \
|
||||||
|
libxtst-dev \
|
||||||
|
libxss-dev \
|
||||||
|
libprocps-dev \
|
||||||
|
libopencv-dev
|
||||||
|
```
|
||||||
|
|
||||||
Unfortunately the exact location of these folders may vary from system to system.
|
## Contributing
|
||||||
|
|
||||||
## Compiling the plugin
|
- If you wish to contribute code to the project, have a look at this [section](BUILDING.md) describing how to compile the plugin.
|
||||||
|
- If you wish to contribute translations, feel free to submit pull requests for the corresponding files under `data/locale`.
|
||||||
|
|
||||||
See the [build instructions](BUILDING.md).
|
|
||||||
|
|||||||
83
buildspec.json
Normal file
83
buildspec.json
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"obs-studio": {
|
||||||
|
"version": "28.0.1",
|
||||||
|
"repository": "https://github.com/obsproject/obs-studio.git",
|
||||||
|
"branch": "master",
|
||||||
|
"hash": "e8dc70d0eef4503378d6ac300e680215eb5c9379"
|
||||||
|
},
|
||||||
|
"prebuilt": {
|
||||||
|
"version": "2022-08-02",
|
||||||
|
"baseUrl": "https://github.com/obsproject/obs-deps/releases/download",
|
||||||
|
"label": "Pre-built obs-deps",
|
||||||
|
"hashes": {
|
||||||
|
"macos-x86_64": "7637e52305e6fc53014b5aabd583f1a4490b1d97450420e977cae9a336a29525",
|
||||||
|
"macos-arm64": "755e0fa69b17a3ae444e1befa9d91d77e3cafe628fbd1c6333686091826595cd",
|
||||||
|
"macos-universal": "de057e73e6fe0825664c258ca2dd6798c41ae580bf4d896e1647676a4941934a",
|
||||||
|
"windows-x64": "2192d8ce780c4281b807cd457994963669e5202659ecd92f19b54c3e7d0c1915",
|
||||||
|
"windows-x86": "9f8582ab5891b000869d6484ea591add9fbac9f1c91b56c7b85fdfd56a261c1b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qt5": {
|
||||||
|
"version": "2022-08-02",
|
||||||
|
"baseUrl": "https://github.com/obsproject/obs-deps/releases/download",
|
||||||
|
"label": "Pre-built Qt5",
|
||||||
|
"hashes": {
|
||||||
|
"macos-x86_64": "3d0381a52b0e4d49967936c4357f79ac711f43564329304a6db5c90edadd2697",
|
||||||
|
"macos-arm64": "f4b32548c0530f121956bf0a9a70c36ecbbfca81073d39c396a1759baf2a05c3",
|
||||||
|
"macos-universal": "9a6cf3b9a6c9efee6ba10df649202e8075e99f3c54ae88dc9a36dbc9d7471c1e",
|
||||||
|
"windows-x64": "6488a33a474f750d5a4a268a5e20c78bb40799d99136a1b7ce3365a843cb2fd7",
|
||||||
|
"windows-x86": "a916e09b0a874036801deab2c8a7ec14fdf5d268aa5511eac5bf40727e0c4e33"
|
||||||
|
},
|
||||||
|
"pdb-hashes": {
|
||||||
|
"windows-x64": "e0e5070143fcad9311a68ce5685d8ba8f34f581ed6942b7a92d360f94ca1ba11",
|
||||||
|
"windows-x86": "36642d1052aa461964f46c17610477b0d9b9defbe2d745ccaacb85f805c1bec2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qt6": {
|
||||||
|
"version": "2022-08-02",
|
||||||
|
"baseUrl": "https://github.com/obsproject/obs-deps/releases/download",
|
||||||
|
"label": "Pre-built Qt6",
|
||||||
|
"hashes": {
|
||||||
|
"macos-x86_64": "a83f72a11023b03b6cb2dc365f0a66ad9df31163bbb4fe2df32d601856a9fad3",
|
||||||
|
"macos-arm64": "2f30af90c049670a5660656adbb440668aa1b0567f75a5f29e1def9108928403",
|
||||||
|
"macos-universal": "252e6684f43ab9c6f262c73af739e2296ce391b998da2c4ee04c254aaa07db18",
|
||||||
|
"windows-x64": "e5509b54196a3f935250cc4b9c54160c8e588fd0f92bc078a2a64f9d9e2e4e93",
|
||||||
|
"windows-x86": "24fc03bef153a0e027c1479e42eb08097a4ea1d70a4710825be0783d0626cb0d"
|
||||||
|
},
|
||||||
|
"pdb-hashes": {
|
||||||
|
"windows-x64": "60e5b1d2bc4d7c431bc05f14e3b1e85e088788c372fa85f58717cd6c49555a46",
|
||||||
|
"windows-x86": "f34d1a89fc85d92913bd6c7f75ec5c28471d74db708c98161100bc8b75f8fc63"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"platformConfig": {
|
||||||
|
"macos-x86_64": {
|
||||||
|
"qtVersion": 6,
|
||||||
|
"deploymentTarget": "10.15"
|
||||||
|
},
|
||||||
|
"macos-arm64": {
|
||||||
|
"qtVersion": 6,
|
||||||
|
"deploymentTarget": "11.0"
|
||||||
|
},
|
||||||
|
"macos-universal": {
|
||||||
|
"qtVersion": 6,
|
||||||
|
"deploymentTarget": "10.15"
|
||||||
|
},
|
||||||
|
"windows-x64": {
|
||||||
|
"qtVersion": 6,
|
||||||
|
"visualStudio": "Visual Studio 17 2022",
|
||||||
|
"platformSDK": "10.0.20348.0"
|
||||||
|
},
|
||||||
|
"windows-x86": {
|
||||||
|
"qtVersion": 6,
|
||||||
|
"visualStudio": "Visual Studio 17 2022",
|
||||||
|
"platformSDK": "10.0.20348.0"
|
||||||
|
},
|
||||||
|
"linux-x86_64": {
|
||||||
|
"qtVersion": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "advanced-scene-switcher",
|
||||||
|
"version": "1.0.0"
|
||||||
|
}
|
||||||
312
cmake/AdvSSHelpers.cmake
Normal file
312
cmake/AdvSSHelpers.cmake
Normal file
@@ -0,0 +1,312 @@
|
|||||||
|
# --- Helper functions ---#
|
||||||
|
|
||||||
|
# Subfolder for advanced scene switcher plugins
|
||||||
|
set(_PLUGIN_FOLDER "adv-ss-plugins")
|
||||||
|
|
||||||
|
# --- MACOS section ---
|
||||||
|
if(OS_MACOS)
|
||||||
|
set(ADVSS_BUNDLE_DIR "${CMAKE_INSTALL_PREFIX}/advanced-scene-switcher.plugin")
|
||||||
|
set(ADVSS_BUNDLE_MODULE_DIR "${ADVSS_BUNDLE_DIR}/Contents/MacOS")
|
||||||
|
set(ADVSS_BUNDLE_PLUGIN_DIR ${ADVSS_BUNDLE_MODULE_DIR}/${_PLUGIN_FOLDER})
|
||||||
|
|
||||||
|
function(resign_advss target)
|
||||||
|
set(_COMMAND "codesign --force --deep --sign - ${ADVSS_BUNDLE_DIR}")
|
||||||
|
install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_lib_helper target where)
|
||||||
|
install(
|
||||||
|
TARGETS ${target}
|
||||||
|
RUNTIME DESTINATION "${where}" COMPONENT advss_plugins
|
||||||
|
LIBRARY DESTINATION "${where}" COMPONENT advss_plugins
|
||||||
|
FRAMEWORK DESTINATION "${where}" COMPONENT advss_plugins)
|
||||||
|
resign_advss(${target})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_lib target)
|
||||||
|
install_advss_lib_helper(${target} "${ADVSS_BUNDLE_MODULE_DIR}")
|
||||||
|
set(_COMMAND
|
||||||
|
"${CMAKE_INSTALL_NAME_TOOL} \\
|
||||||
|
-change @rpath/advanced-scene-switcher-lib.so @loader_path/advanced-scene-switcher-lib.so \\
|
||||||
|
\\\"${ADVSS_BUNDLE_MODULE_DIR}/advanced-scene-switcher\\\"")
|
||||||
|
install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")"
|
||||||
|
COMPONENT obs_plugins)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin target)
|
||||||
|
install_advss_lib_helper(${target} "${ADVSS_BUNDLE_PLUGIN_DIR}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin_dependency_target target dep)
|
||||||
|
install(
|
||||||
|
IMPORTED_RUNTIME_ARTIFACTS
|
||||||
|
${dep}
|
||||||
|
RUNTIME
|
||||||
|
DESTINATION
|
||||||
|
"${ADVSS_BUNDLE_PLUGIN_DIR}"
|
||||||
|
COMPONENT
|
||||||
|
${dep}_Runtime
|
||||||
|
LIBRARY
|
||||||
|
DESTINATION
|
||||||
|
"${ADVSS_BUNDLE_PLUGIN_DIR}"
|
||||||
|
COMPONENT
|
||||||
|
${dep}_Runtime
|
||||||
|
NAMELINK_COMPONENT
|
||||||
|
${dep}_Development)
|
||||||
|
resign_advss(${target})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin_dependency_file ${target} dep)
|
||||||
|
target_sources(advanced-scene-switcher PRIVATE ${dep})
|
||||||
|
set_source_files_properties(${dep} PROPERTIES MACOSX_PACKAGE_LOCATION
|
||||||
|
${ADVSS_BUNDLE_PLUGIN_DIR})
|
||||||
|
resign_advss(${target})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# --- End of section ---
|
||||||
|
else()
|
||||||
|
# --- Windows / Linux section ---
|
||||||
|
function(plugin_install_helper what where where_deb)
|
||||||
|
if(DEB_INSTALL)
|
||||||
|
if(NOT LIB_OUT_DIR)
|
||||||
|
set(LIB_OUT_DIR "/lib/obs-plugins")
|
||||||
|
endif()
|
||||||
|
install(
|
||||||
|
TARGETS ${what}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_OUT_DIR}/${where_deb})
|
||||||
|
else()
|
||||||
|
install(
|
||||||
|
TARGETS ${what}
|
||||||
|
RUNTIME DESTINATION "${where}" COMPONENT ${what}_Runtime
|
||||||
|
LIBRARY DESTINATION "${where}"
|
||||||
|
COMPONENT ${what}_Runtime
|
||||||
|
NAMELINK_COMPONENT ${what}_Development)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_FILE:${what}>
|
||||||
|
DESTINATION $<CONFIG>/${where}
|
||||||
|
COMPONENT ${what}_rundir
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
endif()
|
||||||
|
if(OS_WINDOWS)
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_PDB_FILE:${what}>
|
||||||
|
CONFIGURATIONS "RelWithDebInfo" "Debug"
|
||||||
|
DESTINATION ${where}
|
||||||
|
COMPONENT ${what}_Runtime
|
||||||
|
OPTIONAL)
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_PDB_FILE:${what}>
|
||||||
|
CONFIGURATIONS "RelWithDebInfo" "Debug"
|
||||||
|
DESTINATION $<CONFIG>/${where}
|
||||||
|
COMPONENT ${what}_rundir
|
||||||
|
OPTIONAL EXCLUDE_FROM_ALL)
|
||||||
|
endif()
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${what}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
"${CMAKE_COMMAND}" -DCMAKE_INSTALL_PREFIX=${OBS_OUTPUT_DIR}
|
||||||
|
-DCMAKE_INSTALL_COMPONENT=${what}_rundir
|
||||||
|
-DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/cmake_install.cmake
|
||||||
|
COMMENT "Installing ${what} to plugin rundir ${OBS_OUTPUT_DIR}/${where}\n"
|
||||||
|
VERBATIM)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_lib target)
|
||||||
|
plugin_install_helper("${target}" "${OBS_PLUGIN_DESTINATION}" "")
|
||||||
|
if(OS_POSIX)
|
||||||
|
set_target_properties(${target} PROPERTIES INSTALL_RPATH "$ORIGIN")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin target)
|
||||||
|
plugin_install_helper(
|
||||||
|
"${target}" "${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
"${_PLUGIN_FOLDER}")
|
||||||
|
if(OS_POSIX)
|
||||||
|
set_target_properties(${target} PROPERTIES INSTALL_RPATH
|
||||||
|
"$ORIGIN:$ORIGIN/..")
|
||||||
|
endif()
|
||||||
|
message(STATUS "ADVSS: ENABLED PLUGIN ${target}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin_dependency_target target dep)
|
||||||
|
install(
|
||||||
|
IMPORTED_RUNTIME_ARTIFACTS
|
||||||
|
${dep}
|
||||||
|
RUNTIME
|
||||||
|
DESTINATION
|
||||||
|
"${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT
|
||||||
|
${dep}_Runtime
|
||||||
|
LIBRARY
|
||||||
|
DESTINATION
|
||||||
|
"${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT
|
||||||
|
${dep}_Runtime
|
||||||
|
NAMELINK_COMPONENT
|
||||||
|
${dep}_Development)
|
||||||
|
|
||||||
|
install(
|
||||||
|
IMPORTED_RUNTIME_ARTIFACTS
|
||||||
|
${dep}
|
||||||
|
RUNTIME
|
||||||
|
DESTINATION
|
||||||
|
"${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT
|
||||||
|
obs_${dep}
|
||||||
|
EXCLUDE_FROM_ALL
|
||||||
|
LIBRARY
|
||||||
|
DESTINATION
|
||||||
|
"${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT
|
||||||
|
obs_${dep}
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${target}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
"${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
|
||||||
|
${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_${dep} >
|
||||||
|
"$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
|
||||||
|
COMMENT "Installing ${dep} to OBS rundir\n"
|
||||||
|
VERBATIM)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin_dependency_file target dep)
|
||||||
|
get_filename_component(_FILENAME ${dep} NAME)
|
||||||
|
string(REGEX REPLACE "\\.[^.]*$" "" _FILENAMENOEXT ${_FILENAME})
|
||||||
|
set(_DEP_NAME "${target}-${_FILENAMENOEXT}")
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES "${dep}"
|
||||||
|
DESTINATION "${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT ${_DEP_NAME}_Runtime
|
||||||
|
DESTINATION "${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT ${_DEP_NAME}_Runtime
|
||||||
|
NAMELINK_COMPONENT ${_DEP_NAME}_Development)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES "${dep}"
|
||||||
|
DESTINATION "${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT obs_${_DEP_NAME}
|
||||||
|
EXCLUDE_FROM_ALL
|
||||||
|
DESTINATION "${OBS_PLUGIN_DESTINATION}/${_PLUGIN_FOLDER}"
|
||||||
|
COMPONENT obs_${_DEP_NAME}
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${target}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
"${CMAKE_COMMAND}" --install .. --config $<CONFIG> --prefix
|
||||||
|
${OBS_OUTPUT_DIR}/$<CONFIG> --component obs_${_DEP_NAME} >
|
||||||
|
"$<IF:$<PLATFORM_ID:Windows>,nul,/dev/null>"
|
||||||
|
COMMENT "Installing ${_DEP_NAME} to OBS rundir\n"
|
||||||
|
VERBATIM)
|
||||||
|
endfunction()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# --- End of section ---
|
||||||
|
function(setup_obs_lib_dependency target)
|
||||||
|
if(BUILD_OUT_OF_TREE)
|
||||||
|
find_package(libobs)
|
||||||
|
if(libobs_FOUND)
|
||||||
|
target_link_libraries(${target} PUBLIC OBS::libobs)
|
||||||
|
else()
|
||||||
|
if(NOT LIBOBS_LIB)
|
||||||
|
message(FATAL_ERROR "obs library not found - please set LIBOBS_LIB")
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${target} PUBLIC ${LIBOBS_LIB})
|
||||||
|
if(NOT LIBOBS_INCLUDE_DIR)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR "obs.hpp header not found - please set LIBOBS_INCLUDE_DIR"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
target_include_directories(${target} PRIVATE ${LIBOBS_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
|
find_package(obs-frontend-api)
|
||||||
|
if(obs-frontend-api_FOUND)
|
||||||
|
target_link_libraries(${target} PUBLIC OBS::obs-frontend-api)
|
||||||
|
else()
|
||||||
|
if(NOT LIBOBS_FRONTEND_API_LIB)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"libobs frontend-api library not found - please set LIBOBS_FRONTEND_API_LIB"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(${target} PUBLIC ${LIBOBS_FRONTEND_API_LIB})
|
||||||
|
if(NOT LIBOBS_FRONTEND_INCLUDE_DIR)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
" obs-frontend-api.h not found - please set LIBOBS_FRONTEND_INCLUDE_DIR"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
target_include_directories(${target}
|
||||||
|
PRIVATE ${LIBOBS_FRONTEND_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
target_link_libraries(${target} PUBLIC OBS::libobs OBS::frontend-api)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(setup_advss_plugin target)
|
||||||
|
setup_obs_lib_dependency(${target})
|
||||||
|
find_qt(COMPONENTS Widgets Core)
|
||||||
|
target_link_libraries(${target} PRIVATE Qt::Core Qt::Widgets)
|
||||||
|
|
||||||
|
set_target_properties(
|
||||||
|
${target}
|
||||||
|
PROPERTIES AUTOMOC ON
|
||||||
|
AUTOUIC ON
|
||||||
|
AUTORCC ON)
|
||||||
|
|
||||||
|
target_link_libraries(${target} PRIVATE advanced-scene-switcher-lib)
|
||||||
|
|
||||||
|
get_target_property(ADVSS_SOURCE_DIR advanced-scene-switcher-lib SOURCE_DIR)
|
||||||
|
get_target_property(ADVSS_BINARY_DIR advanced-scene-switcher-lib BINARY_DIR)
|
||||||
|
|
||||||
|
if(OS_MACOS)
|
||||||
|
set(_INSTALL_RPATH "@loader_path" "@loader_path/..")
|
||||||
|
set_target_properties(${target} PROPERTIES INSTALL_RPATH
|
||||||
|
"${_INSTALL_RPATH}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set up include directories for headers generated by Qt
|
||||||
|
target_include_directories(
|
||||||
|
${target}
|
||||||
|
PRIVATE "${ADVSS_BINARY_DIR}/advanced-scene-switcher-lib_autogen/include")
|
||||||
|
foreach(_CONF Release RelWithDebInfo Debug MinSizeRe)
|
||||||
|
target_include_directories(
|
||||||
|
${target}
|
||||||
|
PRIVATE
|
||||||
|
"${ADVSS_BINARY_DIR}/advanced-scene-switcher-lib_autogen/include_${_CONF}"
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# General includes
|
||||||
|
target_include_directories(
|
||||||
|
${target}
|
||||||
|
PRIVATE "${ADVSS_SOURCE_DIR}/src" "${ADVSS_SOURCE_DIR}/src/legacy"
|
||||||
|
"${ADVSS_SOURCE_DIR}/src/macro-core"
|
||||||
|
"${ADVSS_SOURCE_DIR}/src/utils" "${ADVSS_SOURCE_DIR}/forms")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_advss_plugin_dependency)
|
||||||
|
cmake_parse_arguments(PARSED_ARGS "" "TARGET" "DEPENDENCIES" ${ARGN})
|
||||||
|
if(NOT PARSED_ARGS_TARGET)
|
||||||
|
message(FATAL_ERROR "You must provide a target")
|
||||||
|
endif()
|
||||||
|
set(_PLUGIN_FOLDER "adv-ss-plugins")
|
||||||
|
foreach(_DEPENDENCY ${PARSED_ARGS_DEPENDENCIES})
|
||||||
|
if(EXISTS ${_DEPENDENCY})
|
||||||
|
install_advss_plugin_dependency_file(${PARSED_ARGS_TARGET} ${_DEPENDENCY})
|
||||||
|
else()
|
||||||
|
install_advss_plugin_dependency_target(${PARSED_ARGS_TARGET}
|
||||||
|
${_DEPENDENCY})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
@@ -1,279 +1,269 @@
|
|||||||
# - Returns a version string from Git
|
# * Returns a version string from Git
|
||||||
#
|
#
|
||||||
# These functions force a re-configure on each git commit so that you can
|
# These functions force a re-configure on each git commit so that you can trust
|
||||||
# trust the values of the variables in your build system.
|
# the values of the variables in your build system.
|
||||||
#
|
#
|
||||||
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
|
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git
|
||||||
|
# describe> ...])
|
||||||
#
|
#
|
||||||
# Returns the refspec and sha hash of the current head revision
|
# Returns the refspec and sha hash of the current head revision
|
||||||
#
|
#
|
||||||
# git_describe(<var> [<additional arguments to git describe> ...])
|
# git_describe(<var> [<additional arguments to git describe> ...])
|
||||||
#
|
#
|
||||||
# Returns the results of git describe on the source tree, and adjusting
|
# Returns the results of git describe on the source tree, and adjusting the
|
||||||
# the output so that it tests false if an error occurs.
|
# output so that it tests false if an error occurs.
|
||||||
#
|
#
|
||||||
# git_describe_working_tree(<var> [<additional arguments to git describe> ...])
|
# git_describe_working_tree(<var> [<additional arguments to git describe> ...])
|
||||||
#
|
#
|
||||||
# Returns the results of git describe on the working tree (--dirty option),
|
# Returns the results of git describe on the working tree (--dirty option), and
|
||||||
# and adjusting the output so that it tests false if an error occurs.
|
# adjusting the output so that it tests false if an error occurs.
|
||||||
#
|
#
|
||||||
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
|
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
|
||||||
#
|
#
|
||||||
# Returns the results of git describe --exact-match on the source tree,
|
# Returns the results of git describe --exact-match on the source tree, and
|
||||||
# and adjusting the output so that it tests false if there was no exact
|
# adjusting the output so that it tests false if there was no exact matching
|
||||||
# matching tag.
|
# tag.
|
||||||
#
|
#
|
||||||
# git_local_changes(<var>)
|
# git_local_changes(<var>)
|
||||||
#
|
#
|
||||||
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
|
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. Uses
|
||||||
# Uses the return code of "git diff-index --quiet HEAD --".
|
# the return code of "git diff-index --quiet HEAD --". Does not regard untracked
|
||||||
# Does not regard untracked files.
|
# files.
|
||||||
#
|
#
|
||||||
# Requires CMake 2.6 or newer (uses the 'function' command)
|
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||||
#
|
#
|
||||||
# Original Author:
|
# Original Author: 2009-2020 Ryan Pavlik <ryan.pavlik@gmail.com>
|
||||||
# 2009-2020 Ryan Pavlik <ryan.pavlik@gmail.com> <abiryan@ryand.net>
|
# <abiryan@ryand.net> http://academic.cleardefinition.com
|
||||||
# http://academic.cleardefinition.com
|
|
||||||
#
|
#
|
||||||
# Copyright 2009-2013, Iowa State University.
|
# Copyright 2009-2013, Iowa State University. Copyright 2013-2020, Ryan Pavlik
|
||||||
# Copyright 2013-2020, Ryan Pavlik
|
# Copyright 2013-2020, Contributors SPDX-License-Identifier: BSL-1.0 Distributed
|
||||||
# Copyright 2013-2020, Contributors
|
# under the Boost Software License, Version 1.0. (See accompanying file
|
||||||
# SPDX-License-Identifier: BSL-1.0
|
# LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
# http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
if(__get_git_revision_description)
|
if(__get_git_revision_description)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
set(__get_git_revision_description YES)
|
set(__get_git_revision_description YES)
|
||||||
|
|
||||||
# We must run the following at "include" time, not at function call time,
|
# We must run the following at "include" time, not at function call time, to
|
||||||
# to find the path to this module rather than the path to a calling list file
|
# find the path to this module rather than the path to a calling list file
|
||||||
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||||
|
|
||||||
# Function _git_find_closest_git_dir finds the next closest .git directory
|
# Function _git_find_closest_git_dir finds the next closest .git directory that
|
||||||
# that is part of any directory in the path defined by _start_dir.
|
# is part of any directory in the path defined by _start_dir. The result is
|
||||||
# The result is returned in the parent scope variable whose name is passed
|
# returned in the parent scope variable whose name is passed as variable
|
||||||
# as variable _git_dir_var. If no .git directory can be found, the
|
# _git_dir_var. If no .git directory can be found, the function returns an empty
|
||||||
# function returns an empty string via _git_dir_var.
|
# string via _git_dir_var.
|
||||||
#
|
#
|
||||||
# Example: Given a path C:/bla/foo/bar and assuming C:/bla/.git exists and
|
# Example: Given a path C:/bla/foo/bar and assuming C:/bla/.git exists and
|
||||||
# neither foo nor bar contain a file/directory .git. This wil return
|
# neither foo nor bar contain a file/directory .git. This wil return C:/bla/.git
|
||||||
# C:/bla/.git
|
|
||||||
#
|
#
|
||||||
function(_git_find_closest_git_dir _start_dir _git_dir_var)
|
function(_git_find_closest_git_dir _start_dir _git_dir_var)
|
||||||
set(cur_dir "${_start_dir}")
|
set(cur_dir "${_start_dir}")
|
||||||
set(git_dir "${_start_dir}/.git")
|
set(git_dir "${_start_dir}/.git")
|
||||||
while(NOT EXISTS "${git_dir}")
|
while(NOT EXISTS "${git_dir}")
|
||||||
# .git dir not found, search parent directories
|
# .git dir not found, search parent directories
|
||||||
set(git_previous_parent "${cur_dir}")
|
set(git_previous_parent "${cur_dir}")
|
||||||
get_filename_component(cur_dir ${cur_dir} DIRECTORY)
|
get_filename_component(cur_dir ${cur_dir} DIRECTORY)
|
||||||
if(cur_dir STREQUAL git_previous_parent)
|
if(cur_dir STREQUAL git_previous_parent)
|
||||||
# We have reached the root directory, we are not in git
|
# We have reached the root directory, we are not in git
|
||||||
set(${_git_dir_var}
|
set(${_git_dir_var}
|
||||||
""
|
""
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
set(git_dir "${cur_dir}/.git")
|
set(git_dir "${cur_dir}/.git")
|
||||||
endwhile()
|
endwhile()
|
||||||
set(${_git_dir_var}
|
set(${_git_dir_var}
|
||||||
"${git_dir}"
|
"${git_dir}"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(get_git_head_revision _refspecvar _hashvar)
|
function(get_git_head_revision _refspecvar _hashvar)
|
||||||
_git_find_closest_git_dir("${CMAKE_CURRENT_SOURCE_DIR}" GIT_DIR)
|
_git_find_closest_git_dir("${CMAKE_CURRENT_SOURCE_DIR}" GIT_DIR)
|
||||||
|
|
||||||
if(NOT "${GIT_DIR}" STREQUAL "")
|
if(NOT "${GIT_DIR}" STREQUAL "")
|
||||||
file(RELATIVE_PATH _relative_to_source_dir "${CMAKE_SOURCE_DIR}"
|
file(RELATIVE_PATH _relative_to_source_dir "${CMAKE_SOURCE_DIR}"
|
||||||
"${GIT_DIR}")
|
"${GIT_DIR}")
|
||||||
if("${_relative_to_source_dir}" MATCHES "[.][.]")
|
if("${_relative_to_source_dir}" MATCHES "[.][.]")
|
||||||
# We've gone above the CMake root dir.
|
# We've gone above the CMake root dir.
|
||||||
set(GIT_DIR "")
|
set(GIT_DIR "")
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
if("${GIT_DIR}" STREQUAL "")
|
endif()
|
||||||
set(${_refspecvar}
|
if("${GIT_DIR}" STREQUAL "")
|
||||||
"GITDIR-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
set(${_hashvar}
|
|
||||||
"GITDIR-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check if the current source dir is a git submodule or a worktree.
|
|
||||||
# In both cases .git is a file instead of a directory.
|
|
||||||
#
|
|
||||||
if(NOT IS_DIRECTORY ${GIT_DIR})
|
|
||||||
# The following git command will return a non empty string that
|
|
||||||
# points to the super project working tree if the current
|
|
||||||
# source dir is inside a git submodule.
|
|
||||||
# Otherwise the command will return an empty string.
|
|
||||||
#
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" rev-parse
|
|
||||||
--show-superproject-working-tree
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(NOT "${out}" STREQUAL "")
|
|
||||||
# If out is empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule
|
|
||||||
file(READ ${GIT_DIR} submodule)
|
|
||||||
string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE
|
|
||||||
${submodule})
|
|
||||||
string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
|
|
||||||
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
|
||||||
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE}
|
|
||||||
ABSOLUTE)
|
|
||||||
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
|
|
||||||
else()
|
|
||||||
# GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree
|
|
||||||
file(READ ${GIT_DIR} worktree_ref)
|
|
||||||
# The .git directory contains a path to the worktree information directory
|
|
||||||
# inside the parent git repo of the worktree.
|
|
||||||
#
|
|
||||||
string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir
|
|
||||||
${worktree_ref})
|
|
||||||
string(STRIP ${git_worktree_dir} git_worktree_dir)
|
|
||||||
_git_find_closest_git_dir("${git_worktree_dir}" GIT_DIR)
|
|
||||||
set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
|
|
||||||
endif()
|
|
||||||
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
|
||||||
if(NOT EXISTS "${GIT_DATA}")
|
|
||||||
file(MAKE_DIRECTORY "${GIT_DATA}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT EXISTS "${HEAD_SOURCE_FILE}")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(HEAD_FILE "${GIT_DATA}/HEAD")
|
|
||||||
configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY)
|
|
||||||
|
|
||||||
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
|
|
||||||
"${GIT_DATA}/grabRef.cmake" @ONLY)
|
|
||||||
include("${GIT_DATA}/grabRef.cmake")
|
|
||||||
|
|
||||||
set(${_refspecvar}
|
set(${_refspecvar}
|
||||||
"${HEAD_REF}"
|
"GITDIR-NOTFOUND"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
set(${_hashvar}
|
set(${_hashvar}
|
||||||
"${HEAD_HASH}"
|
"GITDIR-NOTFOUND"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check if the current source dir is a git submodule or a worktree. In both
|
||||||
|
# cases .git is a file instead of a directory.
|
||||||
|
#
|
||||||
|
if(NOT IS_DIRECTORY ${GIT_DIR})
|
||||||
|
# The following git command will return a non empty string that points to
|
||||||
|
# the super project working tree if the current source dir is inside a git
|
||||||
|
# submodule. Otherwise the command will return an empty string.
|
||||||
|
#
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" rev-parse --show-superproject-working-tree
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
OUTPUT_VARIABLE out
|
||||||
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(NOT "${out}" STREQUAL "")
|
||||||
|
# If out is empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule
|
||||||
|
file(READ ${GIT_DIR} submodule)
|
||||||
|
string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE ${submodule})
|
||||||
|
string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE)
|
||||||
|
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
||||||
|
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE}
|
||||||
|
ABSOLUTE)
|
||||||
|
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
|
||||||
|
else()
|
||||||
|
# GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree
|
||||||
|
file(READ ${GIT_DIR} worktree_ref)
|
||||||
|
# The .git directory contains a path to the worktree information directory
|
||||||
|
# inside the parent git repo of the worktree.
|
||||||
|
#
|
||||||
|
string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir
|
||||||
|
${worktree_ref})
|
||||||
|
string(STRIP ${git_worktree_dir} git_worktree_dir)
|
||||||
|
_git_find_closest_git_dir("${git_worktree_dir}" GIT_DIR)
|
||||||
|
set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD")
|
||||||
|
endif()
|
||||||
|
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
||||||
|
if(NOT EXISTS "${GIT_DATA}")
|
||||||
|
file(MAKE_DIRECTORY "${GIT_DATA}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${HEAD_SOURCE_FILE}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(HEAD_FILE "${GIT_DATA}/HEAD")
|
||||||
|
configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY)
|
||||||
|
|
||||||
|
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
|
||||||
|
"${GIT_DATA}/grabRef.cmake" @ONLY)
|
||||||
|
include("${GIT_DATA}/grabRef.cmake")
|
||||||
|
|
||||||
|
set(${_refspecvar}
|
||||||
|
"${HEAD_REF}"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
set(${_hashvar}
|
||||||
|
"${HEAD_HASH}"
|
||||||
|
PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(git_describe _var)
|
function(git_describe _var)
|
||||||
if(NOT GIT_FOUND)
|
if(NOT GIT_FOUND)
|
||||||
find_package(Git QUIET)
|
find_package(Git QUIET)
|
||||||
endif()
|
endif()
|
||||||
get_git_head_revision(refspec hash)
|
get_git_head_revision(refspec hash)
|
||||||
if(NOT GIT_FOUND)
|
if(NOT GIT_FOUND)
|
||||||
set(${_var}
|
|
||||||
"GIT-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
if(NOT hash)
|
|
||||||
set(${_var}
|
|
||||||
"HEAD-HASH-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TODO sanitize
|
|
||||||
#if((${ARGN}" MATCHES "&&") OR
|
|
||||||
# (ARGN MATCHES "||") OR
|
|
||||||
# (ARGN MATCHES "\\;"))
|
|
||||||
# message("Please report the following error to the project!")
|
|
||||||
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
|
|
||||||
#endif()
|
|
||||||
|
|
||||||
#message(STATUS "Arguments to execute_process: ${ARGN}")
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" describe --tags --always ${hash} ${ARGN}
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
RESULT_VARIABLE res
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(NOT res EQUAL 0)
|
|
||||||
set(out "${out}-${res}-NOTFOUND")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"${out}"
|
"GIT-NOTFOUND"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
if(NOT hash)
|
||||||
|
set(${_var}
|
||||||
|
"HEAD-HASH-NOTFOUND"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# TODO sanitize if((${ARGN}" MATCHES "&&") OR (ARGN MATCHES "||") OR (ARGN
|
||||||
|
# MATCHES "\\;")) message("Please report the following error to the project!")
|
||||||
|
# message(FATAL_ERROR "Looks like someone's doing something nefarious with
|
||||||
|
# git_describe! Passed arguments ${ARGN}") endif()
|
||||||
|
|
||||||
|
# message(STATUS "Arguments to execute_process: ${ARGN}")
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" describe --tags --always ${hash} ${ARGN}
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
RESULT_VARIABLE res
|
||||||
|
OUTPUT_VARIABLE out
|
||||||
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(NOT res EQUAL 0)
|
||||||
|
set(out "${out}-${res}-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${_var}
|
||||||
|
"${out}"
|
||||||
|
PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(git_describe_working_tree _var)
|
function(git_describe_working_tree _var)
|
||||||
if(NOT GIT_FOUND)
|
if(NOT GIT_FOUND)
|
||||||
find_package(Git QUIET)
|
find_package(Git QUIET)
|
||||||
endif()
|
endif()
|
||||||
if(NOT GIT_FOUND)
|
if(NOT GIT_FOUND)
|
||||||
set(${_var}
|
|
||||||
"GIT-NOTFOUND"
|
|
||||||
PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND "${GIT_EXECUTABLE}" describe --dirty ${ARGN}
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
RESULT_VARIABLE res
|
|
||||||
OUTPUT_VARIABLE out
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
if(NOT res EQUAL 0)
|
|
||||||
set(out "${out}-${res}-NOTFOUND")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"${out}"
|
"GIT-NOTFOUND"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" describe --dirty ${ARGN}
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
RESULT_VARIABLE res
|
||||||
|
OUTPUT_VARIABLE out
|
||||||
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(NOT res EQUAL 0)
|
||||||
|
set(out "${out}-${res}-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${_var}
|
||||||
|
"${out}"
|
||||||
|
PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(git_get_exact_tag _var)
|
function(git_get_exact_tag _var)
|
||||||
git_describe(out --exact-match ${ARGN})
|
git_describe(out --exact-match ${ARGN})
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"${out}"
|
"${out}"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(git_local_changes _var)
|
function(git_local_changes _var)
|
||||||
if(NOT GIT_FOUND)
|
if(NOT GIT_FOUND)
|
||||||
find_package(Git QUIET)
|
find_package(Git QUIET)
|
||||||
endif()
|
endif()
|
||||||
get_git_head_revision(refspec hash)
|
get_git_head_revision(refspec hash)
|
||||||
if(NOT GIT_FOUND)
|
if(NOT GIT_FOUND)
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"GIT-NOTFOUND"
|
"GIT-NOTFOUND"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
if(NOT hash)
|
if(NOT hash)
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"HEAD-HASH-NOTFOUND"
|
"HEAD-HASH-NOTFOUND"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD --
|
COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD --
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
RESULT_VARIABLE res
|
RESULT_VARIABLE res
|
||||||
OUTPUT_VARIABLE out
|
OUTPUT_VARIABLE out
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
if(res EQUAL 0)
|
if(res EQUAL 0)
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"CLEAN"
|
"CLEAN"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
else()
|
else()
|
||||||
set(${_var}
|
set(${_var}
|
||||||
"DIRTY"
|
"DIRTY"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|||||||
492
cmake/ObsPluginHelpers.cmake
Normal file
492
cmake/ObsPluginHelpers.cmake
Normal file
@@ -0,0 +1,492 @@
|
|||||||
|
if(POLICY CMP0087)
|
||||||
|
cmake_policy(SET CMP0087 NEW)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(OBS_STANDALONE_PLUGIN_DIR ${CMAKE_SOURCE_DIR}/release)
|
||||||
|
set(INCLUDED_LIBOBS_CMAKE_MODULES ON)
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
|
||||||
|
set(OS_MACOS ON)
|
||||||
|
set(OS_POSIX ON)
|
||||||
|
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD")
|
||||||
|
set(OS_POSIX ON)
|
||||||
|
string(TOUPPER "${CMAKE_SYSTEM_NAME}" _SYSTEM_NAME_U)
|
||||||
|
set(OS_${_SYSTEM_NAME_U} ON)
|
||||||
|
elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
|
set(OS_WINDOWS ON)
|
||||||
|
set(OS_POSIX OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND (OS_WINDOWS OR OS_MACOS))
|
||||||
|
set(CMAKE_INSTALL_PREFIX
|
||||||
|
${OBS_STANDALONE_PLUGIN_DIR}
|
||||||
|
CACHE STRING "Directory to install OBS plugin after building" FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT CMAKE_BUILD_TYPE)
|
||||||
|
set(CMAKE_BUILD_TYPE
|
||||||
|
"RelWithDebInfo"
|
||||||
|
CACHE STRING
|
||||||
|
"OBS build type [Release, RelWithDebInfo, Debug, MinSizeRel]" FORCE)
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Release RelWithDebInfo
|
||||||
|
Debug MinSizeRel)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT QT_VERSION)
|
||||||
|
set(QT_VERSION
|
||||||
|
AUTO
|
||||||
|
CACHE STRING "OBS Qt version [AUTO, 5, 6]" FORCE)
|
||||||
|
set_property(CACHE QT_VERSION PROPERTY STRINGS AUTO 5 6)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
macro(find_qt)
|
||||||
|
set(multiValueArgs COMPONENTS COMPONENTS_WIN COMPONENTS_MAC COMPONENTS_LINUX)
|
||||||
|
cmake_parse_arguments(FIND_QT "" "${oneValueArgs}" "${multiValueArgs}"
|
||||||
|
${ARGN})
|
||||||
|
set(QT_NO_CREATE_VERSIONLESS_TARGETS ON)
|
||||||
|
find_package(
|
||||||
|
Qt5
|
||||||
|
COMPONENTS Core
|
||||||
|
QUIET)
|
||||||
|
find_package(
|
||||||
|
Qt6
|
||||||
|
COMPONENTS Core
|
||||||
|
QUIET)
|
||||||
|
|
||||||
|
if(NOT _QT_VERSION AND QT_VERSION STREQUAL AUTO)
|
||||||
|
if(TARGET Qt6::Core)
|
||||||
|
set(_QT_VERSION
|
||||||
|
6
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
elseif(TARGET Qt5::Core)
|
||||||
|
set(_QT_VERSION
|
||||||
|
5
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
endif()
|
||||||
|
message(STATUS "Qt version: ${_QT_VERSION}")
|
||||||
|
elseif(NOT _QT_VERSION)
|
||||||
|
if(TARGET Qt${QT_VERSION}::Core)
|
||||||
|
set(_QT_VERSION
|
||||||
|
${QT_VERSION}
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
else()
|
||||||
|
if(QT_VERSION EQUAL 6)
|
||||||
|
set(FALLBACK_QT_VERSION 5)
|
||||||
|
else()
|
||||||
|
set(FALLBACK_QT_VERSION 6)
|
||||||
|
endif()
|
||||||
|
message(
|
||||||
|
WARNING
|
||||||
|
"Qt${QT_VERSION} was not found, falling back to Qt${FALLBACK_QT_VERSION}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(TARGET Qt${FALLBACK_QT_VERSION}::Core)
|
||||||
|
set(_QT_VERSION
|
||||||
|
${FALLBACK_QT_VERSION}
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
message(STATUS "Qt version: ${_QT_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(QT_NO_CREATE_VERSIONLESS_TARGETS OFF)
|
||||||
|
|
||||||
|
if(NOT _QT_VERSION)
|
||||||
|
message(FATAL_ERROR "Neither Qt5 or Qt6 were found")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OS_WINDOWS)
|
||||||
|
find_package(
|
||||||
|
Qt${_QT_VERSION}
|
||||||
|
COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_WIN}
|
||||||
|
REQUIRED)
|
||||||
|
elseif(OS_MACOS)
|
||||||
|
find_package(
|
||||||
|
Qt${_QT_VERSION}
|
||||||
|
COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_MAC}
|
||||||
|
REQUIRED)
|
||||||
|
else()
|
||||||
|
find_package(
|
||||||
|
Qt${_QT_VERSION}
|
||||||
|
COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_LINUX}
|
||||||
|
REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND FIND_QT_COMPONENTS "Core")
|
||||||
|
|
||||||
|
if("Gui" IN_LIST FIND_QT_COMPONENTS_LINUX)
|
||||||
|
list(APPEND FIND_QT_COMPONENTS_LINUX "GuiPrivate")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
foreach(_COMPONENT IN LISTS FIND_QT_COMPONENTS FIND_QT_COMPONENTS_WIN
|
||||||
|
FIND_QT_COMPONENTS_MAC FIND_QT_COMPONENTS_LINUX)
|
||||||
|
if(NOT TARGET Qt::${_COMPONENT} AND TARGET Qt${_QT_VERSION}::${_COMPONENT})
|
||||||
|
|
||||||
|
add_library(Qt::${_COMPONENT} INTERFACE IMPORTED)
|
||||||
|
set_target_properties(
|
||||||
|
Qt::${_COMPONENT} PROPERTIES INTERFACE_LINK_LIBRARIES
|
||||||
|
"Qt${_QT_VERSION}::${_COMPONENT}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
file(RELATIVE_PATH RELATIVE_INSTALL_PATH ${CMAKE_SOURCE_DIR}
|
||||||
|
${CMAKE_INSTALL_PREFIX})
|
||||||
|
file(RELATIVE_PATH RELATIVE_BUILD_PATH ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
|
||||||
|
|
||||||
|
# Set up OS-specific environment and helper functions
|
||||||
|
if(OS_POSIX)
|
||||||
|
find_program(CCACHE_PROGRAM "ccache")
|
||||||
|
set(CCACHE_SUPPORT
|
||||||
|
ON
|
||||||
|
CACHE BOOL "Enable ccache support")
|
||||||
|
mark_as_advanced(CCACHE_PROGRAM)
|
||||||
|
if(CCACHE_PROGRAM AND CCACHE_SUPPORT)
|
||||||
|
set(CMAKE_CXX_COMPILER_LAUNCHER
|
||||||
|
${CCACHE_PROGRAM}
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
set(CMAKE_C_COMPILER_LAUNCHER
|
||||||
|
${CCACHE_PROGRAM}
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
set(CMAKE_OBJC_COMPILER_LAUNCHER
|
||||||
|
${CCACHE_PROGRAM}
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
set(CMAKE_OBJCXX_COMPILER_LAUNCHER
|
||||||
|
${CCACHE_PROGRAM}
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
set(CMAKE_CUDA_COMPILER_LAUNCHER
|
||||||
|
${CCACHE_PROGRAM}
|
||||||
|
CACHE INTERNAL "") # CMake 3.9+
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OS_MACOS)
|
||||||
|
set(CMAKE_OSX_ARCHITECTURES
|
||||||
|
"x86_64"
|
||||||
|
CACHE STRING
|
||||||
|
"OBS build architecture for macOS - x86_64 required at least")
|
||||||
|
set_property(CACHE CMAKE_OSX_ARCHITECTURES PROPERTY STRINGS x86_64 arm64
|
||||||
|
"x86_64;arm64")
|
||||||
|
|
||||||
|
set(CMAKE_OSX_DEPLOYMENT_TARGET
|
||||||
|
"10.15"
|
||||||
|
CACHE STRING "OBS deployment target for macOS - 10.15+ required")
|
||||||
|
set_property(CACHE CMAKE_OSX_DEPLOYMENT_TARGET PROPERTY STRINGS 10.15 11.0
|
||||||
|
12.0 13.0)
|
||||||
|
|
||||||
|
set(OBS_BUNDLE_CODESIGN_IDENTITY
|
||||||
|
"-"
|
||||||
|
CACHE STRING "OBS code signing identity for macOS")
|
||||||
|
set(OBS_CODESIGN_ENTITLEMENTS
|
||||||
|
${CMAKE_SOURCE_DIR}/cmake/bundle/macos/entitlements.plist
|
||||||
|
CACHE INTERNAL "Path to codesign entitlements plist")
|
||||||
|
set(OBS_CODESIGN_LINKER
|
||||||
|
ON
|
||||||
|
CACHE BOOL "Enable linker code-signing on macOS (macOS 11+ required)")
|
||||||
|
|
||||||
|
# Xcode configuration
|
||||||
|
if(XCODE)
|
||||||
|
# Tell Xcode to pretend the linker signed binaries so that editing with
|
||||||
|
# install_name_tool preserves ad-hoc signatures. This option is supported by
|
||||||
|
# codesign on macOS 11 or higher. See CMake Issue 21854:
|
||||||
|
# https://gitlab.kitware.com/cmake/cmake/-/issues/21854
|
||||||
|
|
||||||
|
set(CMAKE_XCODE_GENERATE_SCHEME ON)
|
||||||
|
if(OBS_CODESIGN_LINKER)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set default options for bundling on macOS
|
||||||
|
set(CMAKE_MACOSX_RPATH ON)
|
||||||
|
set(CMAKE_SKIP_BUILD_RPATH OFF)
|
||||||
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
|
||||||
|
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks/")
|
||||||
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF)
|
||||||
|
|
||||||
|
function(setup_plugin_target target)
|
||||||
|
if(NOT DEFINED MACOSX_PLUGIN_GUI_IDENTIFIER)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"No 'MACOSX_PLUGIN_GUI_IDENTIFIER' set, but is required to build plugin bundles on macOS - example: 'com.yourname.pluginname'"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT DEFINED MACOSX_PLUGIN_BUNDLE_VERSION)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"No 'MACOSX_PLUGIN_BUNDLE_VERSION' set, but is required to build plugin bundles on macOS - example: '25'"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT DEFINED MACOSX_PLUGIN_SHORT_VERSION_STRING)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"No 'MACOSX_PLUGIN_SHORT_VERSION_STRING' set, but is required to build plugin bundles on macOS - example: '1.0.2'"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(MACOSX_PLUGIN_BUNDLE_NAME
|
||||||
|
"${target}"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
set(MACOSX_PLUGIN_BUNDLE_VERSION
|
||||||
|
"${MACOSX_BUNDLE_BUNDLE_VERSION}"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
set(MACOSX_PLUGIN_SHORT_VERSION_STRING
|
||||||
|
"${MACOSX_BUNDLE_SHORT_VERSION_STRING}"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
set(MACOSX_PLUGIN_EXECUTABLE_NAME
|
||||||
|
"${target}"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
set(MACOSX_PLUGIN_BUNDLE_TYPE
|
||||||
|
"BNDL"
|
||||||
|
PARENT_SCOPE)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS ${target}
|
||||||
|
LIBRARY DESTINATION "."
|
||||||
|
COMPONENT obs_plugins
|
||||||
|
NAMELINK_COMPONENT ${target}_Development)
|
||||||
|
|
||||||
|
if(${QT_VERSION} EQUAL 5)
|
||||||
|
set(_QT_FW_VERSION "${QT_VERSION}")
|
||||||
|
else()
|
||||||
|
set(_QT_FW_VERSION "A")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_COMMAND
|
||||||
|
"${CMAKE_INSTALL_NAME_TOOL} \\
|
||||||
|
-change ${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/${QT_VERSION}/QtWidgets @rpath/QtWidgets.framework/Versions/${_QT_FW_VERSION}/QtWidgets \\
|
||||||
|
-change ${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/${QT_VERSION}/QtCore @rpath/QtCore.framework/Versions/${_QT_FW_VERSION}/QtCore \\
|
||||||
|
-change ${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/${QT_VERSION}/QtGui @rpath/QtGui.framework/Versions/${_QT_FW_VERSION}/QtGui \\
|
||||||
|
\\\"\${CMAKE_INSTALL_PREFIX}/${target}.plugin/Contents/MacOS/${target}\\\""
|
||||||
|
)
|
||||||
|
install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")"
|
||||||
|
COMPONENT obs_plugins)
|
||||||
|
unset(_QT_FW_VERSION)
|
||||||
|
|
||||||
|
if(NOT XCODE)
|
||||||
|
set(_COMMAND
|
||||||
|
"/usr/bin/codesign --force \\
|
||||||
|
--sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" \\
|
||||||
|
--options runtime \\
|
||||||
|
--entitlements \\\"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/bundle/macOS/entitlements.plist\\\" \\
|
||||||
|
\\\"\${CMAKE_INSTALL_PREFIX}/${target}.plugin\\\"")
|
||||||
|
install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")"
|
||||||
|
COMPONENT obs_plugins)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(
|
||||||
|
${target}
|
||||||
|
PROPERTIES
|
||||||
|
BUNDLE ON
|
||||||
|
BUNDLE_EXTENSION "plugin"
|
||||||
|
OUTPUT_NAME ${target}
|
||||||
|
MACOSX_BUNDLE_INFO_PLIST
|
||||||
|
"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/bundle/macOS/Plugin-Info.plist.in"
|
||||||
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER
|
||||||
|
"${MACOSX_PLUGIN_GUI_IDENTIFIER}"
|
||||||
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${OBS_BUNDLE_CODESIGN_IDENTITY}"
|
||||||
|
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS
|
||||||
|
"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/bundle/macOS/entitlements.plist")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${target}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
/bin/sh -c
|
||||||
|
"codesign --force --sign \"-\" $<$<BOOL:${OBS_CODESIGN_LINKER}>:--options linker-signed >\"$<TARGET_BUNDLE_DIR:${target}>\""
|
||||||
|
COMMENT "Codesigning ${target}"
|
||||||
|
VERBATIM)
|
||||||
|
|
||||||
|
install_bundle_resources(${target})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(install_bundle_resources target)
|
||||||
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||||
|
file(GLOB_RECURSE _DATA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
|
||||||
|
foreach(_DATA_FILE IN LISTS _DATA_FILES)
|
||||||
|
file(RELATIVE_PATH _RELATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/data/
|
||||||
|
${_DATA_FILE})
|
||||||
|
get_filename_component(_RELATIVE_PATH ${_RELATIVE_PATH} PATH)
|
||||||
|
target_sources(${target} PRIVATE ${_DATA_FILE})
|
||||||
|
set_source_files_properties(
|
||||||
|
${_DATA_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION
|
||||||
|
Resources/${_RELATIVE_PATH})
|
||||||
|
string(REPLACE "\\" "\\\\" _GROUP_NAME ${_RELATIVE_PATH})
|
||||||
|
source_group("Resources\\${_GROUP_NAME}" FILES ${_DATA_FILE})
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
else()
|
||||||
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(_ARCH_SUFFIX 64)
|
||||||
|
else()
|
||||||
|
set(_ARCH_SUFFIX 32)
|
||||||
|
endif()
|
||||||
|
set(OBS_OUTPUT_DIR ${CMAKE_BINARY_DIR}/rundir)
|
||||||
|
|
||||||
|
if(OS_POSIX)
|
||||||
|
option(LINUX_PORTABLE "Build portable version (Linux)" ON)
|
||||||
|
if(NOT LINUX_PORTABLE)
|
||||||
|
set(OBS_LIBRARY_DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
set(OBS_PLUGIN_DESTINATION ${OBS_LIBRARY_DESTINATION}/obs-plugins)
|
||||||
|
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/lib)
|
||||||
|
set(OBS_DATA_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/obs)
|
||||||
|
else()
|
||||||
|
set(OBS_LIBRARY_DESTINATION bin/${_ARCH_SUFFIX}bit)
|
||||||
|
set(OBS_PLUGIN_DESTINATION obs-plugins/${_ARCH_SUFFIX}bit)
|
||||||
|
set(CMAKE_INSTALL_RPATH
|
||||||
|
"$ORIGIN/" "${CMAKE_INSTALL_PREFIX}/${OBS_LIBRARY_DESTINATION}")
|
||||||
|
set(OBS_DATA_DESTINATION "data")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OS_LINUX)
|
||||||
|
set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${LINUX_MAINTAINER_EMAIL}")
|
||||||
|
set(CPACK_PACKAGE_VERSION "${CMAKE_PROJECT_VERSION}")
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-linux-x86_64")
|
||||||
|
|
||||||
|
set(CPACK_GENERATOR "DEB")
|
||||||
|
if(${QT_VERSION} STREQUAL "6")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS
|
||||||
|
"obs-studio (>= 28.0.0), libqt6core6 (>= 6.2.0), libqt6gui6 (>= 6.1.2), libqt6widgets6 (>= 6.1.2)"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS
|
||||||
|
"obs-studio (>= 28.0.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.3.0), libqt5widgets5 (>= 5.7.0)"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CPACK_OUTPUT_FILE_PREFIX ${CMAKE_SOURCE_DIR}/release)
|
||||||
|
|
||||||
|
if(NOT LINUX_PORTABLE)
|
||||||
|
set(CPACK_SET_DESTDIR ON)
|
||||||
|
endif()
|
||||||
|
include(CPack)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit")
|
||||||
|
set(OBS_LIBRARY32_DESTINATION "bin/32bit")
|
||||||
|
set(OBS_LIBRARY64_DESTINATION "bin/64bit")
|
||||||
|
set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit")
|
||||||
|
set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit")
|
||||||
|
set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit")
|
||||||
|
|
||||||
|
set(OBS_DATA_DESTINATION "data")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function(setup_plugin_target target)
|
||||||
|
set_target_properties(${target} PROPERTIES PREFIX "")
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS ${target}
|
||||||
|
RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}"
|
||||||
|
COMPONENT ${target}_Runtime
|
||||||
|
LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}"
|
||||||
|
COMPONENT ${target}_Runtime
|
||||||
|
NAMELINK_COMPONENT ${target}_Development)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_FILE:${target}>
|
||||||
|
DESTINATION $<CONFIG>/${OBS_PLUGIN_DESTINATION}
|
||||||
|
COMPONENT obs_rundir
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
if(OS_WINDOWS)
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_PDB_FILE:${target}>
|
||||||
|
CONFIGURATIONS "RelWithDebInfo" "Debug"
|
||||||
|
DESTINATION ${OBS_PLUGIN_DESTINATION}
|
||||||
|
COMPONENT ${target}_Runtime
|
||||||
|
OPTIONAL)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_PDB_FILE:${target}>
|
||||||
|
CONFIGURATIONS "RelWithDebInfo" "Debug"
|
||||||
|
DESTINATION $<CONFIG>/${OBS_PLUGIN_DESTINATION}
|
||||||
|
COMPONENT obs_rundir
|
||||||
|
OPTIONAL EXCLUDE_FROM_ALL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
target_link_options(
|
||||||
|
${target}
|
||||||
|
PRIVATE
|
||||||
|
"LINKER:/OPT:REF"
|
||||||
|
"$<$<NOT:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>>:LINKER\:/SAFESEH\:NO>"
|
||||||
|
"$<$<CONFIG:DEBUG>:LINKER\:/INCREMENTAL:NO>"
|
||||||
|
"$<$<CONFIG:RELWITHDEBINFO>:LINKER\:/INCREMENTAL:NO>")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
setup_target_resources(${target} obs-plugins/${target})
|
||||||
|
|
||||||
|
if(OS_WINDOWS AND DEFINED OBS_BUILD_DIR)
|
||||||
|
setup_target_for_testing(${target} obs-plugins/${target})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${target}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
"${CMAKE_COMMAND}" -DCMAKE_INSTALL_PREFIX=${OBS_OUTPUT_DIR}
|
||||||
|
-DCMAKE_INSTALL_COMPONENT=obs_rundir
|
||||||
|
-DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/cmake_install.cmake
|
||||||
|
COMMENT "Installing to plugin rundir"
|
||||||
|
VERBATIM)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(setup_target_resources target destination)
|
||||||
|
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||||
|
install(
|
||||||
|
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/
|
||||||
|
DESTINATION ${OBS_DATA_DESTINATION}/${destination}
|
||||||
|
USE_SOURCE_PERMISSIONS
|
||||||
|
COMPONENT obs_plugins)
|
||||||
|
|
||||||
|
install(
|
||||||
|
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data
|
||||||
|
DESTINATION $<CONFIG>/${OBS_DATA_DESTINATION}/${destination}
|
||||||
|
USE_SOURCE_PERMISSIONS
|
||||||
|
COMPONENT obs_rundir
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
if(OS_WINDOWS)
|
||||||
|
function(setup_target_for_testing target destination)
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_FILE:${target}>
|
||||||
|
DESTINATION $<CONFIG>/${OBS_PLUGIN_DESTINATION}
|
||||||
|
COMPONENT obs_testing
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES $<TARGET_PDB_FILE:${target}>
|
||||||
|
CONFIGURATIONS "RelWithDebInfo" "Debug"
|
||||||
|
DESTINATION $<CONFIG>/${OBS_PLUGIN_DESTINATION}
|
||||||
|
COMPONENT obs_testing
|
||||||
|
OPTIONAL EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
install(
|
||||||
|
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/
|
||||||
|
DESTINATION $<CONFIG>/${OBS_DATA_DESTINATION}/${destination}
|
||||||
|
USE_SOURCE_PERMISSIONS
|
||||||
|
COMPONENT obs_testing
|
||||||
|
EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
TARGET ${target}
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND
|
||||||
|
"${CMAKE_COMMAND}" -DCMAKE_INSTALL_PREFIX=${OBS_BUILD_DIR}/rundir
|
||||||
|
-DCMAKE_INSTALL_COMPONENT=obs_testing
|
||||||
|
-DCMAKE_INSTALL_CONFIG_NAME=$<CONFIG> -P
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/cmake_install.cmake
|
||||||
|
COMMENT "Installing to OBS test directory"
|
||||||
|
VERBATIM)
|
||||||
|
endfunction()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
26
cmake/bundle/macos/Plugin-Info.plist.in
Normal file
26
cmake/bundle/macos/Plugin-Info.plist.in
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>${MACOSX_PLUGIN_BUNDLE_NAME}</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>${MACOSX_PLUGIN_GUI_IDENTIFIER}</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>${MACOSX_PLUGIN_BUNDLE_VERSION}</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>${MACOSX_PLUGIN_SHORT_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>${MACOSX_PLUGIN_EXECUTABLE_NAME}</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>${MACOSX_PLUGIN_BUNDLE_TYPE}</string>
|
||||||
|
<key>CFBundleSupportedPlatforms</key>
|
||||||
|
<array>
|
||||||
|
<string>MacOSX</string>
|
||||||
|
</array>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>10.13</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
17
cmake/bundle/macos/entitlements.plist
Normal file
17
cmake/bundle/macos/entitlements.plist
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!--?xml version="1.0" encoding="UTF-8"?-->
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.device.camera</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.device.audio-input</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
|
<!-- Allows @executable_path to load libaries from within the .app bundle. -->
|
||||||
|
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
920
cmake/bundle/macos/installer-macos.pkgproj.in
Normal file
920
cmake/bundle/macos/installer-macos.pkgproj.in
Normal file
@@ -0,0 +1,920 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>PACKAGES</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>MUST-CLOSE-APPLICATION-ITEMS</key>
|
||||||
|
<array/>
|
||||||
|
<key>MUST-CLOSE-APPLICATIONS</key>
|
||||||
|
<false/>
|
||||||
|
<key>PACKAGE_FILES</key>
|
||||||
|
<dict>
|
||||||
|
<key>DEFAULT_INSTALL_LOCATION</key>
|
||||||
|
<string>/</string>
|
||||||
|
<key>HIERARCHY</key>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Applications</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>509</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>BUNDLE_CAN_DOWNGRADE</key>
|
||||||
|
<false/>
|
||||||
|
<key>BUNDLE_POSTINSTALL_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>BUNDLE_PREINSTALL_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>../@RELATIVE_INSTALL_PATH@/@CMAKE_PROJECT_NAME@.plugin</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>plugins</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>509</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>obs-studio</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>509</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Application Support</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Automator</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Documentation</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Extensions</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Filesystems</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Frameworks</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Input Methods</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Internet Plug-Ins</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>LaunchAgents</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>LaunchDaemons</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>PreferencePanes</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Preferences</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Printers</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>PrivilegedHelperTools</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>1005</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>QuickLook</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>QuickTime</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Screen Savers</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Scripts</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Services</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Widgets</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Library</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Shared</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>1023</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Users</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PAYLOAD_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PRESERVE_EXTENDED_ATTRIBUTES</key>
|
||||||
|
<false/>
|
||||||
|
<key>SHOW_INVISIBLE</key>
|
||||||
|
<false/>
|
||||||
|
<key>SPLIT_FORKS</key>
|
||||||
|
<true/>
|
||||||
|
<key>TREAT_MISSING_FILES_AS_WARNING</key>
|
||||||
|
<false/>
|
||||||
|
<key>VERSION</key>
|
||||||
|
<integer>5</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PACKAGE_SCRIPTS</key>
|
||||||
|
<dict>
|
||||||
|
<key>POSTINSTALL_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PREINSTALL_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>RESOURCES</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
<key>PACKAGE_SETTINGS</key>
|
||||||
|
<dict>
|
||||||
|
<key>AUTHENTICATION</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>CONCLUSION_ACTION</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>FOLLOW_SYMBOLIC_LINKS</key>
|
||||||
|
<false/>
|
||||||
|
<key>IDENTIFIER</key>
|
||||||
|
<string>@MACOS_BUNDLEID@</string>
|
||||||
|
<key>LOCATION</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>NAME</key>
|
||||||
|
<string>@CMAKE_PROJECT_NAME@</string>
|
||||||
|
<key>OVERWRITE_PERMISSIONS</key>
|
||||||
|
<false/>
|
||||||
|
<key>PAYLOAD_SIZE</key>
|
||||||
|
<integer>-1</integer>
|
||||||
|
<key>REFERENCE_PATH</key>
|
||||||
|
<string></string>
|
||||||
|
<key>RELOCATABLE</key>
|
||||||
|
<false/>
|
||||||
|
<key>USE_HFS+_COMPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>VERSION</key>
|
||||||
|
<string>@CMAKE_PROJECT_VERSION@</string>
|
||||||
|
</dict>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>UUID</key>
|
||||||
|
<string>@MACOS_PACKAGE_UUID@</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROJECT</key>
|
||||||
|
<dict>
|
||||||
|
<key>PROJECT_COMMENTS</key>
|
||||||
|
<dict>
|
||||||
|
<key>NOTES</key>
|
||||||
|
<data>
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>PROJECT_PRESENTATION</key>
|
||||||
|
<dict>
|
||||||
|
<key>BACKGROUND</key>
|
||||||
|
<dict>
|
||||||
|
<key>APPAREANCES</key>
|
||||||
|
<dict>
|
||||||
|
<key>DARK_AQUA</key>
|
||||||
|
<dict/>
|
||||||
|
<key>LIGHT_AQUA</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
<key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>INSTALLATION TYPE</key>
|
||||||
|
<dict>
|
||||||
|
<key>HIERARCHIES</key>
|
||||||
|
<dict>
|
||||||
|
<key>INSTALLER</key>
|
||||||
|
<dict>
|
||||||
|
<key>LIST</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>DESCRIPTION</key>
|
||||||
|
<array/>
|
||||||
|
<key>OPTIONS</key>
|
||||||
|
<dict>
|
||||||
|
<key>HIDDEN</key>
|
||||||
|
<false/>
|
||||||
|
<key>STATE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PACKAGE_UUID</key>
|
||||||
|
<string>@MACOS_PACKAGE_UUID@</string>
|
||||||
|
<key>TITLE</key>
|
||||||
|
<array/>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>UUID</key>
|
||||||
|
<string>@MACOS_INSTALLER_UUID@</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>REMOVED</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>MODE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>INSTALLATION_STEPS</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewIntroductionController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>Introduction</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewReadMeController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>ReadMe</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewLicenseController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>License</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewDestinationSelectController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>TargetSelect</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewInstallationTypeController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>PackageSelection</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewInstallationController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>Install</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewSummaryController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>Summary</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>INTRODUCTION</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
<key>LICENSE</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
<key>MODE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>README</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
<key>SUMMARY</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
<key>TITLE</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>PROJECT_REQUIREMENTS</key>
|
||||||
|
<dict>
|
||||||
|
<key>LIST</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>BEHAVIOR</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
<key>DICTIONARY</key>
|
||||||
|
<dict>
|
||||||
|
<key>IC_REQUIREMENT_OS_DISK_TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>
|
||||||
|
<integer>101300</integer>
|
||||||
|
</dict>
|
||||||
|
<key>IC_REQUIREMENT_CHECK_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>IDENTIFIER</key>
|
||||||
|
<string>fr.whitebox.Packages.requirement.os</string>
|
||||||
|
<key>MESSAGE</key>
|
||||||
|
<array/>
|
||||||
|
<key>NAME</key>
|
||||||
|
<string>Operating System</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>RESOURCES</key>
|
||||||
|
<array/>
|
||||||
|
<key>ROOT_VOLUME_ONLY</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>PROJECT_SETTINGS</key>
|
||||||
|
<dict>
|
||||||
|
<key>ADVANCED_OPTIONS</key>
|
||||||
|
<dict>
|
||||||
|
<key>installer-script.domains:enable_currentUserHome</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<key>BUILD_FORMAT</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>BUILD_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>../@RELATIVE_BUILD_PATH@</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<key>EXCLUDED_FILES</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.DS_Store</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove .DS_Store files</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove ".DS_Store" files created by the Finder.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.pbdevelopment</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove .pbdevelopment files</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>CVS</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.cvsignore</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.cvspass</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.svn</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.git</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.gitignore</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove SCM metadata</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>classes.nib</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>designable.db</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>info.nib</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Optimize nib files</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>Resources Disabled</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove Resources Disabled folders</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove "Resources Disabled" folders.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>SEPARATOR</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NAME</key>
|
||||||
|
<string>@CMAKE_PROJECT_NAME@</string>
|
||||||
|
<key>PAYLOAD_ONLY</key>
|
||||||
|
<false/>
|
||||||
|
<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>VERSION</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
64
cmake/bundle/windows/installer-Windows.iss.in
Normal file
64
cmake/bundle/windows/installer-Windows.iss.in
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#define MyAppName "@CMAKE_PROJECT_NAME@"
|
||||||
|
#define MyAppVersion "@CMAKE_PROJECT_VERSION@"
|
||||||
|
#define MyAppPublisher "@PLUGIN_AUTHOR@"
|
||||||
|
#define MyAppURL "http://www.mywebsite.com"
|
||||||
|
|
||||||
|
[Setup]
|
||||||
|
; NOTE: The value of AppId uniquely identifies this application.
|
||||||
|
; Do not use the same AppId value in installers for other applications.
|
||||||
|
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
||||||
|
AppId={{@WINDOWS_INSTALLER_UUID@}
|
||||||
|
AppName={#MyAppName}
|
||||||
|
AppVersion={#MyAppVersion}
|
||||||
|
AppPublisher={#MyAppPublisher}
|
||||||
|
AppPublisherURL={#MyAppURL}
|
||||||
|
AppSupportURL={#MyAppURL}
|
||||||
|
AppUpdatesURL={#MyAppURL}
|
||||||
|
DefaultDirName={code:GetDirName}
|
||||||
|
DefaultGroupName={#MyAppName}
|
||||||
|
OutputBaseFilename={#MyAppName}-{#MyAppVersion}-Windows-Installer
|
||||||
|
Compression=lzma
|
||||||
|
SolidCompression=yes
|
||||||
|
DirExistsWarning=no
|
||||||
|
|
||||||
|
[Languages]
|
||||||
|
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||||
|
|
||||||
|
[Files]
|
||||||
|
Source: "..\release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||||
|
Source: "..\LICENSE"; Flags: dontcopy
|
||||||
|
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
|
||||||
|
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
|
||||||
|
|
||||||
|
[Code]
|
||||||
|
procedure InitializeWizard();
|
||||||
|
var
|
||||||
|
GPLText: AnsiString;
|
||||||
|
Page: TOutputMsgMemoWizardPage;
|
||||||
|
begin
|
||||||
|
ExtractTemporaryFile('LICENSE');
|
||||||
|
LoadStringFromFile(ExpandConstant('{tmp}\LICENSE'), GPLText);
|
||||||
|
Page := CreateOutputMsgMemoPage(wpWelcome,
|
||||||
|
'License Information', 'Please review the license terms before installing {#MyAppName}',
|
||||||
|
'Press Page Down to see the rest of the agreement. Once you are aware of your rights, click Next to continue.',
|
||||||
|
String(GPLText)
|
||||||
|
);
|
||||||
|
end;
|
||||||
|
|
||||||
|
// credit where it's due :
|
||||||
|
// following function come from https://github.com/Xaymar/obs-studio_amf-encoder-plugin/blob/master/%23Resources/Installer.in.iss#L45
|
||||||
|
function GetDirName(Value: string): string;
|
||||||
|
var
|
||||||
|
InstallPath: string;
|
||||||
|
begin
|
||||||
|
// initialize default path, which will be returned when the following registry
|
||||||
|
// key queries fail due to missing keys or for some different reason
|
||||||
|
Result := '{autopf}\obs-studio';
|
||||||
|
// query the first registry value; if this succeeds, return the obtained value
|
||||||
|
if RegQueryStringValue(HKLM32, 'SOFTWARE\OBS Studio', '', InstallPath) then
|
||||||
|
Result := InstallPath
|
||||||
|
end;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#include "src/headers/version.h"
|
#include "version.h"
|
||||||
#define GIT_SHA1 "@GIT_SHA1@"
|
#define GIT_SHA1 "@GIT_SHA1@"
|
||||||
#define GIT_TAG "@GIT_TAG@"
|
#define GIT_TAG "@GIT_TAG@"
|
||||||
const char g_GIT_SHA1[] = GIT_SHA1;
|
const char g_GIT_SHA1[] = GIT_SHA1;
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Save window position
|
|||||||
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Show system tray notifications"
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Show system tray notifications"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints"
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints"
|
||||||
AdvSceneSwitcher.generalTab.generalBehavior.hideLegacyTabs="Hide tabs which can be represented via macros"
|
AdvSceneSwitcher.generalTab.generalBehavior.hideLegacyTabs="Hide tabs which can be represented via macros"
|
||||||
|
AdvSceneSwitcher.generalTab.matchBehavior="Match behavior"
|
||||||
AdvSceneSwitcher.generalTab.priority="Priority"
|
AdvSceneSwitcher.generalTab.priority="Priority"
|
||||||
AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)"
|
AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)"
|
||||||
AdvSceneSwitcher.generalTab.priority.threadPriority="Use thread priority"
|
AdvSceneSwitcher.generalTab.priority.threadPriority="Use thread priority"
|
||||||
@@ -82,6 +83,12 @@ AdvSceneSwitcher.macroTab.minimize="Minimize"
|
|||||||
AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros"
|
AdvSceneSwitcher.macroTab.highlightExecutedMacros="Highlight recently executed macros"
|
||||||
AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently"
|
AdvSceneSwitcher.macroTab.highlightTrueConditions="Highlight conditions of currently selected macro that evaluated to true recently"
|
||||||
AdvSceneSwitcher.macroTab.highlightPerformedActions="Highlight recently performed actions of currently selected macro"
|
AdvSceneSwitcher.macroTab.highlightPerformedActions="Highlight recently performed actions of currently selected macro"
|
||||||
|
AdvSceneSwitcher.macroTab.newMacroRegisterHotkey="Register hotkeys to control pause state of new macros"
|
||||||
|
AdvSceneSwitcher.macroTab.currentDisableHotkeys="Register hotkeys to control pause state of selected macro"
|
||||||
|
|
||||||
|
; Macro List
|
||||||
|
AdvSceneSwitcher.macroList.deleted="deleted"
|
||||||
|
AdvSceneSwitcher.macroList.duplicate="\"%1\" is alreay selected!"
|
||||||
|
|
||||||
; Macro Logic
|
; Macro Logic
|
||||||
AdvSceneSwitcher.logic.none="Ignore entry"
|
AdvSceneSwitcher.logic.none="Ignore entry"
|
||||||
@@ -115,19 +122,23 @@ AdvSceneSwitcher.condition.scene.type.previous="Previous scene is"
|
|||||||
AdvSceneSwitcher.condition.scene.type.changed="Scene changed"
|
AdvSceneSwitcher.condition.scene.type.changed="Scene changed"
|
||||||
AdvSceneSwitcher.condition.scene.type.notChanged="Scene has not changed"
|
AdvSceneSwitcher.condition.scene.type.notChanged="Scene has not changed"
|
||||||
AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="During transition check for transition target scene"
|
AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="During transition check for transition target scene"
|
||||||
|
AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="During transition check for transition source scene"
|
||||||
AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}} {{scenes}}"
|
AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}} {{scenes}}"
|
||||||
AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}"
|
AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}"
|
||||||
AdvSceneSwitcher.condition.window="Window"
|
AdvSceneSwitcher.condition.window="Window"
|
||||||
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} exist and ..."
|
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} exist and ..."
|
||||||
AdvSceneSwitcher.condition.window.entry.line2="... is {{fullscreen}} fullscreen {{maximized}} maximized {{focused}} focused {{windowFocusChanged}} foreground window changed"
|
AdvSceneSwitcher.condition.window.entry.line2="... is {{fullscreen}} fullscreen {{maximized}} maximized {{focused}} focused {{windowFocusChanged}} foreground window changed"
|
||||||
AdvSceneSwitcher.condition.file="File"
|
AdvSceneSwitcher.condition.file="File"
|
||||||
AdvSceneSwitcher.condition.file.entry.line1="Content of {{fileType}} {{filePath}} matches:"
|
AdvSceneSwitcher.condition.file.type.match="matches"
|
||||||
|
AdvSceneSwitcher.condition.file.type.contentChange="content changed"
|
||||||
|
AdvSceneSwitcher.condition.file.type.dateChange="modification date changed"
|
||||||
|
AdvSceneSwitcher.condition.file.entry.line1="Content of{{fileType}}{{filePath}}{{conditions}}"
|
||||||
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
||||||
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
||||||
AdvSceneSwitcher.condition.media="Media"
|
AdvSceneSwitcher.condition.media="Media"
|
||||||
AdvSceneSwitcher.condition.media.anyOnScene="Any media source on"
|
AdvSceneSwitcher.condition.media.anyOnScene="Any media source on"
|
||||||
AdvSceneSwitcher.condition.media.allOnScene="All media sources on"
|
AdvSceneSwitcher.condition.media.allOnScene="All media sources on"
|
||||||
AdvSceneSwitcher.condition.media.matchOnChange="Only match on change (Note: This option will be removed in a future version - please use time constraints instead)"
|
AdvSceneSwitcher.condition.media.matchOnChange="Only match on change (Note: This option will be removed in a future version - please use duration modifiers instead)"
|
||||||
AdvSceneSwitcher.condition.media.inconsistencyInfo="Unfortunately not all media source types behave the same (e.g. Media Source vs. VLC Video Source \"Stopped\" state).\nSo please experiment what works for your setup!"
|
AdvSceneSwitcher.condition.media.inconsistencyInfo="Unfortunately not all media source types behave the same (e.g. Media Source vs. VLC Video Source \"Stopped\" state).\nSo please experiment what works for your setup!"
|
||||||
AdvSceneSwitcher.condition.media.entry="{{mediaSources}}{{scenes}} state is {{states}} and {{timeRestrictions}} {{time}}"
|
AdvSceneSwitcher.condition.media.entry="{{mediaSources}}{{scenes}} state is {{states}} and {{timeRestrictions}} {{time}}"
|
||||||
AdvSceneSwitcher.condition.video="Video"
|
AdvSceneSwitcher.condition.video="Video"
|
||||||
@@ -141,6 +152,8 @@ AdvSceneSwitcher.condition.video.condition.object="contains object"
|
|||||||
AdvSceneSwitcher.condition.video.askFileAction="Do you want to use an existing file or create a screenshot of the currently selected source?"
|
AdvSceneSwitcher.condition.video.askFileAction="Do you want to use an existing file or create a screenshot of the currently selected source?"
|
||||||
AdvSceneSwitcher.condition.video.askFileAction.file="Use existing file"
|
AdvSceneSwitcher.condition.video.askFileAction.file="Use existing file"
|
||||||
AdvSceneSwitcher.condition.video.askFileAction.screenshot="Create screenshot"
|
AdvSceneSwitcher.condition.video.askFileAction.screenshot="Create screenshot"
|
||||||
|
AdvSceneSwitcher.condition.video.reduceLatency="Reduce matching latency"
|
||||||
|
AdvSceneSwitcher.condition.video.reduceLatency.tooltip="Enabling will reduce the matching latency, but will slow down the condition checks of all macros overall."
|
||||||
AdvSceneSwitcher.condition.video.usePatternForChangedCheck="Use pattern matching"
|
AdvSceneSwitcher.condition.video.usePatternForChangedCheck="Use pattern matching"
|
||||||
AdvSceneSwitcher.condition.video.usePatternForChangedCheck.tooltip="This will allow you to control how much the image has to change for the condition to be true."
|
AdvSceneSwitcher.condition.video.usePatternForChangedCheck.tooltip="This will allow you to control how much the image has to change for the condition to be true."
|
||||||
AdvSceneSwitcher.condition.video.patternThreshold="Threshold: "
|
AdvSceneSwitcher.condition.video.patternThreshold="Threshold: "
|
||||||
@@ -162,7 +175,8 @@ AdvSceneSwitcher.condition.video.entry="{{videoSources}} {{condition}} {{imagePa
|
|||||||
AdvSceneSwitcher.condition.video.entry.modelPath="Model data (haar cascade classifier): {{modelDataPath}}"
|
AdvSceneSwitcher.condition.video.entry.modelPath="Model data (haar cascade classifier): {{modelDataPath}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.minNeighbor="Minimum neighbors: {{minNeighbors}}"
|
AdvSceneSwitcher.condition.video.entry.minNeighbor="Minimum neighbors: {{minNeighbors}}"
|
||||||
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduce CPU load by performing check only every {{throttleCount}} milliseconds"
|
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduce CPU load by performing check only every {{throttleCount}} milliseconds"
|
||||||
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}Perform check only in area {{checkArea}} {{selectArea}}"
|
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Perform check only in area"
|
||||||
|
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}"
|
||||||
AdvSceneSwitcher.condition.video.minSize="Minimum size:"
|
AdvSceneSwitcher.condition.video.minSize="Minimum size:"
|
||||||
AdvSceneSwitcher.condition.video.maxSize="Maximum size:"
|
AdvSceneSwitcher.condition.video.maxSize="Maximum size:"
|
||||||
AdvSceneSwitcher.condition.video.selectArea="Select area"
|
AdvSceneSwitcher.condition.video.selectArea="Select area"
|
||||||
@@ -202,20 +216,24 @@ AdvSceneSwitcher.condition.timer.reset="Reset"
|
|||||||
AdvSceneSwitcher.condition.macro="Macro"
|
AdvSceneSwitcher.condition.macro="Macro"
|
||||||
AdvSceneSwitcher.condition.macro.type.count="Count"
|
AdvSceneSwitcher.condition.macro.type.count="Count"
|
||||||
AdvSceneSwitcher.condition.macro.type.state="State"
|
AdvSceneSwitcher.condition.macro.type.state="State"
|
||||||
|
AdvSceneSwitcher.condition.macro.type.multiState="Multiple states"
|
||||||
AdvSceneSwitcher.condition.macro.type.selection="Condition type: {{types}}"
|
AdvSceneSwitcher.condition.macro.type.selection="Condition type: {{types}}"
|
||||||
AdvSceneSwitcher.condition.macro.count.type.below="Less than"
|
AdvSceneSwitcher.condition.macro.count.type.below="Less than"
|
||||||
AdvSceneSwitcher.condition.macro.count.type.above="More than"
|
AdvSceneSwitcher.condition.macro.count.type.above="More than"
|
||||||
AdvSceneSwitcher.condition.macro.count.type.equal="Exactly"
|
AdvSceneSwitcher.condition.macro.count.type.equal="Exactly"
|
||||||
|
AdvSceneSwitcher.condition.macro.state.type.below="Less than"
|
||||||
|
AdvSceneSwitcher.condition.macro.state.type.above="More than"
|
||||||
|
AdvSceneSwitcher.condition.macro.state.type.equal="Exactly"
|
||||||
AdvSceneSwitcher.condition.macro.count.reset="Reset"
|
AdvSceneSwitcher.condition.macro.count.reset="Reset"
|
||||||
AdvSceneSwitcher.condition.macro.pausedWarning="Selected macro is currently paused!"
|
AdvSceneSwitcher.condition.macro.pausedWarning="Selected macro is currently paused!"
|
||||||
AdvSceneSwitcher.condition.macro.state.entry="Conditions of {{macros}} are true"
|
AdvSceneSwitcher.condition.macro.state.entry="Conditions of {{macros}} are true"
|
||||||
|
AdvSceneSwitcher.condition.macro.multistate.entry="Conditions of {{multiStateConditions}}{{multiStateCount}} of the following macros are true:"
|
||||||
AdvSceneSwitcher.condition.macro.count.entry.line1="{{macros}} was executed {{conditions}} {{count}} times"
|
AdvSceneSwitcher.condition.macro.count.entry.line1="{{macros}} was executed {{conditions}} {{count}} times"
|
||||||
AdvSceneSwitcher.condition.macro.count.entry.line2="Current count: {{currentCount}} {{resetCount}}"
|
AdvSceneSwitcher.condition.macro.count.entry.line2="Current count: {{currentCount}} {{resetCount}}"
|
||||||
AdvSceneSwitcher.condition.source="Source"
|
AdvSceneSwitcher.condition.source="Source"
|
||||||
AdvSceneSwitcher.condition.source.type.active="Is active"
|
AdvSceneSwitcher.condition.source.type.active="Is active"
|
||||||
AdvSceneSwitcher.condition.source.type.showing="Is showing"
|
AdvSceneSwitcher.condition.source.type.showing="Is showing"
|
||||||
AdvSceneSwitcher.condition.source.type.settings="Settings match"
|
AdvSceneSwitcher.condition.source.type.settings="Settings match"
|
||||||
AdvSceneSwitcher.condition.source.regex="Use regular expressions"
|
|
||||||
AdvSceneSwitcher.condition.source.getSettings="Get current settings"
|
AdvSceneSwitcher.condition.source.getSettings="Get current settings"
|
||||||
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
|
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
|
||||||
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
|
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
|
||||||
@@ -228,7 +246,6 @@ AdvSceneSwitcher.condition.filter="Filter"
|
|||||||
AdvSceneSwitcher.condition.filter.type.active="Is enabled"
|
AdvSceneSwitcher.condition.filter.type.active="Is enabled"
|
||||||
AdvSceneSwitcher.condition.filter.type.showing="Is disabled"
|
AdvSceneSwitcher.condition.filter.type.showing="Is disabled"
|
||||||
AdvSceneSwitcher.condition.filter.type.settings="Settings match"
|
AdvSceneSwitcher.condition.filter.type.settings="Settings match"
|
||||||
AdvSceneSwitcher.condition.filter.regex="Use regular expressions"
|
|
||||||
AdvSceneSwitcher.condition.filter.getSettings="Get current settings"
|
AdvSceneSwitcher.condition.filter.getSettings="Get current settings"
|
||||||
AdvSceneSwitcher.condition.filter.entry.line1="On {{sources}} {{filters}} {{conditions}}"
|
AdvSceneSwitcher.condition.filter.entry.line1="On {{sources}} {{filters}} {{conditions}}"
|
||||||
AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}"
|
AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}"
|
||||||
@@ -267,12 +284,13 @@ AdvSceneSwitcher.condition.date.ignoreDate="If unchecked the date component will
|
|||||||
AdvSceneSwitcher.condition.date.ignoreTime="If unchecked the time component will be ignored"
|
AdvSceneSwitcher.condition.date.ignoreTime="If unchecked the time component will be ignored"
|
||||||
AdvSceneSwitcher.condition.date.showAdvancedSettings="Show advanced settings"
|
AdvSceneSwitcher.condition.date.showAdvancedSettings="Show advanced settings"
|
||||||
AdvSceneSwitcher.condition.date.showSimpleSettings="Show simple settings"
|
AdvSceneSwitcher.condition.date.showSimpleSettings="Show simple settings"
|
||||||
AdvSceneSwitcher.condition.date.entry.simple="On {{dayOfWeek}} at {{weekTime}}"
|
AdvSceneSwitcher.condition.date.entry.simple="On {{dayOfWeek}} {{weekCondition}} {{ignoreWeekTime}}{{weekTime}}"
|
||||||
AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}"
|
AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}"
|
||||||
AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} Repeat every {{duration}} on date match"
|
AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} Repeat every {{duration}} on date match"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.nextMatchDate="Next match at: %1"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}} On repeat update selected date to repeat date"
|
||||||
AdvSceneSwitcher.condition.sceneTransform="Scene item transform"
|
AdvSceneSwitcher.condition.sceneTransform="Scene item transform"
|
||||||
AdvSceneSwitcher.condition.sceneTransform.getTransform="Get transform"
|
AdvSceneSwitcher.condition.sceneTransform.getTransform="Get transform"
|
||||||
AdvSceneSwitcher.condition.sceneTransform.regex="Use regular expressions"
|
|
||||||
AdvSceneSwitcher.condition.sceneTransform.entry.line1="On{{scenes}}{{sources}}matches transform"
|
AdvSceneSwitcher.condition.sceneTransform.entry.line1="On{{scenes}}{{sources}}matches transform"
|
||||||
AdvSceneSwitcher.condition.sceneTransform.entry.line2="{{settings}}"
|
AdvSceneSwitcher.condition.sceneTransform.entry.line2="{{settings}}"
|
||||||
AdvSceneSwitcher.condition.sceneTransform.entry.line3="{{regex}} {{getSettings}}"
|
AdvSceneSwitcher.condition.sceneTransform.entry.line3="{{regex}} {{getSettings}}"
|
||||||
@@ -295,7 +313,7 @@ AdvSceneSwitcher.condition.studioMode.state.notActive="Studio mode is not active
|
|||||||
AdvSceneSwitcher.condition.studioMode.state.previewScene="Preview scene is"
|
AdvSceneSwitcher.condition.studioMode.state.previewScene="Preview scene is"
|
||||||
AdvSceneSwitcher.condition.studioMode.entry="{{conditions}}{{scenes}}"
|
AdvSceneSwitcher.condition.studioMode.entry="{{conditions}}{{scenes}}"
|
||||||
AdvSceneSwitcher.condition.openvr="OpenVR"
|
AdvSceneSwitcher.condition.openvr="OpenVR"
|
||||||
AdvSceneSwitcher.condition.errorStatus="OpenVR error: "
|
AdvSceneSwitcher.condition.openvr.errorStatus="OpenVR error: "
|
||||||
AdvSceneSwitcher.condition.openvr.entry.line1="HMD is in ..."
|
AdvSceneSwitcher.condition.openvr.entry.line1="HMD is in ..."
|
||||||
AdvSceneSwitcher.condition.openvr.entry.line2="{{controls}}"
|
AdvSceneSwitcher.condition.openvr.entry.line2="{{controls}}"
|
||||||
AdvSceneSwitcher.condition.openvr.entry.line3="HMD is currently at {{xPos}} x {{yPos}} x {{zPos}}"
|
AdvSceneSwitcher.condition.openvr.entry.line3="HMD is currently at {{xPos}} x {{yPos}} x {{zPos}}"
|
||||||
@@ -318,10 +336,28 @@ AdvSceneSwitcher.condition.stats.condition.equals="equal to"
|
|||||||
AdvSceneSwitcher.condition.stats.condition.below="below"
|
AdvSceneSwitcher.condition.stats.condition.below="below"
|
||||||
AdvSceneSwitcher.condition.stats.dockHint="You can open the \"Stats\" dock to view the current status"
|
AdvSceneSwitcher.condition.stats.dockHint="You can open the \"Stats\" dock to view the current status"
|
||||||
AdvSceneSwitcher.condition.stats.entry="{{stats}} is {{condition}} {{value}}"
|
AdvSceneSwitcher.condition.stats.entry="{{stats}} is {{condition}} {{value}}"
|
||||||
|
AdvSceneSwitcher.condition.profile="Profile"
|
||||||
|
AdvSceneSwitcher.condition.profile.entry="Current active profile is {{profiles}}"
|
||||||
|
AdvSceneSwitcher.condition.websocket="Websocket"
|
||||||
|
AdvSceneSwitcher.condition.websocket.type.request="Request"
|
||||||
|
AdvSceneSwitcher.condition.websocket.type.event="Event"
|
||||||
|
AdvSceneSwitcher.condition.websocket.useRegex="Use regular expressions"
|
||||||
|
AdvSceneSwitcher.condition.websocket.entry.request="{{type}} was received:"
|
||||||
|
AdvSceneSwitcher.condition.websocket.entry.event="{{type}} was received from {{connection}}:"
|
||||||
|
AdvSceneSwitcher.condition.variable="Variable"
|
||||||
|
AdvSceneSwitcher.condition.variable.type.compare="equals"
|
||||||
|
AdvSceneSwitcher.condition.variable.type.empty="is empty"
|
||||||
|
AdvSceneSwitcher.condition.variable.type.number="is a number"
|
||||||
|
AdvSceneSwitcher.condition.variable.type.lessThan="is less than"
|
||||||
|
AdvSceneSwitcher.condition.variable.type.greaterThan="is greater than"
|
||||||
|
AdvSceneSwitcher.condition.variable.type.valueChanged="value changed"
|
||||||
|
AdvSceneSwitcher.condition.variable.regex="Use regular expressions"
|
||||||
|
AdvSceneSwitcher.condition.variable.entry="{{variables}}{{conditions}}{{strValue}}{{numValue}}"
|
||||||
|
|
||||||
; Macro Actions
|
; Macro Actions
|
||||||
AdvSceneSwitcher.action.switchScene="Switch scene"
|
AdvSceneSwitcher.action.switchScene="Switch scene"
|
||||||
AdvSceneSwitcher.action.scene.entry="Switch to scene {{scenes}} using {{transitions}} with a duration of {{duration}} seconds"
|
AdvSceneSwitcher.action.scene.entry="Switch to scene{{scenes}}using{{transitions}}with a duration of{{duration}}seconds"
|
||||||
|
AdvSceneSwitcher.action.scene.entry.noDuration="Switch to scene{{scenes}}using{{transitions}}"
|
||||||
AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Wait until transition to target scene is complete"
|
AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Wait until transition to target scene is complete"
|
||||||
AdvSceneSwitcher.action.wait="Wait"
|
AdvSceneSwitcher.action.wait="Wait"
|
||||||
AdvSceneSwitcher.action.wait.type.fixed="fixed"
|
AdvSceneSwitcher.action.wait.type.fixed="fixed"
|
||||||
@@ -345,9 +381,12 @@ AdvSceneSwitcher.action.recording.type.stop="Stop recording"
|
|||||||
AdvSceneSwitcher.action.recording.type.start="Start recording"
|
AdvSceneSwitcher.action.recording.type.start="Start recording"
|
||||||
AdvSceneSwitcher.action.recording.type.pause="Pause recording"
|
AdvSceneSwitcher.action.recording.type.pause="Pause recording"
|
||||||
AdvSceneSwitcher.action.recording.type.unpause="Unpause recording"
|
AdvSceneSwitcher.action.recording.type.unpause="Unpause recording"
|
||||||
|
AdvSceneSwitcher.action.recording.type.split="Split recording file"
|
||||||
AdvSceneSwitcher.action.recording.pause.hint="Note that depending on your recording settings you might not be able to pause recording"
|
AdvSceneSwitcher.action.recording.pause.hint="Note that depending on your recording settings you might not be able to pause recording"
|
||||||
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}"
|
AdvSceneSwitcher.action.recording.split.hint="Make sure to enable automatic file splitting in the OBS settings first!"
|
||||||
|
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}{{splitHint}}"
|
||||||
AdvSceneSwitcher.action.replay="Replay buffer"
|
AdvSceneSwitcher.action.replay="Replay buffer"
|
||||||
|
AdvSceneSwitcher.action.replay.saveWarn="Warning: Saving too frequently might result in the replay buffer not actually being saved!"
|
||||||
AdvSceneSwitcher.action.replay.type.stop="Stop replay buffer"
|
AdvSceneSwitcher.action.replay.type.stop="Stop replay buffer"
|
||||||
AdvSceneSwitcher.action.replay.type.start="Start replay buffer"
|
AdvSceneSwitcher.action.replay.type.start="Start replay buffer"
|
||||||
AdvSceneSwitcher.action.replay.type.save="Save replay buffer"
|
AdvSceneSwitcher.action.replay.type.save="Save replay buffer"
|
||||||
@@ -377,6 +416,8 @@ AdvSceneSwitcher.action.source="Source"
|
|||||||
AdvSceneSwitcher.action.source.type.enable="Enable"
|
AdvSceneSwitcher.action.source.type.enable="Enable"
|
||||||
AdvSceneSwitcher.action.source.type.disable="Disable"
|
AdvSceneSwitcher.action.source.type.disable="Disable"
|
||||||
AdvSceneSwitcher.action.source.type.settings="Set settings"
|
AdvSceneSwitcher.action.source.type.settings="Set settings"
|
||||||
|
AdvSceneSwitcher.action.source.type.refreshSettings="Refresh source settings"
|
||||||
|
AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Can be used to refresh browser, media, etc. sources"
|
||||||
AdvSceneSwitcher.action.source.entry="{{actions}} {{sources}}"
|
AdvSceneSwitcher.action.source.entry="{{actions}} {{sources}}"
|
||||||
AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI"
|
AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI"
|
||||||
AdvSceneSwitcher.action.source.getSettings="Get current settings"
|
AdvSceneSwitcher.action.source.getSettings="Get current settings"
|
||||||
@@ -432,13 +473,20 @@ AdvSceneSwitcher.action.file="File"
|
|||||||
AdvSceneSwitcher.action.file.type.write="Write"
|
AdvSceneSwitcher.action.file.type.write="Write"
|
||||||
AdvSceneSwitcher.action.file.type.append="Append"
|
AdvSceneSwitcher.action.file.type.append="Append"
|
||||||
AdvSceneSwitcher.action.file.entry="{{actions}} to {{filePath}}:"
|
AdvSceneSwitcher.action.file.entry="{{actions}} to {{filePath}}:"
|
||||||
AdvSceneSwitcher.action.previewScene="Switch preview scene"
|
AdvSceneSwitcher.action.studioMode="Studio mode"
|
||||||
AdvSceneSwitcher.action.previewScene.entry="Switch preview scene to {{scenes}}"
|
AdvSceneSwitcher.action.studioMode.type.swap="Swap preview and program scene"
|
||||||
AdvSceneSwitcher.action.SceneSwap="Swap scene (Studio mode)"
|
AdvSceneSwitcher.action.studioMode.type.setScene="Set preview scene to"
|
||||||
AdvSceneSwitcher.action.SceneSwap.entry="Swap preview and program scene in studio mode"
|
AdvSceneSwitcher.action.studioMode.type.enable="Enable studio mode"
|
||||||
|
AdvSceneSwitcher.action.studioMode.type.disable="Disable studio mode"
|
||||||
|
AdvSceneSwitcher.action.studioMode.entry="{{actions}}{{scenes}}"
|
||||||
AdvSceneSwitcher.action.transition="Transition"
|
AdvSceneSwitcher.action.transition="Transition"
|
||||||
AdvSceneSwitcher.action.transition.entry.line1="{{setType}}Set transition type to {{transitions}}"
|
AdvSceneSwitcher.action.transition.type.scene="scene transition"
|
||||||
AdvSceneSwitcher.action.transition.entry.line2="{{setDuration}}Set transition duration to {{duration}}seconds"
|
AdvSceneSwitcher.action.transition.type.sceneOverride="scene transition override"
|
||||||
|
AdvSceneSwitcher.action.transition.type.sourceShow="source show transition"
|
||||||
|
AdvSceneSwitcher.action.transition.type.sourceHide="source hide transition"
|
||||||
|
AdvSceneSwitcher.action.transition.entry.line1="Modify {{type}}{{scenes}}{{sources}}"
|
||||||
|
AdvSceneSwitcher.action.transition.entry.line2="{{setTransition}}Set transition type to {{transitions}}"
|
||||||
|
AdvSceneSwitcher.action.transition.entry.line3="{{setDuration}}Set transition duration to {{duration}}seconds"
|
||||||
AdvSceneSwitcher.action.timer="Timer"
|
AdvSceneSwitcher.action.timer="Timer"
|
||||||
AdvSceneSwitcher.action.timer.type.pause="Pause"
|
AdvSceneSwitcher.action.timer.type.pause="Pause"
|
||||||
AdvSceneSwitcher.action.timer.type.continue="Continue"
|
AdvSceneSwitcher.action.timer.type.continue="Continue"
|
||||||
@@ -450,8 +498,13 @@ AdvSceneSwitcher.action.random.entry="Randomly run any of the following macros (
|
|||||||
AdvSceneSwitcher.action.systray="System tray notification"
|
AdvSceneSwitcher.action.systray="System tray notification"
|
||||||
AdvSceneSwitcher.action.systray.entry="Show notification: {{message}}"
|
AdvSceneSwitcher.action.systray.entry="Show notification: {{message}}"
|
||||||
AdvSceneSwitcher.action.screenshot="Screenshot"
|
AdvSceneSwitcher.action.screenshot="Screenshot"
|
||||||
|
AdvSceneSwitcher.action.screenshot.save.default="Default"
|
||||||
|
AdvSceneSwitcher.action.screenshot.save.custom="Custom"
|
||||||
|
AdvSceneSwitcher.action.screenshot.type.source="Source"
|
||||||
|
AdvSceneSwitcher.action.screenshot.type.scene="Scene"
|
||||||
AdvSceneSwitcher.action.screenshot.mainOutput="OBS's main output"
|
AdvSceneSwitcher.action.screenshot.mainOutput="OBS's main output"
|
||||||
AdvSceneSwitcher.action.screenshot.entry="Screenshot {{sources}}"
|
AdvSceneSwitcher.action.screenshot.blackscreenNote="Sources or scenes, which are not always rendered, may result in some parts of screenshots to remain blank."
|
||||||
|
AdvSceneSwitcher.action.screenshot.entry="Screenshot{{targetType}}{{sources}}{{scenes}}and save to{{saveType}}location"
|
||||||
AdvSceneSwitcher.action.profile="Profile"
|
AdvSceneSwitcher.action.profile="Profile"
|
||||||
AdvSceneSwitcher.action.profile.entry="Switch active profile to {{profiles}}"
|
AdvSceneSwitcher.action.profile.entry="Switch active profile to {{profiles}}"
|
||||||
AdvSceneSwitcher.action.sceneCollection="Scene collection"
|
AdvSceneSwitcher.action.sceneCollection="Scene collection"
|
||||||
@@ -463,6 +516,24 @@ AdvSceneSwitcher.action.sequence.status="Last executed macro: %1 - Next macro to
|
|||||||
AdvSceneSwitcher.action.sequence.status.none="none"
|
AdvSceneSwitcher.action.sequence.status.none="none"
|
||||||
AdvSceneSwitcher.action.sequence.restart="Restart from beginning once end of list is reached"
|
AdvSceneSwitcher.action.sequence.restart="Restart from beginning once end of list is reached"
|
||||||
AdvSceneSwitcher.action.sequence.continueFrom="Continue with selected item"
|
AdvSceneSwitcher.action.sequence.continueFrom="Continue with selected item"
|
||||||
|
AdvSceneSwitcher.action.websocket="Websocket"
|
||||||
|
AdvSceneSwitcher.action.websocket.type.request="Request"
|
||||||
|
AdvSceneSwitcher.action.websocket.type.event="Event"
|
||||||
|
AdvSceneSwitcher.action.websocket.entry.request="Send scene switcher {{type}} via {{connection}}"
|
||||||
|
AdvSceneSwitcher.action.websocket.entry.event="Send scene switcher {{type}} to connected clients"
|
||||||
|
AdvSceneSwitcher.action.http="Http"
|
||||||
|
AdvSceneSwitcher.action.http.type.get="GET"
|
||||||
|
AdvSceneSwitcher.action.http.type.post="POST"
|
||||||
|
AdvSceneSwitcher.action.http.entry.line1="Send {{method}} to {{url}}"
|
||||||
|
AdvSceneSwitcher.action.http.entry.line2="Timeout: {{timeout}} seconds"
|
||||||
|
AdvSceneSwitcher.action.variable="Variable"
|
||||||
|
AdvSceneSwitcher.action.variable.type.set="Set"
|
||||||
|
AdvSceneSwitcher.action.variable.type.append="Append"
|
||||||
|
AdvSceneSwitcher.action.variable.type.appendVar="Append variable"
|
||||||
|
AdvSceneSwitcher.action.variable.type.increment="Increment"
|
||||||
|
AdvSceneSwitcher.action.variable.type.decrement="Decrement"
|
||||||
|
AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}"
|
||||||
|
|
||||||
|
|
||||||
; Transition Tab
|
; Transition Tab
|
||||||
AdvSceneSwitcher.transitionTab.title="Transition"
|
AdvSceneSwitcher.transitionTab.title="Transition"
|
||||||
@@ -718,9 +789,51 @@ AdvSceneSwitcher.askForMacro="Select macro {{macroSelection}}"
|
|||||||
AdvSceneSwitcher.close="Close"
|
AdvSceneSwitcher.close="Close"
|
||||||
AdvSceneSwitcher.browse="Browse"
|
AdvSceneSwitcher.browse="Browse"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.item.select="--select item--"
|
||||||
|
AdvSceneSwitcher.item.add="Add new item"
|
||||||
|
AdvSceneSwitcher.item.rename="Rename"
|
||||||
|
AdvSceneSwitcher.item.remove="Remove"
|
||||||
|
AdvSceneSwitcher.item.properties="Properties"
|
||||||
|
AdvSceneSwitcher.item.newName="New name:"
|
||||||
|
AdvSceneSwitcher.item.emptyName="Empty name not allowed!"
|
||||||
|
AdvSceneSwitcher.item.nameNotAvailable="Name not available!"
|
||||||
|
AdvSceneSwitcher.item.nameReserved="Name reserved!"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.variable.select="--select variable--"
|
||||||
|
AdvSceneSwitcher.variable.add="Add new variable"
|
||||||
|
AdvSceneSwitcher.variable.name="Name:"
|
||||||
|
AdvSceneSwitcher.variable.value="Current value:"
|
||||||
|
AdvSceneSwitcher.variable.save="Save / load behavior"
|
||||||
|
AdvSceneSwitcher.variable.save.dontSave="Don't save variable value"
|
||||||
|
AdvSceneSwitcher.variable.save.save="Save variable value"
|
||||||
|
AdvSceneSwitcher.variable.save.default="Set to value"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.connection.select="--select connection--"
|
||||||
|
AdvSceneSwitcher.connection.add="Add new connection"
|
||||||
|
AdvSceneSwitcher.connection.name="Name:"
|
||||||
|
AdvSceneSwitcher.connection.address="Address:"
|
||||||
|
AdvSceneSwitcher.connection.port="Port:"
|
||||||
|
AdvSceneSwitcher.connection.password="Password:"
|
||||||
|
AdvSceneSwitcher.connection.reconnect="Reconnect automatically:"
|
||||||
|
AdvSceneSwitcher.connection.reconnectDelay="Automatically reconnect after:"
|
||||||
|
AdvSceneSwitcher.connection.connectOnStart="Connect on startup:"
|
||||||
|
AdvSceneSwitcher.connection.test="Test connection"
|
||||||
|
AdvSceneSwitcher.connection.status.disconnected="Disconnected"
|
||||||
|
AdvSceneSwitcher.connection.status.connecting="Connecting"
|
||||||
|
AdvSceneSwitcher.connection.status.connected="Connected, but not authenticated"
|
||||||
|
AdvSceneSwitcher.connection.status.authenticated="Connected and authenticated"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.regex.enable="Enable regular expressions"
|
||||||
|
AdvSceneSwitcher.regex.partialMatch="Allow partial match"
|
||||||
|
AdvSceneSwitcher.regex.caseInsensitive="Match case insensitive"
|
||||||
|
AdvSceneSwitcher.regex.dotMatchNewline=". matches newlines"
|
||||||
|
AdvSceneSwitcher.regex.multiLine="^ and $ match start/end of line"
|
||||||
|
AdvSceneSwitcher.regex.extendedPattern="Enable Qt's ExtendedPatternSyntax"
|
||||||
|
|
||||||
AdvSceneSwitcher.selectScene="--select scene--"
|
AdvSceneSwitcher.selectScene="--select scene--"
|
||||||
AdvSceneSwitcher.selectPreviousScene="Previous Scene"
|
AdvSceneSwitcher.selectPreviousScene="Previous Scene"
|
||||||
AdvSceneSwitcher.selectCurrentScene="Current Scene"
|
AdvSceneSwitcher.selectCurrentScene="Current Scene"
|
||||||
|
AdvSceneSwitcher.selectPreviewScene="Preview Scene"
|
||||||
AdvSceneSwitcher.selectAnyScene="Any Scene"
|
AdvSceneSwitcher.selectAnyScene="Any Scene"
|
||||||
AdvSceneSwitcher.currentTransition="Current Transition"
|
AdvSceneSwitcher.currentTransition="Current Transition"
|
||||||
AdvSceneSwitcher.anyTransition="Any Transition"
|
AdvSceneSwitcher.anyTransition="Any Transition"
|
||||||
@@ -729,7 +842,7 @@ AdvSceneSwitcher.selectWindow="--select window--"
|
|||||||
AdvSceneSwitcher.selectSource="--select source--"
|
AdvSceneSwitcher.selectSource="--select source--"
|
||||||
AdvSceneSwitcher.selectAudioSource="--select audio source--"
|
AdvSceneSwitcher.selectAudioSource="--select audio source--"
|
||||||
AdvSceneSwitcher.selectVideoSource="--select video source--"
|
AdvSceneSwitcher.selectVideoSource="--select video source--"
|
||||||
AdvSceneSwitcher.OBSVideoOutput="OBS video output"
|
AdvSceneSwitcher.OBSVideoOutput="OBS's main output"
|
||||||
AdvSceneSwitcher.selectMediaSource="--select media source--"
|
AdvSceneSwitcher.selectMediaSource="--select media source--"
|
||||||
AdvSceneSwitcher.selectProcess="--select process--"
|
AdvSceneSwitcher.selectProcess="--select process--"
|
||||||
AdvSceneSwitcher.selectFilter="--select filter--"
|
AdvSceneSwitcher.selectFilter="--select filter--"
|
||||||
@@ -739,6 +852,7 @@ AdvSceneSwitcher.selectProfile="--select profile--"
|
|||||||
AdvSceneSwitcher.selectSceneCollection="--select scene collection--"
|
AdvSceneSwitcher.selectSceneCollection="--select scene collection--"
|
||||||
AdvSceneSwitcher.enterPath="--enter path--"
|
AdvSceneSwitcher.enterPath="--enter path--"
|
||||||
AdvSceneSwitcher.enterText="--enter text--"
|
AdvSceneSwitcher.enterText="--enter text--"
|
||||||
|
AdvSceneSwitcher.enterURL="--enter URL--"
|
||||||
AdvSceneSwitcher.invaildEntriesWillNotBeSaved="invalid entries will not be saved"
|
AdvSceneSwitcher.invaildEntriesWillNotBeSaved="invalid entries will not be saved"
|
||||||
AdvSceneSwitcher.selectWindowTip="Use \"OBS\" to specify OBS window\nUse \"Task Switching\"to specify ALT + TAB"
|
AdvSceneSwitcher.selectWindowTip="Use \"OBS\" to specify OBS window\nUse \"Task Switching\"to specify ALT + TAB"
|
||||||
AdvSceneSwitcher.sceneItemSelection.all="All"
|
AdvSceneSwitcher.sceneItemSelection.all="All"
|
||||||
@@ -757,7 +871,8 @@ AdvSceneSwitcher.unit.milliseconds="milliseconds"
|
|||||||
AdvSceneSwitcher.unit.secends="seconds"
|
AdvSceneSwitcher.unit.secends="seconds"
|
||||||
AdvSceneSwitcher.unit.minutes="minutes"
|
AdvSceneSwitcher.unit.minutes="minutes"
|
||||||
AdvSceneSwitcher.unit.hours="hours"
|
AdvSceneSwitcher.unit.hours="hours"
|
||||||
AdvSceneSwitcher.duration.condition.none="No time constraint"
|
AdvSceneSwitcher.duration.condition.none="No duration modifier"
|
||||||
AdvSceneSwitcher.duration.condition.more="For at least"
|
AdvSceneSwitcher.duration.condition.more="For at least"
|
||||||
AdvSceneSwitcher.duration.condition.equal="For exactly"
|
AdvSceneSwitcher.duration.condition.equal="For exactly"
|
||||||
AdvSceneSwitcher.duration.condition.less="For at most"
|
AdvSceneSwitcher.duration.condition.less="For at most"
|
||||||
|
AdvSceneSwitcher.duration.condition.within="Within the last"
|
||||||
|
|||||||
778
data/locale/es-ES.ini
Normal file
778
data/locale/es-ES.ini
Normal file
@@ -0,0 +1,778 @@
|
|||||||
|
AdvSceneSwitcher.pluginName="Advanced Scene Switcher"
|
||||||
|
AdvSceneSwitcher.windowTitle="Advanced Scene Switcher"
|
||||||
|
|
||||||
|
; General Tab
|
||||||
|
AdvSceneSwitcher.generalTab.title="General"
|
||||||
|
AdvSceneSwitcher.generalTab.status="Estado"
|
||||||
|
AdvSceneSwitcher.generalTab.status.hotkeytips="Los atajos pueden ser definidos en los ajustes de OBS"
|
||||||
|
AdvSceneSwitcher.generalTab.status.currentStatus="Advanced Scene Switcher está:"
|
||||||
|
AdvSceneSwitcher.generalTab.status.onStartup="Al iniciar OBS:"
|
||||||
|
AdvSceneSwitcher.generalTab.status.onStartup.asLastRun="Empezar el selector de escenas si no estaba iniciado"
|
||||||
|
AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Siempre iniciar el selector de escenas"
|
||||||
|
AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="No iniciar el selector de escenas"
|
||||||
|
AdvSceneSwitcher.generalTab.status.start="Iniciar"
|
||||||
|
AdvSceneSwitcher.generalTab.status.stop="Detener"
|
||||||
|
AdvSceneSwitcher.generalTab.status.autoStart="Iniciar automáticamente el selector de escenas cuando:"
|
||||||
|
AdvSceneSwitcher.generalTab.status.autoStart.never="Nunca"
|
||||||
|
AdvSceneSwitcher.generalTab.status.autoStart.recording="Grabando"
|
||||||
|
AdvSceneSwitcher.generalTab.status.autoStart.streaming="Emitiendo"
|
||||||
|
AdvSceneSwitcher.generalTab.status.autoStart.recordingAndStreaming="Grabando o emitiendo"
|
||||||
|
AdvSceneSwitcher.generalTab.status.checkInterval="Comprobar las condiciones de cambio cada"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior="Comportamiento general"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet="Si no se cumple ninguna condición por"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip="Solo será tan preciso como el intervalo de comprobación configurado."
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.dontSwitch="No cambiar"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchToRandom="Cambiar a una escena aleatoria"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo="Cambiar a:"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Después de una coincidencia, no cambiar de escena durante"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="¡Durante este tiempo, se ignorarán las posibles coincidencias!"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Habilitar el registro detallado"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Guardar la posición y el tamaño de la ventana"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.showTrayNotifications="Mostrar notificaciones del sistema"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deshabilitar sugerencias de interfaz de usuario"
|
||||||
|
AdvSceneSwitcher.generalTab.generalBehavior.hideLegacyTabs="Ocultar pestañas que se pueden representar a través de macros"
|
||||||
|
AdvSceneSwitcher.generalTab.priority="Prioridad"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.description="Prioridad de métodos de conmutación (la prioridad más alta está en la parte superior)"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.threadPriority="Usar prioridad de subproceso"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.threadPriorityNotice="(No se recomienda elevar la prioridad por encima de \"Normal\")"
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings="Guardar / Cargar ajustes"
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.export="Exportar"
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.import="Importar"
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.exportWindowTitle="Exportar los ajustes para Advanced Scene Switcher ..."
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.importWindowTitle="Importar los ajustes para Advanced Scene Switcher ..."
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.textType="Archivos de texto (*.txt)"
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadFail="La importacion la configuracion de escenas fallo"
|
||||||
|
AdvSceneSwitcher.generalTab.saveOrLoadsettings.loadSuccess="Configuración de escenas importada correctamente"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.fileContent="Contenido del archivo"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.sceneSequence="Secuencia de escenas"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.idleDetection="Detección de inactivos"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.executable="Ejecutable"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.screenRegion="Región de pantalla"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.windowTitle="Título de la ventana"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.media="Medios"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.time="Tiempo"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.audio="Audio"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.video="Video"
|
||||||
|
AdvSceneSwitcher.generalTab.priority.macro="Macro"
|
||||||
|
|
||||||
|
; Macro Tab
|
||||||
|
AdvSceneSwitcher.macroTab.title="Macro"
|
||||||
|
AdvSceneSwitcher.macroTab.macros="Macros"
|
||||||
|
AdvSceneSwitcher.macroTab.priorityWarning="Nota: Se recomienda configurar las macros para que sean la funcionalidad de máxima prioridad.\nEsta configuración se puede cambiar en la ficha General."
|
||||||
|
AdvSceneSwitcher.macroTab.help="Las macros le permiten ejecutar una cadena de acciones en función de varias condiciones.\n\nHaga clic en el símbolo más resaltado para agregar una nueva macro."
|
||||||
|
AdvSceneSwitcher.macroTab.editConditionHelp="Esta sección le permite definir las condiciones de la macro.\n\nSeleccione una macro existente o agregue una nueva a la izquierda.\nLuego haga clic en el botón más a continuación para agregar una nueva condición."
|
||||||
|
AdvSceneSwitcher.macroTab.editActionHelp="Esta sección le permite definir acciones de la macro.\n\nSeleccione una macro existente o agregue una nueva a la izquierda.\nLuego haga clic en el botón más a continuación para agregar una nueva acción"
|
||||||
|
AdvSceneSwitcher.macroTab.edit="Editar macro"
|
||||||
|
AdvSceneSwitcher.macroTab.edit.logic="Tipo de lógica:"
|
||||||
|
AdvSceneSwitcher.macroTab.edit.condition="Tipo de condición:"
|
||||||
|
AdvSceneSwitcher.macroTab.edit.action="Tipo de acción:"
|
||||||
|
AdvSceneSwitcher.macroTab.add="Agregar nueva macro"
|
||||||
|
AdvSceneSwitcher.macroTab.name="Nombre:"
|
||||||
|
AdvSceneSwitcher.macroTab.run="Ejecutar macro"
|
||||||
|
AdvSceneSwitcher.macroTab.runFail="Error al ejecutar \"%1\" si se ha producido un error en una de las acciones o si la macro ya se está ejecutando."
|
||||||
|
AdvSceneSwitcher.macroTab.runInParallel="Ejecutar macro en paralelo a otras macros"
|
||||||
|
AdvSceneSwitcher.macroTab.onChange="Realizar acciones solo en el cambio de condición"
|
||||||
|
AdvSceneSwitcher.macroTab.defaultname="Macro %1"
|
||||||
|
AdvSceneSwitcher.macroTab.exists="El nombre de la macro ya existe"
|
||||||
|
AdvSceneSwitcher.macroTab.copy="Crear copia"
|
||||||
|
AdvSceneSwitcher.macroTab.expandAll="Expandir todo"
|
||||||
|
AdvSceneSwitcher.macroTab.collapseAll="Contraer todo"
|
||||||
|
AdvSceneSwitcher.macroTab.maximize="Maximizar"
|
||||||
|
AdvSceneSwitcher.macroTab.minimize="Minimizar"
|
||||||
|
AdvSceneSwitcher.macroTab.highlightExecutedMacros="Resaltar macros ejecutadas recientemente"
|
||||||
|
AdvSceneSwitcher.macroTab.highlightTrueConditions="Resaltar condiciones de la macro seleccionada, que se evaluaron como verdaderas recientemente"
|
||||||
|
AdvSceneSwitcher.macroTab.highlightPerformedActions="Resaltar acciones realizadas recientemente de la macro seleccionada actualmente"
|
||||||
|
AdvSceneSwitcher.macroTab.disableHotkeys="Registre teclas de acceso rápido para controlar el estado de pausa de la macro seleccionada"
|
||||||
|
|
||||||
|
; Lógica de macros
|
||||||
|
AdvSceneSwitcher.logic.none="Omitir entrada"
|
||||||
|
AdvSceneSwitcher.logic.and="Y"
|
||||||
|
AdvSceneSwitcher.logic.or="O"
|
||||||
|
AdvSceneSwitcher.logic.andNot="Y no"
|
||||||
|
AdvSceneSwitcher.logic.orNot="O no"
|
||||||
|
AdvSceneSwitcher.logic.rootNone="Si"
|
||||||
|
AdvSceneSwitcher.logic.not="Si no"
|
||||||
|
|
||||||
|
; Macro Conditions
|
||||||
|
AdvSceneSwitcher.condition.audio="Audio"
|
||||||
|
AdvSceneSwitcher.condition.audio.state.below="abajo"
|
||||||
|
AdvSceneSwitcher.condition.audio.state.exact="exactamente"
|
||||||
|
AdvSceneSwitcher.condition.audio.state.above="arriba"
|
||||||
|
AdvSceneSwitcher.condition.audio.state.mute="silenciado"
|
||||||
|
AdvSceneSwitcher.condition.audio.state.unmute="no silenciado"
|
||||||
|
AdvSceneSwitcher.condition.audio.type.output="Volumen de salida"
|
||||||
|
AdvSceneSwitcher.condition.audio.type.volume="Nivel de volumen configurado"
|
||||||
|
AdvSceneSwitcher.condition.audio.entry="{{checkType}} de {{audioSources}} es {{condition}} {{volume}}"
|
||||||
|
AdvSceneSwitcher.condition.cursor="Cursor"
|
||||||
|
AdvSceneSwitcher.condition.cursor.type.region="está en la región"
|
||||||
|
AdvSceneSwitcher.condition.cursor.type.moving="se está moviendo"
|
||||||
|
AdvSceneSwitcher.condition.cursor.showFrame="Mostrar cuadro"
|
||||||
|
AdvSceneSwitcher.condition.cursor.hideFrame="Ocultar cuadro"
|
||||||
|
AdvSceneSwitcher.condition.cursor.entry.line1="El cursor es {{conditions}} {{minX}} {{minY}} {{maxX}} {{maxY}} - {{toggleFrameButton}}"
|
||||||
|
AdvSceneSwitcher.condition.cursor.entry.line2="El cursor se encuentra actualmente en {{xPos}} x {{yPos}}"
|
||||||
|
AdvSceneSwitcher.condition.scene="Escena"
|
||||||
|
AdvSceneSwitcher.condition.scene.type.current="La escena actual es"
|
||||||
|
AdvSceneSwitcher.condition.scene.type.previous="La escena anterior es"
|
||||||
|
AdvSceneSwitcher.condition.scene.type.changed="Escena cambiada"
|
||||||
|
AdvSceneSwitcher.condition.scene.type.notChanged="La escena no ha cambiado"
|
||||||
|
AdvSceneSwitcher.condition.scene.currentSceneTransitionBehaviour="Durante la transición, verifique la escena de destino de la transición"
|
||||||
|
AdvSceneSwitcher.condition.scene.previousSceneTransitionBehaviour="Durante la transición, verifique la escena de origen de la transición"
|
||||||
|
AdvSceneSwitcher.condition.scene.entry.line1="{{sceneType}} {{scenes}}"
|
||||||
|
AdvSceneSwitcher.condition.scene.entry.line2="{{useTransitionTargetScene}}"
|
||||||
|
AdvSceneSwitcher.condition.window="Ventana"
|
||||||
|
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} existen y ..."
|
||||||
|
AdvSceneSwitcher.condition.window.entry.line2="... es {{fullscreen}} pantalla completa {{maximized}} maximizada {{focused}} enfocada {{windowFocusChanged}} ventana de primer plano cambiada"
|
||||||
|
AdvSceneSwitcher.condition.file="Archivo"
|
||||||
|
AdvSceneSwitcher.condition.file.entry.line1="Contenido de{{fileType}}{{filePath}}{{conditions}}"
|
||||||
|
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
||||||
|
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
||||||
|
AdvSceneSwitcher.condition.media="Medios"
|
||||||
|
AdvSceneSwitcher.condition.media.anyOnScene="Cualquier fuente multimedia activada"
|
||||||
|
AdvSceneSwitcher.condition.media.allOnScene="Todas las fuentes de medios activadas"
|
||||||
|
AdvSceneSwitcher.condition.media.matchOnChange="Solo coincidir con el cambio (Nota: esta opción se eliminará en una versión futura; use modificadores de duración en su lugar)"
|
||||||
|
AdvSceneSwitcher.condition.media.inconsistencyInfo="Desafortunadamente, no todos los tipos de fuentes de medios se comportan de la misma manera (p. ej., fuente de medios frente a estado \"Detenido\" de fuente de video VLC).\n¡Así que experimente lo que funciona para su configuración!"
|
||||||
|
AdvSceneSwitcher.condition.media.entry="El estado de {{mediaSources}}{{scenes}} es {{states}} y {{timeRestrictions}} {{time}}"
|
||||||
|
AdvSceneSwitcher.condition.video="Video"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.match="coincide exactamente"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.differ="no coincide"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.hasChanged="ha cambiado"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.hasNotChanged="no ha cambiado"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.noImage="no tiene salida"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.pattern="coincide con el patrón"
|
||||||
|
AdvSceneSwitcher.condition.video.condition.object="contiene objeto"
|
||||||
|
AdvSceneSwitcher.condition.video.askFileAction="¿Desea utilizar un archivo existente o crear una captura de pantalla de la fuente seleccionada actualmente?"
|
||||||
|
AdvSceneSwitcher.condition.video.askFileAction.file="Usar archivo existente"
|
||||||
|
AdvSceneSwitcher.condition.video.askFileAction.screenshot="Crear captura de pantalla"
|
||||||
|
AdvSceneSwitcher.condition.video.usePatternForChangedCheck="Usar coincidencia de patrones"
|
||||||
|
AdvSceneSwitcher.condition.video.usePatternForChangedCheck.tooltip="Esto le permitirá controlar cuánto debe cambiar la imagen para que la condición sea verdadera".
|
||||||
|
AdvSceneSwitcher.condition.video.patternThreshold="Umbral: "
|
||||||
|
AdvSceneSwitcher.condition.video.patternThresholdDescription="Un valor de umbral más alto significa que el patrón debe coincidir más estrechamente con la fuente de video".
|
||||||
|
AdvSceneSwitcher.condition.video.patternThresholdUseAlphaAsMask="Usar canal alfa como máscara para el patrón."
|
||||||
|
AdvSceneSwitcher.condition.video.objectScaleThreshold="Factor de escala: "
|
||||||
|
AdvSceneSwitcher.condition.video.objectScaleThresholdDescription="Un factor de escala más bajo generará más coincidencias pero una mayor carga de CPU".
|
||||||
|
AdvSceneSwitcher.condition.video.minNeighborDescription="Un valor de vecinos mínimo más alto dará como resultado menos coincidencias pero de mayor calidad".
|
||||||
|
AdvSceneSwitcher.condition.video.showMatch="Mostrar coincidencia"
|
||||||
|
AdvSceneSwitcher.condition.video.showMatch.loading="Buscando coincidencias"
|
||||||
|
AdvSceneSwitcher.condition.video.screenshotFail="¡Error al obtener la captura de pantalla de la fuente!"
|
||||||
|
AdvSceneSwitcher.condition.video.screenshotEmpty="La captura de pantalla está vacía. ¿Está visible la fuente?"
|
||||||
|
AdvSceneSwitcher.condition.video.patternMatchFail="¡No se encontró el patrón!"
|
||||||
|
AdvSceneSwitcher.condition.video.patternMatchSuccess="El patrón está resaltado en rojo"
|
||||||
|
AdvSceneSwitcher.condition.video.objectMatchFail="¡No se encontró el objeto!"
|
||||||
|
AdvSceneSwitcher.condition.video.objectMatchSuccess="El objeto está resaltado en rojo"
|
||||||
|
AdvSceneSwitcher.condition.video.modelLoadFail="¡No se pudieron cargar los datos del modelo!"
|
||||||
|
AdvSceneSwitcher.condition.video.entry="{{videoSources}} {{condition}} {{imagePath}}"
|
||||||
|
AdvSceneSwitcher.condition.video.entry.modelPath="Datos del modelo (haar cascade classifier): {{modelDataPath}}"
|
||||||
|
AdvSceneSwitcher.condition.video.entry.minNeighbor="Mínimo de vecinos: {{minNeighbors}}"
|
||||||
|
AdvSceneSwitcher.condition.video.entry.throttle="{{throttleEnable}}Reduzca la carga de la CPU realizando una comprobación solo cada {{throttleCount}} milisegundos"
|
||||||
|
AdvSceneSwitcher.condition.video.entry.checkAreaEnable="Realizar comprobación solo en el área"
|
||||||
|
AdvSceneSwitcher.condition.video.entry.checkArea="{{checkAreaEnable}}Realizar comprobación solo en el área {{checkArea}} {{selectArea}}"
|
||||||
|
AdvSceneSwitcher.condition.video.minSize="Tamaño mínimo:"
|
||||||
|
AdvSceneSwitcher.condition.video.maxSize="Tamaño máximo:"
|
||||||
|
AdvSceneSwitcher.condition.video.selectArea="Seleccionar área"
|
||||||
|
AdvSceneSwitcher.condition.video.selectArea.status="Solo se comprobará el área resaltada"
|
||||||
|
AdvSceneSwitcher.condition.video.width="Ancho"
|
||||||
|
AdvSceneSwitcher.condition.video.height="Altura"
|
||||||
|
AdvSceneSwitcher.condition.stream="Transmisión"
|
||||||
|
AdvSceneSwitcher.condition.stream.state.start="Transmisión en ejecución"
|
||||||
|
AdvSceneSwitcher.condition.stream.state.stop="Transmisión detenida"
|
||||||
|
AdvSceneSwitcher.condition.stream.state.starting="Inicio de transmisión"
|
||||||
|
AdvSceneSwitcher.condition.stream.state.stopping="Detener transmisión"
|
||||||
|
AdvSceneSwitcher.condition.stream.entry="{{streamState}}"
|
||||||
|
AdvSceneSwitcher.condition.record="Grabación"
|
||||||
|
AdvSceneSwitcher.condition.record.state.start="Grabación en ejecución"
|
||||||
|
AdvSceneSwitcher.condition.record.state.pause="Grabación en pausa"
|
||||||
|
AdvSceneSwitcher.condition.record.state.stop="Grabación detenida"
|
||||||
|
AdvSceneSwitcher.condition.record.entry="{{recordState}}"
|
||||||
|
AdvSceneSwitcher.condition.process="Proceso"
|
||||||
|
AdvSceneSwitcher.condition.process.entry="{{processes}} se está ejecutando {{focused}} y está enfocado"
|
||||||
|
AdvSceneSwitcher.condition.idle="Inactivo"
|
||||||
|
AdvSceneSwitcher.condition.idle.entry="No hay entradas de teclado o ratón durante {{duration}}"
|
||||||
|
AdvSceneSwitcher.condition.pluginState="Estado del complemento"
|
||||||
|
AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Se activó un cambio de escena automático en este intervalo"
|
||||||
|
AdvSceneSwitcher.condition.pluginState.state.running="El conmutador de escenas avanzado se está ejecutando"
|
||||||
|
AdvSceneSwitcher.condition.pluginState.state.shutdown="OBS se está cerrando"
|
||||||
|
AdvSceneSwitcher.condition.pluginState.entry="{{condition}}"
|
||||||
|
AdvSceneSwitcher.condition.timer="Temporizador"
|
||||||
|
AdvSceneSwitcher.condition.timer.type.fixed="Fijar"
|
||||||
|
AdvSceneSwitcher.condition.timer.type.random="Aleatorio"
|
||||||
|
AdvSceneSwitcher.condition.timer.pause="Pausa"
|
||||||
|
AdvSceneSwitcher.condition.timer.continue="Continuar"
|
||||||
|
AdvSceneSwitcher.condition.timer.entry.line1.fixed="{{type}} la duración de {{duration}} ha pasado"
|
||||||
|
AdvSceneSwitcher.condition.timer.entry.line1.random="La duración de {{type}} de {{duration}} a {{duration2}} ha pasado"
|
||||||
|
AdvSceneSwitcher.condition.timer.entry.line2="Tiempo restante: {{remaining}} segundos"
|
||||||
|
AdvSceneSwitcher.condition.timer.entry.line3="{{pauseContinue}} {{reset}} {{saveRemaining}} Ahorra tiempo restante {{autoReset}} Restablecer el temporizador después de alcanzar la duración"
|
||||||
|
AdvSceneSwitcher.condition.timer.reset="Reiniciar"
|
||||||
|
AdvSceneSwitcher.condition.macro="Macro"
|
||||||
|
AdvSceneSwitcher.condition.macro.type.count="Recuento"
|
||||||
|
AdvSceneSwitcher.condition.macro.type.state="Estado"
|
||||||
|
AdvSceneSwitcher.condition.macro.type.selection="Tipo de condición: {{types}}"
|
||||||
|
AdvSceneSwitcher.condition.macro.count.type.below="Menor que"
|
||||||
|
AdvSceneSwitcher.condition.macro.count.type.above="Más que"
|
||||||
|
AdvSceneSwitcher.condition.macro.count.type.equal="Exactamente"
|
||||||
|
AdvSceneSwitcher.condition.macro.count.reset="Reiniciar"
|
||||||
|
AdvSceneSwitcher.condition.macro.pausedWarning="¡La macro seleccionada está actualmente en pausa!"
|
||||||
|
AdvSceneSwitcher.condition.macro.state.entry="Las condiciones de {{macros}} son verdaderas"
|
||||||
|
AdvSceneSwitcher.condition.macro.count.entry.line1="{{macros}} se ejecutó {{conditions}} {{count}} veces"
|
||||||
|
AdvSceneSwitcher.condition.macro.count.entry.line2="Recuento actual: {{currentCount}} {{resetCount}}"
|
||||||
|
AdvSceneSwitcher.condition.source="Fuente"
|
||||||
|
AdvSceneSwitcher.condition.source.type.active="Está activo"
|
||||||
|
AdvSceneSwitcher.condition.source.type.showing="Se muestra"
|
||||||
|
AdvSceneSwitcher.condition.source.type.settings="Coincidencia de configuración"
|
||||||
|
AdvSceneSwitcher.condition.source.regex="Usar expresiones regulares"
|
||||||
|
AdvSceneSwitcher.condition.source.getSettings="Obtener la configuración actual"
|
||||||
|
AdvSceneSwitcher.condition.source.entry.line1="{{sources}} {{conditions}}"
|
||||||
|
AdvSceneSwitcher.condition.source.entry.line2="{{settings}}"
|
||||||
|
AdvSceneSwitcher.condition.source.entry.line3="{{regex}} {{getSettings}}"
|
||||||
|
AdvSceneSwitcher.condition.virtualCamera="Cámara virtual"
|
||||||
|
AdvSceneSwitcher.condition.virtualCamera.state.start="Cámara virtual iniciada"
|
||||||
|
AdvSceneSwitcher.condition.virtualCamera.state.stop="Cámara virtual detenida"
|
||||||
|
AdvSceneSwitcher.condition.virtualCamera.entry="{{states}}"
|
||||||
|
AdvSceneSwitcher.condition.filter="Filtro"
|
||||||
|
AdvSceneSwitcher.condition.filter.type.active="Está habilitado"
|
||||||
|
AdvSceneSwitcher.condition.filter.type.showing="Está deshabilitado"
|
||||||
|
AdvSceneSwitcher.condition.filter.type.settings="Coincidencia de configuración"
|
||||||
|
AdvSceneSwitcher.condition.filter.regex="Usar expresiones regulares"
|
||||||
|
AdvSceneSwitcher.condition.filter.getSettings="Obtener la configuración actual"
|
||||||
|
AdvSceneSwitcher.condition.filter.entry.line1="En {{sources}} {{filters}} {{conditions}}"
|
||||||
|
AdvSceneSwitcher.condition.filter.entry.line2="{{settings}}"
|
||||||
|
AdvSceneSwitcher.condition.filter.entry.line3="{{regex}} {{getSettings}}"
|
||||||
|
AdvSceneSwitcher.condition.sceneOrder="Orden de elementos de escena"
|
||||||
|
AdvSceneSwitcher.condition.sceneOrder.type.above="Está arriba"
|
||||||
|
AdvSceneSwitcher.condition.sceneOrder.type.below="Está debajo"
|
||||||
|
AdvSceneSwitcher.condition.sceneOrder.type.position="Está en la posición"
|
||||||
|
AdvSceneSwitcher.condition.sceneOrder.positionInfo="El valor de posición comienza en la parte inferior con 0 y aumenta en uno para cada elemento de la escena, incluidos los de los grupos de escenas"
|
||||||
|
AdvSceneSwitcher.condition.sceneOrder.entry="En{{scenes}}{{sources}}{{conditions}}{{sources2}}{{position}}"
|
||||||
|
AdvSceneSwitcher.condition.hotkey="Tecla de acceso rápido"
|
||||||
|
AdvSceneSwitcher.condition.hotkey.name="Tecla de acceso directo de activación de macro"
|
||||||
|
AdvSceneSwitcher.condition.hotkey.tip="Nota: puede configurar las combinaciones de teclas para esta tecla de acceso rápido en la ventana de configuración de OBS"
|
||||||
|
AdvSceneSwitcher.condition.hotkey.entry.line1="Se presiona la tecla de acceso rápido"
|
||||||
|
AdvSceneSwitcher.condition.hotkey.entry.line2="Nombre: {{name}}"
|
||||||
|
AdvSceneSwitcher.condition.replay="Búfer de reproducción"
|
||||||
|
AdvSceneSwitcher.condition.replay.state.stopped="Búfer de reproducción detenido"
|
||||||
|
AdvSceneSwitcher.condition.replay.state.started="Búfer de reproducción iniciado"
|
||||||
|
AdvSceneSwitcher.condition.replay.state.saved="Búfer de reproducción guardado"
|
||||||
|
AdvSceneSwitcher.condition.replay.entry="{{state}}"
|
||||||
|
AdvSceneSwitcher.condition.date="Fecha"
|
||||||
|
AdvSceneSwitcher.condition.date.anyDay="Cualquier día"
|
||||||
|
AdvSceneSwitcher.condition.date.monday="Lunes"
|
||||||
|
AdvSceneSwitcher.condition.date.tuesday="Martes"
|
||||||
|
AdvSceneSwitcher.condition.date.wednesday="Miércoles"
|
||||||
|
AdvSceneSwitcher.condition.date.thursday="Jueves"
|
||||||
|
AdvSceneSwitcher.condition.date.friday="Viernes"
|
||||||
|
AdvSceneSwitcher.condition.date.saturday="Sábado"
|
||||||
|
AdvSceneSwitcher.condition.date.sunday="Domingo"
|
||||||
|
AdvSceneSwitcher.condition.date.state.at="A las"
|
||||||
|
AdvSceneSwitcher.condition.date.state.after="Después"
|
||||||
|
AdvSceneSwitcher.condition.date.state.before="Antes"
|
||||||
|
AdvSceneSwitcher.condition.date.state.between="Entre"
|
||||||
|
AdvSceneSwitcher.condition.date.separator="y"
|
||||||
|
AdvSceneSwitcher.condition.date.ignoreDate="Si no se marca, se ignorará el componente de fecha"
|
||||||
|
AdvSceneSwitcher.condition.date.ignoreTime="Si no se marca, se ignorará el componente de tiempo"
|
||||||
|
AdvSceneSwitcher.condition.date.showAdvancedSettings="Mostrar configuración avanzada"
|
||||||
|
AdvSceneSwitcher.condition.date.showSimpleSettings="Mostrar configuración simple"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.simple="El {{dayOfWeek}} {{weekCondition}} {{ignoreWeekTime}}{{weekTime}}"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} Repetir cada {{duration}} en la coincidencia de fechas"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.nextMatchDate="Próxima coincidencia en: %1"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.updateOnRepeat="{{updateOnRepeat}} Al repetir actualizar la fecha seleccionada para repetir la fecha"
|
||||||
|
AdvSceneSwitcher.condition.sceneTransform="Transformar elemento de escena"
|
||||||
|
AdvSceneSwitcher.condition.sceneTransform.getTransform="Obtener transformación"
|
||||||
|
AdvSceneSwitcher.condition.sceneTransform.regex="Usar expresiones regulares"
|
||||||
|
AdvSceneSwitcher.condition.sceneTransform.entry.line1="En{{scenes}}{{sources}}coincide con la transformación"
|
||||||
|
AdvSceneSwitcher.condition.sceneTransform.entry.line2="{{settings}}"
|
||||||
|
AdvSceneSwitcher.condition.sceneTransform.entry.line3="{{regex}} {{getSettings}}"
|
||||||
|
AdvSceneSwitcher.condition.transition="Transición"
|
||||||
|
AdvSceneSwitcher.condition.transition.type.current="El tipo de transición actual es"
|
||||||
|
AdvSceneSwitcher.condition.transition.type.duration="La duración de la transición actual es"
|
||||||
|
AdvSceneSwitcher.condition.transition.type.started="Transición iniciada"
|
||||||
|
AdvSceneSwitcher.condition.transition.type.ended="Transición finalizada"
|
||||||
|
AdvSceneSwitcher.condition.transition.type.transitionSource="Transición desde"
|
||||||
|
AdvSceneSwitcher.condition.transition.type.transitionTarget="Transición a"
|
||||||
|
AdvSceneSwitcher.condition.transition.durationSuffix="segundos"
|
||||||
|
AdvSceneSwitcher.condition.transition.entry="{{conditions}}{{transitions}}{{scenes}}{{duration}}{{durationSuffix}}"
|
||||||
|
AdvSceneSwitcher.condition.sceneVisibility="Visibilidad del elemento de escena"
|
||||||
|
AdvSceneSwitcher.condition.sceneVisibility.type.shown="Mostrado"
|
||||||
|
AdvSceneSwitcher.condition.sceneVisibility.type.hidden="Oculto"
|
||||||
|
AdvSceneSwitcher.condition.sceneVisibility.entry="En{{scenes}}{{sources}}es{{conditions}}"
|
||||||
|
AdvSceneSwitcher.condition.studioMode="Modo de estudio"
|
||||||
|
AdvSceneSwitcher.condition.studioMode.state.active="El modo de estudio está activo"
|
||||||
|
AdvSceneSwitcher.condition.studioMode.state.notActive="El modo de estudio no está activo"
|
||||||
|
AdvSceneSwitcher.condition.studioMode.state.previewScene="La vista previa de la escena es"
|
||||||
|
AdvSceneSwitcher.condition.studioMode.entry="{{conditions}}{{scenes}}"
|
||||||
|
AdvSceneSwitcher.condition.openvr="OpenVR"
|
||||||
|
AdvSceneSwitcher.condition.errorStatus="Error de OpenVR: "
|
||||||
|
AdvSceneSwitcher.condition.openvr.entry.line1="HMD está en..."
|
||||||
|
AdvSceneSwitcher.condition.openvr.entry.line2="{{controls}}"
|
||||||
|
AdvSceneSwitcher.condition.openvr.entry.line3="HMD se encuentra actualmente en {{xPos}} x {{yPos}} x {{zPos}}"
|
||||||
|
AdvSceneSwitcher.condition.stats="Estadísticas OBS"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.fps="FPS"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.CPUUsage="Uso de CPU"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.HDDSpaceAvailable="Espacio en disco disponible"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.memoryUsage="Uso de memoria"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.averageTimeToRender="Tiempo medio para renderizar fotograma"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.skippedFrames="Fotogramas omitidos debido a un retraso en la codificación"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.missedFrames="Frames perdidos debido al retraso en el procesamiento"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.droppedFrames.stream="Transmitir fotogramas perdidos"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.megabytesSent.stream="Transmisión total de salida de datos"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.bitrate.stream="Tasa de bits de transmisión"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.droppedFrames.recording="Grabando fotogramas caídos"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.megabytesSent.recording="Grabando salida de datos total"
|
||||||
|
AdvSceneSwitcher.condition.stats.type.bitrate.recording="Tasa de bits de grabación"
|
||||||
|
AdvSceneSwitcher.condition.stats.condition.above="arriba de"
|
||||||
|
AdvSceneSwitcher.condition.stats.condition.equals="igual a"
|
||||||
|
AdvSceneSwitcher.condition.stats.condition.below="abajo de"
|
||||||
|
AdvSceneSwitcher.condition.stats.dockHint="Puede abrir el panel de \"Estadísticas\" para ver el estado actual"
|
||||||
|
AdvSceneSwitcher.condition.stats.entry="{{stats}} esta {{condition}} {{value}}"
|
||||||
|
|
||||||
|
; Macro Actions
|
||||||
|
AdvSceneSwitcher.action.switchScene="Cambiar escena"
|
||||||
|
AdvSceneSwitcher.action.scene.entry="Cambiar a la escena {{scenes}} usando {{transitions}} con una duración de {{duration}} segundos"
|
||||||
|
AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Espere hasta que se complete la transición a la escena de destino"
|
||||||
|
AdvSceneSwitcher.action.wait="Esperar"
|
||||||
|
AdvSceneSwitcher.action.wait.type.fixed="fijo"
|
||||||
|
AdvSceneSwitcher.action.wait.type.random="aleatorio"
|
||||||
|
AdvSceneSwitcher.action.wait.entry.fixed="Espere {{waitType}} de {{duration}}"
|
||||||
|
AdvSceneSwitcher.action.wait.entry.random="Espere {{waitType}} de {{duration}} a {{duration2}}"
|
||||||
|
AdvSceneSwitcher.action.audio="Audio"
|
||||||
|
AdvSceneSwitcher.action.audio.type.mute="Silencio"
|
||||||
|
AdvSceneSwitcher.action.audio.type.unmute="Activar silencio"
|
||||||
|
AdvSceneSwitcher.action.audio.type.sourceVolume="Establecer volumen de origen"
|
||||||
|
AdvSceneSwitcher.action.audio.type.masterVolume="Establecer volumen maestro"
|
||||||
|
AdvSceneSwitcher.action.audio.fade.type.duration="durante una duración de"
|
||||||
|
AdvSceneSwitcher.action.audio.fade.type.rate="a una velocidad de"
|
||||||
|
AdvSceneSwitcher.action.audio.fade.duration="{{fade}}Fade {{fadeTypes}} {{duration}} segundos."
|
||||||
|
AdvSceneSwitcher.action.audio.fade.rate="{{fade}}Fade {{fadeTypes}} {{rate}}por segundo."
|
||||||
|
AdvSceneSwitcher.action.audio.fade.wait="Espere a que se complete el desvanecimiento".
|
||||||
|
AdvSceneSwitcher.action.audio.fade.abort="Cancelar atenuación ya activa."
|
||||||
|
AdvSceneSwitcher.action.audio.entry="{{actions}} {{audioSources}} {{volume}}"
|
||||||
|
AdvSceneSwitcher.action.recording="Grabando"
|
||||||
|
AdvSceneSwitcher.action.recording.type.stop="Detener grabación"
|
||||||
|
AdvSceneSwitcher.action.recording.type.start="Iniciar grabación"
|
||||||
|
AdvSceneSwitcher.action.recording.type.pause="Pausar grabación"
|
||||||
|
AdvSceneSwitcher.action.recording.type.unpause="Reanudar grabación"
|
||||||
|
AdvSceneSwitcher.action.recording.pause.hint="Tenga en cuenta que, dependiendo de la configuración de grabación, es posible que no pueda pausar la grabación"
|
||||||
|
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}{{splitHint}}"
|
||||||
|
AdvSceneSwitcher.action.replay="Búfer de reproducción"
|
||||||
|
AdvSceneSwitcher.action.replay.saveWarn="Advertencia: ¡Guardar con demasiada frecuencia puede hacer que el búfer de reproducción no se guarde realmente!"
|
||||||
|
AdvSceneSwitcher.action.replay.type.stop="Detener el búfer de reproducción"
|
||||||
|
AdvSceneSwitcher.action.replay.type.start="Iniciar búfer de reproducción"
|
||||||
|
AdvSceneSwitcher.action.replay.type.save="Guardar búfer de reproducción"
|
||||||
|
AdvSceneSwitcher.action.replay.entry="{{actions}}"
|
||||||
|
AdvSceneSwitcher.action.streaming="Transmisión"
|
||||||
|
AdvSceneSwitcher.action.streaming.type.stop="Detener transmisión"
|
||||||
|
AdvSceneSwitcher.action.streaming.type.start="Iniciar transmisión"
|
||||||
|
AdvSceneSwitcher.action.streaming.entry="{{actions}}"
|
||||||
|
AdvSceneSwitcher.action.run="Ejecutar"
|
||||||
|
AdvSceneSwitcher.action.run.arguments="Argumentos:"
|
||||||
|
AdvSceneSwitcher.action.run.addArgument="Agregar argumento"
|
||||||
|
AdvSceneSwitcher.action.run.addArgumentDescription="Añadir nuevo argumento:"
|
||||||
|
AdvSceneSwitcher.action.run.entry="Ejecutar {{filePath}}"
|
||||||
|
AdvSceneSwitcher.action.sceneVisibility="Visibilidad del elemento de escena"
|
||||||
|
AdvSceneSwitcher.action.sceneVisibility.type.show="Mostrar"
|
||||||
|
AdvSceneSwitcher.action.sceneVisibility.type.hide="Ocultar"
|
||||||
|
AdvSceneSwitcher.action.sceneVisibility.type.source="Fuente"
|
||||||
|
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Cualquiera"
|
||||||
|
AdvSceneSwitcher.action.sceneVisibility.entry="En{{scenes}}{{actions}}{{sourceTypes}}{{sources}}{{sourceGroups}}"
|
||||||
|
AdvSceneSwitcher.action.filter="Filtro"
|
||||||
|
AdvSceneSwitcher.action.filter.type.enable="Habilitar"
|
||||||
|
AdvSceneSwitcher.action.filter.type.disable="Deshabilitar"
|
||||||
|
AdvSceneSwitcher.action.filter.type.settings="Establecer configuración"
|
||||||
|
AdvSceneSwitcher.action.filter.entry="En {{sources}} {{actions}} {{filters}}"
|
||||||
|
AdvSceneSwitcher.action.filter.getSettings="Obtener la configuración actual"
|
||||||
|
AdvSceneSwitcher.action.source="Fuente"
|
||||||
|
AdvSceneSwitcher.action.source.type.enable="Habilitar"
|
||||||
|
AdvSceneSwitcher.action.source.type.disable="Deshabilitar"
|
||||||
|
AdvSceneSwitcher.action.source.type.settings="Establecer configuración"
|
||||||
|
AdvSceneSwitcher.action.source.entry="{{actions}} {{sources}}"
|
||||||
|
AdvSceneSwitcher.action.source.warning="Advertencia: la IU de OBS no puede controlar la habilitación y deshabilitación global de fuentes"
|
||||||
|
AdvSceneSwitcher.action.source.getSettings="Obtener la configuración actual"
|
||||||
|
AdvSceneSwitcher.action.media="Medios"
|
||||||
|
AdvSceneSwitcher.action.media.type.play="Reproducir"
|
||||||
|
AdvSceneSwitcher.action.media.type.pause="Pausa"
|
||||||
|
AdvSceneSwitcher.action.media.type.stop="Detener"
|
||||||
|
AdvSceneSwitcher.action.media.type.restart="Reiniciar"
|
||||||
|
AdvSceneSwitcher.action.media.type.next="Siguiente"
|
||||||
|
AdvSceneSwitcher.action.media.type.previous="Anterior"
|
||||||
|
AdvSceneSwitcher.action.media.type.seek="Buscar"
|
||||||
|
AdvSceneSwitcher.action.media.entry="{{actions}}{{duration}}{{mediaSources}}"
|
||||||
|
AdvSceneSwitcher.action.macro="Macro"
|
||||||
|
AdvSceneSwitcher.action.macro.type.pause="Pausa"
|
||||||
|
AdvSceneSwitcher.action.macro.type.unpause="Reanudar"
|
||||||
|
AdvSceneSwitcher.action.macro.type.resetCounter="Reiniciar contador"
|
||||||
|
AdvSceneSwitcher.action.macro.type.run="Ejecutar"
|
||||||
|
AdvSceneSwitcher.action.macro.type.stop="Detener"
|
||||||
|
AdvSceneSwitcher.action.macro.entry="{{actions}} {{macros}}"
|
||||||
|
AdvSceneSwitcher.action.pluginState="Estado del complemento"
|
||||||
|
AdvSceneSwitcher.action.pluginState.type.stop="Detener el complemento Advanced Scene Switcher"
|
||||||
|
AdvSceneSwitcher.action.pluginState.type.noMatch="Cambiar el comportamiento de no coincidencia:"
|
||||||
|
AdvSceneSwitcher.action.pluginState.type.import="Importar configuración desde"
|
||||||
|
AdvSceneSwitcher.action.pluginState.importWarning="Nota: la acción se ignorará mientras se abra la ventana de configuración."
|
||||||
|
AdvSceneSwitcher.action.pluginState.entry="{{actions}}{{values}}{{scenes}}{{settings}}{{settingsWarning}}"
|
||||||
|
AdvSceneSwitcher.action.virtualCamera="Cámara virtual"
|
||||||
|
AdvSceneSwitcher.action.virtualCamera.type.stop="Detener cámara virtual"
|
||||||
|
AdvSceneSwitcher.action.virtualCamera.type.start="Iniciar cámara virtual"
|
||||||
|
AdvSceneSwitcher.action.virtualCamera.entry="{{actions}}"
|
||||||
|
AdvSceneSwitcher.action.hotkey="Tecla de acceso rápido"
|
||||||
|
AdvSceneSwitcher.action.hotkey.leftShift="Mayús a la izquierda"
|
||||||
|
AdvSceneSwitcher.action.hotkey.rightShift="Mayús a la derecha"
|
||||||
|
AdvSceneSwitcher.action.hotkey.leftCtrl="Ctrl izquierdo"
|
||||||
|
AdvSceneSwitcher.action.hotkey.rightCtrl="Ctrl derecho"
|
||||||
|
AdvSceneSwitcher.action.hotkey.leftAlt="Alt izquierdo"
|
||||||
|
AdvSceneSwitcher.action.hotkey.rightAlt="Alt derecho"
|
||||||
|
AdvSceneSwitcher.action.hotkey.leftMeta="Meta izquierda"
|
||||||
|
AdvSceneSwitcher.action.hotkey.rightMeta="Meta derecho"
|
||||||
|
AdvSceneSwitcher.action.hotkey.onlyOBS="Enviar pulsación de tecla solo a OBS"
|
||||||
|
AdvSceneSwitcher.action.hotkey.disabled="No se puede simular la pulsación de teclas: ¡funcionalidad desactivada!"
|
||||||
|
AdvSceneSwitcher.action.hotkey.entry="Presione {{keys}} durante {{duration}} milisegundos"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder="Orden de elementos de escena"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder.type.moveUp="Mover hacia arriba"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder.type.moveDown="Mover hacia abajo"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder.type.moveTop="Mover al principio"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder.type.moveBottom="Mover al final"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder.type.movePosition="Mover a la posición"
|
||||||
|
AdvSceneSwitcher.action.sceneOrder.entry="En{{scenes}}{{actions}}{{sources}}{{position}}"
|
||||||
|
AdvSceneSwitcher.action.sceneTransform="Transformar elemento de escena"
|
||||||
|
AdvSceneSwitcher.action.sceneTransform.getTransform="Obtener transformación"
|
||||||
|
AdvSceneSwitcher.action.sceneTransform.entry="En{{scenes}}transformar{{sources}}"
|
||||||
|
AdvSceneSwitcher.action.file="Archivo"
|
||||||
|
AdvSceneSwitcher.action.file.type.write="Escribir"
|
||||||
|
AdvSceneSwitcher.action.file.type.append="Agregar"
|
||||||
|
AdvSceneSwitcher.action.file.entry="{{actions}} a {{filePath}}:"
|
||||||
|
AdvSceneSwitcher.action.studioMode="Modo estudio"
|
||||||
|
AdvSceneSwitcher.action.studioMode.type.swap="Intercambiar vista previa y escena del programa"
|
||||||
|
AdvSceneSwitcher.action.studioMode.type.setScene="Establecer escena de vista previa en"
|
||||||
|
AdvSceneSwitcher.action.studioMode.type.enable="Activar modo estudio"
|
||||||
|
AdvSceneSwitcher.action.studioMode.type.disable="Deshabilitar el modo de estudio"
|
||||||
|
AdvSceneSwitcher.action.studioMode.entry="{{actions}}{{scenes}}"
|
||||||
|
AdvSceneSwitcher.action.transition="Transición"
|
||||||
|
AdvSceneSwitcher.action.transition.type.scene="transición de escena"
|
||||||
|
AdvSceneSwitcher.action.transition.type.sceneOverride="anulación de transición de escena"
|
||||||
|
AdvSceneSwitcher.action.transition.type.sourceShow="transición del programa de origen"
|
||||||
|
AdvSceneSwitcher.action.transition.type.sourceHide="fuente ocultar transición"
|
||||||
|
AdvSceneSwitcher.action.transition.entry.line1="Modificar {{type}}{{scenes}}{{sources}}"
|
||||||
|
AdvSceneSwitcher.action.transition.entry.line2="{{setTransition}}Establecer el tipo de transición en {{transitions}}"
|
||||||
|
AdvSceneSwitcher.action.transition.entry.line3="{{setDuration}}Establecer la duración de la transición en {{duration}}segundos"
|
||||||
|
AdvSceneSwitcher.action.timer="Temporizador"
|
||||||
|
AdvSceneSwitcher.action.timer.type.pause="Pausa"
|
||||||
|
AdvSceneSwitcher.action.timer.type.continue="Continuar"
|
||||||
|
AdvSceneSwitcher.action.timer.type.reset="Reiniciar"
|
||||||
|
AdvSceneSwitcher.action.timer.type.setTimeRemaining="Establecer tiempo restante de"
|
||||||
|
AdvSceneSwitcher.action.timer.entry="{{timerAction}} temporizadores en {{macros}} {{duration}}"
|
||||||
|
AdvSceneSwitcher.action.random="Aleatorio"
|
||||||
|
AdvSceneSwitcher.action.random.entry="Ejecute aleatoriamente cualquiera de las siguientes macros (las macros en pausa se ignoran)"
|
||||||
|
AdvSceneSwitcher.action.systray="Notificación de la bandeja del sistema"
|
||||||
|
AdvSceneSwitcher.action.systray.entry="Mostrar notificación: {{message}}"
|
||||||
|
AdvSceneSwitcher.action.screenshot="Captura de pantalla"
|
||||||
|
AdvSceneSwitcher.action.screenshot.mainOutput="Salida principal de OBS"
|
||||||
|
AdvSceneSwitcher.action.profile="Perfil"
|
||||||
|
AdvSceneSwitcher.action.profile.entry="Cambiar perfil activo a {{profiles}}"
|
||||||
|
AdvSceneSwitcher.action.sceneCollection="Colección de escenas"
|
||||||
|
AdvSceneSwitcher.action.sceneCollection.entry="Cambiar la colección de escenas activa a {{sceneCollections}}"
|
||||||
|
AdvSceneSwitcher.action.sceneCollection.warning="Nota: Cualquier acción posterior a esta no se ejecutará, ya que la colección de escenas cambiante también volverá a cargar la configuración del conmutador de escenas.\nLa acción de la colección de escenas se ignorará mientras se abra la ventana de configuración".
|
||||||
|
AdvSceneSwitcher.action.sequence="Secuencia"
|
||||||
|
AdvSceneSwitcher.action.sequence.entry="Cada vez que se realiza esta acción, ejecute la siguiente macro de la lista (las macros en pausa se ignoran)"
|
||||||
|
AdvSceneSwitcher.action.sequence.status="Última macro ejecutada: %1 - Siguiente macro a ejecutar: %2"
|
||||||
|
AdvSceneSwitcher.action.sequence.status.none="ninguno"
|
||||||
|
AdvSceneSwitcher.action.sequence.restart="Reiniciar desde el principio una vez que se alcance el final de la lista"
|
||||||
|
AdvSceneSwitcher.action.sequence.continueFrom="Continuar con el elemento seleccionado"
|
||||||
|
|
||||||
|
; Transition Tab
|
||||||
|
AdvSceneSwitcher.transitionTab.title="Transición"
|
||||||
|
AdvSceneSwitcher.transitionTab.setTransitionBy="Al cambiar las transiciones:"
|
||||||
|
AdvSceneSwitcher.transitionTab.transitionOverride="Establecer anulaciones de transición"
|
||||||
|
AdvSceneSwitcher.transitionTab.adjustActiveTransitionType="Cambiar tipo de transición activa"
|
||||||
|
AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError="Al menos una opción debe estar habilitada:\n\n - Usar anulaciones de transición\n\n - Cambiar el tipo de transición activo"
|
||||||
|
AdvSceneSwitcher.transitionTab.transitionForAToB="Utiliza la transición para el cambio de escena automatizado de la escena A a la escena B"
|
||||||
|
AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body> <p> Estos ajustes <span style =\"font-style: italic; \"> solo </span> surgió a las transiciones causadas por el selector de escenas - Echa un vistazo a <a href =\"https://obsproject.com/forum/resources/transition-table.1174/\"> <span style=\" texto-decoración: subrayado; color: # 268bd2; \"> Tabla de transición </span> </a> si desea configurar esto para cambios de escena manuales. <br/> Los definiciones definidos aquí tienen prioridad sobre los ajustes de transición configurados en cualquier otro lugar del selector de escenas. < br/> <br/> Haz clic en el símbolo más a continuación para agregar una nueva entrada. </p></body></html>"
|
||||||
|
AdvSceneSwitcher.transitionTab.defaultTransition="Cambiar transición si la escena está activa"
|
||||||
|
AdvSceneSwitcher.transitionTab.entry="Cambiar de {{scenes}} a {{scenes2}} usando {{transitions}} con una duración de {{duration}}"
|
||||||
|
AdvSceneSwitcher.transitionTab.defaultTransitionEntry="Cuando la escena {{scenes}} está activa, cambie la transición de escena predeterminada a {{transitions}}"
|
||||||
|
AdvSceneSwitcher.transitionTab.defaultTransitionsHelp="Haga clic en el símbolo más para añadir una entrada."
|
||||||
|
AdvSceneSwitcher.transitionTab.defaultTransition.delay="Cambiar transición {{defTransitionDelay}} después del cambio de escena."
|
||||||
|
AdvSceneSwitcher.transitionTab.defaultTransition.delay.help="El retraso se usa para evitar cambios de escena cancelados, lo que puede suceder si se cambia el tipo de transición mientras una transición aún está en curso".
|
||||||
|
|
||||||
|
; Pause Scenes Tab
|
||||||
|
AdvSceneSwitcher.pauseTab.title="Pausar"
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseOnScene="Pausar el selector de escenas en la escena"
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseInFocus1="Pausar el selector de escena cuando "
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseInFocus2="esté en foco"
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseTypeScene="la escena esté activa"
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseTypeWindow="la ventana esté en foco"
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseTargetAll="Todas"
|
||||||
|
AdvSceneSwitcher.pauseTab.pauseEntry="Pausar {{pauseTargets}} cuando {{pauseTypes}} {{scenes}} {{windows}}"
|
||||||
|
AdvSceneSwitcher.pauseTab.help="En esta pestaña puedes configurar la pausa de métodos de cambio individuales si una escena está activa o una ventana está enfocada.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Window Title Tab
|
||||||
|
AdvSceneSwitcher.windowTitleTab.title="Titulo"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.regexrDescription="<html><head/><body><p>Introduce el título directo de una ventana o un regex válido. Puedes verificar la sintaxis y las coincidencias para las expresiones regulares usando <a href=\"https://regexr.com\"><span style=\" text-decoration: underline; color:#268bd2;\">RegExr</span></a></p></body></html>"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.stayInFocus1="Ignorar nombre de la ventana"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.stayInFocus2=" "
|
||||||
|
AdvSceneSwitcher.windowTitleTab.fullscreen="si está en pantalla completa"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.maximized="si está maximizada"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.focused="si está en foco"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.entry="{{windows}} {{scenes}} {{transitions}} {{fullscreen}} {{maximized}} {{focused}}"
|
||||||
|
AdvSceneSwitcher.windowTitleTab.windowsHelp="Cambia de escena según el título de la ventana de las aplicaciones en ejecución.\nSe pueden seleccionar las siguientes condiciones adicionales:\nLa ventana está en Pantalla completa\nLa ventana está maximizada\nLa ventana está enfocada\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
AdvSceneSwitcher.windowTitleTab.ignoreWindowsHelp="Si se ignora el título de una ventana, el selector de escena actuará como si la ventana seleccionada anteriormente todavía estuviera enfocada.\nEsto te permitirá evitar cambios de escena, si cambias con frecuencia a una ventana diferente, lo que no provocará un cambio de escena.\n\nElige una ventana o introduce un título de ventana arriba y haz clic en el símbolo más a continuación para agregarlo a la lista."
|
||||||
|
|
||||||
|
; Executable Tab
|
||||||
|
AdvSceneSwitcher.executableTab.title="Ejecutable"
|
||||||
|
AdvSceneSwitcher.executableTab.implemented="Implementado por dasOven"
|
||||||
|
AdvSceneSwitcher.executableTab.requiresFocus="sólo si está en foco"
|
||||||
|
AdvSceneSwitcher.executableTab.entry="Cuando {{processes}} está ejectuándose cambiar a {{scenes}} usando {{transitions}} {{requiresFocus}}"
|
||||||
|
AdvSceneSwitcher.executableTab.help="Esta pestaña te permitirá cambiar de escena automáticamente si se está ejecutando un proceso.\nEsto puede ser útil en situaciones en las que el nombre de la ventana puede cambiar o no se conoce.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Screen Region Tab
|
||||||
|
AdvSceneSwitcher.screenRegionTab.title="Región"
|
||||||
|
AdvSceneSwitcher.screenRegionTab.currentPosition="El cursor está actualmente en:"
|
||||||
|
AdvSceneSwitcher.screenRegionTab.showGuideFrames="Mostrar marcos de guía"
|
||||||
|
AdvSceneSwitcher.screenRegionTab.hideGuideFrames="Ocultar guide frames"
|
||||||
|
AdvSceneSwitcher.screenRegionTab.excludeScenes.None="Sin selección"
|
||||||
|
AdvSceneSwitcher.screenRegionTab.entry="Si el cursor está en {{minX}} {{minY}} x {{maxX}} {{maxY}} cambiar a {{scenes}} usando {{transitions}} a menos que esté en {{excludeScenes}}"
|
||||||
|
AdvSceneSwitcher.screenRegionTab.help="Esta pestaña te permitirá cambiar escenas automáticamente según la posición actual del cursor del ratón.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Media Tab
|
||||||
|
AdvSceneSwitcher.mediaTab.title="Medios"
|
||||||
|
AdvSceneSwitcher.mediaTab.implemented="Implementado por Exeldro"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.none="Ninguno"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.playing="Reproduciéndose"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.opening="Abriendo"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.buffering="Almacenando en búfer"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.Paused="Pausado"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.stopped="Detenido"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.ended="Finalizado"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.error="Error"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.playlistEnd="Finalizado(lista de reproducción)"
|
||||||
|
AdvSceneSwitcher.mediaTab.states.any="Cualquiera"
|
||||||
|
AdvSceneSwitcher.mediaTab.timeRestriction.none="Ninguno"
|
||||||
|
AdvSceneSwitcher.mediaTab.timeRestriction.shorter="Tiempo es más corto"
|
||||||
|
AdvSceneSwitcher.mediaTab.timeRestriction.longer="Tiempo es más largo"
|
||||||
|
AdvSceneSwitcher.mediaTab.timeRestriction.remainShorter="Tiempo que quede es más corto"
|
||||||
|
AdvSceneSwitcher.mediaTab.timeRestriction.remainLonger="Tiempo que quede es más largo"
|
||||||
|
AdvSceneSwitcher.mediaTab.entry="Cuando el estado de {{mediaSources}} es {{states}} y el {{timeRestrictions}} que {{time}} cambiar a {{scenes}} usando {{transitions}}"
|
||||||
|
AdvSceneSwitcher.mediaTab.help="Esta pestaña te permitirá cambiar de escena según los estados de las fuentes de medios.\nPor ejemplo, puede volver automáticamente a la escena anterior una vez que la fuente de medios seleccionada finalizó su reproducción.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; File Tab
|
||||||
|
AdvSceneSwitcher.fileTab.title="Archivo"
|
||||||
|
AdvSceneSwitcher.fileTab.readWriteSceneFile="Leer / escribir escena desde / a un archivo"
|
||||||
|
AdvSceneSwitcher.fileTab.currentSceneOutputFile="Escribe el nombre de la escena actual en este archivo:"
|
||||||
|
AdvSceneSwitcher.fileTab.switchSceneBaseOnFile="Habilitar el cambio de escenas según la entrada de archivos"
|
||||||
|
AdvSceneSwitcher.fileTab.switchSceneNameInputFile="Leer el nombre de la escena a la que se cambiará desde este archivo:"
|
||||||
|
AdvSceneSwitcher.fileTab.switchSceneBaseOnFileContent="Cambiar de escena según el contenido del archivo"
|
||||||
|
AdvSceneSwitcher.fileTab.remoteFileWarning="Ten en cuenta que si eliges la opción remota, el selector de escenas intentará acceder a la ubicación remota cada x ms como se especifica en la pestaña General."
|
||||||
|
AdvSceneSwitcher.fileTab.remoteFileWarning1="Ten en cuenta que el selector de escenas intentará acceder a la ubicación remota cada "
|
||||||
|
AdvSceneSwitcher.fileTab.remoteFileWarning2="ms"
|
||||||
|
AdvSceneSwitcher.fileTab.libcurlWarning="¡Error al cargar libcurl! ¡No será posible acceder a archivos remotos!"
|
||||||
|
AdvSceneSwitcher.fileTab.selectWrite="Selecciona un archivo para escribir ..."
|
||||||
|
AdvSceneSwitcher.fileTab.selectRead="Seleccione un archivo para leer ..."
|
||||||
|
AdvSceneSwitcher.fileTab.textFileType="Archivos de texto (*.txt)"
|
||||||
|
AdvSceneSwitcher.fileTab.anyFileType="Cualquier archivo (*.*)"
|
||||||
|
AdvSceneSwitcher.fileTab.remote="archivo remoto"
|
||||||
|
AdvSceneSwitcher.fileTab.local="archivo local"
|
||||||
|
AdvSceneSwitcher.fileTab.useRegExp="usar expresiones regulares (coincidencia de patrones)"
|
||||||
|
AdvSceneSwitcher.fileTab.checkfileContentTime="si la fecha de modificación cambió"
|
||||||
|
AdvSceneSwitcher.fileTab.checkfileContent="si el contenido cambia"
|
||||||
|
AdvSceneSwitcher.fileTab.entry="Cambiar a {{scenes}} usando {{transitions}} si el contenido de {{fileType}} {{filePath}} {{browseButton}} coincide con:"
|
||||||
|
AdvSceneSwitcher.fileTab.entry2="{{matchText}}"
|
||||||
|
AdvSceneSwitcher.fileTab.entry3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
||||||
|
AdvSceneSwitcher.fileTab.help="Esta pestaña te permitirá cambiar escenas automáticamente según el contenido de archivos remotos o locales.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Random Tab
|
||||||
|
AdvSceneSwitcher.randomTab.title="Aleatorio"
|
||||||
|
AdvSceneSwitcher.randomTab.randomDisabledWarning="Funcionalidad deshabilitada - para activarla, selecciona \"Si no se cumple ninguna condición de cambio, cambiar a cualquier escena en la pestaña Aleatorio\" en la pestaña General"
|
||||||
|
AdvSceneSwitcher.randomTab.entry="Si no se cumple ninguna condición de cambio, cambiar a {{scenes}} usando {{transitions}} después de {{delay}}"
|
||||||
|
AdvSceneSwitcher.randomTab.help="El selector de escenas elegirá aleatoriamente una entrada en esta pestaña para cambiar durante el tiempo configurado.\nTen en cuenta que la misma entrada no se elegirá dos veces seguidas.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Time Tab
|
||||||
|
AdvSceneSwitcher.timeTab.title="Tiempo"
|
||||||
|
AdvSceneSwitcher.timeTab.anyDay="En cualquier día"
|
||||||
|
AdvSceneSwitcher.timeTab.mondays="Lunes"
|
||||||
|
AdvSceneSwitcher.timeTab.tuesdays="Martes"
|
||||||
|
AdvSceneSwitcher.timeTab.wednesdays="Miércoles"
|
||||||
|
AdvSceneSwitcher.timeTab.thursdays="Jueves"
|
||||||
|
AdvSceneSwitcher.timeTab.fridays="Viernes"
|
||||||
|
AdvSceneSwitcher.timeTab.saturdays="Sábados"
|
||||||
|
AdvSceneSwitcher.timeTab.sundays="Domingos"
|
||||||
|
AdvSceneSwitcher.timeTab.afterstart="Empezar al iniciar emisión/grabación"
|
||||||
|
AdvSceneSwitcher.timeTab.afterstart.tip="Se utilizará el tiempo relativo al inicio de la transmisión / grabación"
|
||||||
|
AdvSceneSwitcher.timeTab.entry="{{triggers}} a las {{time}} cambiar a {{scenes}} usando {{transitions}}"
|
||||||
|
AdvSceneSwitcher.timeTab.help="Esta pestaña te permitirá cambiar automáticamente a una escena diferente en función de la hora local actual.\n\nTen en cuenta que el selector de escenas solo cambiará de escena a la hora exacta que especificaste.\nAsegúrate de haber configurado los ajustes de prioridad en la pestaña General a tu gusto para que no se pierda el punto de tiempo seleccionado debido a que otros métodos de cambio tengan una prioridad más alta.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Idle Tab
|
||||||
|
AdvSceneSwitcher.idleTab.title="Inactividad"
|
||||||
|
AdvSceneSwitcher.idleTab.enable="Habilitar la detección de inactividad"
|
||||||
|
AdvSceneSwitcher.idleTab.idleswitch="Después de {{duration}} sin entradas de teclado o ratón, cambiar a la escena {{scenes}} usando la {{transitions}}"
|
||||||
|
AdvSceneSwitcher.idleTab.dontSwitchIfFocus1="No cambiar si"
|
||||||
|
AdvSceneSwitcher.idleTab.dontSwitchIfFocus2="está en foco"
|
||||||
|
|
||||||
|
; Scene Sequence Tab
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.title="Secuencia"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.description="Se puede cancelar una secuencia de cambios de escena automática pausando / deteniendo el selector de escenas o cambiando manualmente a una escena diferente"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.save="Guardar secuencias de escenas en un archivo"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.load="Cargar secuencias de escenas desde un archivo"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.saveTitle="Guardar la secuencia de escenas en un archivo ..."
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.loadTitle="Seleccionar un archivo para leer la secuencia de escenas ..."
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.loadFail="¡Advanced Scene Switcher no ha podido cargar los ajustes!"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.loadSuccess="¡Advanced Scene Switcher ha importando los ajustes correctamente!"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.fileType="Archivos de texto (*.txt)"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.interruptible="interrumpible"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.interruptibleHint="Se permiten otros métodos de cambio para interrumpir esta secuencia de escenas."
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.entry="Cuando {{startScenes}} esté activo, cambiar a {{scenes}} después de {{delay}} usando {{transitions}} {{interruptible}}"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.extendEdit="Extender secuencia"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.extendEntry="Después de {{delay}} cambiar a {{scenes}} usando {{transitions}}"
|
||||||
|
AdvSceneSwitcher.sceneSequenceTab.help="Esta pestaña te permitirá cambiar automáticamente a una escena diferente si una escena estuvo activa durante un período de tiempo configurado.\nPor ejemplo, podrías alternar automáticamente entre dos escenas automáticamente.\n\nHaz clic en el símbolo más resaltado para seguir."
|
||||||
|
|
||||||
|
; Audio Tab
|
||||||
|
AdvSceneSwitcher.audioTab.title="Audio"
|
||||||
|
AdvSceneSwitcher.audioTab.condition.above="por encima del"
|
||||||
|
AdvSceneSwitcher.audioTab.condition.below="por debajo del"
|
||||||
|
AdvSceneSwitcher.audioTab.ignoreInactiveSource="a menos que la fuente esté inactiva"
|
||||||
|
AdvSceneSwitcher.audioTab.entry="Cuando el volumen de {{audioSources}} es {{condition}} {{volumeWidget}} durante {{duration}} segundos, cambie a {{scenes}} usando {{transitions}} {{ignoreInactiveSource}}"
|
||||||
|
AdvSceneSwitcher.audioTab.multiMatchfallbackCondition="Si múltiples entradas coinciden ..."
|
||||||
|
AdvSceneSwitcher.audioTab.multiMatchfallback="... durante {{duration}} cambiar a {{scenes}} usando {{transitions}}"
|
||||||
|
AdvSceneSwitcher.audioTab.help="Esta pestaña te permitirá cambiar de escena según el volumen de las fuentes.\nPor ejemplo, podrías cambiar automáticamente a una escena diferente si el volumen de su micrófono alcanza un cierto umbral.\n\nHaz clic en el símbolo más resaltado para continuar."
|
||||||
|
|
||||||
|
; Video Tab
|
||||||
|
AdvSceneSwitcher.videoTab.title="Vídeo"
|
||||||
|
AdvSceneSwitcher.videoTab.getScreenshot="Obtener captura de pantalla para la entrada seleccionada"
|
||||||
|
AdvSceneSwitcher.videoTab.getScreenshotHelp="Obtén una captura de pantalla de la fuente de vídeo de la entrada actualmente seleccionada y configúrala automáticamente como la imagen de destino"
|
||||||
|
AdvSceneSwitcher.videoTab.condition.match="coincide exactamente"
|
||||||
|
AdvSceneSwitcher.videoTab.condition.match.tooltip="Una coincidencia exacta requiere que el objetivo y la imagen de origen tengan la misma resolución.\nAdicionalmente, todos los píxeles deben coincidir, por lo que no se recomienda el uso de formatos de imagen que utilizan compresión (por ejemplo, .JPG)."
|
||||||
|
AdvSceneSwitcher.videoTab.condition.differ="no coincide"
|
||||||
|
AdvSceneSwitcher.videoTab.condition.hasNotChanged="no ha cambiado"
|
||||||
|
AdvSceneSwitcher.videoTab.condition.hasChanged="ha cambiado"
|
||||||
|
AdvSceneSwitcher.videoTab.ignoreInactiveSource="a menos que la fuente esté inactiva"
|
||||||
|
AdvSceneSwitcher.videoTab.entry="Cuando {{videoSources}} {{condition}} {{filePath}} {{browseButton}} durante {{duration}} cambiar a {{scenes}} usando {{transitions}} {{ignoreInactiveSource}}"
|
||||||
|
AdvSceneSwitcher.videoTab.help="<html><head/><body><p>Esta pestaña te permitirá cambiar escenas según la salida de vídeo actual de las fuentes seleccionadas.<br/>Asegúrate de revisar <a href=\"https://obsproject.com/forum/resources/pixel-match-switcher.1202\"><span style=\" text-decoration: underline; color:#268bd2;\">Pixel Match Switcher</span></a> para una implementación aún mejor de esta funcionalidad.<br/><br/> Haz clic en el símbolo más resaltado para continuar.</p></body></html>"
|
||||||
|
|
||||||
|
; Network Tab
|
||||||
|
AdvSceneSwitcher.networkTab.title="Red"
|
||||||
|
AdvSceneSwitcher.networkTab.description="Esta pestaña le permitirá controlar de forma remota la escena activa de otra instancia de OBS.\nTenga en cuenta que los nombres de las escenas deben coincidir exactamente en todas las instancias de OBS".
|
||||||
|
AdvSceneSwitcher.networkTab.warning="Ejecutar el servidor fuera de una red local permitirá que terceros lean la escena activa".
|
||||||
|
AdvSceneSwitcher.networkTab.server="Iniciar servidor (envía mensajes de cambio de escena a todos los clientes conectados)"
|
||||||
|
AdvSceneSwitcher.networkTab.server.port="Puerto"
|
||||||
|
AdvSceneSwitcher.networkTab.server.lockToIPv4="Bloquear servidor para usar solo IPv4"
|
||||||
|
AdvSceneSwitcher.networkTab.server.sendSceneChange="Enviar mensajes para cambios de escena"
|
||||||
|
AdvSceneSwitcher.networkTab.server.restrictSendToAutomatedSwitches="Solo enviar mensajes para cambios de escena automatizados"
|
||||||
|
AdvSceneSwitcher.networkTab.server.sendPreview="Enviar mensajes para obtener una vista previa del cambio de escena cuando se ejecuta en Modo Estudio"
|
||||||
|
AdvSceneSwitcher.networkTab.startFailed.message="El servidor WebSockets no pudo iniciarse, tal vez porque:\n - El puerto TCP %1 puede estar actualmente en uso en otro lugar de este sistema, posiblemente por otra aplicación. Intente configurar un puerto TCP diferente en el WebSocket configuración del servidor o detenga cualquier aplicación que pueda estar usando este puerto.\n - Mensaje de error: %2"
|
||||||
|
AdvSceneSwitcher.networkTab.server.status.currentStatus="Estado actual"
|
||||||
|
AdvSceneSwitcher.networkTab.server.status.notRunning="Desconectado"
|
||||||
|
AdvSceneSwitcher.networkTab.server.status.starting="Iniciando"
|
||||||
|
AdvSceneSwitcher.networkTab.server.status.running="En ejecución"
|
||||||
|
AdvSceneSwitcher.networkTab.server.restart="Reiniciar servidor"
|
||||||
|
AdvSceneSwitcher.networkTab.client="Iniciar cliente (Recibe mensajes de cambios de escena)"
|
||||||
|
AdvSceneSwitcher.networkTab.client.address="Nombre de host o dirección IP"
|
||||||
|
AdvSceneSwitcher.networkTab.client.port="Puerto"
|
||||||
|
AdvSceneSwitcher.networkTab.client.status.currentStatus="Estado actual"
|
||||||
|
AdvSceneSwitcher.networkTab.client.status.disconnected="Desconectado"
|
||||||
|
AdvSceneSwitcher.networkTab.client.status.connecting="Conectando"
|
||||||
|
AdvSceneSwitcher.networkTab.client.status.connected="Conectado"
|
||||||
|
AdvSceneSwitcher.networkTab.client.reconnect="Forzar reconexión"
|
||||||
|
|
||||||
|
; Scene Group Tab
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.title="Grupo de escenas"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.list="Grupos de escenas"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit="Editar grupos de escenas"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.name="Nombre:"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.type="Tipo: {{type}}"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.type.count="Contar"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.type.time="Tiempo"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.type.random="Al azar"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.count="Avanzar a la siguiente escena en la lista después de {{count}} coincidencias"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.time="Avanzar a la siguiente escena de la lista después de que haya pasado {{time}}"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.random="Elige la siguiente escena en la lista al azar"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.repeat="Empezar desde el principio si se llega al final de la lista de escenas"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.edit.addScene="Agregar escena"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.add="Agregar grupo de escenas"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.defaultname="Grupo de escenas %1"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.exists="El grupo de escenas o el nombre de la escena ya existe"
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.help="Los grupos de escenas se pueden seleccionar como un objetivo al igual que una escena normal.\n\nComo sugiere el nombre, un grupo de escenas es una colección de varias escenas.\nEl grupo de escenas avanzará a través de la lista de sus escenas asignadas según los ajustes configurados, que se puede encontrar en el lado derecho.\n\nPuedes configurar el grupo de escenas para avanzar a la siguiente escena en la lista:\nDespués de varias veces, el grupo de escenas se selecciona como objetivo.\nDespués de que un cierto período de tiempo haya pasado.\nO al azar.\n\nPor ejemplo, un grupo de escenas que contiene las escenas ... \nEscena 1 \nEscena 2 \nEscena 3 \n ... activará la \"Escena 1 \" la primera vez que se seleccione como objetivo. \nLa segunda vez se activará \"Escena 2 \". \nLas veces restantes \"Escena 3 \" se activarán. \n\nHaz clic en el símbolo más resaltado a continuación para agregar un nuevo grupo de escenas."
|
||||||
|
AdvSceneSwitcher.sceneGroupTab.scenes.help="Selecciona el grupo de escenas que deseas modificar a la izquierda. \n\nSelecciona una escena para agregar a este grupo de escenas seleccionando la escena de arriba y haciendo clic en el símbolo más a continuación. \n\nSe puede agregar una escena varias veces al mismo grupo de escenas."
|
||||||
|
|
||||||
|
; Scene Trigger Tab
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.title="Activadores de escena"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.none="--selecciona el activador--"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.sceneActive="esté activo"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.sceneInactive="no esté activo"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.sceneLeave="cambie a otra escena"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.none="--Selecciona la acción--"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startRecording="empezar a grabar"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.pauseRecording="pausar la grabación"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unpauseRecording="reanudar grabación"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopRecording="detener grabación"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopStreaming="detener transmisión"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startStreaming="iniciar transmisión"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startReplayBuffer="iniciar búfer de repetición"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopReplayBuffer="detener búfer de repetición"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource="silenciar fuente"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource="dejar de silenciar fuente"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startSwitcher="iniciar el selector de escenas"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopSwitcher="detener el selector de escenas"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startVirtualCamera="Iniciar Camara Virtual"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopVirtualCamera="Detener Camara Virtual"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.entry="Cuando {{scenes}} {{triggers}} {{actions}} {{audioSources}} después de {{duration}}"
|
||||||
|
AdvSceneSwitcher.sceneTriggerTab.help="Esta pestaña te permite activar acciones sobre cambios de escena, como detener la grabación o la transmisión."
|
||||||
|
|
||||||
|
; Hotkey
|
||||||
|
AdvSceneSwitcher.hotkey.startSwitcherHotkey="Iniciar Advanced Scene Switcher"
|
||||||
|
AdvSceneSwitcher.hotkey.stopSwitcherHotkey="Detener Advanced Scene Switcher"
|
||||||
|
AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Alternar inicio / detención para Advanced Scene Switcher"
|
||||||
|
AdvSceneSwitcher.hotkey.macro.pause="Pausar macro %1"
|
||||||
|
AdvSceneSwitcher.hotkey.macro.unpause="Despausar macro %1"
|
||||||
|
AdvSceneSwitcher.hotkey.macro.togglePause="Alternar pausa de macro %1"
|
||||||
|
AdvSceneSwitcher.hotkey.upMacroSegmentHotkey="Mover selección de segmento de macro hacia arriba"
|
||||||
|
AdvSceneSwitcher.hotkey.downMacroSegmentHotkey="Mover selección de segmento de macro hacia abajo"
|
||||||
|
AdvSceneSwitcher.hotkey.removeMacroSegmentHotkey="Eliminar segmento de macro seleccionado"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.askBackup="Se detectó una nueva versión de Advanced Scene Switcher.\n¿Crear una copia de seguridad de la configuración anterior?"
|
||||||
|
AdvSceneSwitcher.askForMacro="Select macro {{macroSelection}}"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.close="Cerrar"
|
||||||
|
AdvSceneSwitcher.browse="Explorar"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.selectScene="--seleccionar escena--"
|
||||||
|
AdvSceneSwitcher.selectPreviousScene="Escena anterior"
|
||||||
|
AdvSceneSwitcher.selectCurrentScene="Escena actual"
|
||||||
|
AdvSceneSwitcher.selectAnyScene="Cualquier escena"
|
||||||
|
AdvSceneSwitcher.currentTransition="Transición actual"
|
||||||
|
AdvSceneSwitcher.anyTransition="Cualquier transición"
|
||||||
|
AdvSceneSwitcher.selectTransition="--seleccionar transición--"
|
||||||
|
AdvSceneSwitcher.selectWindow="--seleccionar ventana--"
|
||||||
|
AdvSceneSwitcher.selectSource="--seleccionar fuente--"
|
||||||
|
AdvSceneSwitcher.selectAudioSource="--seleccione la fuente de audio--"
|
||||||
|
AdvSceneSwitcher.selectVideoSource="--seleccione la fuente de video--"
|
||||||
|
AdvSceneSwitcher.OBSVideoOutput="Salida de vídeo OBS"
|
||||||
|
AdvSceneSwitcher.selectMediaSource="--seleccione la fuente de medios--"
|
||||||
|
AdvSceneSwitcher.selectProcess="--seleccionar proceso--"
|
||||||
|
AdvSceneSwitcher.selectFilter="--seleccionar filtro--"
|
||||||
|
AdvSceneSwitcher.selectMacro="--seleccionar macro--"
|
||||||
|
AdvSceneSwitcher.selectItem="--seleccionar elemento--"
|
||||||
|
AdvSceneSwitcher.selectProfile="--seleccionar perfil--"
|
||||||
|
AdvSceneSwitcher.selectSceneCollection="--seleccionar colección de escenas--"
|
||||||
|
AdvSceneSwitcher.enterPath="--ingrese la ruta--"
|
||||||
|
AdvSceneSwitcher.enterText="--ingresar texto--"
|
||||||
|
AdvSceneSwitcher.invaildEntriesWillNotBeSaved="las entradas no válidas no se guardarán"
|
||||||
|
AdvSceneSwitcher.selectWindowTip="Usa \"OBS \" para especificar la ventana de OBS\nUsa \"Cambiar de tarea \" para especificar ALT + TAB"
|
||||||
|
AdvSceneSwitcher.sceneItemSelection.all="Todos"
|
||||||
|
AdvSceneSwitcher.sceneItemSelection.any="Cualquiera"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.status.active="Activo"
|
||||||
|
AdvSceneSwitcher.status.inactive="Inactivo"
|
||||||
|
AdvSceneSwitcher.running="Iniciar complemento"
|
||||||
|
AdvSceneSwitcher.stopped="Complemento de detención"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.firstBootMessage="<html><head/><body><p>Esta parece ser la primera vez que se inicia el conmutador de escena avanzado.<br>Por favor, eche un vistazo a <a href=\"https:/ /github.com/WarmUpTill/SceneSwitcher/wiki\"><span style=\" text-decoration: underline; color:#268bd2;\">Wiki</span></a> para obtener una lista de guías y ejemplos.<br>No dude en hacer preguntas en el complemento <a href=\"https://obsproject.com /forum/threads/advanced-scene-switcher.48264\"><span style=\" text-decoration: underline; color:#268bd2;\">hilo</span></a> en los foros de OBS!</p></body></html>"
|
||||||
|
|
||||||
|
AdvSceneSwitcher.deprecatedTabWarning="¡Se detuvo el desarrollo de esta pestaña!\nConsidere cambiar a macros en su lugar.\nEsta sugerencia se puede desactivar en la pestaña General".
|
||||||
|
|
||||||
|
AdvSceneSwitcher.unit.milliseconds="milisegundos"
|
||||||
|
AdvSceneSwitcher.unit.secends="segundos"
|
||||||
|
AdvSceneSwitcher.unit.minutes="minutos"
|
||||||
|
AdvSceneSwitcher.unit.hours="horas"
|
||||||
|
AdvSceneSwitcher.duration.condition.none="Sin límite de tiempo"
|
||||||
|
AdvSceneSwitcher.duration.condition.more="Al menos durante"
|
||||||
|
AdvSceneSwitcher.duration.condition.equal="Para exactamente"
|
||||||
|
AdvSceneSwitcher.duration.condition.less="Para como máximo"
|
||||||
|
AdvSceneSwitcher.duration.condition.within="Dentro de los últimos"
|
||||||
|
|
||||||
|
;Traducido por: @EliasDipa
|
||||||
@@ -132,7 +132,7 @@ AdvSceneSwitcher.action.recording.type.start="Начать запись"
|
|||||||
AdvSceneSwitcher.action.recording.type.pause="Пауза записи"
|
AdvSceneSwitcher.action.recording.type.pause="Пауза записи"
|
||||||
AdvSceneSwitcher.action.recording.type.unpause="Снять запись с паузы"
|
AdvSceneSwitcher.action.recording.type.unpause="Снять запись с паузы"
|
||||||
AdvSceneSwitcher.action.recording.pause.hint="Обратите внимание, что в зависимости от настроек записи вы можете не иметь возможности приостановить запись"
|
AdvSceneSwitcher.action.recording.pause.hint="Обратите внимание, что в зависимости от настроек записи вы можете не иметь возможности приостановить запись"
|
||||||
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}"
|
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}{{splitHint}}"
|
||||||
AdvSceneSwitcher.action.replay="Буфер воспроизведения"
|
AdvSceneSwitcher.action.replay="Буфер воспроизведения"
|
||||||
AdvSceneSwitcher.action.replay.type.stop="Остановить буфер воспроизведения"
|
AdvSceneSwitcher.action.replay.type.stop="Остановить буфер воспроизведения"
|
||||||
AdvSceneSwitcher.action.replay.type.start="Начать воспроизведение буфера"
|
AdvSceneSwitcher.action.replay.type.start="Начать воспроизведение буфера"
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ AdvSceneSwitcher.condition.window="Pencere"
|
|||||||
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} Varolan ve ..."
|
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} Varolan ve ..."
|
||||||
AdvSceneSwitcher.condition.window.entry.line2="... {{fullscreen}} Tam ekran {{maximized}} büyütüldü {{focused}} odaklanıldı {{windowFocusChanged}} ön plan penceresi değişikliği"
|
AdvSceneSwitcher.condition.window.entry.line2="... {{fullscreen}} Tam ekran {{maximized}} büyütüldü {{focused}} odaklanıldı {{windowFocusChanged}} ön plan penceresi değişikliği"
|
||||||
AdvSceneSwitcher.condition.file="Dosya"
|
AdvSceneSwitcher.condition.file="Dosya"
|
||||||
AdvSceneSwitcher.condition.file.entry.line1="İçerik {{fileType}} {{filePath}} eşleştirmeler:"
|
AdvSceneSwitcher.condition.file.entry.line1="İçerik{{fileType}}{{filePath}}{{conditions}}"
|
||||||
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
||||||
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
||||||
AdvSceneSwitcher.condition.media="Medya"
|
AdvSceneSwitcher.condition.media="Medya"
|
||||||
@@ -280,7 +280,7 @@ AdvSceneSwitcher.action.recording.type.start="Kayıt Başlat"
|
|||||||
AdvSceneSwitcher.action.recording.type.pause="Kayıt Duraklat"
|
AdvSceneSwitcher.action.recording.type.pause="Kayıt Duraklat"
|
||||||
AdvSceneSwitcher.action.recording.type.unpause="Kayıt Duraklatma"
|
AdvSceneSwitcher.action.recording.type.unpause="Kayıt Duraklatma"
|
||||||
AdvSceneSwitcher.action.recording.pause.hint="Kayıt ayarlarınıza bağlı olarak kaydı duraklatamayabileceğinizi unutmayın."
|
AdvSceneSwitcher.action.recording.pause.hint="Kayıt ayarlarınıza bağlı olarak kaydı duraklatamayabileceğinizi unutmayın."
|
||||||
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}"
|
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}{{splitHint}}"
|
||||||
AdvSceneSwitcher.action.replay="Tekrar arabelleği"
|
AdvSceneSwitcher.action.replay="Tekrar arabelleği"
|
||||||
AdvSceneSwitcher.action.replay.type.stop="Tekrar arabelleğini durdur"
|
AdvSceneSwitcher.action.replay.type.stop="Tekrar arabelleğini durdur"
|
||||||
AdvSceneSwitcher.action.replay.type.start="Tekrar arabelleğini başlat"
|
AdvSceneSwitcher.action.replay.type.start="Tekrar arabelleğini başlat"
|
||||||
@@ -369,8 +369,8 @@ AdvSceneSwitcher.action.previewScene.entry="Önizleme sahnesini şu şekilde de
|
|||||||
AdvSceneSwitcher.action.SceneSwap="Sahneyi değiştir (Studyo modu)"
|
AdvSceneSwitcher.action.SceneSwap="Sahneyi değiştir (Studyo modu)"
|
||||||
AdvSceneSwitcher.action.SceneSwap.entry="Stüdyo modunda önizleme ve program sahnesini değiştir"
|
AdvSceneSwitcher.action.SceneSwap.entry="Stüdyo modunda önizleme ve program sahnesini değiştir"
|
||||||
AdvSceneSwitcher.action.transition="Geçiş"
|
AdvSceneSwitcher.action.transition="Geçiş"
|
||||||
AdvSceneSwitcher.action.transition.entry.line1="{{setType}}Geçiş türünü ayarla {{transitions}}"
|
AdvSceneSwitcher.action.transition.entry.line2="{{setTransition}}Geçiş türünü ayarla {{transitions}}"
|
||||||
AdvSceneSwitcher.action.transition.entry.line2="{{setDuration}}Geçiş süresini şuna ayarla: {{duration}}saniyeler"
|
AdvSceneSwitcher.action.transition.entry.line3="{{setDuration}}Geçiş süresini şuna ayarla: {{duration}}saniyeler"
|
||||||
AdvSceneSwitcher.action.timer="Zamanlayıcı"
|
AdvSceneSwitcher.action.timer="Zamanlayıcı"
|
||||||
AdvSceneSwitcher.action.timer.type.pause="Duraklat"
|
AdvSceneSwitcher.action.timer.type.pause="Duraklat"
|
||||||
AdvSceneSwitcher.action.timer.type.continue="Devam et"
|
AdvSceneSwitcher.action.timer.type.continue="Devam et"
|
||||||
@@ -383,7 +383,6 @@ AdvSceneSwitcher.action.systray="Sistem tepsisi bildirimi"
|
|||||||
AdvSceneSwitcher.action.systray.entry="Bildirimleri göster: {{message}}"
|
AdvSceneSwitcher.action.systray.entry="Bildirimleri göster: {{message}}"
|
||||||
AdvSceneSwitcher.action.screenshot="Ekran görüntüsü"
|
AdvSceneSwitcher.action.screenshot="Ekran görüntüsü"
|
||||||
AdvSceneSwitcher.action.screenshot.mainOutput="OBS'nin ana çıkışı"
|
AdvSceneSwitcher.action.screenshot.mainOutput="OBS'nin ana çıkışı"
|
||||||
AdvSceneSwitcher.action.screenshot.entry="Ekran görüntüsü {{sources}}"
|
|
||||||
AdvSceneSwitcher.action.profile="Profil"
|
AdvSceneSwitcher.action.profile="Profil"
|
||||||
AdvSceneSwitcher.action.profile.entry="Aktif profili şununla değiştir: {{profiles}}"
|
AdvSceneSwitcher.action.profile.entry="Aktif profili şununla değiştir: {{profiles}}"
|
||||||
AdvSceneSwitcher.action.sceneCollection="Sahne koleksiyonu"
|
AdvSceneSwitcher.action.sceneCollection="Sahne koleksiyonu"
|
||||||
|
|||||||
@@ -116,7 +116,6 @@ AdvSceneSwitcher.condition.window="窗口"
|
|||||||
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} 存在..."
|
AdvSceneSwitcher.condition.window.entry.line1="{{windows}} 存在..."
|
||||||
AdvSceneSwitcher.condition.window.entry.line2="... 并且是 {{fullscreen}} 全屏 {{maximized}} 最大化 {{focused}} 获得焦点 {{windowFocusChanged}} 焦点窗口已更改"
|
AdvSceneSwitcher.condition.window.entry.line2="... 并且是 {{fullscreen}} 全屏 {{maximized}} 最大化 {{focused}} 获得焦点 {{windowFocusChanged}} 焦点窗口已更改"
|
||||||
AdvSceneSwitcher.condition.file="文件"
|
AdvSceneSwitcher.condition.file="文件"
|
||||||
AdvSceneSwitcher.condition.file.entry.line1="内容 {{fileType}} {{filePath}} (本地是文本,网络是获取的网页)完全匹配:"
|
|
||||||
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}"
|
||||||
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
AdvSceneSwitcher.condition.file.entry.line3="{{useRegex}} {{checkModificationDate}} {{checkFileContent}}"
|
||||||
AdvSceneSwitcher.condition.media="媒体"
|
AdvSceneSwitcher.condition.media="媒体"
|
||||||
@@ -251,7 +250,6 @@ AdvSceneSwitcher.condition.date.ignoreDate="如果未选中,日期组件将被
|
|||||||
AdvSceneSwitcher.condition.date.ignoreTime="如果未选中,时间组件将被忽略"
|
AdvSceneSwitcher.condition.date.ignoreTime="如果未选中,时间组件将被忽略"
|
||||||
AdvSceneSwitcher.condition.date.showAdvancedSettings="显示高级设置"
|
AdvSceneSwitcher.condition.date.showAdvancedSettings="显示高级设置"
|
||||||
AdvSceneSwitcher.condition.date.showSimpleSettings="显示简单设置"
|
AdvSceneSwitcher.condition.date.showSimpleSettings="显示简单设置"
|
||||||
AdvSceneSwitcher.condition.date.entry.simple="在 {{dayOfWeek}} 的 {{weekTime}}"
|
|
||||||
AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}"
|
AdvSceneSwitcher.condition.date.entry.advanced="{{condition}} {{ignoreDate}}{{date}} {{ignoreTime}}{{time}} {{separator}} {{date2}} {{time2}}"
|
||||||
AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} 在匹配到日期时间后,每隔 {{duration}} 重复一次"
|
AdvSceneSwitcher.condition.date.entry.repeat="{{repeat}} 在匹配到日期时间后,每隔 {{duration}} 重复一次"
|
||||||
AdvSceneSwitcher.condition.sceneTransform="场景项目被改变"
|
AdvSceneSwitcher.condition.sceneTransform="场景项目被改变"
|
||||||
@@ -324,7 +322,7 @@ AdvSceneSwitcher.action.recording.type.start="开始录制"
|
|||||||
AdvSceneSwitcher.action.recording.type.pause="暂停录制"
|
AdvSceneSwitcher.action.recording.type.pause="暂停录制"
|
||||||
AdvSceneSwitcher.action.recording.type.unpause="取消录制暂停"
|
AdvSceneSwitcher.action.recording.type.unpause="取消录制暂停"
|
||||||
AdvSceneSwitcher.action.recording.pause.hint="请注意,根据您的录制设置,您可能无法暂停录制"
|
AdvSceneSwitcher.action.recording.pause.hint="请注意,根据您的录制设置,您可能无法暂停录制"
|
||||||
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}"
|
AdvSceneSwitcher.action.recording.entry="{{actions}}{{pauseHint}}{{splitHint}}"
|
||||||
AdvSceneSwitcher.action.replay="回放缓冲区"
|
AdvSceneSwitcher.action.replay="回放缓冲区"
|
||||||
AdvSceneSwitcher.action.replay.type.stop="停止回放缓冲区"
|
AdvSceneSwitcher.action.replay.type.stop="停止回放缓冲区"
|
||||||
AdvSceneSwitcher.action.replay.type.start="启动回放缓冲区"
|
AdvSceneSwitcher.action.replay.type.start="启动回放缓冲区"
|
||||||
@@ -412,8 +410,8 @@ AdvSceneSwitcher.action.previewScene.entry="将预览场景切换到 {{scenes}}"
|
|||||||
AdvSceneSwitcher.action.SceneSwap="交换场景 (Studio mode)"
|
AdvSceneSwitcher.action.SceneSwap="交换场景 (Studio mode)"
|
||||||
AdvSceneSwitcher.action.SceneSwap.entry="在studio模式下交换预览和编程场景"
|
AdvSceneSwitcher.action.SceneSwap.entry="在studio模式下交换预览和编程场景"
|
||||||
AdvSceneSwitcher.action.transition="过场特效"
|
AdvSceneSwitcher.action.transition="过场特效"
|
||||||
AdvSceneSwitcher.action.transition.entry.line1="{{setType}}将过场特效类型设置为 {{transitions}}"
|
AdvSceneSwitcher.action.transition.entry.line2="{{setTransition}}将过场特效类型设置为 {{transitions}}"
|
||||||
AdvSceneSwitcher.action.transition.entry.line2="{{setDuration}}将过场特效持续时间设置为 {{duration}}seconds"
|
AdvSceneSwitcher.action.transition.entry.line3="{{setDuration}}将过场特效持续时间设置为 {{duration}}seconds"
|
||||||
AdvSceneSwitcher.action.timer="计时器"
|
AdvSceneSwitcher.action.timer="计时器"
|
||||||
AdvSceneSwitcher.action.timer.type.pause="暂停"
|
AdvSceneSwitcher.action.timer.type.pause="暂停"
|
||||||
AdvSceneSwitcher.action.timer.type.continue="继续"
|
AdvSceneSwitcher.action.timer.type.continue="继续"
|
||||||
@@ -425,7 +423,6 @@ AdvSceneSwitcher.action.systray="系统托盘通知"
|
|||||||
AdvSceneSwitcher.action.systray.entry="显示通知: {{message}}"
|
AdvSceneSwitcher.action.systray.entry="显示通知: {{message}}"
|
||||||
AdvSceneSwitcher.action.screenshot="截图"
|
AdvSceneSwitcher.action.screenshot="截图"
|
||||||
AdvSceneSwitcher.action.screenshot.mainOutput="OBS 预览画面"
|
AdvSceneSwitcher.action.screenshot.mainOutput="OBS 预览画面"
|
||||||
AdvSceneSwitcher.action.screenshot.entry="截图 {{sources}}"
|
|
||||||
AdvSceneSwitcher.action.profile="配置文件"
|
AdvSceneSwitcher.action.profile="配置文件"
|
||||||
AdvSceneSwitcher.action.profile.entry="将活动配置文件切换到 {{profiles}}"
|
AdvSceneSwitcher.action.profile.entry="将活动配置文件切换到 {{profiles}}"
|
||||||
AdvSceneSwitcher.action.sceneCollection="场景集合"
|
AdvSceneSwitcher.action.sceneCollection="场景集合"
|
||||||
|
|||||||
216
deps/obs-websocket/lib/obs-websocket-api.h
vendored
Normal file
216
deps/obs-websocket/lib/obs-websocket-api.h
vendored
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/*
|
||||||
|
obs-websocket
|
||||||
|
Copyright (C) 2016-2021 Stephane Lepin <stephane.lepin@gmail.com>
|
||||||
|
Copyright (C) 2020-2022 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/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _OBS_WEBSOCKET_API_H
|
||||||
|
#define _OBS_WEBSOCKET_API_H
|
||||||
|
|
||||||
|
#include <obs.h>
|
||||||
|
|
||||||
|
#define OBS_WEBSOCKET_API_VERSION 2
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void *obs_websocket_vendor;
|
||||||
|
typedef void (*obs_websocket_request_callback_function)(obs_data_t *, obs_data_t *, void *);
|
||||||
|
|
||||||
|
struct obs_websocket_request_response {
|
||||||
|
unsigned int status_code;
|
||||||
|
char *comment;
|
||||||
|
char *response_data; // JSON string, because obs_data_t* only supports array<object>, so conversions would break API.
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ==================== INTERNAL DEFINITIONS ==================== */
|
||||||
|
|
||||||
|
struct obs_websocket_request_callback {
|
||||||
|
obs_websocket_request_callback_function callback;
|
||||||
|
void *priv_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline proc_handler_t *_ph;
|
||||||
|
|
||||||
|
/* ==================== INTERNAL API FUNCTIONS ==================== */
|
||||||
|
|
||||||
|
static inline proc_handler_t *obs_websocket_get_ph(void)
|
||||||
|
{
|
||||||
|
proc_handler_t *global_ph = obs_get_proc_handler();
|
||||||
|
assert(global_ph != NULL);
|
||||||
|
|
||||||
|
calldata_t cd = {0};
|
||||||
|
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?");
|
||||||
|
proc_handler_t *ret = (proc_handler_t *)calldata_ptr(&cd, "ph");
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool obs_websocket_ensure_ph(void)
|
||||||
|
{
|
||||||
|
if (!_ph)
|
||||||
|
_ph = obs_websocket_get_ph();
|
||||||
|
return _ph != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool obs_websocket_vendor_run_simple_proc(obs_websocket_vendor vendor, const char *proc_name, calldata_t *cd)
|
||||||
|
{
|
||||||
|
if (!obs_websocket_ensure_ph())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!vendor || !proc_name || !strlen(proc_name) || !cd)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
calldata_set_ptr(cd, "vendor", vendor);
|
||||||
|
|
||||||
|
proc_handler_call(_ph, proc_name, cd);
|
||||||
|
return calldata_bool(cd, "success");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==================== GENERAL API FUNCTIONS ==================== */
|
||||||
|
|
||||||
|
// Gets the API version built with the obs-websocket plugin
|
||||||
|
static inline unsigned int obs_websocket_get_api_version(void)
|
||||||
|
{
|
||||||
|
if (!obs_websocket_ensure_ph())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
if (!proc_handler_call(_ph, "get_api_version", &cd))
|
||||||
|
return 1; // API v1 does not include get_api_version
|
||||||
|
|
||||||
|
unsigned int ret = calldata_int(&cd, "version");
|
||||||
|
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
if (!obs_websocket_ensure_ph())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
const char *request_data_string = NULL;
|
||||||
|
if (request_data)
|
||||||
|
request_data_string = obs_data_get_json(request_data);
|
||||||
|
|
||||||
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
calldata_set_string(&cd, "request_type", request_type);
|
||||||
|
calldata_set_string(&cd, "request_data", request_data_string);
|
||||||
|
|
||||||
|
proc_handler_call(_ph, "call_request", &cd);
|
||||||
|
|
||||||
|
auto ret = (struct obs_websocket_request_response *)calldata_ptr(&cd, "response");
|
||||||
|
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free a request response object returned by `obs_websocket_call_request()`
|
||||||
|
static inline void obs_websocket_request_response_free(struct obs_websocket_request_response *response)
|
||||||
|
{
|
||||||
|
if (!response)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (response->comment)
|
||||||
|
bfree(response->comment);
|
||||||
|
if (response->response_data)
|
||||||
|
bfree(response->response_data);
|
||||||
|
bfree(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==================== VENDOR API FUNCTIONS ==================== */
|
||||||
|
|
||||||
|
// ALWAYS CALL ONLY VIA `obs_module_post_load()` CALLBACK!
|
||||||
|
// Registers a new "vendor" (Example: obs-ndi)
|
||||||
|
static inline obs_websocket_vendor obs_websocket_register_vendor(const char *vendor_name)
|
||||||
|
{
|
||||||
|
if (!obs_websocket_ensure_ph())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
calldata_set_string(&cd, "name", vendor_name);
|
||||||
|
|
||||||
|
proc_handler_call(_ph, "vendor_register", &cd);
|
||||||
|
obs_websocket_vendor ret = calldata_ptr(&cd, "vendor");
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Registers a new request for a vendor
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
struct obs_websocket_request_callback cb = {};
|
||||||
|
cb.callback = request_callback;
|
||||||
|
cb.priv_data = priv_data;
|
||||||
|
|
||||||
|
calldata_set_string(&cd, "type", request_type);
|
||||||
|
calldata_set_ptr(&cd, "callback", &cb);
|
||||||
|
|
||||||
|
bool success = obs_websocket_vendor_run_simple_proc(vendor, "vendor_request_register", &cd);
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unregisters an existing vendor request
|
||||||
|
static inline bool obs_websocket_vendor_unregister_request(obs_websocket_vendor vendor, const char *request_type)
|
||||||
|
{
|
||||||
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
calldata_set_string(&cd, "type", request_type);
|
||||||
|
|
||||||
|
bool success = obs_websocket_vendor_run_simple_proc(vendor, "vendor_request_unregister", &cd);
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Does not affect event_data refcount.
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
calldata_set_string(&cd, "type", event_name);
|
||||||
|
calldata_set_ptr(&cd, "data", (void *)event_data);
|
||||||
|
|
||||||
|
bool success = obs_websocket_vendor_run_simple_proc(vendor, "vendor_event_emit", &cd);
|
||||||
|
calldata_free(&cd);
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==================== END API FUNCTIONS ==================== */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
2
deps/opencv
vendored
2
deps/opencv
vendored
Submodule deps/opencv updated: ad6e82942b...b0dc474160
File diff suppressed because it is too large
Load Diff
@@ -4,13 +4,21 @@
|
|||||||
OBS_DECLARE_MODULE()
|
OBS_DECLARE_MODULE()
|
||||||
OBS_MODULE_USE_DEFAULT_LOCALE("advanced-scene-switcher", "en-US")
|
OBS_MODULE_USE_DEFAULT_LOCALE("advanced-scene-switcher", "en-US")
|
||||||
|
|
||||||
void InitSceneSwitcher();
|
typedef const char *(*translateFunc)(const char *);
|
||||||
|
|
||||||
|
void InitSceneSwitcher(obs_module_t *, translateFunc);
|
||||||
|
void RegisterWebsocketVendor();
|
||||||
void FreeSceneSwitcher();
|
void FreeSceneSwitcher();
|
||||||
|
|
||||||
|
void obs_module_post_load(void)
|
||||||
|
{
|
||||||
|
RegisterWebsocketVendor();
|
||||||
|
}
|
||||||
|
|
||||||
bool obs_module_load(void)
|
bool obs_module_load(void)
|
||||||
{
|
{
|
||||||
obs_frontend_push_ui_translation(obs_module_get_string);
|
obs_frontend_push_ui_translation(obs_module_get_string);
|
||||||
InitSceneSwitcher();
|
InitSceneSwitcher(obs_current_module(), obs_module_text);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,21 @@
|
|||||||
#include <obs-module.h>
|
#include <obs-module.h>
|
||||||
#include <obs-frontend-api.h>
|
#include <obs-frontend-api.h>
|
||||||
|
|
||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/status-control.hpp"
|
#include "status-control.hpp"
|
||||||
#include "headers/curl-helper.hpp"
|
#include "curl-helper.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
#include "headers/version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
const char *obs_module_text(const char *text)
|
||||||
|
{
|
||||||
|
return switcher->translate(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
obs_module_t *obs_current_module()
|
||||||
|
{
|
||||||
|
return switcher->modulePtr;
|
||||||
|
}
|
||||||
|
|
||||||
SwitcherData *switcher = nullptr;
|
SwitcherData *switcher = nullptr;
|
||||||
SwitcherData *GetSwitcher()
|
SwitcherData *GetSwitcher()
|
||||||
@@ -66,9 +76,6 @@ void AdvSceneSwitcher::loadUI()
|
|||||||
(void)DisplayMessage(msg);
|
(void)DisplayMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __APPLE__
|
|
||||||
setMinimumHeight(700);
|
|
||||||
#endif
|
|
||||||
setupGeneralTab();
|
setupGeneralTab();
|
||||||
setupTitleTab();
|
setupTitleTab();
|
||||||
setupExecutableTab();
|
setupExecutableTab();
|
||||||
@@ -220,6 +227,8 @@ void SwitcherData::Thread()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClearWebsocketMessages();
|
||||||
|
|
||||||
// After this point we will call frontend functions like
|
// After this point we will call frontend functions like
|
||||||
// obs_frontend_set_current_scene() and
|
// obs_frontend_set_current_scene() and
|
||||||
// obs_frontend_set_current_transition()
|
// obs_frontend_set_current_transition()
|
||||||
@@ -460,19 +469,24 @@ bool SwitcherData::sceneChangedDuringWait()
|
|||||||
return (waitScene && currentSource != waitScene);
|
return (waitScene && currentSource != waitScene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Relies on the fact that switcher->currentScene will only be updated on event
|
||||||
|
// OBS_FRONTEND_EVENT_SCENE_CHANGED but obs_frontend_get_current_scene() will
|
||||||
|
// already return the scene to be transitioned to.
|
||||||
|
bool SwitcherData::anySceneTransitionStarted()
|
||||||
|
{
|
||||||
|
auto currentSceneSrouce = obs_frontend_get_current_scene();
|
||||||
|
auto currentScene = obs_source_get_weak_source(currentSceneSrouce);
|
||||||
|
bool ret = switcher->currentScene != currentScene;
|
||||||
|
obs_weak_source_release(currentScene);
|
||||||
|
obs_source_release(currentSceneSrouce);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* OBS module setup
|
* OBS module setup
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
extern "C" void FreeSceneSwitcher()
|
extern "C" void FreeSceneSwitcher()
|
||||||
{
|
{
|
||||||
if (loaded_curl_lib) {
|
|
||||||
if (switcher->curl && f_curl_cleanup) {
|
|
||||||
f_curl_cleanup(switcher->curl);
|
|
||||||
}
|
|
||||||
delete loaded_curl_lib;
|
|
||||||
loaded_curl_lib = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlatformCleanup();
|
PlatformCleanup();
|
||||||
|
|
||||||
delete switcher;
|
delete switcher;
|
||||||
@@ -615,7 +629,7 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher)
|
|||||||
case OBS_FRONTEND_EVENT_STREAMING_STOPPED:
|
case OBS_FRONTEND_EVENT_STREAMING_STOPPED:
|
||||||
resetLiveTime();
|
resetLiveTime();
|
||||||
break;
|
break;
|
||||||
#ifdef REPLAYBUFFER_SUPPORTED
|
#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(26, 0, 0)
|
||||||
case OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED:
|
case OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED:
|
||||||
setReplayBufferSaved();
|
setReplayBufferSaved();
|
||||||
break;
|
break;
|
||||||
@@ -662,16 +676,14 @@ void LoadPlugins()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void InitSceneSwitcher()
|
extern "C" void InitSceneSwitcher(obs_module_t *m, translateFunc t)
|
||||||
{
|
{
|
||||||
blog(LOG_INFO, "version: %s", g_GIT_TAG);
|
blog(LOG_INFO, "version: %s", g_GIT_TAG);
|
||||||
blog(LOG_INFO, "version: %s", g_GIT_SHA1);
|
blog(LOG_INFO, "version: %s", g_GIT_SHA1);
|
||||||
|
|
||||||
switcher = new SwitcherData;
|
switcher = new SwitcherData;
|
||||||
|
switcher->modulePtr = m;
|
||||||
if (loadCurl() && f_curl_init) {
|
switcher->translate = t;
|
||||||
switcher->curl = f_curl_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
PlatformInit();
|
PlatformInit();
|
||||||
LoadPlugins();
|
LoadPlugins();
|
||||||
|
|||||||
@@ -1,15 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#ifdef BUILD_OUT_OF_TREE
|
|
||||||
#include "../../forms/ui_advanced-scene-switcher.h"
|
|
||||||
#elif defined ADVSS_MODULE
|
|
||||||
#include "../../../ui_advanced-scene-switcher.h"
|
|
||||||
#else
|
|
||||||
#include "ui_advanced-scene-switcher.h"
|
|
||||||
#endif
|
|
||||||
#include "macro-segment-list.hpp"
|
|
||||||
#include "switcher-data-structs.hpp"
|
#include "switcher-data-structs.hpp"
|
||||||
#include "platform-funcs.hpp"
|
#include "platform-funcs.hpp"
|
||||||
|
|
||||||
|
#include <macro-segment-list.hpp>
|
||||||
|
#include <ui_advanced-scene-switcher.h>
|
||||||
|
|
||||||
#define blog(level, msg, ...) blog(level, "[adv-ss] " msg, ##__VA_ARGS__)
|
#define blog(level, msg, ...) blog(level, "[adv-ss] " msg, ##__VA_ARGS__)
|
||||||
#define vblog(level, msg, ...) \
|
#define vblog(level, msg, ...) \
|
||||||
if (switcher->verbose) { \
|
if (switcher->verbose) { \
|
||||||
@@ -97,6 +92,12 @@ signals:
|
|||||||
void SceneGroupAdded(const QString &name);
|
void SceneGroupAdded(const QString &name);
|
||||||
void SceneGroupRemoved(const QString &name);
|
void SceneGroupRemoved(const QString &name);
|
||||||
void SceneGroupRenamed(const QString &oldName, const QString newName);
|
void SceneGroupRenamed(const QString &oldName, const QString newName);
|
||||||
|
void ConnectionAdded(const QString &);
|
||||||
|
void ConnectionRenamed(const QString &oldName, const QString &newName);
|
||||||
|
void ConnectionRemoved(const QString &);
|
||||||
|
void VariableAdded(const QString &);
|
||||||
|
void VariableRenamed(const QString &oldName, const QString &newName);
|
||||||
|
void VariableRemoved(const QString &);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void on_windowUp_clicked();
|
void on_windowUp_clicked();
|
||||||
@@ -298,8 +299,6 @@ public slots:
|
|||||||
|
|
||||||
void updateScreenRegionCursorPos();
|
void updateScreenRegionCursorPos();
|
||||||
|
|
||||||
void on_close_clicked();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool MacroTabIsInFocus();
|
bool MacroTabIsInFocus();
|
||||||
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Helper function to install plugins to correct location
|
|
||||||
function(install_advss_plugin target)
|
|
||||||
set(plugin_folder "adv-ss-plugins")
|
|
||||||
if(APPLE)
|
|
||||||
set(_bit_suffix "")
|
|
||||||
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
set(_bit_suffix "64bit/")
|
|
||||||
else()
|
|
||||||
set(_bit_suffix "32bit/")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(${target} PROPERTIES PREFIX "")
|
|
||||||
|
|
||||||
install(
|
|
||||||
TARGETS ${target}
|
|
||||||
LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}/${plugin_folder}"
|
|
||||||
RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}/${plugin_folder}")
|
|
||||||
add_custom_command(
|
|
||||||
TARGET ${target}
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
"${CMAKE_COMMAND}" -E copy "$<TARGET_FILE:${target}>"
|
|
||||||
"${OBS_OUTPUT_DIR}/$<CONFIGURATION>/obs-plugins/${_bit_suffix}/${plugin_folder}/$<TARGET_FILE_NAME:${target}>"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
if(DEFINED ENV{obsInstallerTempDir})
|
|
||||||
add_custom_command(
|
|
||||||
TARGET ${target}
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND
|
|
||||||
"${CMAKE_COMMAND}" -E copy "$<TARGET_FILE:${target}>"
|
|
||||||
"$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}/${plugin_folder}/$<TARGET_FILE_NAME:${target}>"
|
|
||||||
VERBATIM)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
obs_debug_copy_helper(
|
|
||||||
${target}
|
|
||||||
"${OBS_OUTPUT_DIR}/$<CONFIGURATION>/obs-plugins/${_bit_suffix}/${plugin_folder}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if(DEFINED ENV{obsInstallerTempDir})
|
|
||||||
obs_debug_copy_helper(
|
|
||||||
${target}
|
|
||||||
"$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}/${plugin_folder}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdbs/"
|
|
||||||
DESTINATION "${OBS_PLUGIN_DESTINATION}/${plugin_folder}"
|
|
||||||
CONFIGURATIONS Debug RelWithDebInfo)
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# Add macro conditions or actions which have dependencies to external libraries
|
|
||||||
# or other components which might potentially not be fulfilled by the user and
|
|
||||||
# thus cause issues.
|
|
||||||
add_subdirectory(opencv)
|
|
||||||
add_subdirectory(openvr)
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.14)
|
|
||||||
project(advanced-scene-switcher-opencv)
|
|
||||||
|
|
||||||
add_definitions(-DADVSS_MODULE)
|
|
||||||
|
|
||||||
find_package(OpenCV)
|
|
||||||
if(OpenCV_FOUND)
|
|
||||||
include_directories("${OpenCV_INCLUDE_DIRS}")
|
|
||||||
else()
|
|
||||||
set(OpenCV_LIBRARIES "")
|
|
||||||
message(
|
|
||||||
WARNING
|
|
||||||
"OpenCV not found! Functionality relying on OpenCV will be disabled!\nOpenCV sources are available under: ${CMAKE_CURRENT_SOURCE_DIR}/deps/opencv"
|
|
||||||
)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../headers")
|
|
||||||
set(module_SOURCES
|
|
||||||
area-selection.cpp
|
|
||||||
area-selection.hpp
|
|
||||||
macro-condition-video.cpp
|
|
||||||
macro-condition-video.hpp
|
|
||||||
opencv-helpers.cpp
|
|
||||||
opencv-helpers.hpp
|
|
||||||
preview-dialog.cpp
|
|
||||||
preview-dialog.hpp
|
|
||||||
threshold-slider.cpp
|
|
||||||
threshold-slider.hpp
|
|
||||||
video-selection.cpp
|
|
||||||
video-selection.hpp)
|
|
||||||
add_library(advanced-scene-switcher-opencv MODULE ${module_SOURCES})
|
|
||||||
|
|
||||||
if(BUILD_OUT_OF_TREE)
|
|
||||||
target_link_libraries(
|
|
||||||
advanced-scene-switcher-opencv
|
|
||||||
advanced-scene-switcher
|
|
||||||
${LIBOBS_LIB}
|
|
||||||
${LIBOBS_FRONTEND_API_LIB}
|
|
||||||
${OpenCV_LIBRARIES}
|
|
||||||
Qt5::Core
|
|
||||||
Qt5::Widgets)
|
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE)
|
|
||||||
if(NOT LIB_OUT_DIR)
|
|
||||||
set(LIB_OUT_DIR "/lib/obs-plugins")
|
|
||||||
endif()
|
|
||||||
set_target_properties(advanced-scene-switcher-opencv PROPERTIES PREFIX "")
|
|
||||||
install(
|
|
||||||
TARGETS advanced-scene-switcher-opencv
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_OUT_DIR}/adv-ss-plugins)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
target_link_libraries(
|
|
||||||
advanced-scene-switcher-opencv
|
|
||||||
advanced-scene-switcher
|
|
||||||
obs-frontend-api
|
|
||||||
${OpenCV_LIBRARIES}
|
|
||||||
Qt5::Core
|
|
||||||
Qt5::Widgets
|
|
||||||
libobs)
|
|
||||||
install_advss_plugin(advanced-scene-switcher-opencv)
|
|
||||||
endif()
|
|
||||||
129
src/general.cpp
129
src/general.cpp
@@ -1,16 +1,11 @@
|
|||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/status-control.hpp"
|
#include "status-control.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
#include "headers/version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QStandardPaths>
|
#include <QStandardPaths>
|
||||||
|
|
||||||
void AdvSceneSwitcher::on_close_clicked()
|
|
||||||
{
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AdvSceneSwitcher::reject()
|
void AdvSceneSwitcher::reject()
|
||||||
{
|
{
|
||||||
close();
|
close();
|
||||||
@@ -152,7 +147,10 @@ void AdvSceneSwitcher::closeEvent(QCloseEvent *)
|
|||||||
}
|
}
|
||||||
switcher->windowPos = this->pos();
|
switcher->windowPos = this->pos();
|
||||||
switcher->windowSize = this->size();
|
switcher->windowSize = this->size();
|
||||||
|
switcher->macroActionConditionSplitterPosition =
|
||||||
|
ui->macroActionConditionSplitter->sizes();
|
||||||
|
switcher->macroListMacroEditSplitterPosition =
|
||||||
|
ui->macroListMacroEditSplitter->sizes();
|
||||||
obs_frontend_save();
|
obs_frontend_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,6 +193,9 @@ void AdvSceneSwitcher::on_uiHintsDisable_stateChanged(int state)
|
|||||||
bool isLegacyTab(const QString &name)
|
bool isLegacyTab(const QString &name)
|
||||||
{
|
{
|
||||||
return name == obs_module_text(
|
return name == obs_module_text(
|
||||||
|
"AdvSceneSwitcher.sceneGroupTab.title") ||
|
||||||
|
name == obs_module_text("AdvSceneSwitcher.networkTab.title") ||
|
||||||
|
name == obs_module_text(
|
||||||
"AdvSceneSwitcher.transitionTab.title") ||
|
"AdvSceneSwitcher.transitionTab.title") ||
|
||||||
name == obs_module_text(
|
name == obs_module_text(
|
||||||
"AdvSceneSwitcher.windowTitleTab.title") ||
|
"AdvSceneSwitcher.windowTitleTab.title") ||
|
||||||
@@ -222,13 +223,13 @@ void AdvSceneSwitcher::on_hideLegacyTabs_stateChanged(int state)
|
|||||||
|
|
||||||
for (int idx = 0; idx < ui->tabWidget->count(); idx++) {
|
for (int idx = 0; idx < ui->tabWidget->count(); idx++) {
|
||||||
if (isLegacyTab(ui->tabWidget->tabText(idx))) {
|
if (isLegacyTab(ui->tabWidget->tabText(idx))) {
|
||||||
#if defined(_WIN32) || defined(__APPLE__)
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
ui->tabWidget->setTabVisible(idx, !state);
|
|
||||||
#else
|
|
||||||
// TODO: Switch to setTabVisible() once QT 5.15 is more wide spread
|
// TODO: Switch to setTabVisible() once QT 5.15 is more wide spread
|
||||||
ui->tabWidget->setTabEnabled(idx, !state);
|
ui->tabWidget->setTabEnabled(idx, !state);
|
||||||
ui->tabWidget->setStyleSheet(
|
ui->tabWidget->setStyleSheet(
|
||||||
"QTabBar::tab::disabled {width: 0; height: 0; margin: 0; padding: 0; border: none;} ");
|
"QTabBar::tab::disabled {width: 0; height: 0; margin: 0; padding: 0; border: none;} ");
|
||||||
|
#else
|
||||||
|
ui->tabWidget->setTabVisible(idx, !state);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -501,8 +502,12 @@ void SwitcherData::loadSettings(obs_data_t *obj)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Needs to be loaded before any entries which might rely on scene group
|
||||||
|
// selections to be available.
|
||||||
loadSceneGroups(obj);
|
loadSceneGroups(obj);
|
||||||
|
loadVariables(obj);
|
||||||
loadMacros(obj);
|
loadMacros(obj);
|
||||||
|
loadConnections(obj);
|
||||||
loadWindowTitleSwitches(obj);
|
loadWindowTitleSwitches(obj);
|
||||||
loadScreenRegionSwitches(obj);
|
loadScreenRegionSwitches(obj);
|
||||||
loadPauseSwitches(obj);
|
loadPauseSwitches(obj);
|
||||||
@@ -520,6 +525,7 @@ void SwitcherData::loadSettings(obs_data_t *obj)
|
|||||||
loadSceneTriggers(obj);
|
loadSceneTriggers(obj);
|
||||||
loadGeneralSettings(obj);
|
loadGeneralSettings(obj);
|
||||||
loadHotkeys(obj);
|
loadHotkeys(obj);
|
||||||
|
loadUISettings(obj);
|
||||||
|
|
||||||
// Reset on startup and scene collection change
|
// Reset on startup and scene collection change
|
||||||
switcher->lastOpenedTab = -1;
|
switcher->lastOpenedTab = -1;
|
||||||
@@ -531,11 +537,10 @@ void SwitcherData::saveSettings(obs_data_t *obj)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Needs to be loaded before any entries which might rely on scene group
|
|
||||||
// selections to be available.
|
|
||||||
saveSceneGroups(obj);
|
saveSceneGroups(obj);
|
||||||
|
|
||||||
saveMacros(obj);
|
saveMacros(obj);
|
||||||
|
saveConnections(obj);
|
||||||
|
saveVariables(obj);
|
||||||
saveWindowTitleSwitches(obj);
|
saveWindowTitleSwitches(obj);
|
||||||
saveScreenRegionSwitches(obj);
|
saveScreenRegionSwitches(obj);
|
||||||
savePauseSwitches(obj);
|
savePauseSwitches(obj);
|
||||||
@@ -553,6 +558,7 @@ void SwitcherData::saveSettings(obs_data_t *obj)
|
|||||||
saveSceneTriggers(obj);
|
saveSceneTriggers(obj);
|
||||||
saveGeneralSettings(obj);
|
saveGeneralSettings(obj);
|
||||||
saveHotkeys(obj);
|
saveHotkeys(obj);
|
||||||
|
saveUISettings(obj);
|
||||||
saveVersion(obj, g_GIT_SHA1);
|
saveVersion(obj, g_GIT_SHA1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -593,31 +599,6 @@ void SwitcherData::saveGeneralSettings(obs_data_t *obj)
|
|||||||
obs_data_set_int(obj, "priority10", functionNamesByPriority[10]);
|
obs_data_set_int(obj, "priority10", functionNamesByPriority[10]);
|
||||||
|
|
||||||
obs_data_set_int(obj, "threadPriority", threadPriority);
|
obs_data_set_int(obj, "threadPriority", threadPriority);
|
||||||
|
|
||||||
obs_data_set_int(obj, "generalTabPos", tabOrder[0]);
|
|
||||||
obs_data_set_int(obj, "macroTabPos", tabOrder[1]);
|
|
||||||
obs_data_set_int(obj, "transitionTabPos", tabOrder[2]);
|
|
||||||
obs_data_set_int(obj, "pauseTabPos", tabOrder[3]);
|
|
||||||
obs_data_set_int(obj, "titleTabPos", tabOrder[4]);
|
|
||||||
obs_data_set_int(obj, "exeTabPos", tabOrder[5]);
|
|
||||||
obs_data_set_int(obj, "regionTabPos", tabOrder[6]);
|
|
||||||
obs_data_set_int(obj, "mediaTabPos", tabOrder[7]);
|
|
||||||
obs_data_set_int(obj, "fileTabPos", tabOrder[8]);
|
|
||||||
obs_data_set_int(obj, "randomTabPos", tabOrder[9]);
|
|
||||||
obs_data_set_int(obj, "timeTabPos", tabOrder[10]);
|
|
||||||
obs_data_set_int(obj, "idleTabPos", tabOrder[11]);
|
|
||||||
obs_data_set_int(obj, "sequenceTabPos", tabOrder[12]);
|
|
||||||
obs_data_set_int(obj, "audioTabPos", tabOrder[13]);
|
|
||||||
obs_data_set_int(obj, "videoTabPos", tabOrder[14]);
|
|
||||||
obs_data_set_int(obj, "networkTabPos", tabOrder[15]);
|
|
||||||
obs_data_set_int(obj, "sceneGroupTabPos", tabOrder[16]);
|
|
||||||
obs_data_set_int(obj, "triggerTabPos", tabOrder[17]);
|
|
||||||
|
|
||||||
obs_data_set_bool(obj, "saveWindowGeo", saveWindowGeo);
|
|
||||||
obs_data_set_int(obj, "windowPosX", windowPos.x());
|
|
||||||
obs_data_set_int(obj, "windowPosY", windowPos.y());
|
|
||||||
obs_data_set_int(obj, "windowWidth", windowSize.width());
|
|
||||||
obs_data_set_int(obj, "windowHeight", windowSize.height());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitcherData::loadGeneralSettings(obs_data_t *obj)
|
void SwitcherData::loadGeneralSettings(obs_data_t *obj)
|
||||||
@@ -693,7 +674,69 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj)
|
|||||||
obs_data_set_default_int(obj, "threadPriority",
|
obs_data_set_default_int(obj, "threadPriority",
|
||||||
QThread::NormalPriority);
|
QThread::NormalPriority);
|
||||||
threadPriority = obs_data_get_int(obj, "threadPriority");
|
threadPriority = obs_data_get_int(obj, "threadPriority");
|
||||||
|
}
|
||||||
|
|
||||||
|
void saveSplitterPos(QList<int> &sizes, obs_data_t *obj, const std::string name)
|
||||||
|
{
|
||||||
|
auto array = obs_data_array_create();
|
||||||
|
for (int i = 0; i < sizes.count(); ++i) {
|
||||||
|
obs_data_t *array_obj = obs_data_create();
|
||||||
|
obs_data_set_int(array_obj, "pos", sizes[i]);
|
||||||
|
obs_data_array_push_back(array, array_obj);
|
||||||
|
obs_data_release(array_obj);
|
||||||
|
}
|
||||||
|
obs_data_set_array(obj, name.c_str(), array);
|
||||||
|
obs_data_array_release(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadSplitterPos(QList<int> &sizes, obs_data_t *obj, const std::string name)
|
||||||
|
{
|
||||||
|
sizes.clear();
|
||||||
|
obs_data_array_t *array = obs_data_get_array(obj, name.c_str());
|
||||||
|
size_t count = obs_data_array_count(array);
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
obs_data_t *item = obs_data_array_item(array, i);
|
||||||
|
sizes << obs_data_get_int(item, "pos");
|
||||||
|
obs_data_release(item);
|
||||||
|
}
|
||||||
|
obs_data_array_release(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SwitcherData::saveUISettings(obs_data_t *obj)
|
||||||
|
{
|
||||||
|
obs_data_set_int(obj, "generalTabPos", tabOrder[0]);
|
||||||
|
obs_data_set_int(obj, "macroTabPos", tabOrder[1]);
|
||||||
|
obs_data_set_int(obj, "transitionTabPos", tabOrder[2]);
|
||||||
|
obs_data_set_int(obj, "pauseTabPos", tabOrder[3]);
|
||||||
|
obs_data_set_int(obj, "titleTabPos", tabOrder[4]);
|
||||||
|
obs_data_set_int(obj, "exeTabPos", tabOrder[5]);
|
||||||
|
obs_data_set_int(obj, "regionTabPos", tabOrder[6]);
|
||||||
|
obs_data_set_int(obj, "mediaTabPos", tabOrder[7]);
|
||||||
|
obs_data_set_int(obj, "fileTabPos", tabOrder[8]);
|
||||||
|
obs_data_set_int(obj, "randomTabPos", tabOrder[9]);
|
||||||
|
obs_data_set_int(obj, "timeTabPos", tabOrder[10]);
|
||||||
|
obs_data_set_int(obj, "idleTabPos", tabOrder[11]);
|
||||||
|
obs_data_set_int(obj, "sequenceTabPos", tabOrder[12]);
|
||||||
|
obs_data_set_int(obj, "audioTabPos", tabOrder[13]);
|
||||||
|
obs_data_set_int(obj, "videoTabPos", tabOrder[14]);
|
||||||
|
obs_data_set_int(obj, "networkTabPos", tabOrder[15]);
|
||||||
|
obs_data_set_int(obj, "sceneGroupTabPos", tabOrder[16]);
|
||||||
|
obs_data_set_int(obj, "triggerTabPos", tabOrder[17]);
|
||||||
|
|
||||||
|
obs_data_set_bool(obj, "saveWindowGeo", saveWindowGeo);
|
||||||
|
obs_data_set_int(obj, "windowPosX", windowPos.x());
|
||||||
|
obs_data_set_int(obj, "windowPosY", windowPos.y());
|
||||||
|
obs_data_set_int(obj, "windowWidth", windowSize.width());
|
||||||
|
obs_data_set_int(obj, "windowHeight", windowSize.height());
|
||||||
|
|
||||||
|
saveSplitterPos(macroActionConditionSplitterPosition, obj,
|
||||||
|
"macroActionConditionSplitterPosition");
|
||||||
|
saveSplitterPos(macroListMacroEditSplitterPosition, obj,
|
||||||
|
"macroListMacroEditSplitterPosition");
|
||||||
|
}
|
||||||
|
|
||||||
|
void SwitcherData::loadUISettings(obs_data_t *obj)
|
||||||
|
{
|
||||||
obs_data_set_default_int(obj, "generalTabPos", 0);
|
obs_data_set_default_int(obj, "generalTabPos", 0);
|
||||||
obs_data_set_default_int(obj, "macroTabPos", 1);
|
obs_data_set_default_int(obj, "macroTabPos", 1);
|
||||||
obs_data_set_default_int(obj, "networkTabPos", 13);
|
obs_data_set_default_int(obj, "networkTabPos", 13);
|
||||||
@@ -742,6 +785,10 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj)
|
|||||||
(int)obs_data_get_int(obj, "windowPosY")};
|
(int)obs_data_get_int(obj, "windowPosY")};
|
||||||
windowSize = {(int)obs_data_get_int(obj, "windowWidth"),
|
windowSize = {(int)obs_data_get_int(obj, "windowWidth"),
|
||||||
(int)obs_data_get_int(obj, "windowHeight")};
|
(int)obs_data_get_int(obj, "windowHeight")};
|
||||||
|
loadSplitterPos(macroActionConditionSplitterPosition, obj,
|
||||||
|
"macroActionConditionSplitterPosition");
|
||||||
|
loadSplitterPos(macroListMacroEditSplitterPosition, obj,
|
||||||
|
"macroListMacroEditSplitterPosition");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SwitcherData::tabOrderValid()
|
bool SwitcherData::tabOrderValid()
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <curl/curl.h>
|
|
||||||
#include <QLibrary>
|
|
||||||
|
|
||||||
#if defined(WIN32)
|
|
||||||
constexpr auto curl_library_name = "libcurl.dll";
|
|
||||||
#elif __APPLE__
|
|
||||||
constexpr auto curl_library_name = "libcurl.4.dylib";
|
|
||||||
#else
|
|
||||||
constexpr auto curl_library_name = "libcurl.so.4";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef CURL *(*initFunction)(void);
|
|
||||||
typedef CURLcode (*setOptFunction)(CURL *, CURLoption, ...);
|
|
||||||
typedef CURLcode (*performFunction)(CURL *);
|
|
||||||
typedef void (*cleanupFunction)(CURL *);
|
|
||||||
|
|
||||||
extern initFunction f_curl_init;
|
|
||||||
extern setOptFunction f_curl_setopt;
|
|
||||||
extern performFunction f_curl_perform;
|
|
||||||
extern cleanupFunction f_curl_cleanup;
|
|
||||||
|
|
||||||
extern QLibrary *loaded_curl_lib;
|
|
||||||
|
|
||||||
bool resolveCurl();
|
|
||||||
bool loadCurl();
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QDoubleSpinBox>
|
|
||||||
#include <QComboBox>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
#include "obs-data.h"
|
|
||||||
|
|
||||||
enum class DurationUnit {
|
|
||||||
SECONDS,
|
|
||||||
MINUTES,
|
|
||||||
HOURS,
|
|
||||||
};
|
|
||||||
|
|
||||||
class Duration {
|
|
||||||
public:
|
|
||||||
void Save(obs_data_t *obj, const char *secondsName = "seconds",
|
|
||||||
const char *unitName = "displayUnit");
|
|
||||||
void Load(obs_data_t *obj, const char *secondsName = "seconds",
|
|
||||||
const char *unitName = "displayUnit");
|
|
||||||
|
|
||||||
bool DurationReached();
|
|
||||||
double TimeRemaining();
|
|
||||||
void SetTimeRemaining(double);
|
|
||||||
void Reset();
|
|
||||||
std::string ToString();
|
|
||||||
|
|
||||||
double seconds = 0.;
|
|
||||||
// only used for UI
|
|
||||||
DurationUnit displayUnit = DurationUnit::SECONDS;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::chrono::high_resolution_clock::time_point _startTime;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DurationSelection : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
DurationSelection(QWidget *parent = nullptr,
|
|
||||||
bool showUnitSelection = true);
|
|
||||||
void SetValue(double value);
|
|
||||||
void SetUnit(DurationUnit u);
|
|
||||||
void SetDuration(Duration d);
|
|
||||||
QDoubleSpinBox *SpinBox() { return _duration; }
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void _DurationChanged(double value);
|
|
||||||
void _UnitChanged(int idx);
|
|
||||||
signals:
|
|
||||||
void DurationChanged(double value); // always reutrn value in seconds
|
|
||||||
void UnitChanged(DurationUnit u);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QDoubleSpinBox *_duration;
|
|
||||||
QComboBox *_unitSelection;
|
|
||||||
|
|
||||||
double _unitMultiplier;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class DurationCondition {
|
|
||||||
NONE,
|
|
||||||
MORE,
|
|
||||||
EQUAL,
|
|
||||||
LESS,
|
|
||||||
};
|
|
||||||
|
|
||||||
class DurationConstraint {
|
|
||||||
public:
|
|
||||||
void Save(obs_data_t *obj, const char *condName = "time_constraint",
|
|
||||||
const char *secondsName = "seconds",
|
|
||||||
const char *unitName = "displayUnit");
|
|
||||||
void Load(obs_data_t *obj, const char *condName = "time_constraint",
|
|
||||||
const char *secondsName = "seconds",
|
|
||||||
const char *unitName = "displayUnit");
|
|
||||||
void SetCondition(DurationCondition cond) { _type = cond; }
|
|
||||||
void SetDuration(const Duration &dur) { _dur = dur; }
|
|
||||||
void SetValue(double value) { _dur.seconds = value; }
|
|
||||||
void SetUnit(DurationUnit u) { _dur.displayUnit = u; }
|
|
||||||
DurationCondition GetCondition() { return _type; }
|
|
||||||
Duration GetDuration() { return _dur; }
|
|
||||||
bool DurationReached();
|
|
||||||
void Reset();
|
|
||||||
|
|
||||||
private:
|
|
||||||
DurationCondition _type = DurationCondition::NONE;
|
|
||||||
Duration _dur;
|
|
||||||
bool _timeReached = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DurationConstraintEdit : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
DurationConstraintEdit(QWidget *parent = nullptr);
|
|
||||||
void SetValue(DurationConstraint &value);
|
|
||||||
void SetUnit(DurationUnit u);
|
|
||||||
void SetDuration(const Duration &d);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void _ConditionChanged(int value);
|
|
||||||
void ToggleClicked();
|
|
||||||
signals:
|
|
||||||
void DurationChanged(double value);
|
|
||||||
void UnitChanged(DurationUnit u);
|
|
||||||
void ConditionChanged(DurationCondition value);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void Collapse(bool collapse);
|
|
||||||
|
|
||||||
DurationSelection *_duration;
|
|
||||||
QComboBox *_condition;
|
|
||||||
QPushButton *_toggle;
|
|
||||||
};
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "macro-action-edit.hpp"
|
|
||||||
|
|
||||||
class MacroActionSceneSwap : public MacroAction {
|
|
||||||
public:
|
|
||||||
MacroActionSceneSwap(Macro *m) : MacroAction(m) {}
|
|
||||||
bool PerformAction();
|
|
||||||
void LogAction();
|
|
||||||
bool Save(obs_data_t *obj);
|
|
||||||
bool Load(obs_data_t *obj);
|
|
||||||
std::string GetId() { return id; };
|
|
||||||
static std::shared_ptr<MacroAction> Create(Macro *m)
|
|
||||||
{
|
|
||||||
return std::make_shared<MacroActionSceneSwap>(m);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static bool _registered;
|
|
||||||
static const std::string id;
|
|
||||||
};
|
|
||||||
|
|
||||||
class MacroActionSceneSwapEdit : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
MacroActionSceneSwapEdit(
|
|
||||||
QWidget *parent,
|
|
||||||
std::shared_ptr<MacroActionSceneSwap> entryData = nullptr);
|
|
||||||
static QWidget *Create(QWidget *parent,
|
|
||||||
std::shared_ptr<MacroAction> action)
|
|
||||||
{
|
|
||||||
return new MacroActionSceneSwapEdit(
|
|
||||||
parent, std::dynamic_pointer_cast<MacroActionSceneSwap>(
|
|
||||||
action));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::shared_ptr<MacroActionSceneSwap> _entryData;
|
|
||||||
};
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <QComboBox>
|
|
||||||
#include <obs-data.h>
|
|
||||||
|
|
||||||
#include "scene-selection.hpp"
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
class SceneItemSelection {
|
|
||||||
public:
|
|
||||||
void Save(obs_data_t *obj, const char *name = "sceneItem",
|
|
||||||
const char *targetName = "sceneItemTarget",
|
|
||||||
const char *idxName = "sceneItemIdx");
|
|
||||||
void Load(obs_data_t *obj, const char *name = "sceneItem",
|
|
||||||
const char *targetName = "sceneItemTarget",
|
|
||||||
const char *idxName = "sceneItemIdx");
|
|
||||||
|
|
||||||
enum class Target { ALL, ANY, INDIVIDUAL };
|
|
||||||
Target GetType() { return _target; }
|
|
||||||
std::vector<obs_scene_item *> GetSceneItems(SceneSelection &s);
|
|
||||||
std::string ToString();
|
|
||||||
|
|
||||||
private:
|
|
||||||
OBSWeakSource _sceneItem;
|
|
||||||
Target _target = Target::ALL;
|
|
||||||
int _idx = 0;
|
|
||||||
friend class SceneItemSelectionWidget;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SceneItemSelectionWidget : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum class AllSelectionType { ALL, ANY };
|
|
||||||
SceneItemSelectionWidget(
|
|
||||||
QWidget *parent, bool allSelection = true,
|
|
||||||
AllSelectionType allType = AllSelectionType::ALL);
|
|
||||||
void SetSceneItem(const SceneItemSelection &);
|
|
||||||
void SetScene(const SceneSelection &);
|
|
||||||
void SetShowAll(bool);
|
|
||||||
void SetShowAllSelectionType(AllSelectionType t);
|
|
||||||
signals:
|
|
||||||
void SceneItemChanged(const SceneItemSelection &);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void SceneChanged(const SceneSelection &);
|
|
||||||
void SelectionChanged(const QString &name);
|
|
||||||
void IdxChanged(int);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void SetupIdxSelection(int);
|
|
||||||
|
|
||||||
QComboBox *_sceneItems;
|
|
||||||
QComboBox *_idx;
|
|
||||||
|
|
||||||
SceneSelection _scene;
|
|
||||||
OBSWeakSource _sceneItem;
|
|
||||||
bool _showAll = false;
|
|
||||||
AllSelectionType _allType = AllSelectionType::ALL;
|
|
||||||
};
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include "scene-group.hpp"
|
|
||||||
#include "utility.hpp"
|
|
||||||
|
|
||||||
#include <QComboBox>
|
|
||||||
|
|
||||||
enum class SceneSelectionType {
|
|
||||||
SCENE,
|
|
||||||
GROUP,
|
|
||||||
PREVIOUS,
|
|
||||||
CURRENT,
|
|
||||||
};
|
|
||||||
|
|
||||||
class SceneSelection {
|
|
||||||
public:
|
|
||||||
void Save(obs_data_t *obj, const char *name = "scene",
|
|
||||||
const char *typeName = "sceneType");
|
|
||||||
void Load(obs_data_t *obj, const char *name = "scene",
|
|
||||||
const char *typeName = "sceneType");
|
|
||||||
|
|
||||||
SceneSelectionType GetType() { return _type; }
|
|
||||||
OBSWeakSource GetScene(bool advance = true);
|
|
||||||
std::string ToString();
|
|
||||||
|
|
||||||
private:
|
|
||||||
OBSWeakSource _scene;
|
|
||||||
SceneGroup *_group = nullptr;
|
|
||||||
SceneSelectionType _type = SceneSelectionType::SCENE;
|
|
||||||
friend class SceneSelectionWidget;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SceneSelectionWidget : public QComboBox {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
SceneSelectionWidget(QWidget *parent, bool sceneGroups = false,
|
|
||||||
bool previous = false, bool current = false);
|
|
||||||
void SetScene(SceneSelection &);
|
|
||||||
signals:
|
|
||||||
void SceneChanged(const SceneSelection &);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void SelectionChanged(const QString &name);
|
|
||||||
void SceneGroupAdd(const QString &name);
|
|
||||||
void SceneGroupRemove(const QString &name);
|
|
||||||
void SceneGroupRename(const QString &oldName, const QString &newName);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool IsCurrentSceneSelected(const QString &name);
|
|
||||||
bool IsPreviousSceneSelected(const QString &name);
|
|
||||||
};
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "headers/hotkey.hpp"
|
#include "hotkey.hpp"
|
||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include <obs-module.h>
|
#include <obs-module.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
bool SceneTrigger::pause = false;
|
bool SceneTrigger::pause = false;
|
||||||
static QMetaObject::Connection addPulse;
|
static QMetaObject::Connection addPulse;
|
||||||
@@ -185,7 +185,7 @@ void frontEndActionThread(sceneTriggerAction action, double delay)
|
|||||||
case sceneTriggerAction::STOP_STREAMING:
|
case sceneTriggerAction::STOP_STREAMING:
|
||||||
obs_frontend_streaming_stop();
|
obs_frontend_streaming_stop();
|
||||||
break;
|
break;
|
||||||
#ifdef REPLAYBUFFER_SUPPORTED
|
#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(26, 0, 0)
|
||||||
case sceneTriggerAction::START_REPLAY_BUFFER:
|
case sceneTriggerAction::START_REPLAY_BUFFER:
|
||||||
obs_frontend_replay_buffer_start();
|
obs_frontend_replay_buffer_start();
|
||||||
break;
|
break;
|
||||||
@@ -193,7 +193,7 @@ void frontEndActionThread(sceneTriggerAction action, double delay)
|
|||||||
obs_frontend_replay_buffer_stop();
|
obs_frontend_replay_buffer_stop();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef VCAM_SUPPORTED
|
#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(27, 0, 0)
|
||||||
case sceneTriggerAction::START_VCAM:
|
case sceneTriggerAction::START_VCAM:
|
||||||
obs_frontend_start_virtualcam();
|
obs_frontend_start_virtualcam();
|
||||||
break;
|
break;
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/volume-control.hpp"
|
#include "volume-control.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
bool AudioSwitch::pause = false;
|
bool AudioSwitch::pause = false;
|
||||||
static QMetaObject::Connection addPulse;
|
static QMetaObject::Connection addPulse;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
bool ExecutableSwitch::pause = false;
|
bool ExecutableSwitch::pause = false;
|
||||||
static QMetaObject::Connection addPulse;
|
static QMetaObject::Connection addPulse;
|
||||||
@@ -1,12 +1,14 @@
|
|||||||
|
#include <QtGlobal>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <regex>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/curl-helper.hpp"
|
#include "curl-helper.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
bool FileSwitch::pause = false;
|
bool FileSwitch::pause = false;
|
||||||
static QMetaObject::Connection addPulse;
|
static QMetaObject::Connection addPulse;
|
||||||
@@ -113,7 +115,11 @@ void SwitcherData::writeToStatusFile(const QString &msg)
|
|||||||
QFile file(QString::fromStdString(fileIO.writePath));
|
QFile file(QString::fromStdString(fileIO.writePath));
|
||||||
if (file.open(QIODevice::ReadWrite)) {
|
if (file.open(QIODevice::ReadWrite)) {
|
||||||
QTextStream stream(&file);
|
QTextStream stream(&file);
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
stream << msg << endl;
|
stream << msg << endl;
|
||||||
|
#else
|
||||||
|
stream << msg << Qt::endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@@ -168,21 +174,18 @@ static std::string getRemoteData(std::string &url)
|
|||||||
{
|
{
|
||||||
std::string readBuffer;
|
std::string readBuffer;
|
||||||
|
|
||||||
if (switcher->curl && f_curl_setopt && f_curl_perform) {
|
switcher->curl.SetOpt(CURLOPT_URL, url.c_str());
|
||||||
f_curl_setopt(switcher->curl, CURLOPT_URL, url.c_str());
|
switcher->curl.SetOpt(CURLOPT_WRITEFUNCTION, WriteCallback);
|
||||||
f_curl_setopt(switcher->curl, CURLOPT_WRITEFUNCTION,
|
switcher->curl.SetOpt(CURLOPT_WRITEDATA, &readBuffer);
|
||||||
WriteCallback);
|
|
||||||
f_curl_setopt(switcher->curl, CURLOPT_WRITEDATA, &readBuffer);
|
|
||||||
|
|
||||||
// Set timeout to at least one second
|
// Set timeout to at least one second
|
||||||
int timeout = switcher->interval / 1000;
|
int timeout = switcher->interval / 1000;
|
||||||
if (timeout == 0) {
|
if (timeout == 0) {
|
||||||
timeout = 1;
|
timeout = 1;
|
||||||
}
|
|
||||||
f_curl_setopt(switcher->curl, CURLOPT_TIMEOUT, 1);
|
|
||||||
|
|
||||||
f_curl_perform(switcher->curl);
|
|
||||||
}
|
}
|
||||||
|
switcher->curl.SetOpt(CURLOPT_TIMEOUT, 1);
|
||||||
|
switcher->curl.Perform();
|
||||||
|
|
||||||
return readBuffer;
|
return readBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,8 +200,12 @@ bool matchFileContent(QString &filedata, FileSwitch &s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (s.useRegex) {
|
if (s.useRegex) {
|
||||||
QRegExp rx(QString::fromStdString(s.text));
|
try {
|
||||||
return rx.exactMatch(filedata);
|
std::regex expr(s.text);
|
||||||
|
return std::regex_match(filedata.toStdString(), expr);
|
||||||
|
} catch (const std::regex_error &) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString text = QString::fromStdString(s.text);
|
QString text = QString::fromStdString(s.text);
|
||||||
@@ -412,7 +419,7 @@ void AdvSceneSwitcher::setupFileTab()
|
|||||||
obs_module_text("AdvSceneSwitcher.fileTab.remoteFileWarning2"));
|
obs_module_text("AdvSceneSwitcher.fileTab.remoteFileWarning2"));
|
||||||
ui->remoteFileWarningLabel->hide();
|
ui->remoteFileWarningLabel->hide();
|
||||||
|
|
||||||
if (switcher->curl) {
|
if (switcher->curl.Initialized()) {
|
||||||
ui->libcurlWarning->setVisible(false);
|
ui->libcurlWarning->setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "headers/advanced-scene-switcher.hpp"
|
#include "advanced-scene-switcher.hpp"
|
||||||
#include "headers/utility.hpp"
|
#include "utility.hpp"
|
||||||
|
|
||||||
static inline bool SceneGroupValid(SceneGroup *group)
|
static inline bool SceneGroupValid(SceneGroup *group)
|
||||||
{
|
{
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user