#pragma once #include // for size_t #include // for uint32_t, uint8_t #include // for function #include // for shared_ptr, unique_ptr #include // for mutex #include // for vector #include "StreamInfo.h" // for BitWidth namespace bell { class AudioPipeline; class CentralAudioBuffer; #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