delay_line.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include <cstring>
  2. #include "audio_core/delay_line.h"
  3. namespace AudioCore {
  4. DelayLineBase::DelayLineBase() = default;
  5. DelayLineBase::~DelayLineBase() = default;
  6. void DelayLineBase::Initialize(s32 max_delay_, float* src_buffer) {
  7. buffer = src_buffer;
  8. buffer_end = buffer + max_delay_;
  9. max_delay = max_delay_;
  10. output = buffer;
  11. SetDelay(max_delay_);
  12. Clear();
  13. }
  14. void DelayLineBase::SetDelay(s32 new_delay) {
  15. if (max_delay < new_delay) {
  16. return;
  17. }
  18. delay = new_delay;
  19. input = (buffer + ((output - buffer) + new_delay) % (max_delay + 1));
  20. }
  21. s32 DelayLineBase::GetDelay() const {
  22. return delay;
  23. }
  24. s32 DelayLineBase::GetMaxDelay() const {
  25. return max_delay;
  26. }
  27. f32 DelayLineBase::TapOut(s32 last_sample) {
  28. const float* ptr = input - (last_sample + 1);
  29. if (ptr < buffer) {
  30. ptr += (max_delay + 1);
  31. }
  32. return *ptr;
  33. }
  34. f32 DelayLineBase::Tick(f32 sample) {
  35. *(input++) = sample;
  36. const auto out_sample = *(output++);
  37. if (buffer_end < input) {
  38. input = buffer;
  39. }
  40. if (buffer_end < output) {
  41. output = buffer;
  42. }
  43. return out_sample;
  44. }
  45. float* DelayLineBase::GetInput() {
  46. return input;
  47. }
  48. const float* DelayLineBase::GetInput() const {
  49. return input;
  50. }
  51. f32 DelayLineBase::GetOutputSample() const {
  52. return *output;
  53. }
  54. void DelayLineBase::Clear() {
  55. std::memset(buffer, 0, sizeof(float) * max_delay);
  56. }
  57. void DelayLineBase::Reset() {
  58. buffer = nullptr;
  59. buffer_end = nullptr;
  60. max_delay = 0;
  61. input = nullptr;
  62. output = nullptr;
  63. delay = 0;
  64. }
  65. DelayLineAllPass::DelayLineAllPass() = default;
  66. DelayLineAllPass::~DelayLineAllPass() = default;
  67. void DelayLineAllPass::Initialize(u32 delay_, float coeffcient_, f32* src_buffer) {
  68. DelayLineBase::Initialize(delay_, src_buffer);
  69. SetCoefficient(coeffcient_);
  70. }
  71. void DelayLineAllPass::SetCoefficient(float coeffcient_) {
  72. coefficient = coeffcient_;
  73. }
  74. f32 DelayLineAllPass::Tick(f32 sample) {
  75. const auto temp = sample - coefficient * *output;
  76. return coefficient * temp + DelayLineBase::Tick(temp);
  77. }
  78. void DelayLineAllPass::Reset() {
  79. coefficient = 0.0f;
  80. DelayLineBase::Reset();
  81. }
  82. } // namespace AudioCore