├── preview.gif
├── .gitmodules
├── AtemSimulator
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── AtemSimulator.entitlements
├── AppDelegate.swift
├── SwitcherSimulator.swift
├── Info.plist
├── ViewController.swift
└── Base.lproj
│ └── Main.storyboard
├── AtemSimulator.xcodeproj
├── xcuserdata
│ └── damiaan.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── AtemSimulator.xcscheme
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
└── project.pbxproj
├── .gitignore
└── Readme.md
/preview.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Dev1an/Atem-Simulator/HEAD/preview.gif
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "Swift-Atem"]
2 | path = Swift-Atem
3 | url = git@github.com:Dev1an/Swift-Atem.git
4 |
--------------------------------------------------------------------------------
/AtemSimulator/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/xcuserdata/damiaan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/AtemSimulator/AtemSimulator.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 | com.apple.security.network.client
10 |
11 | com.apple.security.network.server
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## User settings
6 | xcuserdata/
7 |
8 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
9 | *.xcscmblueprint
10 | *.xccheckout
11 |
12 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
13 | build/
14 | DerivedData/
15 | *.moved-aside
16 | *.pbxuser
17 | !default.pbxuser
18 | *.mode1v3
19 | !default.mode1v3
20 | *.mode2v3
21 | !default.mode2v3
22 | *.perspectivev3
23 | !default.perspectivev3
24 |
--------------------------------------------------------------------------------
/AtemSimulator/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // AtemSimulator
4 | //
5 | // Created by Damiaan on 22/05/18.
6 | // Copyright © 2018 Devian. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | @NSApplicationMain
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | func applicationDidFinishLaunching(_ aNotification: Notification) {
15 | // Insert code here to initialize your application
16 | }
17 |
18 | func applicationWillTerminate(_ aNotification: Notification) {
19 | // Insert code here to tear down your application
20 | }
21 |
22 |
23 | }
24 |
25 |
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/xcuserdata/damiaan.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | AtemSimulator.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 74CCEB1920B441AE007ACFF8
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "Atem",
6 | "repositoryURL": "git@github.com:Dev1an/Swift-Atem.git",
7 | "state": {
8 | "branch": null,
9 | "revision": "8fb507a547982d060cc26a93e7126efde906e663",
10 | "version": "1.0.0"
11 | }
12 | },
13 | {
14 | "package": "swift-nio",
15 | "repositoryURL": "https://github.com/apple/swift-nio.git",
16 | "state": {
17 | "branch": null,
18 | "revision": "ff01888051cd7efceb1bf8319c1dd3986c4bf6fc",
19 | "version": "2.10.1"
20 | }
21 | }
22 | ]
23 | },
24 | "version": 1
25 | }
26 |
--------------------------------------------------------------------------------
/AtemSimulator/SwitcherSimulator.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwitcherSimulator.swift
3 | // AtemSimulator
4 | //
5 | // Created by Damiaan on 27/05/18.
6 | // Copyright © 2018 Devian. All rights reserved.
7 | //
8 |
9 | import Atem
10 |
11 | func simulateSwitcher(handler: RespondingMessageHandler) {
12 | handler.when { (change: ChangePreviewBus) in
13 | [PreviewBusChanged(to: change.previewBus, mixEffect: change.mixEffect)]
14 | }
15 | handler.when{ (change: ChangeProgramBus) in
16 | [ProgramBusChanged(to: change.programBus, mixEffect: change.mixEffect)]
17 | }
18 | handler.when { (change: ChangeTransitionPosition) in
19 | [
20 | TransitionPositionChanged(
21 | to: change.position,
22 | remainingFrames: 250 - UInt8(change.position/40),
23 | mixEffect: change.mixEffect
24 | )
25 | ]
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/AtemSimulator/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 0.2.1
21 | CFBundleVersion
22 | 2
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2018 Devian. All rights reserved.
27 | NSMainStoryboardFile
28 | Main
29 | NSPrincipalClass
30 | NSApplication
31 |
32 |
33 |
--------------------------------------------------------------------------------
/AtemSimulator/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # Atem simulation tool
2 |
3 | Simulates an ATEM Television Studio and enables the desktop application so you can peek around in the app and aren't stuck in the `No Device Connected` window. Written using [Swift-Atem](https://github.com/Dev1an/Swift-Atem)
4 |
5 | 
6 |
7 | This tool does not simulate the entire functionality of the Television studio but it keeps the connection alive so you can browse and discover the application...
8 |
9 | ## Installation
10 |
11 | ### Prerequisites
12 |
13 | - Xcode (available from the Mac App Store)
14 | - ATEM Software Control
15 |
16 | ### Build the macOS app
17 |
18 | Make sure to pull all the submodules first:
19 |
20 | ```
21 | git submodule update --init --recursive
22 | ```
23 |
24 | Then:
25 |
26 | ```
27 | cd Protocol
28 | swift package generate-xcodeproj
29 | open ../AtemSimulator.xcodeproj
30 | ```
31 |
32 | ### Run the macOS app
33 |
34 | Select the macOS target an click the run button. This will launch a small window with an on/off button for the simulator.
35 |
36 | ### Run the ATEM control software
37 |
38 | Enter `127.0.0.1` as the switcher IP. It should connect to the switcher simulator running on your computer.
39 |
--------------------------------------------------------------------------------
/AtemSimulator/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // AtemSimulator
4 | //
5 | // Created by Damiaan on 22/05/18.
6 | // Copyright © 2018 Devian. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import Atem
11 |
12 | class ViewController: NSViewController {
13 |
14 | @IBOutlet weak var onButton: NSButton!
15 | @IBOutlet weak var offButton: NSButton!
16 |
17 | var switcher: Switcher?
18 |
19 | override func viewDidLoad() {
20 | super.viewDidLoad()
21 | setSwitchOn()
22 | changePowerState(self)
23 | }
24 |
25 | @IBAction func changePowerState(_ sender: Any) {
26 | if onButton.state == .on {
27 | do {
28 | switcher = try Switcher(initializer: simulateSwitcher)
29 | } catch {
30 | presentError(error)
31 | setSwitchOff()
32 | }
33 | } else {
34 | switcher?.channel.map{ $0.close(mode: .all) }.whenFailure { error in
35 | DispatchQueue.main.async {
36 | self.presentError(error)
37 | }
38 | self.setSwitchOn()
39 | }
40 | }
41 | }
42 |
43 | func setSwitchOn() {
44 | onButton.state = .on
45 | offButton.state = .off
46 | }
47 |
48 | func setSwitchOff() {
49 | onButton.state = .off
50 | offButton.state = .on
51 | }
52 | }
53 |
54 | class WindowController: NSWindowController {
55 |
56 | var controller: Controller?
57 | override func windowDidLoad() {
58 | super.windowDidLoad()
59 | controller = try? Controller(ipAddress: "0.0.0.0") { handler in
60 | handler.when{ (change: PreviewBusChanged) in
61 | print(change)
62 | }
63 | handler.when { (change: NewTimecode) in
64 | print(change)
65 | }
66 | }
67 | }
68 |
69 | @IBAction func moveLever(_ sender: NSSlider) {
70 | controller?.send(message: ChangeTransitionPosition(to: UInt16(sender.intValue)))
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/xcuserdata/damiaan.xcuserdatad/xcschemes/AtemSimulator.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
39 |
40 |
41 |
42 |
52 |
54 |
60 |
61 |
62 |
63 |
69 |
71 |
77 |
78 |
79 |
80 |
82 |
83 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/AtemSimulator.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 52;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 742E20CE20BAF1030027115F /* SwitcherSimulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 742E20CD20BAF1020027115F /* SwitcherSimulator.swift */; };
11 | 74CCEB1E20B441AE007ACFF8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74CCEB1D20B441AE007ACFF8 /* AppDelegate.swift */; };
12 | 74CCEB2020B441AE007ACFF8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74CCEB1F20B441AE007ACFF8 /* ViewController.swift */; };
13 | 74CCEB2220B441AF007ACFF8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 74CCEB2120B441AF007ACFF8 /* Assets.xcassets */; };
14 | 74CCEB2520B441AF007ACFF8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74CCEB2320B441AF007ACFF8 /* Main.storyboard */; };
15 | 74D206E42385B4B800E20BFA /* Atem in Frameworks */ = {isa = PBXBuildFile; productRef = 74D206E32385B4B800E20BFA /* Atem */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXFileReference section */
19 | 742E20CD20BAF1020027115F /* SwitcherSimulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitcherSimulator.swift; sourceTree = ""; };
20 | 74CCEB1A20B441AE007ACFF8 /* AtemSimulator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AtemSimulator.app; sourceTree = BUILT_PRODUCTS_DIR; };
21 | 74CCEB1D20B441AE007ACFF8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
22 | 74CCEB1F20B441AE007ACFF8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
23 | 74CCEB2120B441AF007ACFF8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
24 | 74CCEB2420B441AF007ACFF8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
25 | 74CCEB2620B441AF007ACFF8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
26 | 74CCEB2720B441AF007ACFF8 /* AtemSimulator.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AtemSimulator.entitlements; sourceTree = ""; };
27 | 74D206E62385B52C00E20BFA /* Swift-Atem */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Swift-Atem"; sourceTree = SOURCE_ROOT; };
28 | /* End PBXFileReference section */
29 |
30 | /* Begin PBXFrameworksBuildPhase section */
31 | 74CCEB1720B441AE007ACFF8 /* Frameworks */ = {
32 | isa = PBXFrameworksBuildPhase;
33 | buildActionMask = 2147483647;
34 | files = (
35 | 74D206E42385B4B800E20BFA /* Atem in Frameworks */,
36 | );
37 | runOnlyForDeploymentPostprocessing = 0;
38 | };
39 | /* End PBXFrameworksBuildPhase section */
40 |
41 | /* Begin PBXGroup section */
42 | 74CCEB1120B441AE007ACFF8 = {
43 | isa = PBXGroup;
44 | children = (
45 | 74D206E62385B52C00E20BFA /* Swift-Atem */,
46 | 74CCEB1C20B441AE007ACFF8 /* AtemSimulator */,
47 | 74CCEB1B20B441AE007ACFF8 /* Products */,
48 | );
49 | sourceTree = "";
50 | };
51 | 74CCEB1B20B441AE007ACFF8 /* Products */ = {
52 | isa = PBXGroup;
53 | children = (
54 | 74CCEB1A20B441AE007ACFF8 /* AtemSimulator.app */,
55 | );
56 | name = Products;
57 | sourceTree = "";
58 | };
59 | 74CCEB1C20B441AE007ACFF8 /* AtemSimulator */ = {
60 | isa = PBXGroup;
61 | children = (
62 | 74CCEB1D20B441AE007ACFF8 /* AppDelegate.swift */,
63 | 74CCEB1F20B441AE007ACFF8 /* ViewController.swift */,
64 | 742E20CD20BAF1020027115F /* SwitcherSimulator.swift */,
65 | 74CCEB2120B441AF007ACFF8 /* Assets.xcassets */,
66 | 74CCEB2320B441AF007ACFF8 /* Main.storyboard */,
67 | 74CCEB2620B441AF007ACFF8 /* Info.plist */,
68 | 74CCEB2720B441AF007ACFF8 /* AtemSimulator.entitlements */,
69 | );
70 | path = AtemSimulator;
71 | sourceTree = "";
72 | };
73 | /* End PBXGroup section */
74 |
75 | /* Begin PBXNativeTarget section */
76 | 74CCEB1920B441AE007ACFF8 /* AtemSimulator */ = {
77 | isa = PBXNativeTarget;
78 | buildConfigurationList = 74CCEB2A20B441AF007ACFF8 /* Build configuration list for PBXNativeTarget "AtemSimulator" */;
79 | buildPhases = (
80 | 74D8D26B20B44AFC006EA471 /* ShellScript */,
81 | 74CCEB1620B441AE007ACFF8 /* Sources */,
82 | 74CCEB1720B441AE007ACFF8 /* Frameworks */,
83 | 74CCEB1820B441AE007ACFF8 /* Resources */,
84 | );
85 | buildRules = (
86 | );
87 | dependencies = (
88 | );
89 | name = AtemSimulator;
90 | packageProductDependencies = (
91 | 74D206E32385B4B800E20BFA /* Atem */,
92 | );
93 | productName = AtemSimulator;
94 | productReference = 74CCEB1A20B441AE007ACFF8 /* AtemSimulator.app */;
95 | productType = "com.apple.product-type.application";
96 | };
97 | /* End PBXNativeTarget section */
98 |
99 | /* Begin PBXProject section */
100 | 74CCEB1220B441AE007ACFF8 /* Project object */ = {
101 | isa = PBXProject;
102 | attributes = {
103 | LastSwiftUpdateCheck = 0940;
104 | LastUpgradeCheck = 1120;
105 | ORGANIZATIONNAME = Devian;
106 | TargetAttributes = {
107 | 74CCEB1920B441AE007ACFF8 = {
108 | CreatedOnToolsVersion = 9.4;
109 | LastSwiftMigration = 1120;
110 | SystemCapabilities = {
111 | com.apple.HardenedRuntime = {
112 | enabled = 1;
113 | };
114 | com.apple.Sandbox = {
115 | enabled = 1;
116 | };
117 | };
118 | };
119 | };
120 | };
121 | buildConfigurationList = 74CCEB1520B441AE007ACFF8 /* Build configuration list for PBXProject "AtemSimulator" */;
122 | compatibilityVersion = "Xcode 9.3";
123 | developmentRegion = en;
124 | hasScannedForEncodings = 0;
125 | knownRegions = (
126 | en,
127 | Base,
128 | );
129 | mainGroup = 74CCEB1120B441AE007ACFF8;
130 | packageReferences = (
131 | 74D206E22385B4B800E20BFA /* XCRemoteSwiftPackageReference "Swift-Atem" */,
132 | );
133 | productRefGroup = 74CCEB1B20B441AE007ACFF8 /* Products */;
134 | projectDirPath = "";
135 | projectRoot = "";
136 | targets = (
137 | 74CCEB1920B441AE007ACFF8 /* AtemSimulator */,
138 | );
139 | };
140 | /* End PBXProject section */
141 |
142 | /* Begin PBXResourcesBuildPhase section */
143 | 74CCEB1820B441AE007ACFF8 /* Resources */ = {
144 | isa = PBXResourcesBuildPhase;
145 | buildActionMask = 2147483647;
146 | files = (
147 | 74CCEB2220B441AF007ACFF8 /* Assets.xcassets in Resources */,
148 | 74CCEB2520B441AF007ACFF8 /* Main.storyboard in Resources */,
149 | );
150 | runOnlyForDeploymentPostprocessing = 0;
151 | };
152 | /* End PBXResourcesBuildPhase section */
153 |
154 | /* Begin PBXShellScriptBuildPhase section */
155 | 74D8D26B20B44AFC006EA471 /* ShellScript */ = {
156 | isa = PBXShellScriptBuildPhase;
157 | buildActionMask = 2147483647;
158 | files = (
159 | );
160 | inputPaths = (
161 | );
162 | outputPaths = (
163 | );
164 | runOnlyForDeploymentPostprocessing = 0;
165 | shellPath = /bin/sh;
166 | shellScript = "#if [ -d .git ]; then\n# git submodule update --init --recursive\n#else\n# git clone git@github.com:Dev1an/Swift-Atem.git Protocol\n#fi;\n#cd Protocol\n#swift package update";
167 | };
168 | /* End PBXShellScriptBuildPhase section */
169 |
170 | /* Begin PBXSourcesBuildPhase section */
171 | 74CCEB1620B441AE007ACFF8 /* Sources */ = {
172 | isa = PBXSourcesBuildPhase;
173 | buildActionMask = 2147483647;
174 | files = (
175 | 742E20CE20BAF1030027115F /* SwitcherSimulator.swift in Sources */,
176 | 74CCEB2020B441AE007ACFF8 /* ViewController.swift in Sources */,
177 | 74CCEB1E20B441AE007ACFF8 /* AppDelegate.swift in Sources */,
178 | );
179 | runOnlyForDeploymentPostprocessing = 0;
180 | };
181 | /* End PBXSourcesBuildPhase section */
182 |
183 | /* Begin PBXVariantGroup section */
184 | 74CCEB2320B441AF007ACFF8 /* Main.storyboard */ = {
185 | isa = PBXVariantGroup;
186 | children = (
187 | 74CCEB2420B441AF007ACFF8 /* Base */,
188 | );
189 | name = Main.storyboard;
190 | sourceTree = "";
191 | };
192 | /* End PBXVariantGroup section */
193 |
194 | /* Begin XCBuildConfiguration section */
195 | 74CCEB2820B441AF007ACFF8 /* Debug */ = {
196 | isa = XCBuildConfiguration;
197 | buildSettings = {
198 | ALWAYS_SEARCH_USER_PATHS = NO;
199 | CLANG_ANALYZER_NONNULL = YES;
200 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
201 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
202 | CLANG_CXX_LIBRARY = "libc++";
203 | CLANG_ENABLE_MODULES = YES;
204 | CLANG_ENABLE_OBJC_ARC = YES;
205 | CLANG_ENABLE_OBJC_WEAK = YES;
206 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
207 | CLANG_WARN_BOOL_CONVERSION = YES;
208 | CLANG_WARN_COMMA = YES;
209 | CLANG_WARN_CONSTANT_CONVERSION = YES;
210 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
211 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
212 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
213 | CLANG_WARN_EMPTY_BODY = YES;
214 | CLANG_WARN_ENUM_CONVERSION = YES;
215 | CLANG_WARN_INFINITE_RECURSION = YES;
216 | CLANG_WARN_INT_CONVERSION = YES;
217 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
218 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
219 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
220 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
221 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
222 | CLANG_WARN_STRICT_PROTOTYPES = YES;
223 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
224 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
225 | CLANG_WARN_UNREACHABLE_CODE = YES;
226 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
227 | COPY_PHASE_STRIP = NO;
228 | DEBUG_INFORMATION_FORMAT = dwarf;
229 | ENABLE_STRICT_OBJC_MSGSEND = YES;
230 | ENABLE_TESTABILITY = YES;
231 | GCC_C_LANGUAGE_STANDARD = gnu11;
232 | GCC_DYNAMIC_NO_PIC = NO;
233 | GCC_NO_COMMON_BLOCKS = YES;
234 | GCC_OPTIMIZATION_LEVEL = 0;
235 | GCC_PREPROCESSOR_DEFINITIONS = (
236 | "DEBUG=1",
237 | "$(inherited)",
238 | );
239 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
240 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
241 | GCC_WARN_UNDECLARED_SELECTOR = YES;
242 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
243 | GCC_WARN_UNUSED_FUNCTION = YES;
244 | GCC_WARN_UNUSED_VARIABLE = YES;
245 | MACOSX_DEPLOYMENT_TARGET = 10.10;
246 | MTL_ENABLE_DEBUG_INFO = YES;
247 | ONLY_ACTIVE_ARCH = YES;
248 | SDKROOT = macosx;
249 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
250 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
251 | };
252 | name = Debug;
253 | };
254 | 74CCEB2920B441AF007ACFF8 /* Release */ = {
255 | isa = XCBuildConfiguration;
256 | buildSettings = {
257 | ALWAYS_SEARCH_USER_PATHS = NO;
258 | CLANG_ANALYZER_NONNULL = YES;
259 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
260 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
261 | CLANG_CXX_LIBRARY = "libc++";
262 | CLANG_ENABLE_MODULES = YES;
263 | CLANG_ENABLE_OBJC_ARC = YES;
264 | CLANG_ENABLE_OBJC_WEAK = YES;
265 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
266 | CLANG_WARN_BOOL_CONVERSION = YES;
267 | CLANG_WARN_COMMA = YES;
268 | CLANG_WARN_CONSTANT_CONVERSION = YES;
269 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
270 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
271 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
272 | CLANG_WARN_EMPTY_BODY = YES;
273 | CLANG_WARN_ENUM_CONVERSION = YES;
274 | CLANG_WARN_INFINITE_RECURSION = YES;
275 | CLANG_WARN_INT_CONVERSION = YES;
276 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
277 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
278 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
279 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
280 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
281 | CLANG_WARN_STRICT_PROTOTYPES = YES;
282 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
283 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
284 | CLANG_WARN_UNREACHABLE_CODE = YES;
285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
286 | COPY_PHASE_STRIP = NO;
287 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
288 | ENABLE_NS_ASSERTIONS = NO;
289 | ENABLE_STRICT_OBJC_MSGSEND = YES;
290 | GCC_C_LANGUAGE_STANDARD = gnu11;
291 | GCC_NO_COMMON_BLOCKS = YES;
292 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
293 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
294 | GCC_WARN_UNDECLARED_SELECTOR = YES;
295 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
296 | GCC_WARN_UNUSED_FUNCTION = YES;
297 | GCC_WARN_UNUSED_VARIABLE = YES;
298 | MACOSX_DEPLOYMENT_TARGET = 10.10;
299 | MTL_ENABLE_DEBUG_INFO = NO;
300 | SDKROOT = macosx;
301 | SWIFT_COMPILATION_MODE = wholemodule;
302 | SWIFT_OPTIMIZATION_LEVEL = "-O";
303 | };
304 | name = Release;
305 | };
306 | 74CCEB2B20B441AF007ACFF8 /* Debug */ = {
307 | isa = XCBuildConfiguration;
308 | buildSettings = {
309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
310 | CODE_SIGN_ENTITLEMENTS = AtemSimulator/AtemSimulator.entitlements;
311 | CODE_SIGN_IDENTITY = "-";
312 | COMBINE_HIDPI_IMAGES = YES;
313 | ENABLE_HARDENED_RUNTIME = YES;
314 | INFOPLIST_FILE = AtemSimulator/Info.plist;
315 | LD_RUNPATH_SEARCH_PATHS = (
316 | "$(inherited)",
317 | "@executable_path/../Frameworks",
318 | );
319 | OTHER_SWIFT_FLAGS = "";
320 | PRODUCT_BUNDLE_IDENTIFIER = com.devian.AtemSimulator;
321 | PRODUCT_NAME = "$(TARGET_NAME)";
322 | SWIFT_COMPILATION_MODE = singlefile;
323 | SWIFT_INCLUDE_PATHS = "";
324 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
325 | SWIFT_VERSION = 5.0;
326 | };
327 | name = Debug;
328 | };
329 | 74CCEB2C20B441AF007ACFF8 /* Release */ = {
330 | isa = XCBuildConfiguration;
331 | buildSettings = {
332 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
333 | CODE_SIGN_ENTITLEMENTS = AtemSimulator/AtemSimulator.entitlements;
334 | CODE_SIGN_IDENTITY = "-";
335 | COMBINE_HIDPI_IMAGES = YES;
336 | ENABLE_HARDENED_RUNTIME = YES;
337 | INFOPLIST_FILE = AtemSimulator/Info.plist;
338 | LD_RUNPATH_SEARCH_PATHS = (
339 | "$(inherited)",
340 | "@executable_path/../Frameworks",
341 | );
342 | OTHER_SWIFT_FLAGS = "";
343 | PRODUCT_BUNDLE_IDENTIFIER = com.devian.AtemSimulator;
344 | PRODUCT_NAME = "$(TARGET_NAME)";
345 | SWIFT_COMPILATION_MODE = wholemodule;
346 | SWIFT_INCLUDE_PATHS = "";
347 | SWIFT_VERSION = 5.0;
348 | };
349 | name = Release;
350 | };
351 | /* End XCBuildConfiguration section */
352 |
353 | /* Begin XCConfigurationList section */
354 | 74CCEB1520B441AE007ACFF8 /* Build configuration list for PBXProject "AtemSimulator" */ = {
355 | isa = XCConfigurationList;
356 | buildConfigurations = (
357 | 74CCEB2820B441AF007ACFF8 /* Debug */,
358 | 74CCEB2920B441AF007ACFF8 /* Release */,
359 | );
360 | defaultConfigurationIsVisible = 0;
361 | defaultConfigurationName = Release;
362 | };
363 | 74CCEB2A20B441AF007ACFF8 /* Build configuration list for PBXNativeTarget "AtemSimulator" */ = {
364 | isa = XCConfigurationList;
365 | buildConfigurations = (
366 | 74CCEB2B20B441AF007ACFF8 /* Debug */,
367 | 74CCEB2C20B441AF007ACFF8 /* Release */,
368 | );
369 | defaultConfigurationIsVisible = 0;
370 | defaultConfigurationName = Release;
371 | };
372 | /* End XCConfigurationList section */
373 |
374 | /* Begin XCRemoteSwiftPackageReference section */
375 | 74D206E22385B4B800E20BFA /* XCRemoteSwiftPackageReference "Swift-Atem" */ = {
376 | isa = XCRemoteSwiftPackageReference;
377 | repositoryURL = "git@github.com:Dev1an/Swift-Atem.git";
378 | requirement = {
379 | kind = upToNextMajorVersion;
380 | minimumVersion = 1.1.0;
381 | };
382 | };
383 | /* End XCRemoteSwiftPackageReference section */
384 |
385 | /* Begin XCSwiftPackageProductDependency section */
386 | 74D206E32385B4B800E20BFA /* Atem */ = {
387 | isa = XCSwiftPackageProductDependency;
388 | package = 74D206E22385B4B800E20BFA /* XCRemoteSwiftPackageReference "Swift-Atem" */;
389 | productName = Atem;
390 | };
391 | /* End XCSwiftPackageProductDependency section */
392 | };
393 | rootObject = 74CCEB1220B441AE007ACFF8 /* Project object */;
394 | }
395 |
--------------------------------------------------------------------------------
/AtemSimulator/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 |
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
732 |
733 |
743 |
753 |
754 |
755 |
756 |
757 |
758 |
759 |
760 |
761 |
762 |
763 |
764 |
765 |
766 |
767 |
768 |
769 |
770 |
771 |
772 |
773 |
774 |
--------------------------------------------------------------------------------