// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cobalt/media/base/audio_pull_fifo.h"

#include <algorithm>

#include "base/logging.h"
#include "cobalt/media/base/audio_bus.h"

namespace media {

AudioPullFifo::AudioPullFifo(int channels, int frames, const ReadCB& read_cb)
    : read_cb_(read_cb),
      fifo_(AudioBus::Create(channels, frames)),
      fifo_index_(frames) {}

AudioPullFifo::~AudioPullFifo() {}

void AudioPullFifo::Consume(AudioBus* destination, int frames_to_consume) {
  DCHECK_LE(frames_to_consume, destination->frames());

  int remaining_frames_to_provide = frames_to_consume;

  // Try to fulfill the request using what's available in the FIFO.
  int frames_read = ReadFromFifo(destination, remaining_frames_to_provide, 0);
  int write_pos = frames_read;
  remaining_frames_to_provide -= frames_read;

  // Get the remaining audio frames from the producer using the callback.
  while (remaining_frames_to_provide > 0) {
    DCHECK_EQ(fifo_index_, fifo_->frames());
    fifo_index_ = 0;

    // Fill up the FIFO by acquiring audio data from the producer.
    read_cb_.Run(write_pos, fifo_.get());

    // Try to fulfill the request using what's available in the FIFO.
    frames_read =
        ReadFromFifo(destination, remaining_frames_to_provide, write_pos);
    write_pos += frames_read;
    remaining_frames_to_provide -= frames_read;
  }
}

void AudioPullFifo::Clear() { fifo_index_ = fifo_->frames(); }

int AudioPullFifo::SizeInFrames() const { return fifo_->frames(); }

int AudioPullFifo::ReadFromFifo(AudioBus* destination, int frames_to_provide,
                                int write_pos) {
  int frames = std::min(frames_to_provide, fifo_->frames() - fifo_index_);
  if (frames <= 0) return 0;

  for (int ch = 0; ch < fifo_->channels(); ++ch) {
    const float* src = fifo_->channel(ch) + fifo_index_;
    float* dest = destination->channel(ch) + write_pos;
    memcpy(dest, src, frames * sizeof(*src));
  }

  fifo_index_ += frames;
  return frames;
}

}  // namespace media
