// Copyright 2016 The Cobalt Authors. 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"
#if defined(COBALT_MEDIA_SOURCE_2016)
#include "cobalt/media/base/shell_audio_bus.h"
#else  // defined(COBALT_MEDIA_SOURCE_2016)
#include "media/base/shell_audio_bus.h"
#endif  // defined(COBALT_MEDIA_SOURCE_2016)
#include "third_party/flac/include/FLAC/stream_encoder.h"

namespace cobalt {
namespace speech {

// Encode raw audio to using FLAC codec.
class AudioEncoderFlac {
 public:
#if defined(COBALT_MEDIA_SOURCE_2016)
  typedef media::ShellAudioBus ShellAudioBus;
#else   // defined(COBALT_MEDIA_SOURCE_2016)
  typedef ::media::ShellAudioBus ShellAudioBus;
#endif  // defined(COBALT_MEDIA_SOURCE_2016)

  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_
