Skip to content

Commit cbf714c

Browse files
committed
Optionally force scene switch transitions for all video sources.
1 parent ae7e0cb commit cbf714c

File tree

5 files changed

+44
-13
lines changed

5 files changed

+44
-13
lines changed

Common/Localizable.xcstrings

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58276,6 +58276,9 @@
5827658276
}
5827758277
}
5827858278
}
58279+
},
58280+
"Force scene switch transition" : {
58281+
5827958282
},
5828058283
"Foreground" : {
5828158284
"localizations" : {
@@ -100417,6 +100420,9 @@
100417100420
}
100418100421
}
100419100422
}
100423+
},
100424+
"RTMP, SRT(LA), screen capture and media player video sources can instantly be switched to, but if you want consistency you can force scene switch transitions to these as well." : {
100425+
100420100426
},
100421100427
"rtmp://a.rtmp.youtube.com/live2" : {
100422100428
"localizations" : {

Moblin/Various/Media.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -812,16 +812,16 @@ final class Media: NSObject {
812812
func attachReplaceCamera(
813813
device: AVCaptureDevice?,
814814
cameraPreviewLayer: AVCaptureVideoPreviewLayer?,
815-
showCameraPreview _: Bool,
816-
cameraId: UUID
815+
cameraId: UUID,
816+
ignoreFramesAfterAttachSeconds: Double
817817
) {
818818
netStream?.attachCamera(
819819
device,
820820
cameraPreviewLayer,
821821
false,
822822
.off,
823823
false,
824-
0.0,
824+
ignoreFramesAfterAttachSeconds,
825825
replaceVideoCameraId: cameraId
826826
)
827827
}

Moblin/Various/Model.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6433,6 +6433,14 @@ final class Model: NSObject, ObservableObject, @unchecked Sendable {
64336433
return Double(database.debug.cameraSwitchRemoveBlackish!)
64346434
}
64356435

6436+
private func getIgnoreFramesAfterAttachSecondsReplaceCamera() -> Double {
6437+
if database.forceSceneSwitchTransition! {
6438+
return Double(database.debug.cameraSwitchRemoveBlackish!)
6439+
} else {
6440+
return 0.0
6441+
}
6442+
}
6443+
64366444
private func attachReplaceCamera(cameraId: UUID) {
64376445
cameraDevice = nil
64386446
cameraPosition = nil
@@ -6441,8 +6449,8 @@ final class Model: NSObject, ObservableObject, @unchecked Sendable {
64416449
media.attachReplaceCamera(
64426450
device: getVideoSourceBuiltinCameraDevice(),
64436451
cameraPreviewLayer: cameraPreviewLayer,
6444-
showCameraPreview: updateShowCameraPreview(),
6445-
cameraId: cameraId
6452+
cameraId: cameraId,
6453+
ignoreFramesAfterAttachSeconds: getIgnoreFramesAfterAttachSecondsReplaceCamera()
64466454
)
64476455
media.usePendingAfterAttachEffects()
64486456
}

Moblin/Various/Settings.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,6 +2677,7 @@ class Database: Codable {
26772677
var pixellateStrength: Float? = 0.3
26782678
var moblink: SettingsMoblinkRelay? = .init()
26792679
var sceneSwitchTransition: SettingsSceneSwitchTransition? = .blur
2680+
var forceSceneSwitchTransition: Bool? = false
26802681

26812682
static func fromString(settings: String) throws -> Database {
26822683
let database = try JSONDecoder().decode(
@@ -4609,5 +4610,9 @@ final class Settings {
46094610
realDatabase.sceneSwitchTransition = realDatabase.debug.blurSceneSwitch! ? .blur : .freeze
46104611
store()
46114612
}
4613+
if realDatabase.forceSceneSwitchTransition == nil {
4614+
realDatabase.forceSceneSwitchTransition = false
4615+
store()
4616+
}
46124617
}
46134618
}

Moblin/View/Settings/Scenes/ScenesSettingsView.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,27 @@ private struct ScenesSwitchTransition: View {
6565
@State var sceneSwitchTransition: String
6666

6767
var body: some View {
68-
Picker("Scene switch transition", selection: $sceneSwitchTransition) {
69-
ForEach(sceneSwitchTransitions, id: \.self) { transition in
70-
Text(transition)
68+
Section {
69+
Picker("Scene switch transition", selection: $sceneSwitchTransition) {
70+
ForEach(sceneSwitchTransitions, id: \.self) { transition in
71+
Text(transition)
72+
}
7173
}
72-
}
73-
.onChange(of: sceneSwitchTransition) { _ in
74-
model.database.sceneSwitchTransition = SettingsSceneSwitchTransition
75-
.fromString(value: sceneSwitchTransition)
76-
model.setSceneSwitchTransition()
74+
.onChange(of: sceneSwitchTransition) { _ in
75+
model.database.sceneSwitchTransition = SettingsSceneSwitchTransition
76+
.fromString(value: sceneSwitchTransition)
77+
model.setSceneSwitchTransition()
78+
}
79+
Toggle("Force scene switch transition", isOn: Binding(get: {
80+
model.database.forceSceneSwitchTransition!
81+
}, set: { value in
82+
model.database.forceSceneSwitchTransition = value
83+
}))
84+
} footer: {
85+
Text("""
86+
RTMP, SRT(LA), screen capture and media player video sources can instantly be switched \
87+
to, but if you want consistency you can force scene switch transitions to these as well.
88+
""")
7789
}
7890
}
7991
}

0 commit comments

Comments
 (0)