⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 267432 in webkit


Ignore:
Timestamp:
Sep 22, 2020, 12:25:56 PM (6 years ago)
Author:
Chris Dumez
Message:

AudioParams with automations must process timelines
https://bugs.webkit.org/show_bug.cgi?id=216837

Reviewed by Darin Adler.

Source/WebCore:

Currently, if an AudioNode has no inputs connected, any automations
(or connections) to an AudioParam of the node is not processed. Thus,
time never advances on the AudioParam, and any upstream graph
connected to the AudioParam never gets pulled for data.

AudioParam should get processed so that time progresses. Normal
processing of the node causes AudioParams to be processed, so we were
only missing the case where the node has silent inputs (silent or no
inputs). Then we just need to update the AudioParams, without having
to do the full processing associated with the node.

See https://webaudio.github.io/web-audio-api/#rendering-loop, step 8.1.1
in particular that says any inputs connected to an AudioParam are
processed. There are no conditions on when this happens.

This is a merge of the following Blink change by Raymond Toy:

No new tests, rebaselined existing test.

  • Modules/webaudio/AudioBasicProcessorNode.cpp:

(WebCore::AudioBasicProcessorNode::processOnlyAudioParams):

  • Modules/webaudio/AudioBasicProcessorNode.h:
  • Modules/webaudio/AudioListener.h:
  • Modules/webaudio/AudioNode.cpp:

(WebCore::AudioNode::processIfNecessary):

  • Modules/webaudio/AudioNode.h:

(WebCore::AudioNode::processOnlyAudioParams):

  • Modules/webaudio/BiquadFilterNode.cpp:

(WebCore::BiquadFilterNode::BiquadFilterNode):

  • Modules/webaudio/BiquadProcessor.cpp:

(WebCore::BiquadProcessor::processOnlyAudioParams):

  • Modules/webaudio/BiquadProcessor.h:
  • Modules/webaudio/DelayDSPKernel.cpp:

(WebCore::DelayDSPKernel::processOnlyAudioParams):

  • Modules/webaudio/DelayDSPKernel.h:
  • Modules/webaudio/DelayNode.cpp:

(WebCore::DelayNode::DelayNode):

  • Modules/webaudio/DynamicsCompressorNode.cpp:

(WebCore::DynamicsCompressorNode::processOnlyAudioParams):

  • Modules/webaudio/DynamicsCompressorNode.h:
  • Modules/webaudio/GainNode.cpp:

(WebCore::GainNode::processOnlyAudioParams):

  • Modules/webaudio/GainNode.h:
  • Modules/webaudio/PannerNode.cpp:

(WebCore::PannerNode::processOnlyAudioParams):

  • Modules/webaudio/PannerNode.h:
  • Modules/webaudio/StereoPannerNode.cpp:

(WebCore::StereoPannerNode::processOnlyAudioParams):

  • Modules/webaudio/StereoPannerNode.h:
  • platform/audio/AudioDSPKernel.h:

(WebCore::AudioDSPKernel::processOnlyAudioParams):

  • platform/audio/AudioDSPKernelProcessor.cpp:

(WebCore::AudioDSPKernelProcessor::processOnlyAudioParams):

  • platform/audio/AudioDSPKernelProcessor.h:
  • platform/audio/AudioProcessor.h:

(WebCore::AudioProcessor::processOnlyAudioParams):

LayoutTests:

Rebaseline test that is now passing.

  • webaudio/AudioParam/audioparam-processing-expected.txt:
