/*
 *  Copyright 2018 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "rtc_base/strings/audio_format_to_string.h"

#include "rtc_base/strings/string_builder.h"

namespace rtc {
std::string ToString(const webrtc::SdpAudioFormat& saf) {
  char sb_buf[1024];
  rtc::SimpleStringBuilder sb(sb_buf);
  sb << "{name: " << saf.name;
  sb << ", clockrate_hz: " << saf.clockrate_hz;
  sb << ", num_channels: " << saf.num_channels;
  sb << ", parameters: {";
  const char* sep = "";
  for (const auto& kv : saf.parameters) {
    sb << sep << kv.first << ": " << kv.second;
    sep = ", ";
  }
  sb << "}}";
  return sb.str();
}
std::string ToString(const webrtc::AudioCodecInfo& aci) {
  char sb_buf[1024];
  rtc::SimpleStringBuilder sb(sb_buf);
  sb << "{sample_rate_hz: " << aci.sample_rate_hz;
  sb << ", num_channels: " << aci.num_channels;
  sb << ", default_bitrate_bps: " << aci.default_bitrate_bps;
  sb << ", min_bitrate_bps: " << aci.min_bitrate_bps;
  sb << ", max_bitrate_bps: " << aci.max_bitrate_bps;
  sb << ", allow_comfort_noise: " << aci.allow_comfort_noise;
  sb << ", supports_network_adaption: " << aci.supports_network_adaption;
  sb << "}";
  return sb.str();
}
std::string ToString(const webrtc::AudioCodecSpec& acs) {
  char sb_buf[1024];
  rtc::SimpleStringBuilder sb(sb_buf);
  sb << "{format: " << ToString(acs.format);
  sb << ", info: " << ToString(acs.info);
  sb << "}";
  return sb.str();
}
}  // namespace rtc
