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