setSourceEnabled method

Future<LocalTrackPublication<LocalTrack>?> setSourceEnabled(
  1. TrackSource source,
  2. bool enabled, {
  3. bool? captureScreenAudio,
  4. AudioCaptureOptions? audioCaptureOptions,
  5. CameraCaptureOptions? cameraCaptureOptions,
  6. ScreenShareCaptureOptions? screenShareCaptureOptions,
})

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}) {
  return _publishRunner.run(() async {
    if (TrackSource.screenShareVideo == source && lkPlatformIsWebMobile()) {
      throw TrackCreateException('Screen sharing is not supported on mobile devices');
    }

    logger.fine('setSourceEnabled(source: $source, enabled: $enabled)');

    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;
  });
}