1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_AUDIO_FIFO_H_
6#define MEDIA_BASE_AUDIO_FIFO_H_
7
8#include "media/base/audio_bus.h"
9#include "media/base/media_export.h"
10
11namespace media {
12
13// First-in first-out container for AudioBus elements.
14// The maximum number of audio frames in the FIFO is set at construction and
15// can not be extended dynamically.  The allocated memory is utilized as a
16// ring buffer.
17// This class is thread-unsafe.
18class MEDIA_EXPORT AudioFifo {
19 public:
20  // Creates a new AudioFifo and allocates |channels| of length |frames|.
21  AudioFifo(int channels, int frames);
22  virtual ~AudioFifo();
23
24  // Pushes all audio channel data from |source| to the FIFO.
25  // Push() will crash if the allocated space is insufficient.
26  void Push(const AudioBus* source);
27
28  // Consumes |frames_to_consume| audio frames from the FIFO and copies
29  // them to |destination| starting at position |start_frame|.
30  // Consume() will crash if the FIFO does not contain |frames_to_consume|
31  // frames or if there is insufficient space in |destination| to store the
32  // frames.
33  void Consume(AudioBus* destination, int start_frame, int frames_to_consume);
34
35  // Empties the FIFO without deallocating any memory.
36  void Clear();
37
38  // Number of actual audio frames in the FIFO.
39  int frames() const;
40
41  int max_frames() const { return max_frames_; }
42
43 private:
44  // The actual FIFO is an audio bus implemented as a ring buffer.
45  scoped_ptr<AudioBus> audio_bus_;
46
47  // Maximum number of elements the FIFO can contain.
48  // This value is set by |frames| in the constructor.
49  const int max_frames_;
50
51  // Number of actual elements in the FIFO.
52  int frames_pushed_;
53  int frames_consumed_;
54
55  // Current read position.
56  int read_pos_;
57
58  // Current write position.
59  int write_pos_;
60
61  DISALLOW_COPY_AND_ASSIGN(AudioFifo);
62};
63
64}  // namespace media
65
66#endif  // MEDIA_BASE_AUDIO_FIFO_H_
67