void DefaultAudioFrameAdapter::OnAudioMetadata()

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