BellDSP.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma once
  2. #include <memory>
  3. #include <mutex>
  4. #include <vector>
  5. #include "AudioPipeline.h"
  6. #include "CentralAudioBuffer.h"
  7. namespace bell {
  8. #define MAX_INT16 32767
  9. class BellDSP {
  10. public:
  11. BellDSP(std::shared_ptr<CentralAudioBuffer> centralAudioBuffer);
  12. ~BellDSP() {};
  13. class AudioEffect {
  14. public:
  15. AudioEffect() = default;
  16. ~AudioEffect() = default;
  17. size_t duration;
  18. virtual void apply(float* sampleData, size_t samples, size_t relativePosition) = 0;
  19. };
  20. class FadeEffect: public AudioEffect {
  21. private:
  22. std::function<void()> onFinish;
  23. bool isFadeIn;
  24. public:
  25. FadeEffect(size_t duration, bool isFadeIn, std::function<void()> onFinish = nullptr);
  26. ~FadeEffect() {};
  27. void apply(float* sampleData, size_t samples, size_t relativePosition);
  28. };
  29. void applyPipeline(std::shared_ptr<AudioPipeline> pipeline);
  30. void queryInstantEffect(std::unique_ptr<AudioEffect> instantEffect);
  31. std::shared_ptr<AudioPipeline> getActivePipeline();
  32. size_t process(uint8_t* data, size_t bytes, int channels,
  33. uint32_t sampleRate, BitWidth bitWidth);
  34. private:
  35. std::shared_ptr<AudioPipeline> activePipeline;
  36. std::shared_ptr<CentralAudioBuffer> buffer;
  37. std::mutex accessMutex;
  38. std::vector<float> dataLeft = std::vector<float>(1024);
  39. std::vector<float> dataRight = std::vector<float>(1024);
  40. std::unique_ptr<AudioEffect> underflowEffect = nullptr;
  41. std::unique_ptr<AudioEffect> startEffect = nullptr;
  42. std::unique_ptr<AudioEffect> instantEffect = nullptr;
  43. size_t samplesSinceInstantQueued;
  44. };
  45. }; // namespace bell