How to get the output level of any AudioProcessor in an AudioProcessorGraph?

In a channel-strip plugin, I’m using AudioProcessorGraph to connect various AudioProcessor nodes sequentially; for example filter → compressor → distortion. The nodes are implemented as ProcessorBase, as in the cascading audio-effects tutorial, and added to the graph in a simplified manner. I’d like to be able to get the output level of each processor in the chain periodically, for level-metering and other visualizations.

I’ve looked at a few approaches to level metering, including this great demo which uses a FIFO queue to get AudioBuffers from the audio thread and function pointers to get the Level Data to multiple UI meters, each with their own timer. However, it doesn’t utilize AudioProcessorGraph, so I’m currently seeing if this can be converted to use the Graph architecture.

Earlier, I attempted to use an APVT float parameter, and a std::atomic<float>, to communicate between UI thread and AudioThread. However this resulted in various errors, such as read access violation, and didn’t seem like a good design overall.

If relevant, my UI is constructed in the PluginEditor and uses APVT and SliderAttachment to let sliders control parameters like filter frequency, gain, etc.

Anyway, let me know if you have a preferred approach for getting the output level from the nodes in a AudioProcessorGraph. Any thoughts on architecture, performance, or other trade-offs much appreciated!