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