// Copyright 2018 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MEDIA_STREAM_AUDIO_PARAMETERS_H_
#define COBALT_MEDIA_STREAM_AUDIO_PARAMETERS_H_

#include <string>

#include "base/logging.h"

namespace cobalt {
namespace media_stream {

class AudioParameters {
 public:
  AudioParameters(int channel_count, int sample_rate, int bits_per_sample)
      : channel_count_(channel_count),
        sample_rate_(sample_rate),
        bits_per_sample_(bits_per_sample) {
    DCHECK(IsValid());
  }

  AudioParameters(const AudioParameters&) = default;
  AudioParameters& operator=(const AudioParameters&) = default;

  int channel_count() const { return channel_count_; }
  int sample_rate() const { return sample_rate_; }
  int bits_per_sample() const { return bits_per_sample_; }

  std::string AsHumanReadableString() const;

  bool IsValid() const {
    return (channel_count_ > 0) && (bits_per_sample_ > 0) && (sample_rate_ > 0);
  }

  int GetBitsPerSecond() const {
    return sample_rate_ * channel_count_ * bits_per_sample_;
  }

 private:
  int channel_count_;
  int sample_rate_;
  int bits_per_sample_;
};

inline bool operator==(const AudioParameters& lhs, const AudioParameters& rhs) {
  return ((lhs.channel_count() == rhs.channel_count()) &&
          (lhs.sample_rate() == rhs.sample_rate()) &&
          (lhs.bits_per_sample() == rhs.bits_per_sample()));
}

inline bool operator!=(const AudioParameters& lhs, const AudioParameters& rhs) {
  return !(lhs == rhs);
}

inline std::ostream& operator<<(std::ostream& os,
                                const AudioParameters& params) {
  os << params.AsHumanReadableString();
  return os;
}

}  // namespace media_stream
}  // namespace cobalt

#endif  // COBALT_MEDIA_STREAM_AUDIO_PARAMETERS_H_
