#pragma once #include #include #include "Blocklist.h" #include "Constants.h" class McpServer; class PluginBridgeProcessor : public juce::AudioProcessor { public: PluginBridgeProcessor(); ~PluginBridgeProcessor() override; void prepareToPlay(double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock(juce::AudioBuffer&, juce::MidiBuffer&) override; juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override { return true; } const juce::String getName() const override { return "PluginBridge"; } bool acceptsMidi() const override { return true; } bool producesMidi() const override { return true; } double getTailLengthSeconds() const override { return 0.0; } int getNumPrograms() override { return 1; } int getCurrentProgram() override { return 0; } void setCurrentProgram(int) override {} const juce::String getProgramName(int) override { return {}; } void changeProgramName(int, const juce::String&) override {} void getStateInformation(juce::MemoryBlock& destData) override; void setStateInformation(const void* data, int sizeInBytes) override; // MCP bool isMcpServerRunning() const; int getMcpServerPort() const; // Plugin hosting (IN-PROCESS — plugin runs inside Ableton) void loadPlugin(const juce::String& path); void unloadPlugin(); bool isPluginLoaded() const { return hostedPlugin != nullptr; } juce::String getLoadedPluginName() const; int getLoadedPluginParamCount() const; juce::String getLastPluginPath() const { return pluginPath; } // Plugin list juce::Array getInstalledPluginFiles() const; // Blocklist bool isBlocked(const juce::String& path) const; Blocklist& getBlocklist() { return blocklist; } // Parameter access (for MCP server) 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); // For editor: get hosted plugin's editor component juce::AudioProcessorEditor* createHostedPluginEditor(); // Notify editor that plugin changed std::function onPluginLoaded; std::function onPluginUnloaded; std::function onLoadFailed; private: // In-process hosted plugin juce::AudioPluginFormatManager formatManager; std::unique_ptr hostedPlugin; juce::CriticalSection pluginLock; // MCP server std::unique_ptr mcpServer; // Blocklist (persisted to disk) Blocklist blocklist; // State juce::String pluginPath; double currentSampleRate = 44100.0; int currentBlockSize = 512; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginBridgeProcessor) };