Location:
trunk
Files:
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r267419 r267432  
     12020-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
    1122020-09-22  Diego Pino Garcia  <dpino@igalia.com>
    213
  • trunk/LayoutTests/webaudio/AudioParam/audioparam-processing-expected.txt

    r267361 r267432  
    1111PASS > [BiquadFilterNode] 
    1212PASS   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
     13PASS   BiquadFilterNode.Q.value is equal to 5.
    1414PASS   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
     15PASS   BiquadFilterNode.detune.value is equal to 0.5.
    1616PASS   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
     17PASS   BiquadFilterNode.frequency.value is equal to 100.
    1818PASS   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
     19PASS   BiquadFilterNode.gain.value is equal to 3.
     20PASS < [BiquadFilterNode] All assertions passed. (total 8 assertions)
    2121PASS > [DelayNode] 
    2222PASS   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
     23PASS   DelayNode.delayTime.value is equal to 0.5.
     24PASS < [DelayNode] All assertions passed. (total 2 assertions)
    2525PASS > [DynamicsCompressorNode] 
    2626PASS   DynamicsCompressorNode.attack ramp final value is not equal to 0.003000000026077032.
     
    3737PASS > [GainNode] 
    3838PASS   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
     39PASS   GainNode.gain.value is equal to 0.5.
     40PASS < [GainNode] All assertions passed. (total 2 assertions)
    4141PASS > [PannerNode] 
    4242PASS   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
     43PASS   PannerNode.positionX.value is equal to 0.5.
    4444PASS   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
     45PASS   PannerNode.positionY.value is equal to 30.
    4646PASS   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
     47PASS   PannerNode.positionZ.value is equal to 15.
    4848PASS   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
     49PASS   PannerNode.orientationX.value is equal to 0.5.
    5050PASS   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
     51PASS   PannerNode.orientationY.value is equal to 30.
    5252PASS   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
     53PASS   PannerNode.orientationZ.value is equal to 15.
     54PASS < [PannerNode] All assertions passed. (total 12 assertions)
    5555PASS > [StereoPannerNode] 
    5656PASS   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
     57PASS   StereoPannerNode.pan.value is equal to 0.5.
     58PASS < [StereoPannerNode] All assertions passed. (total 2 assertions)
    5959PASS > [AudioListener] 
    6060PASS   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
     61PASS   AudioListener.positionX.value is equal to 100.
    6262PASS   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
     63PASS   AudioListener.positionY.value is equal to 200.
    6464PASS   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
     65PASS   AudioListener.positionZ.value is equal to 300.
    6666PASS   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
     67PASS   AudioListener.forwardX.value is equal to -100.
    6868PASS   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
     69PASS   AudioListener.forwardY.value is equal to -200.
    7070PASS   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
     71PASS   AudioListener.forwardZ.value is equal to -300.
    7272PASS   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
     73PASS   AudioListener.upX.value is equal to 99.
    7474PASS   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
     75PASS   AudioListener.upY.value is equal to 42.
    7676PASS   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
     77PASS   AudioListener.upZ.value is equal to 137.
     78PASS < [AudioListener] All assertions passed. (total 18 assertions)
     79PASS # AUDIT TASK RUNNER FINISHED: 7 tasks ran successfully.
    8080
  • trunk/Source/WebCore/ChangeLog

    r267428 r267432  
     12020-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
    1662020-09-22  Chris Dumez  <cdumez@apple.com>
    267
  • trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.cpp

    r266417 r267432  
    8888}
    8989
     90void AudioBasicProcessorNode::processOnlyAudioParams(size_t framesToProcess)
     91{
     92    if (!isInitialized() || !processor())
     93        return;
     94
     95    processor()->processOnlyAudioParams(framesToProcess);
     96}
     97
    9098// Nice optimization in the very common case allowing for "in-place" processing
    9199void AudioBasicProcessorNode::pullInputs(size_t framesToProcess)
  • trunk/Source/WebCore/Modules/webaudio/AudioBasicProcessorNode.h

    r266417 r267432  
    4242    // AudioNode
    4343    void process(size_t framesToProcess) override;
     44    void processOnlyAudioParams(size_t framesToProcess) override;
    4445    void pullInputs(size_t framesToProcess) override;
    4546    void reset() override;
  • trunk/Source/WebCore/Modules/webaudio/AudioListener.h

    r266319 r267432  
    8888    const float* upZValues(size_t framesToProcess);
    8989
     90    void updateValuesIfNeeded(size_t framesToProcess);
     91
    9092protected:
    9193    explicit AudioListener(BaseAudioContext&);
    9294
    9395private:
    94     void updateValuesIfNeeded(size_t framesToProcess);
    9596
    9697    Ref<AudioParam> m_positionX;
  • trunk/Source/WebCore/Modules/webaudio/AudioNode.cpp

    r267376 r267432  
    480480            m_lastNonSilentTime = (context().currentSampleFrame() + framesToProcess) / static_cast<double>(context().sampleRate());
    481481
    482         if (silentInputs && propagatesSilence())
     482        if (silentInputs && propagatesSilence()) {
    483483            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
    485489            process(framesToProcess);
    486490    }
  • trunk/Source/WebCore/Modules/webaudio/AudioNode.h

    r266518 r267432  
    117117    virtual void process(size_t framesToProcess) = 0;
    118118
     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
    119124    // Resets DSP processing state (clears delay lines, filter memory, etc.)
    120125    // Called from context's audio thread.
  • trunk/Source/WebCore/Modules/webaudio/BiquadFilterNode.cpp

    r266398 r267432  
    6363    // Initially setup as lowpass filter.
    6464    m_processor = makeUnique<BiquadProcessor>(context, context.sampleRate(), 1, false);
     65
     66    // Initialize so that AudioParams can be processed.
     67    initialize();
    6568}
    6669
  • trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.cpp

    r266398 r267432  
    109109}
    110110
     111void 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
    111122void BiquadProcessor::setType(BiquadFilterType type)
    112123{
  • trunk/Source/WebCore/Modules/webaudio/BiquadProcessor.h

    r266398 r267432  
    4848       
    4949    void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) override;
     50    void processOnlyAudioParams(size_t framesToProcess) final;
    5051
    5152    // Get the magnitude and phase response of the filter at the given
  • trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.cpp

    r267060 r267432  
    134134}
    135135
     136void 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
    136147void DelayDSPKernel::reset()
    137148{
  • trunk/Source/WebCore/Modules/webaudio/DelayDSPKernel.h

    r267060 r267432  
    3939   
    4040    void process(const float* source, float* destination, size_t framesToProcess) override;
     41    void processOnlyAudioParams(size_t framesToProcess) final;
    4142    void reset() override;
    4243   
  • trunk/Source/WebCore/Modules/webaudio/DelayNode.cpp

    r265375 r267432  
    4444    setNodeType(NodeTypeDelay);
    4545    m_processor = makeUnique<DelayProcessor>(context, context.sampleRate(), 1, maxDelayTime);
     46
     47    // Initialize so that AudioParams can be processed.
     48    initialize();
    4649}
    4750
  • trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.cpp

    r266417 r267432  
    104104}
    105105
     106void 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
    106118void DynamicsCompressorNode::reset()
    107119{
  • trunk/Source/WebCore/Modules/webaudio/DynamicsCompressorNode.h

    r266417 r267432  
    4444    // AudioNode
    4545    void process(size_t framesToProcess) override;
     46    void processOnlyAudioParams(size_t framesToProcess) final;
    4647    void reset() override;
    4748    void initialize() override;
  • trunk/Source/WebCore/Modules/webaudio/GainNode.cpp

    r266794 r267432  
    103103}
    104104
     105void 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
    105113void GainNode::reset()
    106114{
  • trunk/Source/WebCore/Modules/webaudio/GainNode.h

    r266794 r267432  
    4444    // AudioNode
    4545    void process(size_t framesToProcess) override;
     46    void processOnlyAudioParams(size_t framesToProcess) final;
    4647    void reset() override;
    4748
  • trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp

    r266794 r267432  
    182182}
    183183
     184void 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
    184200void PannerNode::processSampleAccurateValues(AudioBus* destination, const AudioBus* source, size_t framesToProcess)
    185201{
  • trunk/Source/WebCore/Modules/webaudio/PannerNode.h

    r266794 r267432  
    7171    // AudioNode
    7272    void process(size_t framesToProcess) override;
     73    void processOnlyAudioParams(size_t framesToProcess) final;
    7374    void pullInputs(size_t framesToProcess) override;
    7475    void reset() override;
  • trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.cpp

    r266061 r267432  
    101101}
    102102
     103void 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
    103111ExceptionOr<void> StereoPannerNode::setChannelCount(unsigned channelCount)
    104112{
  • trunk/Source/WebCore/Modules/webaudio/StereoPannerNode.h

    r266417 r267432  
    5252    // AudioNode
    5353    void process(size_t framesToProcess) final;
     54    void processOnlyAudioParams(size_t framesToProcess) final;
    5455    void reset() final { };
    5556    bool requiresTailProcessing() const final { return false; }
  • trunk/Source/WebCore/platform/audio/AudioDSPKernel.h

    r266417 r267432  
    5858    // Subclasses must override process() to do the processing and reset() to reset DSP state.
    5959    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
    6064    virtual void reset() = 0;
    6165
  • trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.cpp

    r266417 r267432  
    9191}
    9292
     93void 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
    93102// Resets filter state
    94103void AudioDSPKernelProcessor::reset()
  • trunk/Source/WebCore/platform/audio/AudioDSPKernelProcessor.h

    r266417 r267432  
    5959    void uninitialize() override;
    6060    void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) override;
     61    void processOnlyAudioParams(size_t framesToProcess) override;
    6162    void reset() override;
    6263    void setNumberOfChannels(unsigned) override;
  • trunk/Source/WebCore/platform/audio/AudioProcessor.h

    r266417 r267432  
    6060    virtual void process(const AudioBus* source, AudioBus* destination, size_t framesToProcess) = 0;
    6161
     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
    6266    // Resets filter state
    6367    virtual void reset() = 0;
Note: See TracChangeset for help on using the changeset viewer.