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_bus.h" | 5 #include "media/base/audio_bus.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "media/audio/audio_parameters.h" | 10 #include "media/audio/audio_parameters.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 static void CheckOverflow(int start_frame, int frames, int total_frames) { | 98 static void CheckOverflow(int start_frame, int frames, int total_frames) { |
99 CHECK_GE(start_frame, 0); | 99 CHECK_GE(start_frame, 0); |
100 CHECK_GE(frames, 0); | 100 CHECK_GE(frames, 0); |
101 CHECK_GT(total_frames, 0); | 101 CHECK_GT(total_frames, 0); |
102 int sum = start_frame + frames; | 102 int sum = start_frame + frames; |
103 CHECK_LE(sum, total_frames); | 103 CHECK_LE(sum, total_frames); |
104 CHECK_GE(sum, 0); | 104 CHECK_GE(sum, 0); |
105 } | 105 } |
106 | 106 |
107 AudioBus::AudioBus(int channels, int frames) | 107 AudioBus::AudioBus(int channels, int frames) |
108 : frames_(frames) { | 108 : frames_(frames), |
| 109 can_set_channel_data_(false) { |
109 ValidateConfig(channels, frames_); | 110 ValidateConfig(channels, frames_); |
110 | 111 |
111 int aligned_frames = 0; | 112 int aligned_frames = 0; |
112 int size = CalculateMemorySizeInternal(channels, frames, &aligned_frames); | 113 int size = CalculateMemorySizeInternal(channels, frames, &aligned_frames); |
113 | 114 |
114 data_.reset(static_cast<float*>(base::AlignedAlloc( | 115 data_.reset(static_cast<float*>(base::AlignedAlloc( |
115 size, AudioBus::kChannelAlignment))); | 116 size, AudioBus::kChannelAlignment))); |
116 | 117 |
117 BuildChannelData(channels, aligned_frames, data_.get()); | 118 BuildChannelData(channels, aligned_frames, data_.get()); |
118 } | 119 } |
119 | 120 |
120 AudioBus::AudioBus(int channels, int frames, float* data) | 121 AudioBus::AudioBus(int channels, int frames, float* data) |
121 : frames_(frames) { | 122 : frames_(frames), |
| 123 can_set_channel_data_(false) { |
122 ValidateConfig(channels, frames_); | 124 ValidateConfig(channels, frames_); |
123 | 125 |
124 int aligned_frames = 0; | 126 int aligned_frames = 0; |
125 CalculateMemorySizeInternal(channels, frames, &aligned_frames); | 127 CalculateMemorySizeInternal(channels, frames, &aligned_frames); |
126 | 128 |
127 BuildChannelData(channels, aligned_frames, data); | 129 BuildChannelData(channels, aligned_frames, data); |
128 } | 130 } |
129 | 131 |
130 AudioBus::AudioBus(int frames, const std::vector<float*>& channel_data) | 132 AudioBus::AudioBus(int frames, const std::vector<float*>& channel_data) |
131 : channel_data_(channel_data), | 133 : channel_data_(channel_data), |
132 frames_(frames) { | 134 frames_(frames), |
| 135 can_set_channel_data_(false) { |
133 ValidateConfig(channel_data_.size(), frames_); | 136 ValidateConfig(channel_data_.size(), frames_); |
134 | 137 |
135 // Sanity check wrapped vector for alignment and channel count. | 138 // Sanity check wrapped vector for alignment and channel count. |
136 for (size_t i = 0; i < channel_data_.size(); ++i) | 139 for (size_t i = 0; i < channel_data_.size(); ++i) |
137 DCHECK(IsAligned(channel_data_[i])); | 140 DCHECK(IsAligned(channel_data_[i])); |
138 } | 141 } |
139 | 142 |
| 143 AudioBus::AudioBus(int channels) |
| 144 : channel_data_(channels), |
| 145 frames_(0), |
| 146 can_set_channel_data_(true) { |
| 147 for (size_t i = 0; i < channel_data_.size(); ++i) |
| 148 channel_data_[i] = NULL; |
| 149 } |
| 150 |
140 AudioBus::~AudioBus() {} | 151 AudioBus::~AudioBus() {} |
141 | 152 |
142 scoped_ptr<AudioBus> AudioBus::Create(int channels, int frames) { | 153 scoped_ptr<AudioBus> AudioBus::Create(int channels, int frames) { |
143 return scoped_ptr<AudioBus>(new AudioBus(channels, frames)); | 154 return scoped_ptr<AudioBus>(new AudioBus(channels, frames)); |
144 } | 155 } |
145 | 156 |
146 scoped_ptr<AudioBus> AudioBus::Create(const AudioParameters& params) { | 157 scoped_ptr<AudioBus> AudioBus::Create(const AudioParameters& params) { |
147 return scoped_ptr<AudioBus>(new AudioBus( | 158 return scoped_ptr<AudioBus>(new AudioBus( |
148 params.channels(), params.frames_per_buffer())); | 159 params.channels(), params.frames_per_buffer())); |
149 } | 160 } |
150 | 161 |
| 162 scoped_ptr<AudioBus> AudioBus::CreateWrapper(int channels) { |
| 163 return scoped_ptr<AudioBus>(new AudioBus(channels)); |
| 164 } |
| 165 |
151 scoped_ptr<AudioBus> AudioBus::WrapVector( | 166 scoped_ptr<AudioBus> AudioBus::WrapVector( |
152 int frames, const std::vector<float*>& channel_data) { | 167 int frames, const std::vector<float*>& channel_data) { |
153 return scoped_ptr<AudioBus>(new AudioBus(frames, channel_data)); | 168 return scoped_ptr<AudioBus>(new AudioBus(frames, channel_data)); |
154 } | 169 } |
155 | 170 |
156 scoped_ptr<AudioBus> AudioBus::WrapMemory(int channels, int frames, | 171 scoped_ptr<AudioBus> AudioBus::WrapMemory(int channels, int frames, |
157 void* data) { | 172 void* data) { |
158 // |data| must be aligned by AudioBus::kChannelAlignment. | 173 // |data| must be aligned by AudioBus::kChannelAlignment. |
159 CHECK(IsAligned(data)); | 174 CHECK(IsAligned(data)); |
160 return scoped_ptr<AudioBus>(new AudioBus( | 175 return scoped_ptr<AudioBus>(new AudioBus( |
161 channels, frames, static_cast<float*>(data))); | 176 channels, frames, static_cast<float*>(data))); |
162 } | 177 } |
163 | 178 |
164 scoped_ptr<AudioBus> AudioBus::WrapMemory(const AudioParameters& params, | 179 scoped_ptr<AudioBus> AudioBus::WrapMemory(const AudioParameters& params, |
165 void* data) { | 180 void* data) { |
166 // |data| must be aligned by AudioBus::kChannelAlignment. | 181 // |data| must be aligned by AudioBus::kChannelAlignment. |
167 CHECK(IsAligned(data)); | 182 CHECK(IsAligned(data)); |
168 return scoped_ptr<AudioBus>(new AudioBus( | 183 return scoped_ptr<AudioBus>(new AudioBus( |
169 params.channels(), params.frames_per_buffer(), | 184 params.channels(), params.frames_per_buffer(), |
170 static_cast<float*>(data))); | 185 static_cast<float*>(data))); |
171 } | 186 } |
172 | 187 |
| 188 void AudioBus::SetChannelData(int channel, float* data) { |
| 189 CHECK(can_set_channel_data_); |
| 190 CHECK_GE(channel, 0); |
| 191 CHECK_LT(static_cast<size_t>(channel), channel_data_.size()); |
| 192 DCHECK(IsAligned(data)); |
| 193 channel_data_[channel] = data; |
| 194 } |
| 195 |
| 196 void AudioBus::set_frames(int frames) { |
| 197 CHECK(can_set_channel_data_); |
| 198 frames_ = frames; |
| 199 } |
| 200 |
173 void AudioBus::ZeroFramesPartial(int start_frame, int frames) { | 201 void AudioBus::ZeroFramesPartial(int start_frame, int frames) { |
174 CheckOverflow(start_frame, frames, frames_); | 202 CheckOverflow(start_frame, frames, frames_); |
175 | 203 |
176 if (frames <= 0) | 204 if (frames <= 0) |
177 return; | 205 return; |
178 | 206 |
179 for (size_t i = 0; i < channel_data_.size(); ++i) { | 207 for (size_t i = 0; i < channel_data_.size(); ++i) { |
180 memset(channel_data_[i] + start_frame, 0, | 208 memset(channel_data_[i] + start_frame, 0, |
181 frames * sizeof(*channel_data_[i])); | 209 frames * sizeof(*channel_data_[i])); |
182 } | 210 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 DCHECK_EQ(channels(), dest->channels()); | 293 DCHECK_EQ(channels(), dest->channels()); |
266 DCHECK_EQ(frames(), dest->frames()); | 294 DCHECK_EQ(frames(), dest->frames()); |
267 | 295 |
268 // Since we don't know if the other AudioBus is wrapped or not (and we don't | 296 // Since we don't know if the other AudioBus is wrapped or not (and we don't |
269 // want to care), just copy using the public channel() accessors. | 297 // want to care), just copy using the public channel() accessors. |
270 for (int i = 0; i < channels(); ++i) | 298 for (int i = 0; i < channels(); ++i) |
271 memcpy(dest->channel(i), channel(i), sizeof(*channel(i)) * frames()); | 299 memcpy(dest->channel(i), channel(i), sizeof(*channel(i)) * frames()); |
272 } | 300 } |
273 | 301 |
274 } // namespace media | 302 } // namespace media |
OLD | NEW |