Skip to content

Commit f34b60f

Browse files
committed
fix: fix incorrect bypass behaviour
1 parent 51e6742 commit f34b60f

File tree

7 files changed

+79
-15
lines changed

7 files changed

+79
-15
lines changed

source/PluginProcessor.cpp

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,32 @@ bool PluginProcessor::isBusesLayoutSupported(const BusesLayout &layouts) const {
125125
return true;
126126
}
127127

128-
void PluginProcessor::processBlock(juce::AudioBuffer<float> &buffer,
129-
juce::MidiBuffer &) {
128+
void PluginProcessor::processBlock(juce::AudioBuffer<float> &buffer, juce::MidiBuffer &) {
129+
if (bypass_ref_.load(std::memory_order::relaxed) < .5f) {
130+
processBlockInternal<false>(buffer);
131+
} else {
132+
processBlockInternal<true>(buffer);
133+
}
134+
}
135+
136+
void PluginProcessor::processBlock(juce::AudioBuffer<double> &buffer, juce::MidiBuffer &) {
137+
if (bypass_ref_.load(std::memory_order::relaxed) < .5f) {
138+
processBlockInternal<false>(buffer);
139+
} else {
140+
processBlockInternal<true>(buffer);
141+
}
142+
}
143+
144+
void PluginProcessor::processBlockBypassed(juce::AudioBuffer<float> &buffer, juce::MidiBuffer &) {
145+
processBlockInternal<true>(buffer);
146+
}
147+
148+
void PluginProcessor::processBlockBypassed(juce::AudioBuffer<double> &buffer, juce::MidiBuffer &) {
149+
processBlockInternal<true>(buffer);
150+
}
151+
152+
template<bool IsBypassed>
153+
void PluginProcessor::processBlockInternal(juce::AudioBuffer<float> &buffer) {
130154
juce::ScopedNoDenormals no_denormals;
131155
double_in_pointers[0] = double_in_buffer[0].data();
132156
double_in_pointers[1] = double_in_buffer[1].data();
@@ -143,20 +167,25 @@ void PluginProcessor::processBlock(juce::AudioBuffer<float> &buffer,
143167
static_cast<size_t>(buffer.getNumSamples()));
144168
}
145169

146-
if (bypass_ref_.load(std::memory_order::relaxed) < .5f) {
170+
if constexpr (!IsBypassed) {
147171
for (size_t chan = 0; chan < static_cast<size_t>(std::min(4, buffer.getNumChannels())); ++chan) {
148172
zldsp::vector::copy(buffer.getWritePointer(static_cast<int>(chan)),
149173
double_out_pointers1[chan], static_cast<size_t>(buffer.getNumSamples()));
150174
}
151175
} else {
176+
double_controller_.processBypassDelay(double_in_pointers, static_cast<size_t>(buffer.getNumSamples()));
177+
for (size_t chan = 0; chan < 2; ++chan) {
178+
zldsp::vector::copy(buffer.getWritePointer(static_cast<int>(chan)),
179+
double_in_pointers[chan], static_cast<size_t>(buffer.getNumSamples()));
180+
}
152181
for (auto i = getTotalNumInputChannels(); i < getTotalNumOutputChannels(); ++i) {
153182
buffer.clear(i, 0, buffer.getNumSamples());
154183
}
155184
}
156185
}
157186

158-
void PluginProcessor::processBlock(juce::AudioBuffer<double> &buffer,
159-
juce::MidiBuffer &) {
187+
template<bool IsBypassed>
188+
void PluginProcessor::processBlockInternal(juce::AudioBuffer<double> &buffer) {
160189
juce::ScopedNoDenormals no_denormals;
161190
double_in_pointers[0] = buffer.getWritePointer(0);
162191
double_in_pointers[1] = buffer.getWritePointer(1);
@@ -169,12 +198,13 @@ void PluginProcessor::processBlock(juce::AudioBuffer<double> &buffer,
169198
static_cast<size_t>(buffer.getNumSamples()));
170199
}
171200

172-
if (bypass_ref_.load(std::memory_order::relaxed) < .5f) {
201+
if constexpr (!IsBypassed) {
173202
for (size_t chan = 0; chan < static_cast<size_t>(std::min(4, buffer.getNumChannels())); ++chan) {
174203
zldsp::vector::copy(buffer.getWritePointer(static_cast<int>(chan)),
175204
double_out_pointers1[chan], static_cast<size_t>(buffer.getNumSamples()));
176205
}
177206
} else {
207+
double_controller_.processBypassDelay(double_in_pointers, static_cast<size_t>(buffer.getNumSamples()));
178208
for (auto i = getTotalNumInputChannels(); i < getTotalNumOutputChannels(); ++i) {
179209
buffer.clear(i, 0, buffer.getNumSamples());
180210
}

source/PluginProcessor.hpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class PluginProcessor : public juce::AudioProcessor {
4040

4141
void processBlock(juce::AudioBuffer<double> &, juce::MidiBuffer &) override;
4242

43+
void processBlockBypassed(juce::AudioBuffer<float> &, juce::MidiBuffer &) override;
44+
45+
void processBlockBypassed(juce::AudioBuffer<double> &, juce::MidiBuffer &) override;
46+
4347
juce::AudioProcessorEditor *createEditor() override;
4448

4549
bool hasEditor() const override;
@@ -74,7 +78,7 @@ class PluginProcessor : public juce::AudioProcessor {
7478
return double_controller_;
7579
}
7680

77-
double getAtomicSampleRate() const {
81+
double getAtomicSampleRate() const {
7882
return sample_rate_.load(std::memory_order::relaxed);
7983
}
8084

@@ -86,12 +90,18 @@ class PluginProcessor : public juce::AudioProcessor {
8690

8791
std::array<std::vector<double>, 2> double_in_buffer;
8892
std::array<std::vector<double>, 4> double_out_buffer;
89-
std::array<double*, 2> double_in_pointers{};
90-
std::array<double*, 4> double_out_pointers1{};
91-
std::array<double*, 4> double_out_pointers2{};
93+
std::array<double *, 2> double_in_pointers{};
94+
std::array<double *, 4> double_out_pointers1{};
95+
std::array<double *, 4> double_out_pointers2{};
9296

9397
zlp::Controller<double> double_controller_;
9498
zlp::ControllerAttach<double> double_controller_attach_;
9599

100+
template<bool IsBypassed>
101+
void processBlockInternal(juce::AudioBuffer<float> &);
102+
103+
template<bool IsBypassed>
104+
void processBlockInternal(juce::AudioBuffer<double> &);
105+
96106
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginProcessor)
97107
};

source/dsp/delay/integer_delay.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ namespace zldsp::delay {
7474
}
7575

7676
void setDelay(const FloatType delay_seconds) {
77-
const auto delay_samples = static_cast<int>(std::round(delay_seconds * sample_rate_));
77+
delay_samples_ = static_cast<int>(std::round(delay_seconds * sample_rate_));
7878
const auto pre_delay_samples = static_cast<int>(std::round(delay_seconds_ * sample_rate_));
79-
const auto delta = delay_samples - pre_delay_samples;
79+
const auto delta = delay_samples_ - pre_delay_samples;
8080
delay_seconds_ = delay_seconds;
8181
if (delta < 0) {
8282
tail_ += delta;
@@ -96,12 +96,13 @@ namespace zldsp::delay {
9696
}
9797

9898
[[nodiscard]] int getDelayInSamples() const {
99-
return static_cast<int>(std::round(delay_seconds_ * sample_rate_));
99+
return delay_samples_;
100100
}
101101

102102
private:
103103
double sample_rate_{48000.0};
104104
FloatType delay_seconds_{0};
105+
int delay_samples_{0};
105106
int capacity_{0}, head_{0}, tail_{0};
106107
std::vector<std::vector<FloatType> > states_;
107108
};

source/dsp/splitter/lh_splitter/lh_fir_splitter.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,10 @@ namespace zldsp::splitter {
152152
}
153153
}
154154

155+
int getMaxLatency() const {
156+
return static_cast<int>(1 << (kSecondOrderNumStage + extra_stage_ + 2)) + 2;
157+
}
158+
155159
private:
156160
inline static constexpr size_t kFirstOrderNumStage = 9;
157161
inline static constexpr size_t kSecondOrderNumStage = 11;

source/dsp/splitter/ts_splitter/ts_splitter.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ namespace zldsp::splitter {
4040
delay_span_[0] = steady_buffer;
4141
delay_.process(delay_span_, num_samples);
4242
// transient split
43-
fft_span_[0] = in_buffer;
44-
zldsp::filter::FIRBase<FloatType, 10>::process(fft_span_, num_samples);
4543
zldsp::vector::copy(transient_buffer, in_buffer, num_samples);
44+
fft_span_[0] = transient_buffer;
45+
zldsp::filter::FIRBase<FloatType, 10>::process(fft_span_, num_samples);
4646
// subtract transient buffer from steady buffer
4747
auto transient_v = kfr::make_univector(transient_buffer, num_samples);
4848
auto steady_v = kfr::make_univector(steady_buffer, num_samples);

source/zlp/controller.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ namespace zlp {
2929

3030
fft_analyzer_.prepare(sample_rate, {2, 2});
3131
mag_analyzer_.prepare(sample_rate, max_num_samples);
32+
33+
const auto max_latency = std::max(lh_fir_splitter_.getMaxLatency(), ts_splitter_[0].getTSLatency());
34+
bypass_delay_.prepare(sample_rate, max_num_samples, 2,
35+
static_cast<FloatType>(max_latency + 1) / static_cast<FloatType>(sample_rate));
3236
}
3337

3438
template<typename FloatType>
@@ -156,11 +160,22 @@ namespace zlp {
156160
}
157161
}
158162

163+
template<typename FloatType>
164+
void Controller<FloatType>::processBypassDelay(std::array<FloatType *, 2> &in_buffer, size_t num_samples) {
165+
if (bypass_delay_.getDelayInSamples() == 0) {
166+
return;
167+
}
168+
bypass_delay_.process(in_buffer, num_samples);
169+
}
170+
159171
template<typename FloatType>
160172
void Controller<FloatType>::checkUpdateLatency() {
173+
bypass_delay_.reset();
174+
bypass_delay_.setDelayInSamples(latency_.load(std::memory_order::relaxed));
161175
if (latency_.load(std::memory_order::relaxed) != p_ref_.getLatencySamples()) {
162176
triggerAsyncUpdate();
163177
}
178+
mag_analyzer_.setToReset();
164179
}
165180

166181
template<typename FloatType>

source/zlp/controller.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ namespace zlp {
3535
std::array<FloatType *, 4> &out_buffer,
3636
size_t num_samples);
3737

38+
void processBypassDelay(std::array<FloatType *, 2> &in_buffer, size_t num_samples);
39+
3840
void setSplitType(zlp::PSplitType::SplitType split_type) {
3941
split_type_.store(split_type, std::memory_order::relaxed);
4042
to_update_split_type_.store(true, std::memory_order::release);
@@ -120,6 +122,8 @@ namespace zlp {
120122
std::atomic<bool> is_mag_on_{false};
121123
zldsp::analyzer::MultipleMagAnalyzer<FloatType, 2, kAnalyzerPointNum> mag_analyzer_;
122124

125+
zldsp::delay::IntegerDelay<FloatType> bypass_delay_;
126+
123127
void checkUpdateLatency();
124128

125129
void handleAsyncUpdate() override;

0 commit comments

Comments
 (0)