It's hard to detect what is available. The default device or port may not be found, but a user-specified one may work. Hence it'd be abusive to disable output.x if x appears to be unavailable. The same reasoning shows that our naive "preference" system doesn't work well enough.
A better solution would be to: (1) Always enable all supported I/O, as it is the case currently. (2) Have a prefered input/output that is always available, and has a different implementation depending on a detection done at runtime: if the default ALSA device seems to work, we can use ALSA I/O; if pulseaudio is available with default settings, we can use it; if everything fails, pick a dummy implementation; etc. Unfortunately this requires a little bit of code, including a system of detection plugins. If detection is done upon instantiation of output.prefered() we can rely on a setting to tweak the detection order. Detection results should be cached to ensure consistency – all input/output.prefered should rely on the same soundcard API and clock.