in chime-sdk-signaling-cpp/src/audio_video/default_audio_frame_adapter.cc [141:200]
void DefaultAudioFrameAdapter::OnAudioMetadata(const signal_sdk::SdkAudioMetadataFrame &audio_metadata) {
std::vector<VolumeUpdate> volume_updates;
std::vector<SignalStrengthUpdate> signal_strength_updates;
for (const signal_sdk::SdkAudioAttendeeState& state : audio_metadata.attendee_states()) {
// Skip when no stream id
if (!state.has_audio_stream_id()) {
CHIME_LOG(LogLevel::kVerbose, "No audio stream id in audio metadata frame, will skip.")
continue;
}
const auto attendee_itr = stream_id_to_attendee_id_.find(state.audio_stream_id());
// Skip when attendee not seen
if (attendee_itr == stream_id_to_attendee_id_.end()) {
CHIME_LOG(LogLevel::kVerbose, "Failed to find attendee with stream id: " + std::to_string(state.audio_stream_id()) + " for audio metadata, will skip.")
continue;
}
std::string attendee_id = attendee_itr->second;
// Handle volume
if (state.has_volume()) {
Volume new_volume = { NormalizeVolume(state.volume()) };
const auto volume_itr = attendee_id_to_volume_.find(attendee_id);
if (volume_itr == attendee_id_to_volume_.end() ||
!IsEqual(volume_itr->second.normalized_volume, new_volume.normalized_volume)) {
// Volume changed
const auto external_user_itr = stream_id_to_external_user_id_.find(state.audio_stream_id());
std::string external_user_id = external_user_itr != stream_id_to_external_user_id_.end() ?
external_user_itr->second : "";
volume_updates.push_back({ { attendee_id, external_user_id }, new_volume });
}
// Store current volume
attendee_id_to_volume_[attendee_id] = new_volume;
}
// Handle signal strength
if (state.has_signal_strength()) {
SignalStrength new_signal = { NormalizeSignalStrength(state.signal_strength()) };
const auto signal_itr = attendee_id_to_signal_strength_.find(attendee_id);
if (signal_itr == attendee_id_to_signal_strength_.end() || !IsEqual(signal_itr->second.normalized_signal_strength, new_signal.normalized_signal_strength)) {
// Signal changed
auto external_user_itr = stream_id_to_external_user_id_.find(state.audio_stream_id());
std::string external_user_id = external_user_itr != stream_id_to_external_user_id_.end() ?
external_user_itr->second : "";
signal_strength_updates.push_back({ { attendee_id, external_user_id }, new_signal });
}
// Store current signal
attendee_id_to_signal_strength_[attendee_id] = new_signal;
}
}
// Send updates if any
if (!volume_updates.empty()) {
default_signaling_client_->NotifySignalingObserver([&] (SignalingClientObserver* observer) -> void {
observer->OnVolumeUpdates(volume_updates);
});
}
if (!signal_strength_updates.empty()) {
default_signaling_client_->NotifySignalingObserver([&] (SignalingClientObserver* observer) -> void {
observer->OnSignalStrengthChanges(signal_strength_updates);
});
}
}