| 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 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| 11 * notice, this list of conditions and the following disclaimer in the | 11 * notice, this list of conditions and the following disclaimer in the |
| 12 * documentation and/or other materials provided with the distribution. | 12 * documentation and/or other materials provided with the distribution. |
| 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
| 14 * its contributors may be used to endorse or promote products derived | 14 * its contributors may be used to endorse or promote products derived |
| 15 * from this software without specific prior written permission. | 15 * from this software without specific prior written permission. |
| 16 * | 16 * |
| 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
| 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
| 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 */ | 27 */ |
| 28 | 28 |
| 29 #include "platform/audio/ReverbConvolver.h" |
| 29 #include "platform/ThreadSafeFunctional.h" | 30 #include "platform/ThreadSafeFunctional.h" |
| 30 #include "platform/audio/AudioBus.h" | 31 #include "platform/audio/AudioBus.h" |
| 31 #include "platform/audio/ReverbConvolver.h" | |
| 32 #include "platform/audio/VectorMath.h" | 32 #include "platform/audio/VectorMath.h" |
| 33 #include "public/platform/Platform.h" | 33 #include "public/platform/Platform.h" |
| 34 #include "public/platform/WebTaskRunner.h" | 34 #include "public/platform/WebTaskRunner.h" |
| 35 #include "public/platform/WebThread.h" | 35 #include "public/platform/WebThread.h" |
| 36 #include "public/platform/WebTraceLocation.h" | 36 #include "public/platform/WebTraceLocation.h" |
| 37 #include "wtf/PtrUtil.h" | |
| 38 #include <memory> | |
| 39 | 37 |
| 40 namespace blink { | 38 namespace blink { |
| 41 | 39 |
| 42 using namespace VectorMath; | 40 using namespace VectorMath; |
| 43 | 41 |
| 44 const int InputBufferSize = 8 * 16384; | 42 const int InputBufferSize = 8 * 16384; |
| 45 | 43 |
| 46 // We only process the leading portion of the impulse response in the real-time
thread. We don't exceed this length. | 44 // We only process the leading portion of the impulse response in the real-time
thread. We don't exceed this length. |
| 47 // It turns out then, that the background thread has about 278msec of scheduling
slop. | 45 // It turns out then, that the background thread has about 278msec of scheduling
slop. |
| 48 // Empirically, this has been found to be a good compromise between giving enoug
h time for scheduling slop, | 46 // Empirically, this has been found to be a good compromise between giving enoug
h time for scheduling slop, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 // For the last stage, it's possible that stageOffset is such that we're
straddling the end | 81 // For the last stage, it's possible that stageOffset is such that we're
straddling the end |
| 84 // of the impulse response buffer (if we use stageSize), so reduce the l
ast stage's length... | 82 // of the impulse response buffer (if we use stageSize), so reduce the l
ast stage's length... |
| 85 if (stageSize + stageOffset > totalResponseLength) | 83 if (stageSize + stageOffset > totalResponseLength) |
| 86 stageSize = totalResponseLength - stageOffset; | 84 stageSize = totalResponseLength - stageOffset; |
| 87 | 85 |
| 88 // This "staggers" the time when each FFT happens so they don't all happ
en at the same time | 86 // This "staggers" the time when each FFT happens so they don't all happ
en at the same time |
| 89 int renderPhase = convolverRenderPhase + i * renderSliceSize; | 87 int renderPhase = convolverRenderPhase + i * renderSliceSize; |
| 90 | 88 |
| 91 bool useDirectConvolver = !stageOffset; | 89 bool useDirectConvolver = !stageOffset; |
| 92 | 90 |
| 93 std::unique_ptr<ReverbConvolverStage> stage = wrapUnique(new ReverbConvo
lverStage(response, totalResponseLength, reverbTotalLatency, stageOffset, stageS
ize, fftSize, renderPhase, renderSliceSize, &m_accumulationBuffer, useDirectConv
olver)); | 91 OwnPtr<ReverbConvolverStage> stage = adoptPtr(new ReverbConvolverStage(r
esponse, totalResponseLength, reverbTotalLatency, stageOffset, stageSize, fftSiz
e, renderPhase, renderSliceSize, &m_accumulationBuffer, useDirectConvolver)); |
| 94 | 92 |
| 95 bool isBackgroundStage = false; | 93 bool isBackgroundStage = false; |
| 96 | 94 |
| 97 if (useBackgroundThreads && stageOffset > RealtimeFrameLimit) { | 95 if (useBackgroundThreads && stageOffset > RealtimeFrameLimit) { |
| 98 m_backgroundStages.append(std::move(stage)); | 96 m_backgroundStages.append(std::move(stage)); |
| 99 isBackgroundStage = true; | 97 isBackgroundStage = true; |
| 100 } else { | 98 } else { |
| 101 m_stages.append(std::move(stage)); | 99 m_stages.append(std::move(stage)); |
| 102 } | 100 } |
| 103 | 101 |
| 104 stageOffset += stageSize; | 102 stageOffset += stageSize; |
| 105 ++i; | 103 ++i; |
| 106 | 104 |
| 107 if (!useDirectConvolver) { | 105 if (!useDirectConvolver) { |
| 108 // Figure out next FFT size | 106 // Figure out next FFT size |
| 109 fftSize *= 2; | 107 fftSize *= 2; |
| 110 } | 108 } |
| 111 | 109 |
| 112 if (useBackgroundThreads && !isBackgroundStage && fftSize > m_maxRealtim
eFFTSize) | 110 if (useBackgroundThreads && !isBackgroundStage && fftSize > m_maxRealtim
eFFTSize) |
| 113 fftSize = m_maxRealtimeFFTSize; | 111 fftSize = m_maxRealtimeFFTSize; |
| 114 if (fftSize > m_maxFFTSize) | 112 if (fftSize > m_maxFFTSize) |
| 115 fftSize = m_maxFFTSize; | 113 fftSize = m_maxFFTSize; |
| 116 } | 114 } |
| 117 | 115 |
| 118 // Start up background thread | 116 // Start up background thread |
| 119 // FIXME: would be better to up the thread priority here. It doesn't need t
o be real-time, but higher than the default... | 117 // FIXME: would be better to up the thread priority here. It doesn't need t
o be real-time, but higher than the default... |
| 120 if (useBackgroundThreads && m_backgroundStages.size() > 0) | 118 if (useBackgroundThreads && m_backgroundStages.size() > 0) |
| 121 m_backgroundThread = wrapUnique(Platform::current()->createThread("Rever
b convolution background thread")); | 119 m_backgroundThread = adoptPtr(Platform::current()->createThread("Reverb
convolution background thread")); |
| 122 } | 120 } |
| 123 | 121 |
| 124 ReverbConvolver::~ReverbConvolver() | 122 ReverbConvolver::~ReverbConvolver() |
| 125 { | 123 { |
| 126 // Wait for background thread to stop | 124 // Wait for background thread to stop |
| 127 m_backgroundThread.reset(); | 125 m_backgroundThread.reset(); |
| 128 } | 126 } |
| 129 | 127 |
| 130 void ReverbConvolver::processInBackground() | 128 void ReverbConvolver::processInBackground() |
| 131 { | 129 { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 m_accumulationBuffer.reset(); | 184 m_accumulationBuffer.reset(); |
| 187 m_inputBuffer.reset(); | 185 m_inputBuffer.reset(); |
| 188 } | 186 } |
| 189 | 187 |
| 190 size_t ReverbConvolver::latencyFrames() const | 188 size_t ReverbConvolver::latencyFrames() const |
| 191 { | 189 { |
| 192 return 0; | 190 return 0; |
| 193 } | 191 } |
| 194 | 192 |
| 195 } // namespace blink | 193 } // namespace blink |
| OLD | NEW |