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" | |
30 #include "platform/ThreadSafeFunctional.h" | 29 #include "platform/ThreadSafeFunctional.h" |
31 #include "platform/audio/AudioBus.h" | 30 #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> |
37 | 39 |
38 namespace blink { | 40 namespace blink { |
39 | 41 |
40 using namespace VectorMath; | 42 using namespace VectorMath; |
41 | 43 |
42 const int InputBufferSize = 8 * 16384; | 44 const int InputBufferSize = 8 * 16384; |
43 | 45 |
44 // We only process the leading portion of the impulse response in the real-time
thread. We don't exceed this length. | 46 // We only process the leading portion of the impulse response in the real-time
thread. We don't exceed this length. |
45 // It turns out then, that the background thread has about 278msec of scheduling
slop. | 47 // It turns out then, that the background thread has about 278msec of scheduling
slop. |
46 // Empirically, this has been found to be a good compromise between giving enoug
h time for scheduling slop, | 48 // 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... |
81 // For the last stage, it's possible that stageOffset is such that we're
straddling the end | 83 // For the last stage, it's possible that stageOffset is such that we're
straddling the end |
82 // of the impulse response buffer (if we use stageSize), so reduce the l
ast stage's length... | 84 // of the impulse response buffer (if we use stageSize), so reduce the l
ast stage's length... |
83 if (stageSize + stageOffset > totalResponseLength) | 85 if (stageSize + stageOffset > totalResponseLength) |
84 stageSize = totalResponseLength - stageOffset; | 86 stageSize = totalResponseLength - stageOffset; |
85 | 87 |
86 // This "staggers" the time when each FFT happens so they don't all happ
en at the same time | 88 // This "staggers" the time when each FFT happens so they don't all happ
en at the same time |
87 int renderPhase = convolverRenderPhase + i * renderSliceSize; | 89 int renderPhase = convolverRenderPhase + i * renderSliceSize; |
88 | 90 |
89 bool useDirectConvolver = !stageOffset; | 91 bool useDirectConvolver = !stageOffset; |
90 | 92 |
91 OwnPtr<ReverbConvolverStage> stage = adoptPtr(new ReverbConvolverStage(r
esponse, totalResponseLength, reverbTotalLatency, stageOffset, stageSize, fftSiz
e, renderPhase, renderSliceSize, &m_accumulationBuffer, useDirectConvolver)); | 93 std::unique_ptr<ReverbConvolverStage> stage = wrapUnique(new ReverbConvo
lverStage(response, totalResponseLength, reverbTotalLatency, stageOffset, stageS
ize, fftSize, renderPhase, renderSliceSize, &m_accumulationBuffer, useDirectConv
olver)); |
92 | 94 |
93 bool isBackgroundStage = false; | 95 bool isBackgroundStage = false; |
94 | 96 |
95 if (useBackgroundThreads && stageOffset > RealtimeFrameLimit) { | 97 if (useBackgroundThreads && stageOffset > RealtimeFrameLimit) { |
96 m_backgroundStages.append(std::move(stage)); | 98 m_backgroundStages.append(std::move(stage)); |
97 isBackgroundStage = true; | 99 isBackgroundStage = true; |
98 } else { | 100 } else { |
99 m_stages.append(std::move(stage)); | 101 m_stages.append(std::move(stage)); |
100 } | 102 } |
101 | 103 |
102 stageOffset += stageSize; | 104 stageOffset += stageSize; |
103 ++i; | 105 ++i; |
104 | 106 |
105 if (!useDirectConvolver) { | 107 if (!useDirectConvolver) { |
106 // Figure out next FFT size | 108 // Figure out next FFT size |
107 fftSize *= 2; | 109 fftSize *= 2; |
108 } | 110 } |
109 | 111 |
110 if (useBackgroundThreads && !isBackgroundStage && fftSize > m_maxRealtim
eFFTSize) | 112 if (useBackgroundThreads && !isBackgroundStage && fftSize > m_maxRealtim
eFFTSize) |
111 fftSize = m_maxRealtimeFFTSize; | 113 fftSize = m_maxRealtimeFFTSize; |
112 if (fftSize > m_maxFFTSize) | 114 if (fftSize > m_maxFFTSize) |
113 fftSize = m_maxFFTSize; | 115 fftSize = m_maxFFTSize; |
114 } | 116 } |
115 | 117 |
116 // Start up background thread | 118 // Start up background thread |
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... | 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... |
118 if (useBackgroundThreads && m_backgroundStages.size() > 0) | 120 if (useBackgroundThreads && m_backgroundStages.size() > 0) |
119 m_backgroundThread = adoptPtr(Platform::current()->createThread("Reverb
convolution background thread")); | 121 m_backgroundThread = wrapUnique(Platform::current()->createThread("Rever
b convolution background thread")); |
120 } | 122 } |
121 | 123 |
122 ReverbConvolver::~ReverbConvolver() | 124 ReverbConvolver::~ReverbConvolver() |
123 { | 125 { |
124 // Wait for background thread to stop | 126 // Wait for background thread to stop |
125 m_backgroundThread.reset(); | 127 m_backgroundThread.reset(); |
126 } | 128 } |
127 | 129 |
128 void ReverbConvolver::processInBackground() | 130 void ReverbConvolver::processInBackground() |
129 { | 131 { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 m_accumulationBuffer.reset(); | 186 m_accumulationBuffer.reset(); |
185 m_inputBuffer.reset(); | 187 m_inputBuffer.reset(); |
186 } | 188 } |
187 | 189 |
188 size_t ReverbConvolver::latencyFrames() const | 190 size_t ReverbConvolver::latencyFrames() const |
189 { | 191 { |
190 return 0; | 192 return 0; |
191 } | 193 } |
192 | 194 |
193 } // namespace blink | 195 } // namespace blink |
OLD | NEW |