#pragma once #include #include #include #include #include "SharedAudioBuffer.h" class HelperPluginHost { public: HelperPluginHost(); ~HelperPluginHost(); // Plugin lifecycle bool loadPlugin(const juce::String& path, double sampleRate, int blockSize); void unloadPlugin(); bool isLoaded() const { return plugin != nullptr; } juce::String getPluginName() const; int getParameterCount() const; // Audio processing (shared memory) void setSharedAudio(SharedAudioBuffer* shm, SharedSemaphore* inSem, SharedSemaphore* outSem); void startProcessing(); void stopProcessing(); // Parameters struct ParamInfo { int index; juce::String id; juce::String name; float value; juce::String displayText; }; std::vector searchParams(const juce::String& keyword) const; std::vector> getParams(const std::vector& ids) const; bool setParams(const std::map& values); // GUI void showGui(); void hideGui(); // State juce::String getStateBase64() const; bool setStateBase64(const juce::String& base64State); // Configure void configure(double sampleRate, int blockSize, int channels); // Param change callback std::function onParamChanged; private: void audioProcessingLoop(); juce::AudioPluginFormatManager formatManager; std::unique_ptr plugin; std::thread audioThread; std::atomic processing{false}; SharedAudioBuffer* sharedAudio = nullptr; SharedSemaphore* inputSem = nullptr; SharedSemaphore* outputSem = nullptr; double currentSampleRate = 44100.0; int currentBlockSize = 512; int currentChannels = 2; std::unique_ptr guiWindow; };