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/media_export.h"
10
11namespace media {
12class AudioBus;
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.  |frame_delay| is the number
24  // of output frames already processed and can be used to estimate delay.
25  typedef base::Callback<void(int frame_delay, AudioBus* audio_bus)> ReadCB;
26
27  // Constructs an AudioPullFifo with the specified |read_cb|, which is used to
28  // read audio data to the FIFO if data is not already available. The internal
29  // FIFO can contain |channel| number of channels, where each channel is of
30  // length |frames| audio frames.
31  AudioPullFifo(int channels, int frames, const ReadCB& read_cb);
32  virtual ~AudioPullFifo();
33
34  // Consumes |frames_to_consume| audio frames from the FIFO and copies
35  // them to |destination|. If the FIFO does not have enough data, we ask
36  // the producer to give us more data to fulfill the request using the
37  // ReadCB implementation.
38  void Consume(AudioBus* destination, int frames_to_consume);
39
40  // Empties the FIFO without deallocating any memory.
41  void Clear();
42
43 private:
44  // Attempt to fulfill the request using what is available in the FIFO.
45  // Append new data to the |destination| starting at |write_pos|.
46  int ReadFromFifo(AudioBus* destination, int frames_to_provide, int write_pos);
47
48  // Source of data to the FIFO.
49  const ReadCB read_cb_;
50
51  // Temporary audio bus to hold the data from the producer.
52  scoped_ptr<AudioBus> fifo_;
53  int fifo_index_;
54
55  DISALLOW_COPY_AND_ASSIGN(AudioPullFifo);
56};
57
58}  // namespace media
59
60#endif  // MEDIA_BASE_AUDIO_PULL_FIFO_H_
61