• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
11 namespace 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.
18 class 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 
max_frames()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