/*
 * Copyright 2016 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_SPEECH_AUDIO_ENCODER_FLAC_H_
#define COBALT_SPEECH_AUDIO_ENCODER_FLAC_H_

#include <string>

#include "base/basictypes.h"
#include "base/callback.h"
#include "base/threading/thread_checker.h"
#include "media/base/shell_audio_bus.h"
#include "third_party/flac/include/FLAC/stream_encoder.h"

namespace cobalt {
namespace speech {

// Encode raw audio to using FLAC codec.
class AudioEncoderFlac {
 public:
  typedef ::media::ShellAudioBus ShellAudioBus;

  explicit AudioEncoderFlac(int sample_rate);
  ~AudioEncoderFlac();

  // Encode raw audio data.
  void Encode(const ShellAudioBus* audio_bus);
  // Finish encoding.
  void Finish();

  // Returns mime Type of audio data.
  std::string GetMimeType() const;
  // Returns and clears the available encoded audio data.
  std::string GetAndClearAvailableEncodedData();

 private:
  // FLAC encoder callback.
  static FLAC__StreamEncoderWriteStatus WriteCallback(
      const FLAC__StreamEncoder* encoder, const FLAC__byte buffer[],
      size_t bytes, unsigned int samples, unsigned int current_frame,
      void* client_data);

  base::ThreadChecker thread_checker_;
  // FLAC encoder.
  FLAC__StreamEncoder* encoder_;
  // Cached encoded data.
  std::string encoded_data_;
};

}  // namespace speech
}  // namespace cobalt

#endif  // COBALT_SPEECH_AUDIO_ENCODER_FLAC_H_
