#pragma once #include "Dsp.h" #include "IQueuedWork.h" #include "RingBuffer.h" #include "Runnable.h" #include "Singleton/PortAudioAPI.h" #include "QueuedThreadPool.h" #include "HAL/ThreadingBase.h" class FPluginHost; class FInstrumentRenderThread : public IQueuedWork { public: FInstrumentRenderThread(FPluginHost* InPluginHost, int32 InFrameNum, TAtomic& InCounter) : PluginHost(InPluginHost), FrameNum(InFrameNum), Counter(InCounter) { } virtual void DoThreadedWork() override; virtual void Abandon() override { --Counter; delete this; } private: FPluginHost* PluginHost; int32 FrameNum; TAtomic& Counter; }; class FAudioRenderThread : public FRunnable { public: FAudioRenderThread(); virtual bool Init() override; virtual uint32 Run() override; virtual void Stop() override; virtual void Exit() override; void SetBlockSize(int32 InBlockSize) { BlockSize = InBlockSize; Size = BlockSize * 16; Buffer.SetCapacity(Size); } float SampleRate; int32 BlockSize; uint32 Size; Audio::TCircularAudioBuffer Buffer; private: std::atomic IsRunning; FQueuedThreadPool* ThreadPool; };