Skip to content

Commit e5caee2

Browse files
committed
Media state from participant
1 parent 14f5373 commit e5caee2

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

Sources/LiveKit/Agent/LocalMedia.swift

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ open class LocalMedia: ObservableObject {
3232
@Published public private(set) var cameraTrack: (any VideoTrack)?
3333
@Published public private(set) var screenShareTrack: (any VideoTrack)?
3434

35-
public var isMicrophoneEnabled: Bool { microphoneTrack != nil }
36-
public var isCameraEnabled: Bool { cameraTrack != nil }
37-
public var isScreenShareEnabled: Bool { screenShareTrack != nil }
35+
@Published public private(set) var isMicrophoneEnabled: Bool = false
36+
@Published public private(set) var isCameraEnabled: Bool = false
37+
@Published public private(set) var isScreenShareEnabled: Bool = false
3838

3939
@Published public private(set) var audioDevices: [AudioDevice] = AudioManager.shared.inputDevices
4040
@Published public private(set) var selectedAudioDeviceID: String = AudioManager.shared.inputDevice.deviceId
@@ -46,29 +46,37 @@ open class LocalMedia: ObservableObject {
4646

4747
// MARK: - Dependencies
4848

49-
private var room: Room
49+
private var localParticipant: LocalParticipant
5050

5151
// MARK: - Initialization
5252

53-
public init(room: Room) {
54-
self.room = room
53+
public init(localParticipant: LocalParticipant) {
54+
self.localParticipant = localParticipant
5555

56-
observe(room: room)
56+
observe(localParticipant)
5757
observeDevices()
5858
}
5959

60+
public convenience init(room: Room) {
61+
self.init(localParticipant: room.localParticipant)
62+
}
63+
6064
public convenience init(conversation: Conversation) {
6165
self.init(room: conversation.room)
6266
}
6367

64-
private func observe(room: Room) {
68+
private func observe(_ localParticipant: LocalParticipant) {
6569
Task { [weak self] in
66-
for try await _ in room.changes {
70+
for try await _ in localParticipant.changes {
6771
guard let self else { return }
6872

69-
microphoneTrack = room.localParticipant.firstAudioTrack
70-
cameraTrack = room.localParticipant.firstCameraVideoTrack
71-
screenShareTrack = room.localParticipant.firstScreenShareVideoTrack
73+
microphoneTrack = localParticipant.firstAudioTrack
74+
cameraTrack = localParticipant.firstCameraVideoTrack
75+
screenShareTrack = localParticipant.firstScreenShareVideoTrack
76+
77+
isMicrophoneEnabled = localParticipant.isMicrophoneEnabled()
78+
isCameraEnabled = localParticipant.isCameraEnabled()
79+
isScreenShareEnabled = localParticipant.isScreenShareEnabled()
7280
}
7381
}
7482
}
@@ -101,7 +109,7 @@ open class LocalMedia: ObservableObject {
101109

102110
public func toggleMicrophone() async {
103111
do {
104-
try await room.localParticipant.setMicrophone(enabled: !isMicrophoneEnabled)
112+
try await localParticipant.setMicrophone(enabled: !isMicrophoneEnabled)
105113
} catch {
106114
self.error = .mediaDevice(error)
107115
}
@@ -111,11 +119,11 @@ open class LocalMedia: ObservableObject {
111119
let enable = !isCameraEnabled
112120
do {
113121
if enable, disableScreenShare, isScreenShareEnabled {
114-
try await room.localParticipant.setScreenShare(enabled: false)
122+
try await localParticipant.setScreenShare(enabled: false)
115123
}
116124

117125
let device = try await CameraCapturer.captureDevices().first(where: { $0.uniqueID == selectedVideoDeviceID })
118-
try await room.localParticipant.setCamera(enabled: enable, captureOptions: CameraCaptureOptions(device: device))
126+
try await localParticipant.setCamera(enabled: enable, captureOptions: CameraCaptureOptions(device: device))
119127
} catch {
120128
self.error = .mediaDevice(error)
121129
}
@@ -125,9 +133,9 @@ open class LocalMedia: ObservableObject {
125133
let enable = !isScreenShareEnabled
126134
do {
127135
if enable, disableCamera, isCameraEnabled {
128-
try await room.localParticipant.setCamera(enabled: false)
136+
try await localParticipant.setCamera(enabled: false)
129137
}
130-
try await room.localParticipant.setScreenShare(enabled: enable)
138+
try await localParticipant.setScreenShare(enabled: enable)
131139
} catch {
132140
self.error = .mediaDevice(error)
133141
}
@@ -158,7 +166,7 @@ open class LocalMedia: ObservableObject {
158166
// MARK: - Private
159167

160168
private func getCameraCapturer() -> CameraCapturer? {
161-
guard let cameraTrack = room.localParticipant.firstCameraVideoTrack as? LocalVideoTrack else { return nil }
169+
guard let cameraTrack = localParticipant.firstCameraVideoTrack as? LocalVideoTrack else { return nil }
162170
return cameraTrack.capturer as? CameraCapturer
163171
}
164172
}

0 commit comments

Comments
 (0)