@@ -17,10 +17,38 @@ public final actor MediaMixer {
17
17
case deviceNotFound
18
18
}
19
19
20
+ /// An enumeration defines the capture session mode used for video/audio input.
21
+ public enum CaptureSessionMode : Sendable {
22
+ /// Uses a standard `AVCaptureSession`
23
+ case single
24
+ /// Uses an `AVCaptureMultiCamSession`
25
+ case multi
26
+ /// Does not use a `AVCaptureSession`. Set this when using ReplayKit, as AVCaptureSession is not required.
27
+ case manual
28
+
29
+ func makeSession( ) -> ( any CaptureSessionConvertible ) {
30
+ switch self {
31
+ case . single:
32
+ var session = CaptureSession ( )
33
+ session. isMultiCamSessionEnabled = false
34
+ return session
35
+ case . multi:
36
+ var session = CaptureSession ( )
37
+ session. isMultiCamSessionEnabled = true
38
+ return session
39
+ case . manual:
40
+ return NullCaptureSession ( )
41
+ }
42
+ }
43
+ }
44
+
20
45
/// The offscreen rendering object.
21
46
@ScreenActor
22
47
public private( set) lazy var screen = Screen ( )
23
48
49
+ /// The capture session mode.
50
+ public let captureSessionMode : CaptureSessionMode
51
+
24
52
#if os(iOS) || os(tvOS)
25
53
/// The AVCaptureMultiCamSession enabled.
26
54
@available ( tvOS 17 . 0 , * )
@@ -99,57 +127,27 @@ public final actor MediaMixer {
99
127
private var cancellables : Set < AnyCancellable > = [ ]
100
128
private lazy var audioIO = AudioCaptureUnit ( session)
101
129
private lazy var videoIO = VideoCaptureUnit ( session)
102
- private lazy var session = CaptureSession ( )
130
+ private lazy var session : ( any CaptureSessionConvertible ) = captureSessionMode . makeSession ( )
103
131
@ScreenActor
104
132
private lazy var displayLink = DisplayLinkChoreographer ( )
105
133
106
- #if os(iOS) || os(tvOS)
107
134
/// Creates a new instance.
108
135
///
109
136
/// - Parameters:
110
- /// - multiCamSessionEnabled : Specifies the AVCaptureMultiCamSession enabled .
137
+ /// - captureSessionMode : Specifies the capture session mode .
111
138
/// - multiTrackAudioMixingEnabled: Specifies the feature to mix multiple audio tracks. For example, it is possible to mix .appAudio and .micAudio from ReplayKit.
112
139
public init (
113
- multiCamSessionEnabled : Bool = true ,
140
+ captureSessionMode : CaptureSessionMode = . single ,
114
141
multiTrackAudioMixingEnabled: Bool = false
115
142
) {
116
- Task {
117
- await _init (
118
- multiCamSessionEnabled: multiCamSessionEnabled,
119
- multiTrackAudioMixingEnabled: multiTrackAudioMixingEnabled
120
- )
121
- }
122
- }
123
-
124
- private func _init(
125
- multiCamSessionEnabled: Bool ,
126
- multiTrackAudioMixingEnabled: Bool
127
- ) async {
128
- session. isMultiCamSessionEnabled = multiCamSessionEnabled
129
- audioIO. isMultiTrackAudioMixingEnabled = multiTrackAudioMixingEnabled
130
- }
131
-
132
- #else
133
- /// Creates a new instance.
134
- ///
135
- /// - Parameters:
136
- /// - multiTrackAudioMixingEnabled: Specifies the feature to mix multiple audio tracks. For example, it is possible to mix .appAudio and .micAudio from ReplayKit.
137
- public init (
138
- multiTrackAudioMixingEnabled: Bool = false ,
139
- ) {
140
- Task {
141
- await _init (
142
- multiTrackAudioMixingEnabled: multiTrackAudioMixingEnabled
143
- )
144
- }
143
+ self . captureSessionMode = captureSessionMode
145
144
}
146
145
147
146
private func _init(
148
147
multiTrackAudioMixingEnabled: Bool
149
148
) async {
150
149
audioIO. isMultiTrackAudioMixingEnabled = multiTrackAudioMixingEnabled
151
150
}
152
- #endif
153
151
154
152
/// Attaches a video device.
155
153
///
0 commit comments