Added more appcache tests to the Mac WebKit2 skip list due to intermittent failures.
[WebKit-https.git] / Source / WebCore / platform / audio / DirectConvolver.cpp
1 /*
2  * Copyright (C) 2012 Intel Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
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
15  *     from this software without specific prior written permission.
16  *
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
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
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
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
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
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30
31 #if ENABLE(WEB_AUDIO)
32
33 #include "DirectConvolver.h"
34
35 #include "VectorMath.h"
36
37 namespace WebCore {
38
39 using namespace VectorMath;
40     
41 DirectConvolver::DirectConvolver(size_t inputBlockSize)
42     : m_inputBlockSize(inputBlockSize)
43     , m_inputBuffer(inputBlockSize * 2)
44 {
45 }
46
47 void DirectConvolver::process(AudioFloatArray* convolutionKernel, const float* sourceP, float* destP, size_t framesToProcess)
48 {
49     // FIXME: Optimize for IPP, reverb function in IPP library can be used here.
50     // https://bugs.webkit.org/show_bug.cgi?id=80255
51     // FIXME: Optimize for DARWIN, conv() function in Accelerate.framework can be used here.
52     // https://bugs.webkit.org/show_bug.cgi?id=80256
53
54     ASSERT(framesToProcess == m_inputBlockSize);
55     if (framesToProcess != m_inputBlockSize)
56         return;
57
58     // Only support kernelSize <= m_inputBlockSize
59     size_t kernelSize = convolutionKernel->size();
60     ASSERT(kernelSize <= m_inputBlockSize);
61     if (kernelSize > m_inputBlockSize)
62         return;
63
64     float* kernelP = convolutionKernel->data();
65
66     float* inputP = m_inputBuffer.data() + m_inputBlockSize;
67
68     // Sanity check
69     bool isCopyGood = kernelP && sourceP && destP && m_inputBuffer.data();
70     ASSERT(isCopyGood);
71     if (!isCopyGood)
72         return;
73
74     // Copy samples to 2nd half of input buffer.
75     memcpy(inputP, sourceP, sizeof(float) * framesToProcess);
76
77     // FIXME: The macro can be further optimized to avoid pipeline stalls. One possibility is to maintain 4 separate sums and change the macro to CONVOLVE_FOUR_SAMPLES.
78 #define CONVOLVE_ONE_SAMPLE             \
79     sum += inputP[i - j] * kernelP[j];  \
80     j++;
81
82     size_t i = 0;
83     while (i < framesToProcess) {
84         size_t j = 0;
85         float sum = 0;
86         
87         // FIXME: SSE optimization may be applied here.
88         if (kernelSize == 32) {
89             CONVOLVE_ONE_SAMPLE // 1
90             CONVOLVE_ONE_SAMPLE // 2
91             CONVOLVE_ONE_SAMPLE // 3
92             CONVOLVE_ONE_SAMPLE // 4
93             CONVOLVE_ONE_SAMPLE // 5
94             CONVOLVE_ONE_SAMPLE // 6
95             CONVOLVE_ONE_SAMPLE // 7
96             CONVOLVE_ONE_SAMPLE // 8
97             CONVOLVE_ONE_SAMPLE // 9
98             CONVOLVE_ONE_SAMPLE // 10
99
100             CONVOLVE_ONE_SAMPLE // 11
101             CONVOLVE_ONE_SAMPLE // 12
102             CONVOLVE_ONE_SAMPLE // 13
103             CONVOLVE_ONE_SAMPLE // 14
104             CONVOLVE_ONE_SAMPLE // 15
105             CONVOLVE_ONE_SAMPLE // 16
106             CONVOLVE_ONE_SAMPLE // 17
107             CONVOLVE_ONE_SAMPLE // 18
108             CONVOLVE_ONE_SAMPLE // 19
109             CONVOLVE_ONE_SAMPLE // 20
110
111             CONVOLVE_ONE_SAMPLE // 21
112             CONVOLVE_ONE_SAMPLE // 22
113             CONVOLVE_ONE_SAMPLE // 23
114             CONVOLVE_ONE_SAMPLE // 24
115             CONVOLVE_ONE_SAMPLE // 25
116             CONVOLVE_ONE_SAMPLE // 26
117             CONVOLVE_ONE_SAMPLE // 27
118             CONVOLVE_ONE_SAMPLE // 28
119             CONVOLVE_ONE_SAMPLE // 29
120             CONVOLVE_ONE_SAMPLE // 30
121
122             CONVOLVE_ONE_SAMPLE // 31
123             CONVOLVE_ONE_SAMPLE // 32
124
125         } else if (kernelSize == 64) {
126             CONVOLVE_ONE_SAMPLE // 1
127             CONVOLVE_ONE_SAMPLE // 2
128             CONVOLVE_ONE_SAMPLE // 3
129             CONVOLVE_ONE_SAMPLE // 4
130             CONVOLVE_ONE_SAMPLE // 5
131             CONVOLVE_ONE_SAMPLE // 6
132             CONVOLVE_ONE_SAMPLE // 7
133             CONVOLVE_ONE_SAMPLE // 8
134             CONVOLVE_ONE_SAMPLE // 9
135             CONVOLVE_ONE_SAMPLE // 10
136
137             CONVOLVE_ONE_SAMPLE // 11
138             CONVOLVE_ONE_SAMPLE // 12
139             CONVOLVE_ONE_SAMPLE // 13
140             CONVOLVE_ONE_SAMPLE // 14
141             CONVOLVE_ONE_SAMPLE // 15
142             CONVOLVE_ONE_SAMPLE // 16
143             CONVOLVE_ONE_SAMPLE // 17
144             CONVOLVE_ONE_SAMPLE // 18
145             CONVOLVE_ONE_SAMPLE // 19
146             CONVOLVE_ONE_SAMPLE // 20
147
148             CONVOLVE_ONE_SAMPLE // 21
149             CONVOLVE_ONE_SAMPLE // 22
150             CONVOLVE_ONE_SAMPLE // 23
151             CONVOLVE_ONE_SAMPLE // 24
152             CONVOLVE_ONE_SAMPLE // 25
153             CONVOLVE_ONE_SAMPLE // 26
154             CONVOLVE_ONE_SAMPLE // 27
155             CONVOLVE_ONE_SAMPLE // 28
156             CONVOLVE_ONE_SAMPLE // 29
157             CONVOLVE_ONE_SAMPLE // 30
158
159             CONVOLVE_ONE_SAMPLE // 31
160             CONVOLVE_ONE_SAMPLE // 32
161             CONVOLVE_ONE_SAMPLE // 33
162             CONVOLVE_ONE_SAMPLE // 34
163             CONVOLVE_ONE_SAMPLE // 35
164             CONVOLVE_ONE_SAMPLE // 36
165             CONVOLVE_ONE_SAMPLE // 37
166             CONVOLVE_ONE_SAMPLE // 38
167             CONVOLVE_ONE_SAMPLE // 39
168             CONVOLVE_ONE_SAMPLE // 40
169
170             CONVOLVE_ONE_SAMPLE // 41
171             CONVOLVE_ONE_SAMPLE // 42
172             CONVOLVE_ONE_SAMPLE // 43
173             CONVOLVE_ONE_SAMPLE // 44
174             CONVOLVE_ONE_SAMPLE // 45
175             CONVOLVE_ONE_SAMPLE // 46
176             CONVOLVE_ONE_SAMPLE // 47
177             CONVOLVE_ONE_SAMPLE // 48
178             CONVOLVE_ONE_SAMPLE // 49
179             CONVOLVE_ONE_SAMPLE // 50
180
181             CONVOLVE_ONE_SAMPLE // 51
182             CONVOLVE_ONE_SAMPLE // 52
183             CONVOLVE_ONE_SAMPLE // 53
184             CONVOLVE_ONE_SAMPLE // 54
185             CONVOLVE_ONE_SAMPLE // 55
186             CONVOLVE_ONE_SAMPLE // 56
187             CONVOLVE_ONE_SAMPLE // 57
188             CONVOLVE_ONE_SAMPLE // 58
189             CONVOLVE_ONE_SAMPLE // 59
190             CONVOLVE_ONE_SAMPLE // 60
191
192             CONVOLVE_ONE_SAMPLE // 61
193             CONVOLVE_ONE_SAMPLE // 62
194             CONVOLVE_ONE_SAMPLE // 63
195             CONVOLVE_ONE_SAMPLE // 64
196
197         } else if (kernelSize == 128) {
198             CONVOLVE_ONE_SAMPLE // 1
199             CONVOLVE_ONE_SAMPLE // 2
200             CONVOLVE_ONE_SAMPLE // 3
201             CONVOLVE_ONE_SAMPLE // 4
202             CONVOLVE_ONE_SAMPLE // 5
203             CONVOLVE_ONE_SAMPLE // 6
204             CONVOLVE_ONE_SAMPLE // 7
205             CONVOLVE_ONE_SAMPLE // 8
206             CONVOLVE_ONE_SAMPLE // 9
207             CONVOLVE_ONE_SAMPLE // 10
208
209             CONVOLVE_ONE_SAMPLE // 11
210             CONVOLVE_ONE_SAMPLE // 12
211             CONVOLVE_ONE_SAMPLE // 13
212             CONVOLVE_ONE_SAMPLE // 14
213             CONVOLVE_ONE_SAMPLE // 15
214             CONVOLVE_ONE_SAMPLE // 16
215             CONVOLVE_ONE_SAMPLE // 17
216             CONVOLVE_ONE_SAMPLE // 18
217             CONVOLVE_ONE_SAMPLE // 19
218             CONVOLVE_ONE_SAMPLE // 20
219
220             CONVOLVE_ONE_SAMPLE // 21
221             CONVOLVE_ONE_SAMPLE // 22
222             CONVOLVE_ONE_SAMPLE // 23
223             CONVOLVE_ONE_SAMPLE // 24
224             CONVOLVE_ONE_SAMPLE // 25
225             CONVOLVE_ONE_SAMPLE // 26
226             CONVOLVE_ONE_SAMPLE // 27
227             CONVOLVE_ONE_SAMPLE // 28
228             CONVOLVE_ONE_SAMPLE // 29
229             CONVOLVE_ONE_SAMPLE // 30
230
231             CONVOLVE_ONE_SAMPLE // 31
232             CONVOLVE_ONE_SAMPLE // 32
233             CONVOLVE_ONE_SAMPLE // 33
234             CONVOLVE_ONE_SAMPLE // 34
235             CONVOLVE_ONE_SAMPLE // 35
236             CONVOLVE_ONE_SAMPLE // 36
237             CONVOLVE_ONE_SAMPLE // 37
238             CONVOLVE_ONE_SAMPLE // 38
239             CONVOLVE_ONE_SAMPLE // 39
240             CONVOLVE_ONE_SAMPLE // 40
241
242             CONVOLVE_ONE_SAMPLE // 41
243             CONVOLVE_ONE_SAMPLE // 42
244             CONVOLVE_ONE_SAMPLE // 43
245             CONVOLVE_ONE_SAMPLE // 44
246             CONVOLVE_ONE_SAMPLE // 45
247             CONVOLVE_ONE_SAMPLE // 46
248             CONVOLVE_ONE_SAMPLE // 47
249             CONVOLVE_ONE_SAMPLE // 48
250             CONVOLVE_ONE_SAMPLE // 49
251             CONVOLVE_ONE_SAMPLE // 50
252
253             CONVOLVE_ONE_SAMPLE // 51
254             CONVOLVE_ONE_SAMPLE // 52
255             CONVOLVE_ONE_SAMPLE // 53
256             CONVOLVE_ONE_SAMPLE // 54
257             CONVOLVE_ONE_SAMPLE // 55
258             CONVOLVE_ONE_SAMPLE // 56
259             CONVOLVE_ONE_SAMPLE // 57
260             CONVOLVE_ONE_SAMPLE // 58
261             CONVOLVE_ONE_SAMPLE // 59
262             CONVOLVE_ONE_SAMPLE // 60
263
264             CONVOLVE_ONE_SAMPLE // 61
265             CONVOLVE_ONE_SAMPLE // 62
266             CONVOLVE_ONE_SAMPLE // 63
267             CONVOLVE_ONE_SAMPLE // 64
268             CONVOLVE_ONE_SAMPLE // 65
269             CONVOLVE_ONE_SAMPLE // 66
270             CONVOLVE_ONE_SAMPLE // 67
271             CONVOLVE_ONE_SAMPLE // 68
272             CONVOLVE_ONE_SAMPLE // 69
273             CONVOLVE_ONE_SAMPLE // 70
274
275             CONVOLVE_ONE_SAMPLE // 71
276             CONVOLVE_ONE_SAMPLE // 72
277             CONVOLVE_ONE_SAMPLE // 73
278             CONVOLVE_ONE_SAMPLE // 74
279             CONVOLVE_ONE_SAMPLE // 75
280             CONVOLVE_ONE_SAMPLE // 76
281             CONVOLVE_ONE_SAMPLE // 77
282             CONVOLVE_ONE_SAMPLE // 78
283             CONVOLVE_ONE_SAMPLE // 79
284             CONVOLVE_ONE_SAMPLE // 80
285
286             CONVOLVE_ONE_SAMPLE // 81
287             CONVOLVE_ONE_SAMPLE // 82
288             CONVOLVE_ONE_SAMPLE // 83
289             CONVOLVE_ONE_SAMPLE // 84
290             CONVOLVE_ONE_SAMPLE // 85
291             CONVOLVE_ONE_SAMPLE // 86
292             CONVOLVE_ONE_SAMPLE // 87
293             CONVOLVE_ONE_SAMPLE // 88
294             CONVOLVE_ONE_SAMPLE // 89
295             CONVOLVE_ONE_SAMPLE // 90
296
297             CONVOLVE_ONE_SAMPLE // 91
298             CONVOLVE_ONE_SAMPLE // 92
299             CONVOLVE_ONE_SAMPLE // 93
300             CONVOLVE_ONE_SAMPLE // 94
301             CONVOLVE_ONE_SAMPLE // 95
302             CONVOLVE_ONE_SAMPLE // 96
303             CONVOLVE_ONE_SAMPLE // 97
304             CONVOLVE_ONE_SAMPLE // 98
305             CONVOLVE_ONE_SAMPLE // 99
306             CONVOLVE_ONE_SAMPLE // 100
307
308             CONVOLVE_ONE_SAMPLE // 101
309             CONVOLVE_ONE_SAMPLE // 102
310             CONVOLVE_ONE_SAMPLE // 103
311             CONVOLVE_ONE_SAMPLE // 104
312             CONVOLVE_ONE_SAMPLE // 105
313             CONVOLVE_ONE_SAMPLE // 106
314             CONVOLVE_ONE_SAMPLE // 107
315             CONVOLVE_ONE_SAMPLE // 108
316             CONVOLVE_ONE_SAMPLE // 109
317             CONVOLVE_ONE_SAMPLE // 110
318
319             CONVOLVE_ONE_SAMPLE // 111
320             CONVOLVE_ONE_SAMPLE // 112
321             CONVOLVE_ONE_SAMPLE // 113
322             CONVOLVE_ONE_SAMPLE // 114
323             CONVOLVE_ONE_SAMPLE // 115
324             CONVOLVE_ONE_SAMPLE // 116
325             CONVOLVE_ONE_SAMPLE // 117
326             CONVOLVE_ONE_SAMPLE // 118
327             CONVOLVE_ONE_SAMPLE // 119
328             CONVOLVE_ONE_SAMPLE // 120
329
330             CONVOLVE_ONE_SAMPLE // 121
331             CONVOLVE_ONE_SAMPLE // 122
332             CONVOLVE_ONE_SAMPLE // 123
333             CONVOLVE_ONE_SAMPLE // 124
334             CONVOLVE_ONE_SAMPLE // 125
335             CONVOLVE_ONE_SAMPLE // 126
336             CONVOLVE_ONE_SAMPLE // 127
337             CONVOLVE_ONE_SAMPLE // 128
338         } else {
339             while (j < kernelSize) {
340                 // Non-optimized using actual while loop.
341                 CONVOLVE_ONE_SAMPLE
342             }
343         }
344         destP[i++] = sum;
345     }
346
347     // Copy 2nd half of input buffer to 1st half.
348     memcpy(m_inputBuffer.data(), inputP, sizeof(float) * framesToProcess);
349 }
350
351 void DirectConvolver::reset()
352 {
353     m_inputBuffer.zero();
354 }
355
356 } // namespace WebCore
357
358 #endif // ENABLE(WEB_AUDIO)