Does synchronous Rust (with no runtime and no tokio) have a cross-platform way for a parent thread (eg. a GUI) to wait for messages either from user input or a child thread (eg. audio device changed), and/or a child thread to wait for messages either from IO (eg. audio buffers ready to fill) or other sources (eg. audio timeout or cancellation as you mentioned)? In C++ on Windows you'd use WaitForMultipleObjects, on Unix you'd use poll on hardware/event file descriptors, Crossbeam channels have a select macro but I'm not sure if it's as real-time as WaitForMultipleObjects (officially recommended for WASAPI) or poll (officially recommended for ALSA), and it probably doesn't work outside of channels?