| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | #pragma once#include <stddef.h>    // for size_t#include <stdint.h>    // for uint32_t, uint8_t#include <functional>  // for function#include <memory>      // for shared_ptr, unique_ptr#include <mutex>       // for mutex#include <vector>      // for vector#include "StreamInfo.h"  // for BitWidthnamespace bell {class AudioPipeline;class CentralAudioBuffer;#define MAX_INT16 32767class BellDSP { public:  BellDSP(std::shared_ptr<CentralAudioBuffer> 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<void()> onFinish;    bool isFadeIn;   public:    FadeEffect(size_t duration, bool isFadeIn,               std::function<void()> onFinish = nullptr);    ~FadeEffect(){};    void apply(float* sampleData, size_t samples, size_t relativePosition);  };  void applyPipeline(std::shared_ptr<AudioPipeline> pipeline);  void queryInstantEffect(std::unique_ptr<AudioEffect> instantEffect);  std::shared_ptr<AudioPipeline> getActivePipeline();  size_t process(uint8_t* data, size_t bytes, int channels, uint32_t sampleRate,                 BitWidth bitWidth); private:  std::shared_ptr<AudioPipeline> activePipeline;  std::shared_ptr<CentralAudioBuffer> buffer;  std::mutex accessMutex;  std::vector<float> dataLeft = std::vector<float>(1024);  std::vector<float> dataRight = std::vector<float>(1024);  std::unique_ptr<AudioEffect> underflowEffect = nullptr;  std::unique_ptr<AudioEffect> startEffect = nullptr;  std::unique_ptr<AudioEffect> instantEffect = nullptr;  size_t samplesSinceInstantQueued;};};  // namespace bell
 |