2024-01-25 11:21:15 +08:00

47 lines
1.1 KiB
C++

#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<int32>& InCounter) :
PluginHost(InPluginHost), FrameNum(InFrameNum), Counter(InCounter)
{
}
virtual void DoThreadedWork() override;
virtual void Abandon() override { --Counter; delete this; }
private:
FPluginHost* PluginHost;
int32 FrameNum;
TAtomic<int32>& 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<SampleType> Buffer;
private:
std::atomic<bool> IsRunning;
FQueuedThreadPool* ThreadPool;
};