Home | History | Annotate | Download | only in base
      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 "base/atomicops.h"
      9 #include "media/base/audio_bus.h"
     10 #include "media/base/media_export.h"
     11 
     12 namespace media {
     13 
     14 // First-in first-out container for AudioBus elements.
     15 // The maximum number of audio frames in the FIFO is set at construction and
     16 // can not be extended dynamically.  The allocated memory is utilized as a
     17 // ring buffer.
     18 // This class is thread-safe in the limited sense that one thread may call
     19 // Push(), while a second thread calls Consume().
     20 class MEDIA_EXPORT AudioFifo {
     21  public:
     22   // Creates a new AudioFifo and allocates |channels| of length |frames|.
     23   AudioFifo(int channels, int frames);
     24   virtual ~AudioFifo();
     25 
     26   // Pushes all audio channel data from |source| to the FIFO.
     27   // Push() will crash if the allocated space is insufficient.
     28   void Push(const AudioBus* source);
     29 
     30   // Consumes |frames_to_consume| audio frames from the FIFO and copies
     31   // them to |destination| starting at position |start_frame|.
     32   // Consume() will crash if the FIFO does not contain |frames_to_consume|
     33   // frames or if there is insufficient space in |destination| to store the
     34   // frames.
     35   void Consume(AudioBus* destination, int start_frame, int frames_to_consume);
     36 
     37   // Empties the FIFO without deallocating any memory.
     38   void Clear();
     39 
     40   // Number of actual audio frames in the FIFO.
     41   int frames() const;
     42 
     43   int max_frames() const { return max_frames_; }
     44 
     45  private:
     46   // The actual FIFO is an audio bus implemented as a ring buffer.
     47   scoped_ptr<AudioBus> audio_bus_;
     48 
     49   // Maximum number of elements the FIFO can contain.
     50   // This value is set by |frames| in the constructor.
     51   const int max_frames_;
     52 
     53   // Number of actual elements in the FIFO.
     54   volatile base::subtle::Atomic32 frames_pushed_;
     55   volatile base::subtle::Atomic32 frames_consumed_;
     56 
     57   // Current read position.
     58   int read_pos_;
     59 
     60   // Current write position.
     61   int write_pos_;
     62 
     63   DISALLOW_COPY_AND_ASSIGN(AudioFifo);
     64 };
     65 
     66 }  // namespace media
     67 
     68 #endif  // MEDIA_BASE_AUDIO_FIFO_H_
     69