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 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 13 matching lines...) Expand all Loading... |
24 | 24 |
25 #include "config.h" | 25 #include "config.h" |
26 | 26 |
27 #if ENABLE(WEB_AUDIO) | 27 #if ENABLE(WEB_AUDIO) |
28 | 28 |
29 #include "modules/webaudio/BiquadProcessor.h" | 29 #include "modules/webaudio/BiquadProcessor.h" |
30 | 30 |
31 #include "modules/webaudio/BiquadDSPKernel.h" | 31 #include "modules/webaudio/BiquadDSPKernel.h" |
32 | 32 |
33 namespace WebCore { | 33 namespace WebCore { |
34 | 34 |
35 BiquadProcessor::BiquadProcessor(AudioContext* context, float sampleRate, size_t
numberOfChannels, bool autoInitialize) | 35 BiquadProcessor::BiquadProcessor(AudioContext* context, float sampleRate, size_t
numberOfChannels, bool autoInitialize) |
36 : AudioDSPKernelProcessor(sampleRate, numberOfChannels) | 36 : AudioDSPKernelProcessor(sampleRate, numberOfChannels) |
37 , m_type(LowPass) | 37 , m_type(LowPass) |
38 , m_parameter1(0) | 38 , m_parameter1(0) |
39 , m_parameter2(0) | 39 , m_parameter2(0) |
40 , m_parameter3(0) | 40 , m_parameter3(0) |
41 , m_parameter4(0) | 41 , m_parameter4(0) |
42 , m_filterCoefficientsDirty(true) | 42 , m_filterCoefficientsDirty(true) |
43 , m_hasSampleAccurateValues(false) | 43 , m_hasSampleAccurateValues(false) |
44 { | 44 { |
(...skipping 20 matching lines...) Expand all Loading... |
65 return adoptPtr(new BiquadDSPKernel(this)); | 65 return adoptPtr(new BiquadDSPKernel(this)); |
66 } | 66 } |
67 | 67 |
68 void BiquadProcessor::checkForDirtyCoefficients() | 68 void BiquadProcessor::checkForDirtyCoefficients() |
69 { | 69 { |
70 // Deal with smoothing / de-zippering. Start out assuming filter parameters
are not changing. | 70 // Deal with smoothing / de-zippering. Start out assuming filter parameters
are not changing. |
71 | 71 |
72 // The BiquadDSPKernel objects rely on this value to see if they need to re-
compute their internal filter coefficients. | 72 // The BiquadDSPKernel objects rely on this value to see if they need to re-
compute their internal filter coefficients. |
73 m_filterCoefficientsDirty = false; | 73 m_filterCoefficientsDirty = false; |
74 m_hasSampleAccurateValues = false; | 74 m_hasSampleAccurateValues = false; |
75 | 75 |
76 if (m_parameter1->hasSampleAccurateValues() || m_parameter2->hasSampleAccura
teValues() || m_parameter3->hasSampleAccurateValues() || m_parameter4->hasSample
AccurateValues()) { | 76 if (m_parameter1->hasSampleAccurateValues() || m_parameter2->hasSampleAccura
teValues() || m_parameter3->hasSampleAccurateValues() || m_parameter4->hasSample
AccurateValues()) { |
77 m_filterCoefficientsDirty = true; | 77 m_filterCoefficientsDirty = true; |
78 m_hasSampleAccurateValues = true; | 78 m_hasSampleAccurateValues = true; |
79 } else { | 79 } else { |
80 if (m_hasJustReset) { | 80 if (m_hasJustReset) { |
81 // Snap to exact values first time after reset, then smooth for subs
equent changes. | 81 // Snap to exact values first time after reset, then smooth for subs
equent changes. |
82 m_parameter1->resetSmoothedValue(); | 82 m_parameter1->resetSmoothedValue(); |
83 m_parameter2->resetSmoothedValue(); | 83 m_parameter2->resetSmoothedValue(); |
84 m_parameter3->resetSmoothedValue(); | 84 m_parameter3->resetSmoothedValue(); |
85 m_parameter4->resetSmoothedValue(); | 85 m_parameter4->resetSmoothedValue(); |
(...skipping 10 matching lines...) Expand all Loading... |
96 } | 96 } |
97 } | 97 } |
98 } | 98 } |
99 | 99 |
100 void BiquadProcessor::process(const AudioBus* source, AudioBus* destination, siz
e_t framesToProcess) | 100 void BiquadProcessor::process(const AudioBus* source, AudioBus* destination, siz
e_t framesToProcess) |
101 { | 101 { |
102 if (!isInitialized()) { | 102 if (!isInitialized()) { |
103 destination->zero(); | 103 destination->zero(); |
104 return; | 104 return; |
105 } | 105 } |
106 | 106 |
107 checkForDirtyCoefficients(); | 107 checkForDirtyCoefficients(); |
108 | 108 |
109 // For each channel of our input, process using the corresponding BiquadDSPK
ernel into the output channel. | 109 // For each channel of our input, process using the corresponding BiquadDSPK
ernel into the output channel. |
110 for (unsigned i = 0; i < m_kernels.size(); ++i) | 110 for (unsigned i = 0; i < m_kernels.size(); ++i) |
111 m_kernels[i]->process(source->channel(i)->data(), destination->channel(i
)->mutableData(), framesToProcess); | 111 m_kernels[i]->process(source->channel(i)->data(), destination->channel(i
)->mutableData(), framesToProcess); |
112 } | 112 } |
113 | 113 |
114 void BiquadProcessor::setType(FilterType type) | 114 void BiquadProcessor::setType(FilterType type) |
115 { | 115 { |
116 if (type != m_type) { | 116 if (type != m_type) { |
117 m_type = type; | 117 m_type = type; |
118 reset(); // The filter state must be reset only if the type has changed. | 118 reset(); // The filter state must be reset only if the type has changed. |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 void BiquadProcessor::getFrequencyResponse(int nFrequencies, | 122 void BiquadProcessor::getFrequencyResponse(int nFrequencies, |
123 const float* frequencyHz, | 123 const float* frequencyHz, |
124 float* magResponse, | 124 float* magResponse, |
125 float* phaseResponse) | 125 float* phaseResponse) |
126 { | 126 { |
127 // Compute the frequency response on a separate temporary kernel | 127 // Compute the frequency response on a separate temporary kernel |
128 // to avoid interfering with the processing running in the audio | 128 // to avoid interfering with the processing running in the audio |
129 // thread on the main kernels. | 129 // thread on the main kernels. |
130 | 130 |
131 OwnPtr<BiquadDSPKernel> responseKernel = adoptPtr(new BiquadDSPKernel(this))
; | 131 OwnPtr<BiquadDSPKernel> responseKernel = adoptPtr(new BiquadDSPKernel(this))
; |
132 | 132 |
133 responseKernel->getFrequencyResponse(nFrequencies, frequencyHz, magResponse,
phaseResponse); | 133 responseKernel->getFrequencyResponse(nFrequencies, frequencyHz, magResponse,
phaseResponse); |
134 } | 134 } |
135 | 135 |
136 } // namespace WebCore | 136 } // namespace WebCore |
137 | 137 |
138 #endif // ENABLE(WEB_AUDIO) | 138 #endif // ENABLE(WEB_AUDIO) |
OLD | NEW |