// Copyright 2015 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_AUDIO_AUDIO_FILE_READER_WAV_H_
#define COBALT_AUDIO_AUDIO_FILE_READER_WAV_H_

#include <memory>
#include <utility>

#include "cobalt/audio/audio_file_reader.h"
#include "cobalt/audio/audio_helpers.h"

namespace cobalt {
namespace audio {

// WAVE Audio File Format Specifications:
//   http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
class AudioFileReaderWAV : public AudioFileReader {
 public:
  static std::unique_ptr<AudioFileReader> TryCreate(const uint8* data,
                                                    size_t size,
                                                    SampleType sample_type);

  float sample_rate() const override { return sample_rate_; }
  int32 number_of_frames() const override { return number_of_frames_; }
  int32 number_of_channels() const override { return number_of_channels_; }
  SampleType sample_type() const override { return sample_type_; }

  std::unique_ptr<AudioBus> ResetAndReturnAudioBus() override {
    return std::move(audio_bus_);
  }

 private:
  AudioFileReaderWAV(const uint8* data, size_t size, SampleType sample_type);

  bool ParseRIFFHeader(const uint8* data, size_t size);
  void ParseChunks(const uint8* data, size_t size);
  bool ParseWAV_fmt(const uint8* data, size_t offset, size_t size,
                    bool* is_src_sample_in_float);
  void ParseWAV_data(const uint8* data, size_t offset, size_t size,
                     bool is_src_sample_in_float);

  bool is_valid() { return audio_bus_ != NULL; }

  std::unique_ptr<AudioBus> audio_bus_;
  float sample_rate_;
  int32 number_of_frames_;
  int32 number_of_channels_;
  SampleType sample_type_;
};

}  // namespace audio
}  // namespace cobalt

#endif  // COBALT_AUDIO_AUDIO_FILE_READER_WAV_H_
