Changeset 267432 in webkit
- Timestamp:
- Sep 22, 2020, 12:25:56 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 26 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/webaudio/AudioParam/audioparam-processing-expected.txt (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/AudioListener.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/AudioNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/AudioNode.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/BiquadProcessor.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/BiquadProcessor.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/DelayDSPKernel.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/DelayNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/DynamicsCompressorNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/DynamicsCompressorNode.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/GainNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/GainNode.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/PannerNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/PannerNode.h (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/StereoPannerNode.cpp (modified) (1 diff)
-
Source/WebCore/Modules/webaudio/StereoPannerNode.h (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioDSPKernel.h (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioDSPKernelProcessor.h (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioProcessor.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r267419 r267432 1 2020-09-22 Chris Dumez <cdumez@apple.com> 2 3 AudioParams with automations must process timelines 4 https://bugs.webkit.org/show_bug.cgi?id=216837 5 6 Reviewed by Darin Adler. 7 8 Rebaseline test that is now passing. 9 10 * webaudio/AudioParam/audioparam-processing-expected.txt: 11 1 12 2020-09-22 Diego Pino Garcia <dpino@igalia.com> 2 13 -
trunk/LayoutTests/webaudio/AudioParam/audioparam-processing-expected.txt
r267361 r267432 11 11 PASS > [BiquadFilterNode] 12 12 PASS BiquadFilterNode.Q ramp final value is not equal to 1. 13 FAIL X BiquadFilterNode.Q.value is not equal to 5. Got 1. assert_true: expected true got false 13 PASS BiquadFilterNode.Q.value is equal to 5. 14 14 PASS BiquadFilterNode.detune ramp final value is not equal to 0. 15 FAIL X BiquadFilterNode.detune.value is not equal to 0.5. Got 0. assert_true: expected true got false 15 PASS BiquadFilterNode.detune.value is equal to 0.5. 16 16 PASS BiquadFilterNode.frequency ramp final value is not equal to 350. 17 FAIL X BiquadFilterNode.frequency.value is not equal to 100. Got 350. assert_true: expected true got false 17 PASS BiquadFilterNode.frequency.value is equal to 100. 18 18 PASS BiquadFilterNode.gain ramp final value is not equal to 0. 19 FAIL X BiquadFilterNode.gain.value is not equal to 3. Got 0. assert_true: expected true got false 20 FAIL < [BiquadFilterNode] 4 out of 8 assertions were failed. assert_true: expected true got false 19 PASS BiquadFilterNode.gain.value is equal to 3. 20 PASS < [BiquadFilterNode] All assertions passed. (total 8 assertions) 21 21 PASS > [DelayNode] 22 22 PASS DelayNode.delayTime ramp final value is not equal to 0. 23 FAIL X DelayNode.delayTime.value is not equal to 0.5. Got 0. assert_true: expected true got false 24 FAIL < [DelayNode] 1 out of 2 assertions were failed. assert_true: expected true got false 23 PASS DelayNode.delayTime.value is equal to 0.5. 24 PASS < [DelayNode] All assertions passed. (total 2 assertions) 25 25 PASS > [DynamicsCompressorNode] 26 26 PASS DynamicsCompressorNode.attack ramp final value is not equal to 0.003000000026077032. … … 37 37 PASS > [GainNode] 38 38 PASS GainNode.gain ramp final value is not equal to 1. 39 FAIL X GainNode.gain.value is not equal to 0.5. Got 1. assert_true: expected true got false 40 FAIL < [GainNode] 1 out of 2 assertions were failed. assert_true: expected true got false 39 PASS GainNode.gain.value is equal to 0.5. 40 PASS < [GainNode] All assertions passed. (total 2 assertions) 41 41 PASS > [PannerNode] 42 42 PASS PannerNode.positionX ramp final value is not equal to 0. 43 FAIL X PannerNode.positionX.value is not equal to 0.5. Got 0. assert_true: expected true got false 43 PASS PannerNode.positionX.value is equal to 0.5. 44 44 PASS PannerNode.positionY ramp final value is not equal to 0. 45 FAIL X PannerNode.positionY.value is not equal to 30. Got 0. assert_true: expected true got false 45 PASS PannerNode.positionY.value is equal to 30. 46 46 PASS PannerNode.positionZ ramp final value is not equal to 0. 47 FAIL X PannerNode.positionZ.value is not equal to 15. Got 0. assert_true: expected true got false 47 PASS PannerNode.positionZ.value is equal to 15. 48 48 PASS PannerNode.orientationX ramp final value is not equal to 1. 49 FAIL X PannerNode.orientationX.value is not equal to 0.5. Got 1. assert_true: expected true got false 49 PASS PannerNode.orientationX.value is equal to 0.5. 50 50 PASS PannerNode.orientationY ramp final value is not equal to 0. 51 FAIL X PannerNode.orientationY.value is not equal to 30. Got 0. assert_true: expected true got false 51 PASS PannerNode.orientationY.value is equal to 30. 52 52 PASS PannerNode.orientationZ ramp final value is not equal to 0. 53 FAIL X PannerNode.orientationZ.value is not equal to 15. Got 0. assert_true: expected true got false 54 FAIL < [PannerNode] 6 out of 12 assertions were failed. assert_true: expected true got false 53 PASS PannerNode.orientationZ.value is equal to 15. 54 PASS < [PannerNode] All assertions passed. (total 12 assertions) 55 55 PASS > [StereoPannerNode] 56 56 PASS StereoPannerNode.pan ramp final value is not equal to 0. 57 FAIL X StereoPannerNode.pan.value is not equal to 0.5. Got 0. assert_true: expected true got false 58 FAIL < [StereoPannerNode] 1 out of 2 assertions were failed. assert_true: expected true got false 57 PASS StereoPannerNode.pan.value is equal to 0.5. 58 PASS < [StereoPannerNode] All assertions passed. (total 2 assertions) 59 59 PASS > [AudioListener] 60 60 PASS AudioListener.positionX ramp final value is not equal to 0. 61 FAIL X AudioListener.positionX.value is not equal to 100. Got 0. assert_true: expected true got false 61 PASS AudioListener.positionX.value is equal to 100. 62 62 PASS AudioListener.positionY ramp final value is not equal to 0. 63 FAIL X AudioListener.positionY.value is not equal to 200. Got 0. assert_true: expected true got false 63 PASS AudioListener.positionY.value is equal to 200. 64 64 PASS AudioListener.positionZ ramp final value is not equal to 0. 65 FAIL X AudioListener.positionZ.value is not equal to 300. Got 0. assert_true: expected true got false 65 PASS AudioListener.positionZ.value is equal to 300. 66 66 PASS AudioListener.forwardX ramp final value is not equal to 0. 67 FAIL X AudioListener.forwardX.value is not equal to -100. Got 0. assert_true: expected true got false 67 PASS AudioListener.forwardX.value is equal to -100. 68 68 PASS AudioListener.forwardY ramp final value is not equal to 0. 69 FAIL X AudioListener.forwardY.value is not equal to -200. Got 0. assert_true: expected true got false 69 PASS AudioListener.forwardY.value is equal to -200. 70 70 PASS AudioListener.forwardZ ramp final value is not equal to -1. 71 FAIL X AudioListener.forwardZ.value is not equal to -300. Got -1. assert_true: expected true got false 71 PASS AudioListener.forwardZ.value is equal to -300. 72 72 PASS AudioListener.upX ramp final value is not equal to 0. 73 FAIL X AudioListener.upX.value is not equal to 99. Got 0. assert_true: expected true got false 73 PASS AudioListener.upX.value is equal to 99. 74 74 PASS AudioListener.upY ramp final value is not equal to 1. 75 FAIL X AudioListener.upY.value is not equal to 42. Got 1. assert_true: expected true got false 75 PASS AudioListener.upY.value is equal to 42. 76 76 PASS AudioListener.upZ ramp final value is not equal to 0. 77 FAIL X AudioListener.upZ.value is not equal to 137. Got 0. assert_true: expected true got false 78 FAIL < [AudioListener] 9 out of 18 assertions were failed. assert_true: expected true got false 79 FAIL # AUDIT TASK RUNNER FINISHED: 6 out of 7 tasks were failed. assert_true: expected true got false 77 PASS AudioListener.upZ.value is equal to 137. 78 PASS < [AudioListener] All assertions passed. (total 18 assertions) 79 PASS # AUDIT TASK RUNNER FINISHED: 7 tasks ran successfully. 80 80 -
trunk/Source/WebCore/ChangeLog
r267428 r267432 1 2020-09-22 Chris Dumez <cdumez@apple.com> 2 3 AudioParams with automations must process timelines 4 https://bugs.webkit.org/show_bug.cgi?id=216837 5 6 Reviewed by Darin Adler. 7 8 Currently, if an AudioNode has no inputs connected, any automations 9 (or connections) to an AudioParam of the node is not processed. Thus, 10 time never advances on the AudioParam, and any upstream graph 11 connected to the AudioParam never gets pulled for data. 12 13 AudioParam should get processed so that time progresses. Normal 14 processing of the node causes AudioParams to be processed, so we were 15 only missing the case where the node has silent inputs (silent or no 16 inputs). Then we just need to update the AudioParams, without having 17 to do the full processing associated with the node. 18 19 See https://webaudio.github.io/web-audio-api/#rendering-loop, step 8.1.1 20 in particular that says any inputs connected to an AudioParam are 21 processed. There are no conditions on when this happens. 22 23 This is a merge of the following Blink change by Raymond Toy: 24 - https://codereview.chromium.org/2420983002 25 26 No new tests, rebaselined existing test. 27 28 * Modules/webaudio/AudioBasicProcessorNode.cpp: 29 (WebCore::AudioBasicProcessorNode::processOnlyAudioParams): 30 * Modules/webaudio/AudioBasicProcessorNode.h: 31 * Modules/webaudio/AudioListener.h: 32 * Modules/webaudio/AudioNode.cpp: 33 (WebCore::AudioNode::processIfNecessary): 34 * Modules/webaudio/AudioNode.h: 35 (WebCore::AudioNode::processOnlyAudioParams): 36 * Modules/webaudio/BiquadFilterNode.cpp: 37 (WebCore::BiquadFilterNode::BiquadFilterNode): 38 * Modules/webaudio/BiquadProcessor.cpp: 39 (WebCore::BiquadProcessor::processOnlyAudioParams): 40 * Modules/webaudio/BiquadProcessor.h: 41 * Modules/webaudio/DelayDSPKernel.cpp: 42 (WebCore::DelayDSPKernel::processOnlyAudioParams): 43 * Modules/webaudio/DelayDSPKernel.h: 44 * Modules/webaudio/DelayNode.cpp: 45 (WebCore::DelayNode::DelayNode): 46 * Modules/webaudio/DynamicsCompressorNode.cpp: 47 (WebCore::DynamicsCompressorNode::processOnlyAudioParams): 48 * Modules/webaudio/DynamicsCompressorNode.h: 49 * Modules/webaudio/GainNode.cpp: 50 (WebCore::GainNode::processOnlyAudioParams): 51 * Modules/webaudio/GainNode.h: 52 * Modules/webaudio/PannerNode.cpp: 53 (WebCore::PannerNode::processOnlyAudioParams): 54 * Modules/webaudio/PannerNode.h: 55 * Modules/webaudio/StereoPannerNode.cpp: 56 (WebCore::StereoPannerNode::processOnlyAudioParams): 57 * Modules/webaudio/StereoPannerNode.h: 58 * platform/audio/AudioDSPKernel.h: 59 (WebCore::AudioDSPKernel::processOnlyAudioParams): 60 * platform/audio/AudioDSPKernelProcessor.cpp: 61 (WebCore::AudioDSPKernelProcessor::processOnlyAudioParams): 62 * platform/audio/AudioDSPKernelProcessor.h: 63 * platform/audio/AudioProcessor.h: 64 (WebCore::AudioProcessor::processOnlyAudioParams): 65 1 66 2020-09-22 Chris Dumez <cdumez@apple.com> 2 67 -
trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.cpp
r266417 r267432 88 88 } 89 89 90 void AudioBasicProcessorNode::processOnlyAudioParams(size_t framesToProcess) 91 { 92 if (!isInitialized() || !processor()) 93 return; 94 95 processor()->processOnlyAudioParams(framesToProcess); 96 } 97 90 98 // Nice optimization in the very common case allowing for "in-place" processing 91 99 void AudioBasicProcessorNode::pullInputs(size_t framesToProcess) -
trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.h
r266417 r267432 42 42 // AudioNode 43 43 void process(size_t framesToProcess) override; 44 void processOnlyAudioParams(size_t framesToProcess) override; 44 45 void pullInputs(size_t framesToProcess) override; 45 46 void reset() override; -
trunk/Source/WebCore/Modules/webaudio/AudioListener.h
r266319 r267432 88 88 const float* upZValues(size_t framesToProcess); 89 89 90 void updateValuesIfNeeded(size_t framesToProcess); 91 90 92 protected: 91 93 explicit AudioListener(BaseAudioContext&); 92 94 93 95 private: 94 void updateValuesIfNeeded(size_t framesToProcess);95 96 96 97 Ref<AudioParam> m_positionX; -
trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp
r267376 r267432 480 480 m_lastNonSilentTime = (context().currentSampleFrame() + framesToProcess) / static_cast<double>(context().sampleRate()); 481 481 482 if (silentInputs && propagatesSilence()) 482 if (silentInputs && propagatesSilence()) { 483 483 silenceOutputs(); 484 else 484 // AudioParams still need to be processed so that the value can be updated 485 // if there are automations or so that the upstream nodes get pulled if 486 // any are connected to the AudioParam. 487 processOnlyAudioParams(framesToProcess); 488 } else 485 489 process(framesToProcess); 486 490 } -
trunk/Source/WebCore/Modules/webaudio/AudioNode.h
r266518 r267432 117 117 virtual void process(size_t framesToProcess) = 0; 118 118 119 // Like process(), but only causes the automations to process; the 120 // normal processing of the node is bypassed. By default, we assume 121 // no AudioParams need to be updated. 122 virtual void processOnlyAudioParams(size_t) { } 123 119 124 // Resets DSP processing state (clears delay lines, filter memory, etc.) 120 125 // Called from context's audio thread. -
trunk/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp
r266398 r267432 63 63 // Initially setup as lowpass filter. 64 64 m_processor = makeUnique<BiquadProcessor>(context, context.sampleRate(), 1, false); 65 66 // Initialize so that AudioParams can be processed. 67 initialize(); 65 68 } 66 69 -
trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.cpp
r266398 r267432 109 109 } 110 110 111 void BiquadProcessor::processOnlyAudioParams(size_t framesToProcess) 112 { 113 float values[AudioNode::ProcessingSizeInFrames]; 114 ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames); 115 116 m_parameter1->calculateSampleAccurateValues(values, framesToProcess); 117 m_parameter2->calculateSampleAccurateValues(values, framesToProcess); 118 m_parameter3->calculateSampleAccurateValues(values, framesToProcess); 119 m_parameter4->calculateSampleAccurateValues(values, framesToProcess); 120 } 121 111 122 void BiquadProcessor::setType(BiquadFilterType type) 112 123 { -
trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.h
r266398 r267432 48 48 49 49 void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) override; 50 void processOnlyAudioParams(size_t framesToProcess) final; 50 51 51 52 // Get the magnitude and phase response of the filter at the given -
trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp
r267060 r267432 134 134 } 135 135 136 void DelayDSPKernel::processOnlyAudioParams(size_t framesToProcess) 137 { 138 if (!delayProcessor()) 139 return; 140 141 float values[AudioNode::ProcessingSizeInFrames]; 142 ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames); 143 144 delayProcessor()->delayTime().calculateSampleAccurateValues(values, framesToProcess); 145 } 146 136 147 void DelayDSPKernel::reset() 137 148 { -
trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.h
r267060 r267432 39 39 40 40 void process(const float* source, float* destination, size_t framesToProcess) override; 41 void processOnlyAudioParams(size_t framesToProcess) final; 41 42 void reset() override; 42 43 -
trunk/Source/WebCore/Modules/webaudio/DelayNode.cpp
r265375 r267432 44 44 setNodeType(NodeTypeDelay); 45 45 m_processor = makeUnique<DelayProcessor>(context, context.sampleRate(), 1, maxDelayTime); 46 47 // Initialize so that AudioParams can be processed. 48 initialize(); 46 49 } 47 50 -
trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.cpp
r266417 r267432 104 104 } 105 105 106 void DynamicsCompressorNode::processOnlyAudioParams(size_t framesToProcess) 107 { 108 float values[AudioNode::ProcessingSizeInFrames]; 109 ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames); 110 111 m_threshold->calculateSampleAccurateValues(values, framesToProcess); 112 m_knee->calculateSampleAccurateValues(values, framesToProcess); 113 m_ratio->calculateSampleAccurateValues(values, framesToProcess); 114 m_attack->calculateSampleAccurateValues(values, framesToProcess); 115 m_release->calculateSampleAccurateValues(values, framesToProcess); 116 } 117 106 118 void DynamicsCompressorNode::reset() 107 119 { -
trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.h
r266417 r267432 44 44 // AudioNode 45 45 void process(size_t framesToProcess) override; 46 void processOnlyAudioParams(size_t framesToProcess) final; 46 47 void reset() override; 47 48 void initialize() override; -
trunk/Source/WebCore/Modules/webaudio/GainNode.cpp
r266794 r267432 103 103 } 104 104 105 void GainNode::processOnlyAudioParams(size_t framesToProcess) 106 { 107 float values[AudioNode::ProcessingSizeInFrames]; 108 ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames); 109 110 m_gain->calculateSampleAccurateValues(values, framesToProcess); 111 } 112 105 113 void GainNode::reset() 106 114 { -
trunk/Source/WebCore/Modules/webaudio/GainNode.h
r266794 r267432 44 44 // AudioNode 45 45 void process(size_t framesToProcess) override; 46 void processOnlyAudioParams(size_t framesToProcess) final; 46 47 void reset() override; 47 48 -
trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp
r266794 r267432 182 182 } 183 183 184 void PannerNode::processOnlyAudioParams(size_t framesToProcess) 185 { 186 float values[AudioNode::ProcessingSizeInFrames]; 187 ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames); 188 189 m_positionX->calculateSampleAccurateValues(values, framesToProcess); 190 m_positionY->calculateSampleAccurateValues(values, framesToProcess); 191 m_positionZ->calculateSampleAccurateValues(values, framesToProcess); 192 193 m_orientationX->calculateSampleAccurateValues(values, framesToProcess); 194 m_orientationY->calculateSampleAccurateValues(values, framesToProcess); 195 m_orientationZ->calculateSampleAccurateValues(values, framesToProcess); 196 197 listener().updateValuesIfNeeded(framesToProcess); 198 } 199 184 200 void PannerNode::processSampleAccurateValues(AudioBus* destination, const AudioBus* source, size_t framesToProcess) 185 201 { -
trunk/Source/WebCore/Modules/webaudio/PannerNode.h
r266794 r267432 71 71 // AudioNode 72 72 void process(size_t framesToProcess) override; 73 void processOnlyAudioParams(size_t framesToProcess) final; 73 74 void pullInputs(size_t framesToProcess) override; 74 75 void reset() override; -
trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.cpp
r266061 r267432 101 101 } 102 102 103 void StereoPannerNode::processOnlyAudioParams(size_t framesToProcess) 104 { 105 float values[AudioNode::ProcessingSizeInFrames]; 106 ASSERT(framesToProcess <= AudioNode::ProcessingSizeInFrames); 107 108 m_pan->calculateSampleAccurateValues(values, framesToProcess); 109 } 110 103 111 ExceptionOr<void> StereoPannerNode::setChannelCount(unsigned channelCount) 104 112 { -
trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.h
r266417 r267432 52 52 // AudioNode 53 53 void process(size_t framesToProcess) final; 54 void processOnlyAudioParams(size_t framesToProcess) final; 54 55 void reset() final { }; 55 56 bool requiresTailProcessing() const final { return false; } -
trunk/Source/WebCore/platform/audio/AudioDSPKernel.h
r266417 r267432 58 58 // Subclasses must override process() to do the processing and reset() to reset DSP state. 59 59 virtual void process(const float* source, float* destination, size_t framesToProcess) = 0; 60 61 // Subclasses that have AudioParams must override this to process the AudioParams. 62 virtual void processOnlyAudioParams(size_t) { } 63 60 64 virtual void reset() = 0; 61 65 -
trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp
r266417 r267432 91 91 } 92 92 93 void AudioDSPKernelProcessor::processOnlyAudioParams(size_t framesToProcess) 94 { 95 if (!isInitialized()) 96 return; 97 98 for (unsigned i = 0; i < m_kernels.size(); ++i) 99 m_kernels[i]->processOnlyAudioParams(framesToProcess); 100 } 101 93 102 // Resets filter state 94 103 void AudioDSPKernelProcessor::reset() -
trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h
r266417 r267432 59 59 void uninitialize() override; 60 60 void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) override; 61 void processOnlyAudioParams(size_t framesToProcess) override; 61 62 void reset() override; 62 63 void setNumberOfChannels(unsigned) override; -
trunk/Source/WebCore/platform/audio/AudioProcessor.h
r266417 r267432 60 60 virtual void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) = 0; 61 61 62 // Forces all AudioParams in the processor to run the timeline, bypassing any other processing the processor 63 // would do in process(). 64 virtual void processOnlyAudioParams(size_t) { } 65 62 66 // Resets filter state 63 67 virtual void reset() = 0;
Note:
See TracChangeset
for help on using the changeset viewer.