495. The audio drain was arithmetic
2026-09-10 - loop, continuing 494
Every audio conformance check passes - eight of eight. Against the matching hardware leg the checks where hardware passes and orbistoun does not went from ten to five, and orbistoun now passes 174 against hardware's 167.
Five failures, one cause
090-audio/blocking, format-selector,
oops-sdk-pcm, open-shapes and
volume-flag all cascaded from sceAudioOutOpen
never opening a port. The check messages said so plainly - "no
selector opened a port", "a port would not open for the volume
run".
It was unimplemented on purpose. This crate's own header says why: no backend, and a port that opens but never drains hangs a title waiting on buffer completion, with silence as the only clue (D171).
The drain turned out not to need a device.
090-audio/blocking times eight 512-frame buffers on
hardware - 57 ms - which says output blocks, and how long is arithmetic
on the sample rate. That is what made opening honest, and the rest
followed from measurements already taken: which formats open, what a
refusal answers, what the port state holds (D672).
Surprises
A real sleep is invisible to the guest unless the clock is
told. First run with everything in place,
090-audio/blocking still reported 1 µs and
read as not blocking - while sceAudioOutOutput was
returning 0x200, so it was plainly running and plainly
sleeping. The guest's clock is logical by default, a microsecond per
read, so a run repeats (D582). Eight buffers that really slept 85 ms
read as 8 µs.
clocks::advance exists for exactly this and was added
when usleep was caught doing the same thing. Same hazard,
same fix, one subsystem over. Worth carrying as a rule: every
call that makes time pass has to say so, and no amount of
reading the sleep code would have shown it - only the check did.
The format split is on the frequency alone. 48 kHz accepted at four chunk sizes, 44.1 kHz refused at all four. Chunk size decided no measured case, so the shim decides on nothing else - refusing an unmeasured chunk would be inventing a rule the data does not contain.
Selector 0 is mono. Measured, not read off a header: the three port-state images differ in exactly one byte and obSCEne reads offset two as the channel count.
What is left
Five checks where hardware passes and orbistoun does not:
080-video/visual-flip- skip, no scanout111-modlink/walk- skip, noDT_DEBUG101-input-ext/mouse-read- partial130-layout/system-software-version- partial900-surface/control- the one outright failure
No sibling has answered any of the five requests filed to obSCEne or the two to Prosperous.
Next
900-surface/controlis the only outright failure left and has not been looked at.111-modlink/walkand theunknown-gpucontext label are the sameDT_DEBUGpiece.category::presentis still built and uncalled, three turns running.