| Differences between
and this patch
- WebCore/ChangeLog +21 lines
Lines 1-3 WebCore/ChangeLog_sec1
1
2010-10-04  Chris Rogers  <crogers@google.com>
2
3
        Reviewed by NOBODY (OOPS!).
4
5
        Add BiquadProcessor files
6
        https://bugs.webkit.org/show_bug.cgi?id=46527
7
8
        No new tests since audio API is not yet implemented.
9
10
        * webaudio/BiquadProcessor.cpp: Added.
11
        (WebCore::BiquadProcessor::BiquadProcessor):
12
        (WebCore::BiquadProcessor::~BiquadProcessor):
13
        (WebCore::BiquadProcessor::createKernel):
14
        (WebCore::BiquadProcessor::process):
15
        * webaudio/BiquadProcessor.h: Added.
16
        (WebCore::BiquadProcessor::filterCoefficientsDirty):
17
        (WebCore::BiquadProcessor::parameter1):
18
        (WebCore::BiquadProcessor::parameter2):
19
        (WebCore::BiquadProcessor::parameter3):
20
        (WebCore::BiquadProcessor::type):
21
1
2010-10-04  Darin Adler  <darin@apple.com>
22
2010-10-04  Darin Adler  <darin@apple.com>
2
23
3
        Reviewed by Dan Bernstein.
24
        Reviewed by Dan Bernstein.
- WebCore/webaudio/BiquadProcessor.cpp +127 lines
Line 0 WebCore/webaudio/BiquadProcessor.cpp_sec1
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
 * 1.  Redistributions of source code must retain the above copyright
8
 *    notice, this list of conditions and the following disclaimer.
9
 * 2.  Redistributions in binary form must reproduce the above copyright
10
 *    notice, this list of conditions and the following disclaimer in the
11
 *    documentation and/or other materials provided with the distribution.
12
 *
13
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
 */
24
25
#include "config.h"
26
27
#if ENABLE(WEB_AUDIO)
28
29
#include "BiquadProcessor.h"
30
31
#include "BiquadDSPKernel.h"
32
33
namespace WebCore {
34
35
BiquadProcessor::BiquadProcessor(FilterType type, double sampleRate, size_t numberOfChannels, bool autoInitialize)
36
    : AudioDSPKernelProcessor(sampleRate, numberOfChannels)
37
    , m_type(type)
38
    , m_parameter1(0)
39
    , m_parameter2(0)
40
    , m_parameter3(0)
41
    , m_filterCoefficientsDirty(true)
42
{
43
    double nyquist = 0.5 * this->sampleRate();
44
    
45
    switch (type) {
46
    case LowPass2:
47
        m_parameter1 = AudioParam::create("frequency", 350.0, 20.0, nyquist);
48
        m_parameter2 = AudioParam::create("resonance", 0.0, -20.0, 20.0);
49
        m_parameter3 = AudioParam::create("unused", 0.0, 0.0, 1.0);
50
        break;
51
    case HighPass2:
52
        m_parameter1 = AudioParam::create("frequency", 350.0, 20.0, nyquist);
53
        m_parameter2 = AudioParam::create("resonance", 0.0, -20.0, 20.0);
54
        m_parameter3 = AudioParam::create("unused", 0.0, 0.0, 1.0);
55
        break;
56
    case Peaking:
57
        m_parameter1 = AudioParam::create("frequency", 2500.0, 20.0, nyquist);
58
        m_parameter2 = AudioParam::create("gain", 0.0, -20.0, 20.0);
59
        m_parameter3 = AudioParam::create("Q", 0.5, 0.0, 1000.0);
60
        break;
61
    case Allpass:
62
        m_parameter1 = AudioParam::create("frequency", 2500.0, 20.0, nyquist);
63
        m_parameter2 = AudioParam::create("Q", 0.5, 0.0, 1000.0);
64
        m_parameter3 = AudioParam::create("unused", 0.0, 0.0, 1.0);
65
        break;
66
    case LowShelf:
67
        m_parameter1 = AudioParam::create("frequency", 80.0, 20.0, nyquist);
68
        m_parameter2 = AudioParam::create("gain", 0.0, 0.0, 1.0);
69
        m_parameter3 = AudioParam::create("unused", 0.0, 0.0, 1.0);
70
        break;
71
    case HighShelf:
72
        m_parameter1 = AudioParam::create("frequency", 10000.0, 20.0, nyquist);
73
        m_parameter2 = AudioParam::create("gain", 0.0, 0.0, 1.0);
74
        m_parameter3 = AudioParam::create("unused", 0.0, 0.0, 1.0);
75
        break;
76
    }
77
78
    if (autoInitialize)
79
        initialize();
80
}
81
82
BiquadProcessor::~BiquadProcessor()
83
{
84
    if (isInitialized())
85
        uninitialize();
86
}
87
88
PassOwnPtr<AudioDSPKernel> BiquadProcessor::createKernel()
89
{
90
    return adoptPtr(new BiquadDSPKernel(this));
91
}
92
93
void BiquadProcessor::process(AudioBus* source, AudioBus* destination, size_t framesToProcess)
94
{
95
    if (!isInitialized()) {
96
        destination->zero();
97
        return;
98
    }
99
        
100
    // Deal with smoothing / de-zippering.  Start out assuming filter parameters are not changing.
101
    // The BiquadDSPKernel objects rely on this value to see if they need to re-compute their internal filter coefficients.
102
    m_filterCoefficientsDirty = false;
103
    
104
    if (m_hasJustReset) {
105
        // Snap to exact values first time after reset, then smooth for subsequent changes.
106
        m_parameter1->resetSmoothedValue();
107
        m_parameter2->resetSmoothedValue();
108
        m_parameter3->resetSmoothedValue();
109
        m_filterCoefficientsDirty = true;
110
        m_hasJustReset = false;
111
    } else {
112
        // Smooth all of the filter parameters.  If they haven't yet converged to their target value then mark coefficients as dirty.
113
        bool isStable1 = m_parameter1->smooth();
114
        bool isStable2 = m_parameter2->smooth();
115
        bool isStable3 = m_parameter3->smooth();
116
        if (!(isStable1 && isStable2 && isStable3))
117
            m_filterCoefficientsDirty = true;
118
    }
119
        
120
    // For each channel of our input, process using the corresponding BiquadDSPKernel into the output channel.
121
    for (unsigned i = 0; i < m_kernels.size(); ++i)
122
        m_kernels[i]->process(source->channel(i)->data(), destination->channel(i)->data(), framesToProcess);
123
}
124
125
} // namespace WebCore
126
127
#endif // ENABLE(WEB_AUDIO)
- WebCore/webaudio/BiquadProcessor.h +78 lines
Line 0 WebCore/webaudio/BiquadProcessor.h_sec1
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
 * 1.  Redistributions of source code must retain the above copyright
