create

open suspend override fun create(stream: PlayerStreamInfo): AudioDecoder?

Prefers the platform's own decoder when one exists, and open is the ONLY place it may refuse.

The video path needs a whole replay machine to demote mid-stream, because an hwaccel can accept its attach and then fail on a later picture. Audio needs none of that: a named audio decoder either opens or does not, and at open nothing has been decoded, nothing delivered, and no timeline exists to rebuild. So the fallback is one retry on the native decoder, and the warning says which codec lost its platform path so the loss is visible rather than silent.

A failure here is not a playback failure. If BOTH opens fail, the second exception propagates exactly as it did before any of this existed, and the engine reports it typed.