# dsp::FIR::Filter::process does not work, but processSample does

**URL:** <https://forum.juce.com/t/dsp-process-does-not-work-but-processsample-does/61654>\
**Category:** General JUCE discussion\
**Created:** [June 1, 2024, 1:55am UTC](https://forum.juce.com/t/dsp-process-does-not-work-but-processsample-does/61654 "2024-06-01T01:55:16Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![triebb](https://avatars.discourse-cdn.com/v4/letter/t/77aa72/32.png) [@triebb](https://forum.juce.com/u/triebb)\
**Post date:** [June 1, 2024, 1:55am UTC](https://forum.juce.com/t/dsp-process-does-not-work-but-processsample-does/61654/1 "2024-06-01T01:55:16Z")

</div>

I have a lowpass filter like:

```auto
juce::dsp::FIR::Filter<float> lowpass;
auto coefficients = juce::dsp::FilterDesign<float>::designFIRLowpassTransitionMethod(cutoffFrequency,reader->sampleRate, filterOrder,0.01f, 4.0f);
lowpass.coefficients = *coefficients;

```

Processing samples manually works fine, but when I try using “process”, it doesn’t work:

Doesn’t work:

```auto
 juce::dsp::AudioBlock<float> block(audioBuffer);
                 juce::dsp::ProcessContextReplacing<float> context(block);
                 lowpass.reset();
                 lowpass.prepare(juce::dsp::ProcessSpec{.sampleRate = static_cast<double>(sampleRate), .maximumBlockSize = static_cast<juce::uint32>(bufferSampleSize), .numChannels = static_cast<juce::uint32>(numChannels)});
                    lowpass.process(context);

```

Works:

```auto
                for (int i = 0; i < audioBuffer.getNumSamples(); i++){
                    for(int c=0; c<numChannels; c++){
                    audioBuffer.setSample(c, i, lowpass.processSample(audioBuffer.getSample(c,i)));
                    }
                }

```

What am I doing wrong? processSample works when I manually process every sample in every channel, but for some reason calling process on my audio buffer using `ProcessContextReplacing` doesn’t work (the audio is unchanged). Any ideas?

---

<div class="post-metadata">

**Author:** ![kerfuffle](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/kerfuffle/32/11805_2.png) [@kerfuffle](https://forum.juce.com/u/kerfuffle)\
**Post date:** [June 1, 2024, 2:00pm UTC](https://forum.juce.com/t/dsp-process-does-not-work-but-processsample-does/61654/2 "2024-06-01T14:00:41Z")

</div>

That’s weird because `process()` essentially just does that loop that calls `processSample()`.

Does it work OK when you move the calls to `lowpass.reset()` and `lowpass.prepare(...)` into `prepareToPlay` rather than in `processBlock`?

---

<div class="post-metadata">

**Author:** ![triebb](https://avatars.discourse-cdn.com/v4/letter/t/77aa72/32.png) [@triebb](https://forum.juce.com/u/triebb)\
**Post date:** [June 1, 2024, 4:00pm UTC](https://forum.juce.com/t/dsp-process-does-not-work-but-processsample-does/61654/3 "2024-06-01T16:00:37Z")

</div>

Unfortunately not. I’ve tried moving around the `reset` and `prepare` functions, switching the order of them, removing one of them, etc. and no combination seems to get `process` to work at all.

---

<div class="post-metadata">

**Author:** ![triebb](https://avatars.discourse-cdn.com/v4/letter/t/77aa72/32.png) [@triebb](https://forum.juce.com/u/triebb)\
**Post date:** [June 1, 2024, 4:14pm UTC](https://forum.juce.com/t/dsp-process-does-not-work-but-processsample-does/61654/4 "2024-06-01T16:14:36Z")

</div>

Ah, after looking at the source code (`JUCE/modules/juce_dsp/processors /juce_FIRFilter.h`) I found the comment: “This class can only process mono signals. Use the ProcessorDuplicator class”.

After using a ProcessorDuplicator for my 2 channel audio, it works now.

```auto
juce::dsp::ProcessorDuplicator<juce::dsp::FIR::Filter<float>, juce::dsp::FIR::Coefficients<float>> filterDuplicator(coefficients.get());

```
