addLocalStream method

Future<void> addLocalStream(
  1. MediaStream stream,
  2. String purpose, {
  3. bool addToPeerConnection = true,
})

Implementation

Future<void> addLocalStream(
  MediaStream stream,
  String purpose, {
  bool addToPeerConnection = true,
}) async {
  final existingStream =
      getLocalStreams.where((element) => element.purpose == purpose);
  if (existingStream.isNotEmpty) {
    existingStream.first.setNewStream(stream);
  } else {
    final newStream = WrappedMediaStream(
      participant: localParticipant!,
      room: opts.room,
      stream: stream,
      purpose: purpose,
      client: client,
      audioMuted: stream.getAudioTracks().isEmpty,
      videoMuted: stream.getVideoTracks().isEmpty,
      isGroupCall: groupCallId != null,
      pc: pc,
      voip: voip,
    );
    _streams.add(newStream);
    onStreamAdd.add(newStream);
  }

  if (addToPeerConnection) {
    if (purpose == SDPStreamMetadataPurpose.Screenshare) {
      _screensharingSenders.clear();
      for (final track in stream.getTracks()) {
        _screensharingSenders.add(await pc!.addTrack(track, stream));
      }
    } else if (purpose == SDPStreamMetadataPurpose.Usermedia) {
      _usermediaSenders.clear();
      for (final track in stream.getTracks()) {
        _usermediaSenders.add(await pc!.addTrack(track, stream));
      }
    }
  }

  if (purpose == SDPStreamMetadataPurpose.Usermedia) {
    _speakerOn = type == CallType.kVideo;
    if (!voip.delegate.isWeb && stream.getAudioTracks().isNotEmpty) {
      final audioTrack = stream.getAudioTracks()[0];
      audioTrack.enableSpeakerphone(_speakerOn);
    }
  }

  fireCallEvent(CallStateChange.kFeedsChanged);
}