Track.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <filmroellchen@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Clip.h"
  8. #include "Music.h"
  9. #include "Processor.h"
  10. #include <LibCore/Object.h>
  11. namespace LibDSP {
  12. // A track is also known as a channel and serves as a container for the audio pipeline: clips -> processors -> mixing & output
  13. class Track : public Core::Object {
  14. C_OBJECT_ABSTRACT(Track)
  15. public:
  16. Track(NonnullRefPtr<Transport> transport)
  17. : m_transport(move(transport))
  18. {
  19. }
  20. virtual ~Track() override = default;
  21. virtual bool check_processor_chain_valid() const = 0;
  22. bool add_processor(NonnullRefPtr<Processor> new_processor);
  23. // Creates the current signal of the track by processing current note or audio data through the processing chain
  24. Sample current_signal();
  25. NonnullRefPtrVector<Processor> const& processor_chain() const { return m_processor_chain; }
  26. NonnullRefPtr<Transport> const transport() const { return m_transport; }
  27. protected:
  28. bool check_processor_chain_valid_with_initial_type(SignalType initial_type) const;
  29. // Subclasses override to provide the base signal to the processing chain
  30. virtual void compute_current_clips_signal() = 0;
  31. NonnullRefPtrVector<Processor> m_processor_chain;
  32. NonnullRefPtr<Transport> m_transport;
  33. // The current signal is stored here, to prevent unnecessary reallocation.
  34. Signal m_current_signal { Audio::Sample {} };
  35. };
  36. class NoteTrack final : public Track {
  37. public:
  38. virtual ~NoteTrack() override = default;
  39. bool check_processor_chain_valid() const override;
  40. NonnullRefPtrVector<NoteClip> const& clips() const { return m_clips; }
  41. protected:
  42. void compute_current_clips_signal() override;
  43. private:
  44. NonnullRefPtrVector<NoteClip> m_clips;
  45. };
  46. class AudioTrack final : public Track {
  47. public:
  48. virtual ~AudioTrack() override = default;
  49. bool check_processor_chain_valid() const override;
  50. NonnullRefPtrVector<AudioClip> const& clips() const { return m_clips; }
  51. protected:
  52. void compute_current_clips_signal() override;
  53. private:
  54. NonnullRefPtrVector<AudioClip> m_clips;
  55. };
  56. }