bool DefaultSignalingClient::SendSubscribe()

in chime-sdk-signaling-cpp/src/signaling/default_signaling_client.cc [168:245]


bool DefaultSignalingClient::SendSubscribe() {
  if (state_ != SignalingState::kConnected) return false;
  CHIME_LOG(LogLevel::kDebug, "Sending subscribe")
  signal_sdk::SdkStreamServiceType duplex = signal_sdk::SdkStreamServiceType::RX;
  signal_sdk::SdkSignalFrame signal_frame;
  signal_frame.set_type(signal_sdk::SdkSignalFrame_Type_SUBSCRIBE);
  signal_sdk::SdkSubscribeFrame* subscribe_frame = signal_frame.mutable_sub();
  subscribe_frame->set_sdp_offer(sdp_);

  std::vector<MediaSection> media_sections = SDPUtils::ParseSDP(sdp_);

  std::vector<uint32_t> receive_streams;
  std::vector<signal_sdk::SdkStreamDescriptor> stream_descriptors;
  // This is to make sure we have each sdp section in order
  for (const auto& media_section : media_sections) {
    if (media_section.type == MediaType::kAudio) {
      CHIME_LOG(LogLevel::kDebug, "Current mid " + media_section.mid)
      if (local_audio_sources_.find(media_section.mid) != local_audio_sources_.end()) {
        // No mid found, so we just need to have 0 for it.
        InternalStreamConfiguration& internal_local_stream_configuration = local_audio_sources_[media_section.mid];
        // For audio, needs to add 0 since this is what server side expects.
        receive_streams.push_back(0);
        signal_sdk::SdkStreamDescriptor stream_descriptor;
        stream_descriptor.set_stream_id(internal_local_stream_configuration.stream_id);
        stream_descriptor.set_group_id(internal_local_stream_configuration.group_id);
        stream_descriptor.set_max_bitrate_kbps(internal_local_stream_configuration.max_bitrate_kbps);
        stream_descriptors.emplace_back(stream_descriptor);
      }
    } else {
      if (IsLocal(media_section.direction) && IsSending(media_section.direction)) {
        duplex = signal_sdk::SdkStreamServiceType::DUPLEX;
      }
      // Check if local mid is there. We do not need to subscribe for local video on receive side.
      if (local_video_sources_.find(media_section.mid) != local_video_sources_.end()) {
        InternalStreamConfiguration& internal_local_stream_configuration = local_video_sources_[media_section.mid];
        // One of config contains send.
        signal_sdk::SdkStreamDescriptor stream_descriptor;
        stream_descriptor.set_stream_id(internal_local_stream_configuration.stream_id);
        stream_descriptor.set_group_id(internal_local_stream_configuration.group_id);
        stream_descriptor.set_max_bitrate_kbps(internal_local_stream_configuration.max_bitrate_kbps);
        stream_descriptors.emplace_back(stream_descriptor);
      } else {
        // Should be remote videos
        // We'll filter out only those that builders wanted to subscribe which is called by
        // UpdateRemoteVideoSubscriptions
        auto it = remote_video_sources_.find(media_section.mid);
        if (it == remote_video_sources_.end()) continue;

        if (media_section.direction == MediaDirection::kInactive) {
          // Following same behavior as video_client_impl
          receive_streams.push_back(0);
        } else {
          receive_streams.push_back(it->second.stream_id);
        }
      }
    }
  }

  if (duplex == signal_sdk::DUPLEX || duplex == signal_sdk::TX) {
    for (const auto& stream_descriptor : stream_descriptors) {
      *subscribe_frame->add_send_streams() = stream_descriptor;
    }
  }

  subscribe_frame->set_duplex(duplex);

  *subscribe_frame->mutable_receive_stream_ids() = {receive_streams.begin(), receive_streams.end()};

  if (!signaling_configuration_.meeting_configuration.urls.audio_host_url.empty()) {
    subscribe_frame->set_audio_host(signaling_configuration_.meeting_configuration.urls.audio_host_url);
  }

  if (is_muted_) subscribe_frame->set_audio_muted(is_muted_);

  CHIME_LOG(LogLevel::kDebug, SignalFrameDebugUtils::SubscribeFrameDebugString(*subscribe_frame))

  return signaling_transport_->SendSignalFrame(signal_frame);
}