setSourceEnabled method
- TrackSource source,
- bool enabled, {
- bool? captureScreenAudio,
- AudioCaptureOptions? audioCaptureOptions,
- CameraCaptureOptions? cameraCaptureOptions,
A convenience method to publish a track for a specific TrackSource. This is the recommended method to publish tracks.
Implementation
Future<LocalTrackPublication?> setSourceEnabled(TrackSource source, bool enabled,
{bool? captureScreenAudio,
AudioCaptureOptions? audioCaptureOptions,
CameraCaptureOptions? cameraCaptureOptions,
ScreenShareCaptureOptions? screenShareCaptureOptions}) async {
logger.fine('setSourceEnabled(source: $source, enabled: $enabled)');
if (TrackSource.screenShareVideo == source && lkPlatformIsWebMobile()) {
throw TrackCreateException('Screen sharing is not supported on mobile devices');
}
final publication = getTrackPublicationBySource(source);
if (publication != null) {
final stopOnMute = switch (publication.source) {
TrackSource.camera => cameraCaptureOptions?.stopCameraCaptureOnMute ?? true,
TrackSource.microphone => audioCaptureOptions?.stopAudioCaptureOnMute ?? true,
_ => true,
};
if (enabled) {
await publication.unmute(stopOnMute: stopOnMute);
} else {
if (source == TrackSource.screenShareVideo) {
await removePublishedTrack(publication.sid);
final screenAudio = getTrackPublicationBySource(TrackSource.screenShareAudio);
if (screenAudio != null) {
await removePublishedTrack(screenAudio.sid);
}
} else {
await publication.mute(stopOnMute: stopOnMute);
}
}
return publication;
} else if (enabled) {
if (source == TrackSource.camera) {
final CameraCaptureOptions captureOptions =
cameraCaptureOptions ?? room.roomOptions.defaultCameraCaptureOptions;
final track = await LocalVideoTrack.createCameraTrack(captureOptions);
return await publishVideoTrack(track);
} else if (source == TrackSource.microphone) {
final AudioCaptureOptions captureOptions = audioCaptureOptions ?? room.roomOptions.defaultAudioCaptureOptions;
final track = await LocalAudioTrack.create(captureOptions);
return await publishAudioTrack(track);
} else if (source == TrackSource.screenShareVideo) {
ScreenShareCaptureOptions captureOptions =
screenShareCaptureOptions ?? room.roomOptions.defaultScreenShareCaptureOptions;
if (lkPlatformIs(PlatformType.iOS) && !BroadcastManager().isBroadcasting) {
// Wait until broadcasting to publish track
await BroadcastManager().requestActivation();
return null;
}
/// When capturing chrome table audio, we can't capture audio/video
/// track separately, it has to be returned once in getDisplayMedia,
/// so we publish it twice here, but only return videoTrack to user.
if (captureScreenAudio ?? false) {
captureOptions = captureOptions.copyWith(captureScreenAudio: true);
final tracks = await LocalVideoTrack.createScreenShareTracksWithAudio(captureOptions);
LocalTrackPublication<LocalVideoTrack>? publication;
for (final track in tracks) {
if (track is LocalVideoTrack) {
publication = await publishVideoTrack(track);
} else if (track is LocalAudioTrack) {
await publishAudioTrack(track);
}
}
/// just return the video track publication
return publication;
}
final track = await LocalVideoTrack.createScreenShareTrack(captureOptions);
return await publishVideoTrack(track);
}
}
return null;
}