Async UI update from audio thread