Effects.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <filmroellchen@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Effects.h"
  7. #include <AK/FixedArray.h>
  8. #include <math.h>
  9. namespace DSP::Effects {
  10. Delay::Delay(NonnullRefPtr<Transport> transport)
  11. : EffectProcessor(move(transport))
  12. , m_delay_decay("Decay"sv, 0.01, 0.99, 0.33, Logarithmic::No)
  13. , m_delay_time("Delay Time"sv, 3, 2000, 900, Logarithmic::Yes)
  14. , m_dry_gain("Dry"sv, 0, 1, 0.9, Logarithmic::No)
  15. {
  16. m_parameters.append(m_delay_decay);
  17. m_parameters.append(m_delay_time);
  18. m_parameters.append(m_dry_gain);
  19. }
  20. void Delay::handle_delay_time_change()
  21. {
  22. // We want a delay buffer that can hold samples filling the specified number of milliseconds.
  23. double seconds = static_cast<double>(m_delay_time) / 1000.0;
  24. size_t sample_count = ceil(seconds * m_transport->sample_rate());
  25. if (sample_count != m_delay_buffer.size()) {
  26. m_delay_buffer.resize(sample_count, true);
  27. m_delay_index %= max(m_delay_buffer.size(), 1);
  28. }
  29. }
  30. void Delay::process_impl(Signal const& input_signal, Signal& output_signal)
  31. {
  32. // FIXME: This is allocating and needs to happen on a different thread.
  33. handle_delay_time_change();
  34. auto const& samples = input_signal.get<FixedArray<Sample>>();
  35. auto& output = output_signal.get<FixedArray<Sample>>();
  36. for (size_t i = 0; i < output.size(); ++i) {
  37. auto& out = output[i];
  38. auto const& sample = samples[i];
  39. out += sample.log_multiplied(static_cast<double>(m_dry_gain));
  40. out += m_delay_buffer[m_delay_index].log_multiplied(m_delay_decay);
  41. // This is also convenient for disabling the delay effect by setting the buffer size to 0
  42. if (m_delay_buffer.size() >= 1)
  43. m_delay_buffer[m_delay_index++] = out;
  44. if (m_delay_index >= m_delay_buffer.size())
  45. m_delay_index = 0;
  46. }
  47. }
  48. Mastering::Mastering(NonnullRefPtr<Transport> transport)
  49. : EffectProcessor(move(transport))
  50. {
  51. }
  52. void Mastering::process_impl([[maybe_unused]] Signal const& input_signal, [[maybe_unused]] Signal& output_signal)
  53. {
  54. TODO();
  55. }
  56. }