#pragma once #include #include #include #include "AudioPipeline.h" #include "CentralAudioBuffer.h" namespace bell { #define MAX_INT16 32767 class BellDSP { public: BellDSP(std::shared_ptr centralAudioBuffer); ~BellDSP() {}; class AudioEffect { public: AudioEffect() = default; ~AudioEffect() = default; size_t duration; virtual void apply(float* sampleData, size_t samples, size_t relativePosition) = 0; }; class FadeEffect: public AudioEffect { private: std::function onFinish; bool isFadeIn; public: FadeEffect(size_t duration, bool isFadeIn, std::function onFinish = nullptr); ~FadeEffect() {}; void apply(float* sampleData, size_t samples, size_t relativePosition); }; void applyPipeline(std::shared_ptr pipeline); void queryInstantEffect(std::unique_ptr instantEffect); std::shared_ptr getActivePipeline(); size_t process(uint8_t* data, size_t bytes, int channels, uint32_t sampleRate, BitWidth bitWidth); private: std::shared_ptr activePipeline; std::shared_ptr buffer; std::mutex accessMutex; std::vector dataLeft = std::vector(1024); std::vector dataRight = std::vector(1024); std::unique_ptr underflowEffect = nullptr; std::unique_ptr startEffect = nullptr; std::unique_ptr instantEffect = nullptr; size_t samplesSinceInstantQueued; }; }; // namespace bell