// 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:
  // Even though a constructed object is not valid, and there are no setters,
  // it is still possible to construct a dummy object and use the assignment
  // operator later.
  AudioParameters() = default;

  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_
