/*
 *  Copyright (c) 2012 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.
 */

#ifndef MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
#define MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_

#include <stddef.h>

#include "rtc_base/constructor_magic.h"

namespace webrtc {

// Forward declarations.
class AudioMultiVector;
class DecoderDatabase;
class SyncBuffer;
struct Packet;

// This class acts as an interface to the CNG generator.
class ComfortNoise {
 public:
  enum ReturnCodes {
    kOK = 0,
    kUnknownPayloadType,
    kInternalError,
    kMultiChannelNotSupported
  };

  ComfortNoise(int fs_hz,
               DecoderDatabase* decoder_database,
               SyncBuffer* sync_buffer)
      : fs_hz_(fs_hz),
        first_call_(true),
        overlap_length_(5 * fs_hz_ / 8000),
        decoder_database_(decoder_database),
        sync_buffer_(sync_buffer) {}

  // Resets the state. Should be called before each new comfort noise period.
  void Reset();

  // Update the comfort noise generator with the parameters in `packet`.
  int UpdateParameters(const Packet& packet);

  // Generates `requested_length` samples of comfort noise and writes to
  // `output`. If this is the first in call after Reset (or first after creating
  // the object), it will also mix in comfort noise at the end of the
  // SyncBuffer object provided in the constructor.
  int Generate(size_t requested_length, AudioMultiVector* output);

  // Returns the last error code that was produced by the comfort noise
  // decoder. Returns 0 if no error has been encountered since the last reset.
  int internal_error_code() { return internal_error_code_; }

 private:
  int fs_hz_;
  bool first_call_;
  size_t overlap_length_;
  DecoderDatabase* decoder_database_;
  SyncBuffer* sync_buffer_;
  int internal_error_code_;
  RTC_DISALLOW_COPY_AND_ASSIGN(ComfortNoise);
};

}  // namespace webrtc
#endif  // MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
