2018-10-07 03:40:25 +00:00
|
|
|
#pragma once
|
2016-06-09 21:33:26 +00:00
|
|
|
|
2016-06-11 00:47:02 +00:00
|
|
|
#include "audioeffectx.h"
|
2016-06-09 21:33:26 +00:00
|
|
|
#include "VSTEditor.hpp"
|
|
|
|
#include <memory>
|
|
|
|
#include "optional.hpp"
|
|
|
|
|
|
|
|
#include "amuse/BooBackend.hpp"
|
|
|
|
#include "amuse/Engine.hpp"
|
|
|
|
#include "amuse/IBackendVoice.hpp"
|
|
|
|
#include "amuse/IBackendSubmix.hpp"
|
|
|
|
#include "amuse/IBackendVoiceAllocator.hpp"
|
2016-06-13 05:47:07 +00:00
|
|
|
#include "AudioGroupFilePresenter.hpp"
|
2016-06-09 21:33:26 +00:00
|
|
|
|
2018-12-08 05:20:09 +00:00
|
|
|
namespace amuse {
|
2016-06-09 21:33:26 +00:00
|
|
|
class VSTBackend;
|
|
|
|
|
|
|
|
/** Backend voice allocator implementation for AudioUnit mixer */
|
2018-12-08 05:20:09 +00:00
|
|
|
class VSTBackendVoiceAllocator : public BooBackendVoiceAllocator {
|
2016-06-09 21:33:26 +00:00
|
|
|
public:
|
2018-12-08 05:20:09 +00:00
|
|
|
VSTBackendVoiceAllocator(boo::IAudioVoiceEngine& booEngine) : BooBackendVoiceAllocator(booEngine) {}
|
2016-06-09 21:33:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/** Actual plugin implementation class */
|
2018-12-08 05:20:09 +00:00
|
|
|
class VSTBackend : public AudioEffectX {
|
|
|
|
std::mutex m_lock;
|
|
|
|
std::unique_ptr<boo::IAudioVoiceEngine> m_booBackend;
|
|
|
|
std::experimental::optional<amuse::VSTBackendVoiceAllocator> m_voxAlloc;
|
|
|
|
std::experimental::optional<amuse::Engine> m_engine;
|
|
|
|
std::shared_ptr<amuse::Sequencer> m_curSeq;
|
|
|
|
int m_reqGroup = -1;
|
|
|
|
int m_curGroup = -1;
|
|
|
|
const AudioGroupDataCollection* m_curData = nullptr;
|
|
|
|
size_t m_curFrame = 0;
|
|
|
|
std::wstring m_userDir;
|
|
|
|
int m_routeChannel = -1;
|
|
|
|
AudioGroupFilePresenter m_filePresenter;
|
|
|
|
VSTEditor m_editor;
|
2016-07-14 04:54:46 +00:00
|
|
|
|
2016-06-09 21:33:26 +00:00
|
|
|
public:
|
2018-12-08 05:20:09 +00:00
|
|
|
VSTBackend(audioMasterCallback cb);
|
|
|
|
~VSTBackend();
|
|
|
|
AEffEditor* getEditor();
|
|
|
|
VstInt32 processEvents(VstEvents* events);
|
|
|
|
void processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames);
|
|
|
|
VstInt32 canDo(char* text);
|
|
|
|
VstPlugCategory getPlugCategory();
|
|
|
|
bool getEffectName(char* text);
|
|
|
|
bool getProductString(char* text);
|
|
|
|
bool getVendorString(char* text);
|
|
|
|
bool getProgramNameIndexed(VstInt32 category, VstInt32 index, char* text);
|
|
|
|
bool getOutputProperties(VstInt32 index, VstPinProperties* properties);
|
|
|
|
VstInt32 getNumMidiInputChannels();
|
|
|
|
void setSampleRate(float sampleRate);
|
|
|
|
void setBlockSize(VstInt32 blockSize);
|
2016-06-12 04:52:40 +00:00
|
|
|
|
2018-12-08 05:20:09 +00:00
|
|
|
amuse::Engine& getAmuseEngine() { return *m_engine; }
|
|
|
|
std::wstring_view getUserDir() const { return m_userDir; }
|
|
|
|
AudioGroupFilePresenter& getFilePresenter() { return m_filePresenter; }
|
2016-06-14 01:54:24 +00:00
|
|
|
|
2018-12-08 05:20:09 +00:00
|
|
|
void loadGroupFile(int collectionIdx, int fileIdx);
|
|
|
|
void setGroup(int groupIdx, bool immediate);
|
|
|
|
void _setNormalProgram(int programNo);
|
|
|
|
void setNormalProgram(int programNo);
|
|
|
|
void _setDrumProgram(int programNo);
|
|
|
|
void setDrumProgram(int programNo);
|
2016-06-14 08:04:37 +00:00
|
|
|
|
2018-12-08 05:20:09 +00:00
|
|
|
VstInt32 getChunk(void** data, bool isPreset);
|
|
|
|
VstInt32 setChunk(void* data, VstInt32 byteSize, bool isPreset);
|
2016-06-09 21:33:26 +00:00
|
|
|
};
|
2018-12-08 05:20:09 +00:00
|
|
|
} // namespace amuse
|