OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 for (size_t i = 0; i < n; ++i) { | 183 for (size_t i = 0; i < n; ++i) { |
184 std::complex<double> c(realP[i], imagP[i]); | 184 std::complex<double> c(realP[i], imagP[i]); |
185 double scalarMagnitude = abs(c) * magnitudeScale; | 185 double scalarMagnitude = abs(c) * magnitudeScale; |
186 destination[i] = float(k * destination[i] + (1 - k) * scalarMagnitude); | 186 destination[i] = float(k * destination[i] + (1 - k) * scalarMagnitude); |
187 } | 187 } |
188 } | 188 } |
189 | 189 |
190 void RealtimeAnalyser::getFloatFrequencyData(DOMFloat32Array* destinationArray) | 190 void RealtimeAnalyser::getFloatFrequencyData(DOMFloat32Array* destinationArray) |
191 { | 191 { |
192 ASSERT(isMainThread()); | 192 ASSERT(isMainThread()); |
193 | 193 ASSERT(destinationArray); |
194 if (!destinationArray) | |
195 return; | |
196 | 194 |
197 doFFTAnalysis(); | 195 doFFTAnalysis(); |
198 | 196 |
199 // Convert from linear magnitude to floating-point decibels. | 197 // Convert from linear magnitude to floating-point decibels. |
200 const double minDecibels = m_minDecibels; | 198 const double minDecibels = m_minDecibels; |
201 unsigned sourceLength = magnitudeBuffer().size(); | 199 unsigned sourceLength = magnitudeBuffer().size(); |
202 size_t len = std::min(sourceLength, destinationArray->length()); | 200 size_t len = std::min(sourceLength, destinationArray->length()); |
203 if (len > 0) { | 201 if (len > 0) { |
204 const float* source = magnitudeBuffer().data(); | 202 const float* source = magnitudeBuffer().data(); |
205 float* destination = destinationArray->data(); | 203 float* destination = destinationArray->data(); |
206 | 204 |
207 for (unsigned i = 0; i < len; ++i) { | 205 for (unsigned i = 0; i < len; ++i) { |
208 float linearValue = source[i]; | 206 float linearValue = source[i]; |
209 double dbMag = !linearValue ? minDecibels : AudioUtilities::linearTo
Decibels(linearValue); | 207 double dbMag = !linearValue ? minDecibels : AudioUtilities::linearTo
Decibels(linearValue); |
210 destination[i] = float(dbMag); | 208 destination[i] = float(dbMag); |
211 } | 209 } |
212 } | 210 } |
213 } | 211 } |
214 | 212 |
215 void RealtimeAnalyser::getByteFrequencyData(DOMUint8Array* destinationArray) | 213 void RealtimeAnalyser::getByteFrequencyData(DOMUint8Array* destinationArray) |
216 { | 214 { |
217 ASSERT(isMainThread()); | 215 ASSERT(isMainThread()); |
218 | 216 ASSERT(destinationArray); |
219 if (!destinationArray) | |
220 return; | |
221 | 217 |
222 doFFTAnalysis(); | 218 doFFTAnalysis(); |
223 | 219 |
224 // Convert from linear magnitude to unsigned-byte decibels. | 220 // Convert from linear magnitude to unsigned-byte decibels. |
225 unsigned sourceLength = magnitudeBuffer().size(); | 221 unsigned sourceLength = magnitudeBuffer().size(); |
226 size_t len = std::min(sourceLength, destinationArray->length()); | 222 size_t len = std::min(sourceLength, destinationArray->length()); |
227 if (len > 0) { | 223 if (len > 0) { |
228 const double rangeScaleFactor = m_maxDecibels == m_minDecibels ? 1 : 1 /
(m_maxDecibels - m_minDecibels); | 224 const double rangeScaleFactor = m_maxDecibels == m_minDecibels ? 1 : 1 /
(m_maxDecibels - m_minDecibels); |
229 const double minDecibels = m_minDecibels; | 225 const double minDecibels = m_minDecibels; |
230 | 226 |
(...skipping 14 matching lines...) Expand all Loading... |
245 scaledValue = UCHAR_MAX; | 241 scaledValue = UCHAR_MAX; |
246 | 242 |
247 destination[i] = static_cast<unsigned char>(scaledValue); | 243 destination[i] = static_cast<unsigned char>(scaledValue); |
248 } | 244 } |
249 } | 245 } |
250 } | 246 } |
251 | 247 |
252 void RealtimeAnalyser::getFloatTimeDomainData(DOMFloat32Array* destinationArray) | 248 void RealtimeAnalyser::getFloatTimeDomainData(DOMFloat32Array* destinationArray) |
253 { | 249 { |
254 ASSERT(isMainThread()); | 250 ASSERT(isMainThread()); |
255 | 251 ASSERT(destinationArray); |
256 if (!destinationArray) | |
257 return; | |
258 | 252 |
259 unsigned fftSize = this->fftSize(); | 253 unsigned fftSize = this->fftSize(); |
260 size_t len = std::min(fftSize, destinationArray->length()); | 254 size_t len = std::min(fftSize, destinationArray->length()); |
261 if (len > 0) { | 255 if (len > 0) { |
262 bool isInputBufferGood = m_inputBuffer.size() == InputBufferSize && m_in
putBuffer.size() > fftSize; | 256 bool isInputBufferGood = m_inputBuffer.size() == InputBufferSize && m_in
putBuffer.size() > fftSize; |
263 ASSERT(isInputBufferGood); | 257 ASSERT(isInputBufferGood); |
264 if (!isInputBufferGood) | 258 if (!isInputBufferGood) |
265 return; | 259 return; |
266 | 260 |
267 float* inputBuffer = m_inputBuffer.data(); | 261 float* inputBuffer = m_inputBuffer.data(); |
268 float* destination = destinationArray->data(); | 262 float* destination = destinationArray->data(); |
269 | 263 |
270 unsigned writeIndex = m_writeIndex; | 264 unsigned writeIndex = m_writeIndex; |
271 | 265 |
272 for (unsigned i = 0; i < len; ++i) { | 266 for (unsigned i = 0; i < len; ++i) { |
273 // Buffer access is protected due to modulo operation. | 267 // Buffer access is protected due to modulo operation. |
274 float value = inputBuffer[(i + writeIndex - fftSize + InputBufferSiz
e) % InputBufferSize]; | 268 float value = inputBuffer[(i + writeIndex - fftSize + InputBufferSiz
e) % InputBufferSize]; |
275 | 269 |
276 destination[i] = value; | 270 destination[i] = value; |
277 } | 271 } |
278 } | 272 } |
279 } | 273 } |
280 | 274 |
281 void RealtimeAnalyser::getByteTimeDomainData(DOMUint8Array* destinationArray) | 275 void RealtimeAnalyser::getByteTimeDomainData(DOMUint8Array* destinationArray) |
282 { | 276 { |
283 ASSERT(isMainThread()); | 277 ASSERT(isMainThread()); |
284 | 278 ASSERT(destinationArray); |
285 if (!destinationArray) | |
286 return; | |
287 | 279 |
288 unsigned fftSize = this->fftSize(); | 280 unsigned fftSize = this->fftSize(); |
289 size_t len = std::min(fftSize, destinationArray->length()); | 281 size_t len = std::min(fftSize, destinationArray->length()); |
290 if (len > 0) { | 282 if (len > 0) { |
291 bool isInputBufferGood = m_inputBuffer.size() == InputBufferSize && m_in
putBuffer.size() > fftSize; | 283 bool isInputBufferGood = m_inputBuffer.size() == InputBufferSize && m_in
putBuffer.size() > fftSize; |
292 ASSERT(isInputBufferGood); | 284 ASSERT(isInputBufferGood); |
293 if (!isInputBufferGood) | 285 if (!isInputBufferGood) |
294 return; | 286 return; |
295 | 287 |
296 float* inputBuffer = m_inputBuffer.data(); | 288 float* inputBuffer = m_inputBuffer.data(); |
(...skipping 15 matching lines...) Expand all Loading... |
312 scaledValue = UCHAR_MAX; | 304 scaledValue = UCHAR_MAX; |
313 | 305 |
314 destination[i] = static_cast<unsigned char>(scaledValue); | 306 destination[i] = static_cast<unsigned char>(scaledValue); |
315 } | 307 } |
316 } | 308 } |
317 } | 309 } |
318 | 310 |
319 } // namespace blink | 311 } // namespace blink |
320 | 312 |
321 #endif // ENABLE(WEB_AUDIO) | 313 #endif // ENABLE(WEB_AUDIO) |
OLD | NEW |