06661566dd
`omp say` for a short single-segment clip printed `spoke` but produced no sound on hosts where the first streaming backend (bundled ffmpeg without a pulse/alsa output device) spawns then exits nonzero. The single pipe write succeeds into the OS buffer before the backend dies, so the drain's broken-pipe replay never fires, and `player.end()` sets `#inputClosed` before the exit lands, so the early-exit handler short-circuits and never advances to paplay/aplay. The end-of-stream cleanup awaited the exit but ignored its code. StreamingAudioPlayer now retains the utterance PCM and, when the streaming backend exits nonzero, replays it through per-file playback so short clips still reach the speakers. Added injectable backend/file-playback seams and a regression test exercising the nonzero-exit, clean-exit, and no-backend paths. Fixes #5875