8
 *    notice, this list of conditions and the following disclaimer.
9
 * 2.  Redistributions in binary form must reproduce the above copyright
10
 *    notice, this list of conditions and the following disclaimer in the
11
 *    documentation and/or other materials provided with the distribution.
12
 *
13
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
 */
24
25
#ifndef BiquadProcessor_h
26
#define BiquadProcessor_h
27
28
#include "AudioDSPKernel.h"
29
#include "AudioDSPKernelProcessor.h"
30
#include "AudioNode.h"
31
#include "AudioParam.h"
32
#include "Biquad.h"
33
#include <wtf/RefPtr.h>
34
35
namespace WebCore {
36
37
// BiquadProcessor is an AudioDSPKernelProcessor which uses Biquad objects to implement several common filters.
38
39
class BiquadProcessor : public AudioDSPKernelProcessor {
40
public:
41
    enum FilterType {
42
        LowPass2,
43
        HighPass2,
44
        Peaking,
45
        Allpass,
46
        LowShelf,
47
        HighShelf
48
    };
49
    
50
    BiquadProcessor(FilterType, double sampleRate, size_t numberOfChannels, bool autoInitialize = true);
51
    virtual ~BiquadProcessor();
52
    
53
    virtual PassOwnPtr<AudioDSPKernel> createKernel();
54
        
55
    virtual void process(AudioBus* source, AudioBus* destination, size_t framesToProcess);
56
57
    bool filterCoefficientsDirty() const { return m_filterCoefficientsDirty; }
58
59
    AudioParam* parameter1() { return m_parameter1.get(); }
60
    AudioParam* parameter2() { return m_parameter2.get(); }
61
    AudioParam* parameter3() { return m_parameter3.get(); }
62
63
    FilterType type() const { return m_type; }
64
65
private:
66
    FilterType m_type;
67
68
    RefPtr<AudioParam> m_parameter1;
69
    RefPtr<AudioParam> m_parameter2;
70
    RefPtr<AudioParam> m_parameter3;
71
72
    // so DSP kernels know when to re-compute coefficients
73
    bool m_filterCoefficientsDirty;
74
};
75
76
} // namespace WebCore
77
78
#endif // BiquadProcessor_h

Return to Bug 46527