OLD | NEW |
(Empty) | |
| 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 #include "media/base/audio_pull_fifo.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 |
| 9 namespace media { |
| 10 |
| 11 AudioPullFifo::AudioPullFifo(int channels, int frames, |
| 12 const ReadCB& read_cb, int read_frames) |
| 13 : read_cb_(read_cb) { |
| 14 DCHECK_LE(read_frames, frames); |
| 15 audio_fifo_.reset(new AudioFifo(channels, frames)); |
| 16 audio_bus_ = AudioBus::Create(channels, read_frames); |
| 17 } |
| 18 |
| 19 AudioPullFifo::~AudioPullFifo() { |
| 20 read_cb_.Reset(); |
| 21 } |
| 22 |
| 23 void AudioPullFifo::Consume(AudioBus* destination, int frames_to_consume) { |
| 24 DCHECK(destination); |
| 25 |
| 26 if (frames_to_consume > audio_fifo_->frames()) { |
| 27 // We don't have enough data in the FIFO to fulfill the request and must |
| 28 // ask the provider for more data. |
| 29 FillBuffer(frames_to_consume - audio_fifo_->frames()); |
| 30 } |
| 31 |
| 32 // We are now able to copy the requested amount of data to the destination. |
| 33 audio_fifo_->Consume(destination, frames_to_consume); |
| 34 } |
| 35 |
| 36 void AudioPullFifo::FillBuffer(int frames) { |
| 37 // Keep asking the provider to give us data until we have received at least |
| 38 // |frames| number of audio data. Push new data to the FIFO in segments with |
| 39 // the same size as the audio bus (set by |read_frames| in the ctor). |
| 40 int frames_provided = 0; |
| 41 while (frames_provided < frames) { |
| 42 // Read audio data from the provider asking for |read_frames|. |
| 43 read_cb_.Run(audio_bus_.get()); |
| 44 |
| 45 // Add the acquired data to the FIFO. |
| 46 audio_fifo_->Push(audio_bus_.get()); |
| 47 |
| 48 // Keep adding to the FIFO until we have added at least |frames| number |
| 49 // of frames. |
| 50 frames_provided += audio_bus_->frames(); |
| 51 } |
| 52 } |
| 53 |
| 54 } // namespace media |
OLD | NEW |