obsws 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/obsws/req.rb ADDED
@@ -0,0 +1,888 @@
1
+ require "waitutil"
2
+
3
+ require_relative "base"
4
+ require_relative "error"
5
+ require_relative "util"
6
+ require_relative "mixin"
7
+
8
+ module OBSWS
9
+ module Requests
10
+ class Client
11
+ include Error
12
+ include Mixin::TearDown
13
+ include Mixin::OPCodes
14
+
15
+ def initialize(**kwargs)
16
+ @base_client = Base.new(**kwargs)
17
+ @base_client.add_observer(self)
18
+ @response = { requestId: 0 }
19
+ end
20
+
21
+ def run
22
+ yield
23
+ ensure
24
+ close
25
+ WaitUtil.wait_for_condition(
26
+ "driver has closed",
27
+ delay_sec: 0.01,
28
+ timeout_sec: 1
29
+ ) { @base_client.closed }
30
+ end
31
+
32
+ def update(op_code, data)
33
+ @response = data if op_code == Mixin::OPCodes::REQUESTRESPONSE
34
+ end
35
+
36
+ def call(req, data = nil)
37
+ id = rand(1..1000)
38
+ @base_client.req(id, req, data)
39
+ WaitUtil.wait_for_condition(
40
+ "reponse id matches request id",
41
+ delay_sec: 0.001,
42
+ timeout_sec: 3
43
+ ) { @response[:requestId] == id }
44
+ if !@response[:requestStatus][:result]
45
+ error = [
46
+ "Request #{@response[:requestType]} returned code #{@response[:requestStatus][:code]}"
47
+ ]
48
+ if @response[:requestStatus].key?(:comment)
49
+ error += ["With message: #{@response[:requestStatus][:comment]}"]
50
+ end
51
+ raise OBSWSError.new(error.join("\n"))
52
+ end
53
+ @response[:responseData]
54
+ end
55
+
56
+ def get_version
57
+ resp = call("GetVersion")
58
+ Mixin::Response.new(resp, resp.keys)
59
+ end
60
+
61
+ def get_stats
62
+ resp = call("GetStats")
63
+ Mixin::Response.new(resp, resp.keys)
64
+ end
65
+
66
+ def broadcast_custom_event(data)
67
+ call("BroadcastCustomEvent", data)
68
+ end
69
+
70
+ def call_vendor_request(name, type_, data = nil)
71
+ call(requestType, requestData)
72
+ end
73
+
74
+ def get_hotkey_list
75
+ resp = call("GetHotkeyList")
76
+ Mixin::Response.new(resp, resp.keys)
77
+ end
78
+
79
+ def trigger_hotkey_by_name(name)
80
+ payload = { hotkeyName: name }
81
+ call("TriggerHotkeyByName", payload)
82
+ end
83
+
84
+ def trigger_hotkey_by_key_sequence(
85
+ key_id,
86
+ press_shift,
87
+ press_ctrl,
88
+ press_alt,
89
+ press_cmd
90
+ )
91
+ payload = {
92
+ keyId: key_id,
93
+ keyModifiers: {
94
+ shift: press_shift,
95
+ control: press_ctrl,
96
+ alt: press_alt,
97
+ cmd: press_cmd
98
+ }
99
+ }
100
+ call("TriggerHotkeyByKeySequence", payload)
101
+ end
102
+
103
+ def sleep(sleep_millis = nil, sleep_frames = nil)
104
+ payload = { sleepMillis: sleep_millis, sleepFrames: sleep_frames }
105
+ call("Sleep", payload)
106
+ end
107
+
108
+ def get_persistent_data(realm, slot_name)
109
+ payload = { realm: realm, slotName: slot_name }
110
+ resp = call("GetPersistentData", payload)
111
+ Mixin::Response.new(resp, resp.keys)
112
+ end
113
+
114
+ def set_persistent_data(realm, slot_name, slot_value)
115
+ payload = { realm: realm, slotName: slot_name, slotValue: slot_value }
116
+ call("SetPersistentData", payload)
117
+ end
118
+
119
+ def get_scene_collection_list
120
+ resp = call("GetSceneCollectionList")
121
+ Mixin::Response.new(resp, resp.keys)
122
+ end
123
+
124
+ def set_current_scene_collection(name)
125
+ payload = { sceneCollectionName: name }
126
+ call("SetCurrentSceneCollection", payload)
127
+ end
128
+
129
+ def create_scene_collection(name)
130
+ payload = { sceneCollectionName: name }
131
+ call("CreateSceneCollection", payload)
132
+ end
133
+
134
+ def get_profile_list
135
+ resp = call("GetProfileList")
136
+ Mixin::Response.new(resp, resp.keys)
137
+ end
138
+
139
+ def set_current_profile(name)
140
+ payload = { profileName: name }
141
+ call("SetCurrentProfile", payload)
142
+ end
143
+
144
+ def create_profile(name)
145
+ payload = { profileName: name }
146
+ call("CreateProfile", payload)
147
+ end
148
+
149
+ def remove_profile(name)
150
+ payload = { profileName: name }
151
+ call("RemoveProfile", payload)
152
+ end
153
+
154
+ def get_profile_parameter(category, name)
155
+ payload = { parameterCategory: category, parameterName: name }
156
+ resp = call("GetProfileParameter", payload)
157
+ Mixin::Response.new(resp, resp.keys)
158
+ end
159
+
160
+ def set_profile_parameter(category, name, value)
161
+ payload = {
162
+ parameterCategory: category,
163
+ parameterName: name,
164
+ parameterValue: value
165
+ }
166
+ call("SetProfileParameter", payload)
167
+ end
168
+
169
+ def get_video_settings
170
+ resp = call("GetVideoSettings")
171
+ Mixin::Response.new(resp, resp.keys)
172
+ end
173
+
174
+ def set_video_settings(
175
+ numerator,
176
+ denominator,
177
+ base_width,
178
+ base_height,
179
+ out_width,
180
+ out_height
181
+ )
182
+ payload = {
183
+ fpsNumerator: numerator,
184
+ fpsDenominator: denominator,
185
+ baseWidth: base_width,
186
+ baseHeight: base_height,
187
+ outputWidth: out_width,
188
+ outputHeight: out_height
189
+ }
190
+ call("SetVideoSettings", payload)
191
+ end
192
+
193
+ def get_stream_service_settings
194
+ resp = call("GetStreamServiceSettings")
195
+ Mixin::Response.new(resp, resp.keys)
196
+ end
197
+
198
+ def set_stream_service_settings(ss_type, ss_settings)
199
+ payload = {
200
+ streamServiceType: ss_type,
201
+ streamServiceSettings: ss_settings
202
+ }
203
+ call("SetStreamServiceSettings", payload)
204
+ end
205
+
206
+ def get_record_directory
207
+ resp = call("GetRecordDirectory")
208
+ Mixin::Response.new(resp, resp.keys)
209
+ end
210
+
211
+ def get_source_active(name)
212
+ payload = { sourceName: name }
213
+ resp = call("GetSourceActive", payload)
214
+ Mixin::Response.new(resp, resp.keys)
215
+ end
216
+
217
+ def get_source_screenshot(name, img_format, width, height, quality)
218
+ payload = {
219
+ sourceName: name,
220
+ imageFormat: img_format,
221
+ imageWidth: width,
222
+ imageHeight: height,
223
+ imageCompressionQuality: quality
224
+ }
225
+ resp = call("GetSourceScreenshot", payload)
226
+ Mixin::Response.new(resp, resp.keys)
227
+ end
228
+
229
+ def save_source_screenshot(
230
+ name,
231
+ img_format,
232
+ file_path,
233
+ width,
234
+ height,
235
+ quality
236
+ )
237
+ payload = {
238
+ sourceName: name,
239
+ imageFormat: img_format,
240
+ imageFilePath: file_path,
241
+ imageWidth: width,
242
+ imageHeight: height,
243
+ imageCompressionQuality: quality
244
+ }
245
+ resp = call("SaveSourceScreenshot", payload)
246
+ Mixin::Response.new(resp, resp.keys)
247
+ end
248
+
249
+ def get_scene_list
250
+ resp = call("GetSceneList")
251
+ Mixin::Response.new(resp, resp.keys)
252
+ end
253
+
254
+ def get_group_list
255
+ resp = call("GetSceneList")
256
+ Mixin::Response.new(resp, resp.keys)
257
+ end
258
+
259
+ def get_current_program_scene
260
+ resp = call("GetCurrentProgramScene")
261
+ Mixin::Response.new(resp, resp.keys)
262
+ end
263
+
264
+ def set_current_program_scene(name)
265
+ payload = { sceneName: name }
266
+ call("SetCurrentProgramScene", payload)
267
+ end
268
+
269
+ def get_current_preview_scene
270
+ resp = call("GetCurrentPreviewScene")
271
+ Mixin::Response.new(resp, resp.keys)
272
+ end
273
+
274
+ def set_current_preview_scene(name)
275
+ payload = { sceneName: name }
276
+ call("SetCurrentPreviewScene", payload)
277
+ end
278
+
279
+ def create_scene(name)
280
+ payload = { sceneName: name }
281
+ call("CreateScene", payload)
282
+ end
283
+
284
+ def remove_scene(name)
285
+ payload = { sceneName: name }
286
+ call("RemoveScene", payload)
287
+ end
288
+
289
+ def set_scene_name(old_name, new_name)
290
+ payload = { sceneName: old_name, newSceneName: new_name }
291
+ call("SetSceneName", payload)
292
+ end
293
+
294
+ def get_scene_scene_transition_override(name)
295
+ payload = { sceneName: name }
296
+ resp = call("GetSceneSceneTransitionOverride", payload)
297
+ Mixin::Response.new(resp, resp.keys)
298
+ end
299
+
300
+ def set_scene_scene_transition_override(scene_name, tr_name, tr_duration)
301
+ payload = {
302
+ sceneName: scene_name,
303
+ transitionName: tr_name,
304
+ transitionDuration: tr_duration
305
+ }
306
+ call("SetSceneSceneTransitionOverride", payload)
307
+ end
308
+
309
+ def get_input_list(kind = nil)
310
+ payload = { inputKind: kind }
311
+ resp = call("GetInputList", payload)
312
+ Mixin::Response.new(resp, resp.keys)
313
+ end
314
+
315
+ def get_input_kind_list(unversioned)
316
+ payload = { unversioned: unversioned }
317
+ resp = call("GetInputKindList", payload)
318
+ Mixin::Response.new(resp, resp.keys)
319
+ end
320
+
321
+ def get_special_inputs
322
+ resp = call("GetSpecialInputs")
323
+ end
324
+
325
+ def create_input(
326
+ scene_name,
327
+ input_name,
328
+ input_kind,
329
+ input_settings,
330
+ scene_item_enabled
331
+ )
332
+ payload = {
333
+ sceneName: scene_name,
334
+ inputName: input_name,
335
+ inputKind: input_kind,
336
+ inputSettings: input_settings,
337
+ sceneItemEnabled: scene_item_enabled
338
+ }
339
+ resp = call("CreateInput", payload)
340
+ end
341
+
342
+ def remove_input(name)
343
+ payload = { inputName: name }
344
+ call("RemoveInput", payload)
345
+ end
346
+
347
+ def set_input_name(old_name, new_name)
348
+ payload = { inputName: old_name, newInputName: new_name }
349
+ call("SetInputName", payload)
350
+ end
351
+
352
+ def get_input_default_settings(kind)
353
+ payload = { inputKind: kind }
354
+ resp = call("GetInputDefaultSettings", payload)
355
+ Mixin::Response.new(resp, resp.keys)
356
+ end
357
+
358
+ def get_input_settings(name)
359
+ payload = { inputName: name }
360
+ resp = call("GetInputSettings", payload)
361
+ Mixin::Response.new(resp, resp.keys)
362
+ end
363
+
364
+ def set_input_settings(name, settings, overlay)
365
+ payload = { inputName: name, inputSettings: settings, overlay: overlay }
366
+ call("SetInputSettings", payload)
367
+ end
368
+
369
+ def get_input_mute(name)
370
+ payload = { inputName: name }
371
+ resp = call("GetInputMute", payload)
372
+ Mixin::Response.new(resp, resp.keys)
373
+ end
374
+
375
+ def set_input_mute(name, muted)
376
+ payload = { inputName: name, inputMuted: muted }
377
+ call("SetInputMute", payload)
378
+ end
379
+
380
+ def toggle_input_mute(name)
381
+ payload = { inputName: name }
382
+ resp = call("ToggleInputMute", payload)
383
+ Mixin::Response.new(resp, resp.keys)
384
+ end
385
+
386
+ def get_input_volume(name)
387
+ payload = { inputName: name }
388
+ resp = call("GetInputVolume", payload)
389
+ Mixin::Response.new(resp, resp.keys)
390
+ end
391
+
392
+ def set_input_volume(name, vol_mul = nil, vol_db = nil)
393
+ payload = {
394
+ inputName: name,
395
+ inputVolumeMul: vol_mul,
396
+ inputVolumeDb: vol_db
397
+ }
398
+ call("SetInputVolume", payload)
399
+ end
400
+
401
+ def get_input_audio_balance(name)
402
+ payload = { inputName: name }
403
+ resp = call("GetInputAudioBalance", payload)
404
+ Mixin::Response.new(resp, resp.keys)
405
+ end
406
+
407
+ def set_input_audio_balance(name, balance)
408
+ payload = { inputName: name, inputAudioBalance: balance }
409
+ call("SetInputAudioBalance", payload)
410
+ end
411
+
412
+ def get_input_audio_sync_offset(name)
413
+ payload = { inputName: name }
414
+ resp = call("GetInputAudioSyncOffset", payload)
415
+ Mixin::Response.new(resp, resp.keys)
416
+ end
417
+
418
+ def set_input_audio_sync_offset(name, offset)
419
+ payload = { inputName: name, inputAudioSyncOffset: offset }
420
+ call("SetInputAudioSyncOffset", payload)
421
+ end
422
+
423
+ def get_input_audio_monitor_type(name)
424
+ payload = { inputName: name }
425
+ resp = call("GetInputAudioMonitorType", payload)
426
+ Mixin::Response.new(resp, resp.keys)
427
+ end
428
+
429
+ def set_input_audio_monitor_type(name, mon_type)
430
+ payload = { inputName: name, monitorType: mon_type }
431
+ call("SetInputAudioMonitorType", payload)
432
+ end
433
+
434
+ def get_input_audio_tracks(name)
435
+ payload = { inputName: name }
436
+ resp = call("GetInputAudioTracks", payload)
437
+ Mixin::Response.new(resp, resp.keys)
438
+ end
439
+
440
+ def set_input_audio_tracks(name, track)
441
+ payload = { inputName: name, inputAudioTracks: track }
442
+ call("SetInputAudioTracks", payload)
443
+ end
444
+
445
+ def get_input_properties_list_property_items(input_name, prop_name)
446
+ payload = { inputName: input_name, propertyName: prop_name }
447
+ resp = call("GetInputPropertiesListPropertyItems", payload)
448
+ Mixin::Response.new(resp, resp.keys)
449
+ end
450
+
451
+ def press_input_properties_button(input_name, prop_name)
452
+ payload = { inputName: input_name, propertyName: prop_name }
453
+ call("PressInputPropertiesButton", payload)
454
+ end
455
+
456
+ def get_transition_kind_list
457
+ resp = call("GetTransitionKindList")
458
+ Mixin::Response.new(resp, resp.keys)
459
+ end
460
+
461
+ def get_scene_transition_list
462
+ resp = call("GetSceneTransitionList")
463
+ Mixin::Response.new(resp, resp.keys)
464
+ end
465
+
466
+ def get_current_scene_transition
467
+ resp = call("GetCurrentSceneTransition")
468
+ Mixin::Response.new(resp, resp.keys)
469
+ end
470
+
471
+ def set_current_scene_transition(name)
472
+ payload = { transitionName: name }
473
+ call("SetCurrentSceneTransition", payload)
474
+ end
475
+
476
+ def set_current_scene_transition_duration(duration)
477
+ payload = { transitionDuration: duration }
478
+ call("SetCurrentSceneTransitionDuration", payload)
479
+ end
480
+
481
+ def set_current_scene_transition_settings(settings, overlay = nil)
482
+ payload = { transitionSettings: settings, overlay: overlay }
483
+ call("SetCurrentSceneTransitionSettings", payload)
484
+ end
485
+
486
+ def get_current_scene_transition_cursor
487
+ resp = call("GetCurrentSceneTransitionCursor")
488
+ Mixin::Response.new(resp, resp.keys)
489
+ end
490
+
491
+ def trigger_studio_mode_transition
492
+ call("TriggerStudioModeTransition")
493
+ end
494
+
495
+ def set_t_bar_position(pos, release = nil)
496
+ payload = { position: pos, release: release }
497
+ call("SetTBarPosition", payload)
498
+ end
499
+
500
+ def get_source_filter_list(name)
501
+ payload = { sourceName: name }
502
+ resp = call("GetSourceFilterList", payload)
503
+ Mixin::Response.new(resp, resp.keys)
504
+ end
505
+
506
+ def get_source_filter_default_settings(kind)
507
+ payload = { filterKind: kind }
508
+ resp = call("GetSourceFilterDefaultSettings", payload)
509
+ Mixin::Response.new(resp, resp.keys)
510
+ end
511
+
512
+ def create_source_filter(
513
+ source_name,
514
+ filter_name,
515
+ filter_kind,
516
+ filter_settings = nil
517
+ )
518
+ payload = {
519
+ sourceName: source_name,
520
+ filterName: filter_name,
521
+ filterKind: filter_kind,
522
+ filterSettings: filter_settings
523
+ }
524
+ call("CreateSourceFilter", payload)
525
+ end
526
+
527
+ def remove_source_filter(source_name, filter_name)
528
+ payload = { sourceName: source_name, filterName: filter_name }
529
+ call("RemoveSourceFilter", payload)
530
+ end
531
+
532
+ def set_source_filter_name(source_name, old_filter_name, new_filter_name)
533
+ payload = {
534
+ sourceName: source_name,
535
+ filterName: old_filter_name,
536
+ newFilterName: new_filter_name
537
+ }
538
+ call("SetSourceFilterName", payload)
539
+ end
540
+
541
+ def get_source_filter(source_name, filter_name)
542
+ payload = { sourceName: source_name, filterName: filter_name }
543
+ resp = call("GetSourceFilter", payload)
544
+ Mixin::Response.new(resp, resp.keys)
545
+ end
546
+
547
+ def set_source_filter_index(source_name, filter_name, filter_index)
548
+ payload = {
549
+ sourceName: source_name,
550
+ filterName: filter_name,
551
+ filterIndex: filter_index
552
+ }
553
+ call("SetSourceFilterIndex", payload)
554
+ end
555
+
556
+ def set_source_filter_settings(
557
+ source_name,
558
+ filter_name,
559
+ settings,
560
+ overlay = nil
561
+ )
562
+ payload = {
563
+ sourceName: source_name,
564
+ filterName: filter_name,
565
+ filterSettings: settings,
566
+ overlay: overlay
567
+ }
568
+ call("SetSourceFilterSettings", payload)
569
+ end
570
+
571
+ def set_source_filter_enabled(source_name, filter_name, enabled)
572
+ payload = {
573
+ sourceName: source_name,
574
+ filterName: filter_name,
575
+ filterEnabled: enabled
576
+ }
577
+ call("SetSourceFilterEnabled", payload)
578
+ end
579
+
580
+ def get_scene_item_list(name)
581
+ payload = { sceneName: name }
582
+ resp = call("GetSceneItemList", payload)
583
+ Mixin::Response.new(resp, resp.keys)
584
+ end
585
+
586
+ def get_group_scene_item_list(name)
587
+ payload = { sceneName: name }
588
+ resp = call("GetGroupSceneItemList", payload)
589
+ Mixin::Response.new(resp, resp.keys)
590
+ end
591
+
592
+ def get_scene_item_id(scene_name, source_name, offset = nil)
593
+ payload = {
594
+ sceneName: scene_name,
595
+ sourceName: source_name,
596
+ searchOffset: offset
597
+ }
598
+ resp = call("GetSceneItemId", payload)
599
+ Mixin::Response.new(resp, resp.keys)
600
+ end
601
+
602
+ def create_scene_item(scene_name, source_name, enabled = nil)
603
+ payload = {
604
+ sceneName: scene_name,
605
+ sourceName: source_name,
606
+ sceneItemEnabled: enabled
607
+ }
608
+ resp = call("CreateSceneItem", payload)
609
+ Mixin::Response.new(resp, resp.keys)
610
+ end
611
+
612
+ def remove_scene_item(scene_name, item_id)
613
+ payload = { sceneName: scene_name, sceneItemId: item_id }
614
+ call("RemoveSceneItem", payload)
615
+ end
616
+
617
+ def duplicate_scene_item(scene_name, item_id, dest_scene_name = nil)
618
+ payload = {
619
+ sceneName: scene_name,
620
+ sceneItemId: item_id,
621
+ destinationSceneName: dest_scene_name
622
+ }
623
+ resp = call("DuplicateSceneItem", payload)
624
+ Mixin::Response.new(resp, resp.keys)
625
+ end
626
+
627
+ def get_scene_item_transform(scene_name, item_id)
628
+ payload = { sceneName: scene_name, sceneItemId: item_id }
629
+ resp = call("GetSceneItemTransform", payload)
630
+ Mixin::Response.new(resp, resp.keys)
631
+ end
632
+
633
+ def set_scene_item_transform(scene_name, item_id, transform)
634
+ payload = {
635
+ sceneName: scene_name,
636
+ sceneItemId: item_id,
637
+ sceneItemTransform: transform
638
+ }
639
+ call("SetSceneItemTransform", payload)
640
+ end
641
+
642
+ def get_scene_item_enabled(scene_name, item_id)
643
+ payload = { sceneName: scene_name, sceneItemId: item_id }
644
+ resp = call("GetSceneItemEnabled", payload)
645
+ Mixin::Response.new(resp, resp.keys)
646
+ end
647
+
648
+ def set_scene_item_enabled(scene_name, item_id, enabled)
649
+ payload = {
650
+ sceneName: scene_name,
651
+ sceneItemId: item_id,
652
+ sceneItemEnabled: enabled
653
+ }
654
+ call("SetSceneItemEnabled", payload)
655
+ end
656
+
657
+ def get_scene_item_locked(scene_name, item_id)
658
+ payload = { sceneName: scene_name, sceneItemId: item_id }
659
+ resp = call("GetSceneItemLocked", payload)
660
+ Mixin::Response.new(resp, resp.keys)
661
+ end
662
+
663
+ def set_scene_item_locked(scene_name, item_id, locked)
664
+ payload = {
665
+ sceneName: scene_name,
666
+ sceneItemId: item_id,
667
+ sceneItemLocked: locked
668
+ }
669
+ call("SetSceneItemLocked", payload)
670
+ end
671
+
672
+ def get_scene_item_index(scene_name, item_id)
673
+ payload = { sceneName: scene_name, sceneItemId: item_id }
674
+ resp = call("GetSceneItemIndex", payload)
675
+ Mixin::Response.new(resp, resp.keys)
676
+ end
677
+
678
+ def set_scene_item_index(scene_name, item_id, item_index)
679
+ payload = {
680
+ sceneName: scene_name,
681
+ sceneItemId: item_id,
682
+ sceneItemLocked: item_index
683
+ }
684
+ call("SetSceneItemIndex", payload)
685
+ end
686
+
687
+ def get_scene_item_blend_mode(scene_name, item_id)
688
+ payload = { sceneName: scene_name, sceneItemId: item_id }
689
+ resp = call("GetSceneItemBlendMode", payload)
690
+ Mixin::Response.new(resp, resp.keys)
691
+ end
692
+
693
+ def set_scene_item_blend_mode(scene_name, item_id, blend)
694
+ payload = {
695
+ sceneName: scene_name,
696
+ sceneItemId: item_id,
697
+ sceneItemBlendMode: blend
698
+ }
699
+ call("SetSceneItemBlendMode", payload)
700
+ end
701
+
702
+ def get_virtual_cam_status
703
+ resp = call("GetVirtualCamStatus")
704
+ Mixin::Response.new(resp, resp.keys)
705
+ end
706
+
707
+ def toggle_virtual_cam
708
+ resp = call("ToggleVirtualCam")
709
+ Mixin::Response.new(resp, resp.keys)
710
+ end
711
+
712
+ def start_virtual_cam
713
+ call("StartVirtualCam")
714
+ end
715
+
716
+ def stop_virtual_cam
717
+ call("StopVirtualCam")
718
+ end
719
+
720
+ def get_replay_buffer_status
721
+ resp = call("GetReplayBufferStatus")
722
+ Mixin::Response.new(resp, resp.keys)
723
+ end
724
+
725
+ def toggle_replay_buffer
726
+ resp = call("ToggleReplayBuffer")
727
+ Mixin::Response.new(resp, resp.keys)
728
+ end
729
+
730
+ def start_replay_buffer
731
+ call("StartReplayBuffer")
732
+ end
733
+
734
+ def stop_replay_buffer
735
+ call("StopReplayBuffer")
736
+ end
737
+
738
+ def save_replay_buffer
739
+ call("SaveReplayBuffer")
740
+ end
741
+
742
+ def get_last_replay_buffer_replay
743
+ resp = call("GetLastReplayBufferReplay")
744
+ Mixin::Response.new(resp, resp.keys)
745
+ end
746
+
747
+ def get_output_list
748
+ resp = call("GetOutputList")
749
+ Mixin::Response.new(resp, resp.keys)
750
+ end
751
+
752
+ def get_output_status(name)
753
+ payload = { outputName: name }
754
+ resp = call("GetOutputStatus", payload)
755
+ Mixin::Response.new(resp, resp.keys)
756
+ end
757
+
758
+ def toggle_output(name)
759
+ payload = { outputName: name }
760
+ resp = call("ToggleOutput", payload)
761
+ Mixin::Response.new(resp, resp.keys)
762
+ end
763
+
764
+ def start_output(name)
765
+ payload = { outputName: name }
766
+ call("StartOutput", payload)
767
+ end
768
+
769
+ def stop_output(name)
770
+ payload = { outputName: name }
771
+ call("StopOutput", payload)
772
+ end
773
+
774
+ def get_output_settings(name)
775
+ payload = { outputName: name }
776
+ resp = call("GetOutputSettings", payload)
777
+ Mixin::Response.new(resp, resp.keys)
778
+ end
779
+
780
+ def set_output_settings(name, settings)
781
+ payload = { outputName: name, outputSettings: settings }
782
+ call("SetOutputSettings", payload)
783
+ end
784
+
785
+ def get_stream_status
786
+ resp = call("GetStreamStatus")
787
+ Mixin::Response.new(resp, resp.keys)
788
+ end
789
+
790
+ def toggle_stream
791
+ resp = call("ToggleStream")
792
+ Mixin::Response.new(resp, resp.keys)
793
+ end
794
+
795
+ def start_stream
796
+ call("StartStream")
797
+ end
798
+
799
+ def stop_stream
800
+ call("StopStream")
801
+ end
802
+
803
+ def send_stream_caption(caption)
804
+ call("SendStreamCaption")
805
+ end
806
+
807
+ def get_record_status
808
+ resp = call("GetRecordStatus")
809
+ Mixin::Response.new(resp, resp.keys)
810
+ end
811
+
812
+ def toggle_record
813
+ call("ToggleRecord")
814
+ end
815
+
816
+ def start_record
817
+ call("StartRecord")
818
+ end
819
+
820
+ def stop_record
821
+ resp = call("StopRecord")
822
+ end
823
+
824
+ def toggle_record_pause
825
+ call("ToggleRecordPause")
826
+ end
827
+
828
+ def pause_record
829
+ call("PauseRecord")
830
+ end
831
+
832
+ def resume_record
833
+ call("ResumeRecord")
834
+ end
835
+
836
+ def get_media_input_status(name)
837
+ payload = { inputName: name }
838
+ resp = call("GetMediaInputStatus", payload)
839
+ Mixin::Response.new(resp, resp.keys)
840
+ end
841
+
842
+ def set_media_input_cursor(name, cursor)
843
+ payload = { inputName: name, mediaCursor: cursor }
844
+ call("SetMediaInputCursor", payload)
845
+ end
846
+
847
+ def offset_media_input_cursor(name, offset)
848
+ payload = { inputName: name, mediaCursorOffset: offset }
849
+ call("OffsetMediaInputCursor", payload)
850
+ end
851
+
852
+ def trigger_media_input_action(name, action)
853
+ payload = { inputName: name, mediaAction: action }
854
+ call("TriggerMediaInputAction", payload)
855
+ end
856
+
857
+ def get_studio_mode_enabled
858
+ resp = call("GetStudioModeEnabled")
859
+ Mixin::Response.new(resp, resp.keys)
860
+ end
861
+
862
+ def set_studio_mode_enabled(enabled)
863
+ payload = { studioModeEnabled: enabled }
864
+ call("SetStudioModeEnabled", payload)
865
+ end
866
+
867
+ def open_input_properties_dialog(name)
868
+ payload = { inputName: name }
869
+ call("OpenInputPropertiesDialog", payload)
870
+ end
871
+
872
+ def open_input_filters_dialog(name)
873
+ payload = { inputName: name }
874
+ call("OpenInputFiltersDialog", payload)
875
+ end
876
+
877
+ def open_input_interact_dialog(name)
878
+ payload = { inputName: name }
879
+ call("OpenInputInteractDialog", payload)
880
+ end
881
+
882
+ def get_monitor_list
883
+ resp = call("GetMonitorList")
884
+ Mixin::Response.new(resp, resp.keys)
885
+ end
886
+ end
887
+ end
888
+ end