NEXT PUSH:
TASK: Fix port 16620 priority regression
FILES CHANGING: Source/Plugin/McpServer.cpp (start() method only)
FILES NOT TOUCHING: all locked files β
NEW FILES: none"
Sprint 7: wire param callbacks in loadInProcessPlugin, clear in unloadInProcessPluginβ
When SAFE plugin loaded: searchParamCallback, getParamsCallback, setParamsCallback
route directly to inProcessPlugin. When unloaded: cleared to nullptr (falls back to Helper).
Pro-Q 4 GUI now updates instantly when AI sets parameters via MCP.
Sprint 7: McpServer.cpp β use param callbacks with Helper IPC fallback
Adds 3 param callbacks to McpServer. When SAFE plugin loaded in-process,
search/get/set_params go directly to inProcessPlugin. When UNSAFE (callbacks null),
falls back to Helper IPC. Pro-Q 4 GUI now updates when AI changes parameters."
fix: first instance always binds port 16620, fallback to auto-portβ
Sitar118+1: Claude Sonnet 4.6
19d5f13
Ensures Claude Code MCP registration (fixed at 16620) always works.
Second+ instances get OS-assigned ports, discoverable via list_instances().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat: channel name dropdown in Editor (Sprint 6 Part 5)β
Sitar118+1: Claude Sonnet 4.6
6b15202
Two-row header: row 1 = existing controls, row 2 = channel ComboBox.
30 channel items grouped into Vocals/Drums/Bass/Keys/Synths/Strings/FX/Buses/Custom.
Custom... opens AlertWindow for free-text entry. Selection calls
processorRef.setChannelName() which updates registry + MCP.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sprint 6: wire channelName, registry, and auto-port into Processor.cppβ
- Restored PluginBridgeEditor.mm to v0.5.2 (in-process createEditor, TreeView picker)
- Restored PluginBridgeProcessor.cpp to v0.5.2 (loadInProcessPlugin, safety scan, deduplication, manufacturer names, PBLOG)
- Added PluginPickerComponent.mm to CMakeLists.txt (was never registered)
- Wired AudioAnalyser into v0.5.2 processor (prepareToPlay, processBlock, getAnalysisCallback)
- Fixed AudioAnalyser: FFT is now a stored member, not created per audio block
- Updated MACHINE-CONTEXT.md: full scope rules, workflow, architecture lock, dead-end list
Root cause of regression: ML Intern rewrote Editor+Processor to add AudioAnalyser,
accidentally reverting to pre-v0.5.2 CALayerHost architecture (FAILED-APPROACHES #10).
MACHINE-CONTEXT.md now has explicit scope rules to prevent this.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Runs in processBlock (audio thread), stores results in atomics.
MCP get_analysis reads atomics from HTTP thread β zero contention.
Output format: "-14.2 LUFS | TP:-1.1 | sub:ok bass:+3 low:ok mid:ok hi:-2 brill:ok | W:0.72 | bright"
Max ~60 tokens per call."
fix: replace CARemoteLayerServer with CAContext+CALayerHost for cross-process GUIβ
Sitar118
0548359
Three bugs killed the GUI:
1. CARemoteLayerServer does not capture a hidden NSWindow's content cross-process.
Replaced with CAContext (server) + CALayerHost (client) β the correct private-but-stable
macOS API for cross-process layer embedding, stable from 10.10 through Sequoia.
2. NSWindow was never orderFront: β WindowServer never composited its content.
Fixed: window positioned at (-32000,-32000) and orderFront: called.
3. NSMachBootstrapServer (deprecated on 13+) no longer needed.
contextId (uint32_t) is sent directly over the existing IPC socket.
New file: Source/Shared/PrivateCA.h β declares CAContext, CALayerHost, CGSMainConnectionID.
fix: wire onGuiCreated callback in HelperIPC constructor to send gui_ready notification
HelperPluginHost now has onGuiCreated callback. HelperIPC sets it.
When showGui() finishes creating the editor + registering the layer,
it calls onGuiCreated which triggers sendGuiReady with port name + size.
fix: use setLayerPortName() instead of direct member access
COMPLETE REWRITE to proper solution:
- Plugin runs in Helper process (crash-safe, like v0.2)
- GUI renders in Helper via CARemoteLayerServer
- PluginBridge.vst3 displays it via CARemoteLayerClient (CALayer inside its own editor)
- Mach port transferred via NSMachBootstrapServer (named port per PID)
- Mouse/keyboard events forwarded from host β helper via Unix socket IPC
- Audio routes via shared memory (same as v0.2)
This gives BOTH crash safety AND GUI inside Ableton's window (including fullscreen).
Based on: Apple's CARemoteLayerServer/Client public API (macOS 10.7+)
Reference: krevis/RemoteLayerDemo on GitHub"
fix: Blocklist path corrected to ~/Library/PluginBridge/ (where JUCE actually writes)"
Bug 1: paths with spaces got split by tokenizer. Fix: join all args after --test.
Bug 2: some plugins need the JUCE message loop to finish loading (VST3 validation).
Fix: use a Timer to delay quit, giving the plugin time to initialize.