// 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.

#ifndef MEDIA_BASE_AUDIO_FIFO_H_
#define MEDIA_BASE_AUDIO_FIFO_H_

#include "base/atomicops.h"
#include "media/base/audio_bus.h"
#include "media/base/media_export.h"

namespace media {

// First-in first-out container for AudioBus elements.
// The maximum number of audio frames in the FIFO is set at construction and
// can not be extended dynamically.  The allocated memory is utilized as a
// ring buffer.
// This class is thread-safe in the limited sense that one thread may call
// Push(), while a second thread calls Consume().
class MEDIA_EXPORT AudioFifo {
 public:
  // Creates a new AudioFifo and allocates |channels| of length |frames|.
  AudioFifo(int channels, int frames);
  virtual ~AudioFifo();

  // Pushes all audio channel data from |source| to the FIFO.
  // Push() will crash if the allocated space is insufficient.
  void Push(const AudioBus* source);

  // Consumes |frames_to_consume| audio frames from the FIFO and copies
  // them to |destination| starting at position |start_frame|.
  // Consume() will crash if the FIFO does not contain |frames_to_consume|
  // frames or if there is insufficient space in |destination| to store the
  // frames.
  void Consume(AudioBus* destination, int start_frame, int frames_to_consume);

  // Empties the FIFO without deallocating any memory.
  void Clear();

  // Number of actual audio frames in the FIFO.
  int frames() const;

  int max_frames() const { return max_frames_; }

 private:
  // The actual FIFO is an audio bus implemented as a ring buffer.
  scoped_ptr<AudioBus> audio_bus_;

  // Maximum number of elements the FIFO can contain.
  // This value is set by |frames| in the constructor.
  const int max_frames_;

  // Number of actual elements in the FIFO.
  volatile base::subtle::Atomic32 frames_pushed_;
  volatile base::subtle::Atomic32 frames_consumed_;

  // Current read position.
  int read_pos_;

  // Current write position.
  int write_pos_;

  DISALLOW_COPY_AND_ASSIGN(AudioFifo);
};

}  // namespace media

#endif  // MEDIA_BASE_AUDIO_FIFO_H_
