OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/audio_fifo.h" | 5 #include "media/base/audio_fifo.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 | 8 |
9 namespace media { | 9 namespace media { |
10 | 10 |
11 // Given current position in the FIFO, the maximum number of elements in the | 11 AudioFifo::AudioFifo(int channels, int frames) |
12 // FIFO and the size of the input; this method provides two output results: | 12 : audio_bus_(AudioBus::Create(channels, frames)), |
13 // |size| and |wrap_size|. These two results can then be utilized for memcopy | 13 max_frames_(frames), |
14 // operations to and from the FIFO. | 14 frames_pushed_(0), |
15 // Under "normal" circumstances, |size| will be equal to |in_size| and | 15 frames_consumed_(0), |
16 // |wrap_size| will be zero. This case corresponding to the non-wrapping case | 16 read_pos_(0), |
17 // where we have not yet reached the "edge" of the FIFO. If |pos| + |in_size| | 17 write_pos_(0) {} |
18 // exceeds the total size of the FIFO, we must wrap around and start reusing | 18 |
19 // a part the allocated memory. The size of this part is given by |wrap_size|. | 19 AudioFifo::~AudioFifo() {} |
20 static void GetSizes( | 20 |
21 int pos, int max_size, int in_size, int* size, int* wrap_size) { | 21 // static. |
| 22 void AudioFifo::GetSizes(int pos, int max_size, int in_size, |
| 23 int* size, int* wrap_size) { |
22 if (pos + in_size > max_size) { | 24 if (pos + in_size > max_size) { |
23 // Wrapping is required => derive size of each segment. | 25 // Wrapping is required => derive size of each segment. |
24 *size = max_size - pos; | 26 *size = max_size - pos; |
25 *wrap_size = in_size - *size; | 27 *wrap_size = in_size - *size; |
26 } else { | 28 } else { |
27 // Wrapping is not required. | 29 // Wrapping is not required. |
28 *size = in_size; | 30 *size = in_size; |
29 *wrap_size = 0; | 31 *wrap_size = 0; |
30 } | 32 } |
31 } | 33 } |
32 | 34 |
33 // Updates the read/write position with |step| modulo the maximum number of | 35 // static. |
34 // elements in the FIFO to ensure that the position counters wraps around at | 36 int AudioFifo::UpdatePos(int pos, int step, int max_size) { |
35 // the endpoint. | |
36 static int UpdatePos(int pos, int step, int max_size) { | |
37 return ((pos + step) % max_size); | 37 return ((pos + step) % max_size); |
38 } | 38 } |
39 | 39 |
40 AudioFifo::AudioFifo(int channels, int frames) | |
41 : audio_bus_(AudioBus::Create(channels, frames)), | |
42 max_frames_(frames), | |
43 frames_pushed_(0), | |
44 frames_consumed_(0), | |
45 read_pos_(0), | |
46 write_pos_(0) {} | |
47 | |
48 AudioFifo::~AudioFifo() {} | |
49 | |
50 int AudioFifo::frames() const { | 40 int AudioFifo::frames() const { |
51 int delta = frames_pushed_ - frames_consumed_; | 41 int delta = frames_pushed_ - frames_consumed_; |
52 return delta; | 42 return delta; |
53 } | 43 } |
54 | 44 |
55 void AudioFifo::Push(const AudioBus* source) { | 45 void AudioFifo::Push(const AudioBus* source) { |
56 DCHECK(source); | 46 DCHECK(source); |
57 DCHECK_EQ(source->channels(), audio_bus_->channels()); | 47 DCHECK_EQ(source->channels(), audio_bus_->channels()); |
58 | 48 |
59 // Ensure that there is space for the new data in the FIFO. | 49 // Ensure that there is space for the new data in the FIFO. |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 } | 114 } |
125 | 115 |
126 void AudioFifo::Clear() { | 116 void AudioFifo::Clear() { |
127 frames_pushed_ = 0; | 117 frames_pushed_ = 0; |
128 frames_consumed_ = 0; | 118 frames_consumed_ = 0; |
129 read_pos_ = 0; | 119 read_pos_ = 0; |
130 write_pos_ = 0; | 120 write_pos_ = 0; |
131 } | 121 } |
132 | 122 |
133 } // namespace media | 123 } // namespace media |
OLD | NEW |