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