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 |