1/*
2 * Copyright (C) 2010 Google 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 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#ifndef FFTFrame_h
30#define FFTFrame_h
31
32#include "AudioArray.h"
33
34#if USE(WEBAUDIO_GSTREAMER)
35#include <glib.h>
36G_BEGIN_DECLS
37#include <gst/fft/gstfftf32.h>
38G_END_DECLS
39#endif // USE(WEBAUDIO_GSTREAMER)
40
41#if USE(ACCELERATE)
42#include <Accelerate/Accelerate.h>
43#endif
44
45#include <memory>
46#include <wtf/Forward.h>
47#include <wtf/UniqueArray.h>
48
49namespace WebCore {
50
51// Defines the interface for an "FFT frame", an object which is able to perform a forward
52// and reverse FFT, internally storing the resultant frequency-domain data.
53
54class FFTFrame {
55 WTF_MAKE_FAST_ALLOCATED;
56public:
57 // The constructors, destructor, and methods up to the CROSS-PLATFORM section have platform-dependent implementations.
58
59 FFTFrame(unsigned fftSize);
60 FFTFrame(); // creates a blank/empty frame for later use with createInterpolatedFrame()
61 FFTFrame(const FFTFrame& frame);
62 ~FFTFrame();
63
64 static void initialize();
65 static void cleanup();
66 void doFFT(const float* data);
67 void doInverseFFT(float* data);
68 void multiply(const FFTFrame& frame); // multiplies ourself with frame : effectively operator*=()
69
70 float* realData() const;
71 float* imagData() const;
72
73 void print(); // for debugging
74
75 // CROSS-PLATFORM
76 // The remaining public methods have cross-platform implementations:
77
78 // Interpolates from frame1 -> frame2 as x goes from 0.0 -> 1.0
79 static std::unique_ptr<FFTFrame> createInterpolatedFrame(const FFTFrame& frame1, const FFTFrame& frame2, double x);
80
81 void doPaddedFFT(const float* data, size_t dataSize); // zero-padding with dataSize <= fftSize
82 double extractAverageGroupDelay();
83 void addConstantGroupDelay(double sampleFrameDelay);
84
85 unsigned fftSize() const { return m_FFTSize; }
86 unsigned log2FFTSize() const { return m_log2FFTSize; }
87
88private:
89 unsigned m_FFTSize;
90 unsigned m_log2FFTSize;
91
92 void interpolateFrequencyComponents(const FFTFrame& frame1, const FFTFrame& frame2, double x);
93
94#if USE(ACCELERATE)
95 DSPSplitComplex& dspSplitComplex() { return m_frame; }
96 DSPSplitComplex dspSplitComplex() const { return m_frame; }
97
98 static FFTSetup fftSetupForSize(unsigned fftSize);
99
100 static FFTSetup* fftSetups;
101
102 FFTSetup m_FFTSetup;
103
104 DSPSplitComplex m_frame;
105 AudioFloatArray m_realData;
106 AudioFloatArray m_imagData;
107#endif
108
109#if USE(WEBAUDIO_GSTREAMER)
110 GstFFTF32* m_fft;
111 GstFFTF32* m_inverseFft;
112 UniqueArray<GstFFTF32Complex> m_complexData;
113 AudioFloatArray m_realData;
114 AudioFloatArray m_imagData;
115#endif // USE(WEBAUDIO_GSTREAMER)
116};
117
118} // namespace WebCore
119
120#endif // FFTFrame_h
121