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