audio_pull_fifo.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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_PULL_FIFO_H_ 6#define MEDIA_BASE_AUDIO_PULL_FIFO_H_ 7 8#include "base/callback.h" 9#include "media/base/audio_fifo.h" 10#include "media/base/media_export.h" 11 12namespace media { 13 14// A FIFO (First In First Out) buffer to handle mismatches in buffer sizes 15// between a producer and consumer. The consumer will pull data from this FIFO. 16// If data is already available in the FIFO, it is provided to the consumer. 17// If insufficient data is available to satisfy the request, the FIFO will ask 18// the producer for more data to fulfill a request. 19class MEDIA_EXPORT AudioPullFifo { 20 public: 21 // Callback type for providing more data into the FIFO. Expects AudioBus 22 // to be completely filled with data upon return; zero padded if not enough 23 // frames are available to satisfy the request. 24 typedef base::Callback<void(AudioBus* audio_bus)> ReadCB; 25 26 // Constructs an AudioPullFifo with the specified |read_cb|, which is used to 27 // read audio data to the FIFO if data is not already available. The internal 28 // FIFO can contain |channel| number of channels, where each channel is of 29 // length |frames| audio frames. 30 AudioPullFifo(int channels, int frames, const ReadCB& read_cb); 31 virtual ~AudioPullFifo(); 32 33 // Consumes |frames_to_consume| audio frames from the FIFO and copies 34 // them to |destination|. If the FIFO does not have enough data, we ask 35 // the producer to give us more data to fulfill the request using the 36 // ReadCB implementation. 37 void Consume(AudioBus* destination, int frames_to_consume); 38 39 // Empties the FIFO without deallocating any memory. 40 void Clear(); 41 42 private: 43 // Attempt to fulfill the request using what is available in the FIFO. 44 // Append new data to the |destination| starting at |write_pos|. 45 void ReadFromFifo( 46 AudioBus* destination, int* frames_to_provide, int* write_pos); 47 48 // Source of data to the FIFO. 49 ReadCB read_cb_; 50 51 // The actual FIFO. 52 scoped_ptr<AudioFifo> fifo_; 53 54 // Temporary audio bus to hold the data from the producer. 55 scoped_ptr<AudioBus> bus_; 56 57 DISALLOW_COPY_AND_ASSIGN(AudioPullFifo); 58}; 59 60} // namespace media 61 62#endif // MEDIA_BASE_AUDIO_PULL_FIFO_H_ 63