Description
I often come across the desire to monitor a Signal
that is running on the audio thread, from the GUI thread. Normally the kinds of signals I want to monitor are control signals (like Peak
or Rms
) generated by an adaptor around some signal.
I normally end up designing a custom Signal
adaptor to do this depending on the task.
I often want to sample the signal I'm monitoring at a much lower rate than the audio sample rate. E.g. if I want to monitor a 44100hz audio signal in a GUI that is running at 60hz, I only want a "snapshot" of the audio signal every 735 audio frames as I can't physically see the monitored values faster than this anyway.
This rate issue is a large contributor to the awkwardness involved with these monitoring implementations and I think could possibly be addressed at a lower level. That is, it would be nice to have abstractions for safely and predictably pulling values from a Signal
at varying rates.
Signal::bus
could be considered a step in this direction, but has caveats. Firstly, Bus
is designed for use on a single thread (it uses Rc
and RefCell
internally for sharing the ring buffer between output nodes). Secondly, when requesting from a Bus
's Output
nodes at different rates, the internal ring buffer will grow infinitely large with values that have not yet been collected by the slower Output
.
One could work around the second issue by reducing the sample rate (e.g. calling Signal::from_hz_to_hz
) on the slower Output
node to the rate at which it should be called. This would go a long way to fixing the issue, but the same problem will occur if the rate is inconsistent/unreliable or if some drift occurs (which will almost always be the case if frames are being requested from different threads). This same problem applies when a user requires outputting a single audio signal to more than one audio hardware device.