diff options
author | bunnei <bunneidev@gmail.com> | 2021-02-15 05:09:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-15 05:09:15 +0100 |
commit | 8378b8a61feb971fc4b8af8468938e4691c2cfb7 (patch) | |
tree | 6df36c0a553a72ad4ec5dca2a5134b44d0f31849 /src/audio_core/delay_line.cpp | |
parent | Merge pull request #5920 from bunnei/am-ldn-fix (diff) | |
parent | revert to std::sin and std::cos (diff) | |
download | yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.tar yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.tar.gz yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.tar.bz2 yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.tar.lz yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.tar.xz yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.tar.zst yuzu-8378b8a61feb971fc4b8af8468938e4691c2cfb7.zip |
Diffstat (limited to 'src/audio_core/delay_line.cpp')
-rw-r--r-- | src/audio_core/delay_line.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/audio_core/delay_line.cpp b/src/audio_core/delay_line.cpp new file mode 100644 index 000000000..f4e4dd8d2 --- /dev/null +++ b/src/audio_core/delay_line.cpp @@ -0,0 +1,104 @@ +#include <cstring> +#include "audio_core/delay_line.h" + +namespace AudioCore { +DelayLineBase::DelayLineBase() = default; +DelayLineBase::~DelayLineBase() = default; + +void DelayLineBase::Initialize(s32 max_delay_, float* src_buffer) { + buffer = src_buffer; + buffer_end = buffer + max_delay_; + max_delay = max_delay_; + output = buffer; + SetDelay(max_delay_); + Clear(); +} + +void DelayLineBase::SetDelay(s32 new_delay) { + if (max_delay < new_delay) { + return; + } + delay = new_delay; + input = (buffer + ((output - buffer) + new_delay) % (max_delay + 1)); +} + +s32 DelayLineBase::GetDelay() const { + return delay; +} + +s32 DelayLineBase::GetMaxDelay() const { + return max_delay; +} + +f32 DelayLineBase::TapOut(s32 last_sample) { + const float* ptr = input - (last_sample + 1); + if (ptr < buffer) { + ptr += (max_delay + 1); + } + + return *ptr; +} + +f32 DelayLineBase::Tick(f32 sample) { + *(input++) = sample; + const auto out_sample = *(output++); + + if (buffer_end < input) { + input = buffer; + } + + if (buffer_end < output) { + output = buffer; + } + + return out_sample; +} + +float* DelayLineBase::GetInput() { + return input; +} + +const float* DelayLineBase::GetInput() const { + return input; +} + +f32 DelayLineBase::GetOutputSample() const { + return *output; +} + +void DelayLineBase::Clear() { + std::memset(buffer, 0, sizeof(float) * max_delay); +} + +void DelayLineBase::Reset() { + buffer = nullptr; + buffer_end = nullptr; + max_delay = 0; + input = nullptr; + output = nullptr; + delay = 0; +} + +DelayLineAllPass::DelayLineAllPass() = default; +DelayLineAllPass::~DelayLineAllPass() = default; + +void DelayLineAllPass::Initialize(u32 delay_, float coeffcient_, f32* src_buffer) { + DelayLineBase::Initialize(delay_, src_buffer); + SetCoefficient(coeffcient_); +} + +void DelayLineAllPass::SetCoefficient(float coeffcient_) { + coefficient = coeffcient_; +} + +f32 DelayLineAllPass::Tick(f32 sample) { + const auto temp = sample - coefficient * *output; + return coefficient * temp + DelayLineBase::Tick(temp); +} + +void DelayLineAllPass::Reset() { + coefficient = 0.0f; + DelayLineBase::Reset(); +} + +} // namespace AudioCore |