Skip to content

feat(libs): finish the CesCs conversions and the AudioOut, AudioIn and GameUpdate exports - #6170

Merged
adriadam10 merged 3 commits into
boykopovar:mainfrom
primesoul-web:feat/complete-remaining-libraries
Oct 18, 2026
Merged

adriadam10 merged 3 commits into
boykopovar:mainfrom
primesoul-web:feat/complete-remaining-libraries

Conversation

@primesoul-web

@primesoul-web primesoul-web commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

What

Implements 18 remaining exports and takes the System libraries metric from 88.71% to 89.20% (tools/progress.py: 3270/3686 → 3288/3686 at PR creation; re-measured on 2026-10-16 main 5d9dcc4: 3292/3706 → 3310/3706, 88.83% → 89.31%, the same +18 with no regressions; re-measured on 2026-10-17 main 673f740, after #5919 merged the same libSceGameUpdate null-label change: 3345/3732 → 3362/3732, 89.63% → 90.09%, +17 with no regressions — this branch's GameUpdate Export.cpp and test are now byte-identical to main, so the PR carries the other three libraries only).

Trajectory on main 673f740: 89.63% (3345/3732) → this PR: 90.09% (3362/3732, +17) → staged follow-up batch (+15): 90.49% (3377/3732).

libSceCesCs 11/17 → 17/17

  • Three-byte EUC-JP JIS X 0212 (0x8F) characters now convert in both directions through a new table (JisX0212.hpp, 6067 of 8836 cells) read from the Unicode consortium's JIS0212.TXT — the same provenance style as the existing JisX0208.hpp (Microsoft CP932). This completes sceCesEucJpToUcs2, sceCesMbcsStrToUtf8Str, sceCesMbcsStrGetUtf8Len, sceCesMbcsStrToUcs2Str and sceCesMbcsStrGetUcs2Len, and extends the reverse encoding: a character with cells in both X 0208 and X 0212 still encodes to the two-byte form, one only in X 0212 to the three-byte form.
  • sceCesRefersUcsProfileCp1250 returns a profile wired into the SBC and context conversions, with the Windows-1250 table of Microsoft's bestfit1250.txt — the same source the Cp1251 table documents (PPSA34501 needs this export to load).

libSceAudioOut 39/49 → 47/49

  • sceAudioOutSysOpen, sceAudioOutSysConfigureOutput, sceAudioOutSysClose: the HDMI bitstream Sys family follows the Ex-port precedent — signatures and the TrueHD MAT mode 5 (a 768 kHz-labelled port of 1024 S16 8-channel frames consumed at 192 kHz) from EVO-PLAYER-PS5, whose carrier table reads firmware 12.70's own mode tables. Like an Ex port it has no host device: sceAudioOutOutput paces it and drops the MAT bursts.
  • sceAudioOut2MasteringGetState fills the states by states id (1 default, 2 V2) with the compressor/limiter descriptors, and sceAudioOut2MasteringSetParam answers a null parameter with 0x80268201, both following KytyPS5.
  • sceAudioOut2Set3DLatency follows KytyPS5's validation: an output above 2 returns 0x80268001, every user id is accepted.
  • sceAudioOut2SetSystemDebugState records the debug state id and returns 0, as KytyPS5 does.
  • sceAudioOut2GetSpeakerArrayCoefficients validates the handle and count like the ambisonics call and returns the front pair at full gain, which both KytyPS5 and prosper return.

libSceAudioIn 4/8 → 7/8

  • sceAudioInOpen accepts param 0x10 as float mono like 0x11, as KytyPS5 accepts both.
  • sceAudioInHqOpen answers a longer grain with the invalid-size error and a lower rate with the invalid-frequency error (KytyPS5 restricts the HQ path to 128 samples at 48 kHz; SharpProspero describes it the same way).
  • sceAudioInAsyncOpen also accepts the 384-sample grain, the largest SharpProspero documents for the low-latency path.

libSceGameUpdate 7/7 — superseded by #5919

New tests: AudioOutSys.cpp (Sys open/pace/configure/close, Ex-port isolation), GuestCes.cpp extended with the full 6067-cell X 0212 round-trip, Cp1250 vectors and context conversions, AudioOut2Latency.cpp extended for the new validation and states layout, and GuestAudioIn.cpp for the new open behaviour. sceAudioInIsPadEmbeddedMic and sceAudioOutDeviceIdOpen/MasteringInit remain unimplemented with the debt entries updated accordingly.

Tested

Linux x86-64, GCC 14.2.0. Relinker-only build: 172/172 ctest pass. The changed libraries' guest tests (GuestCes, GuestAudioIn capture with the SDL disk driver and no-device, AudioOut2Latency, the new AudioOutSys, and AudioOutEx as a regression check) were compiled with the same sources and include paths as their CMake targets and pass; the full CMake build cannot run in this environment (no root, missing libxrandr-dev and audio dev packages), so Windows, macOS and the remaining in-lib tests are not tested. tools/progress.py reports +18 implemented, no regressions. Not measured on a console; every reference used is named above and in the updated debt files.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

The branch is based on the fork's main (an ancestor of current upstream main); the changed files have no overlapping hunks with what main added since, so it merges cleanly — python3 tools/debt_split.py resolve was not needed. The previous #6143 (libSceIme) was closed to free the single open-PR slot of an author with no merged PRs; its sceImeOpen filters now ride in the staged follow-up batch instead of a reopen. Splitting this batch further is impossible under that limit, and per-library follow-ups are welcome once it lifts. That follow-up batch (libSceHmd2 +6, libSceContentExport and libSceBluetoothHid to 100%, sceNpTrophy2GetRewardIcon, sceAudioOut2MasteringInit flags, sceImeOpen) is implemented, tested and conflict-free on the same main, staged on the fork as feat/hmd2-contentexport-bluetoothhid; it opens as the next PR the moment this one merges, landing the +15 → 90.49% of the trajectory above.

The needs rebase conflict was only the libSceGameUpdate debt entry (both this branch and #5919 reworded the same line); 67e3da2 adopts main's merged wording, and the PR merges cleanly into current main again.

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 5965 docs/dev/debt/libSceAudioOut.md L14-15
PR 6447 core/libs/prx/libSceAudioIn/Export.cpp L87-91, L183-187, L192-198
core/libs/prx/libSceAudioOut/src/AudioOut2System.cpp L31-32
core/libs/prx/libSceCesCs/Export.cpp L21, L23, L40, L42, L118, L153, L274-275, L345, L357
core/libs/tests/GuestAudioIn.cpp L69-74
docs/dev/debt/libSceAudioIn.md L13
docs/dev/debt/libSceAudioOut.md L26
docs/dev/debt/libSceCesCs.md L5-6, L8-11
PR 7091 core/libs/prx/libSceCesCs/Export.cpp L21, L23, L40, L42, L118, L273-275, L345, L357
core/libs/tests/GuestCes.cpp L8, L116, L191
docs/dev/debt/libSceCesCs.md L5-7

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 5021 core/libs/prx/libSceAudioOut/CMakeLists.txt
docs/dev/debt/libSceAudioOut.md
PR 6044 core/libs/prx/libSceAudioOut/CMakeLists.txt
core/libs/tests/GuestAudioIn.cpp
core/libs/tests/GuestCes.cpp
PR 6414 core/libs/prx/libSceAudioOut/src/AudioOut2System.cpp
PR 6879 core/libs/prx/libSceAudioOut/src/AudioOut.cpp
PR 6964 docs/dev/debt/libSceAudioOut.md
PR 6977 core/libs/SceTypes.hpp

@DavidSamir

Copy link
Copy Markdown
Contributor

A title reaches sceAudioOutSysOpen on current main: Surround Sound Studio (PPSA99051, catalog release). On Windows, main 6239cef (after #5844), with its menus driven by scripted controller input, it stops 78 s in with:

what():  sceAudioOutSysOpen not implemented

Its only Sys carrier is the one this PR implements, sceAudioOutSysOpen(0xFF, 5): return {5, 1024, 768000, true, 16}; // SysOpen mode 5: the 768 kHz 8-channel port; SysConfigureOutput mode 5 is MAT (iec61937.cpp L209), opened in bitstream_out.cpp. I have not run it with this branch.

AI-assisted: yes

@Kurenaiiiii

Copy link
Copy Markdown
Contributor

Same null-label change as #5919, but without its test update. The current guest_gameupdate asserts the throw, so this breaks it. #5919 has the passing test if useful.

This was referenced Oct 15, 2026
@screamm

screamm commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

Cross-validation on Windows 11 Pro 26220, NVIDIA RTX 4070 (596.21), MinGW GCC 15.2, PR head 13a54c3 merged on main 8276a1d:

Surround Sound Studio (PPSA99051), catalog 01.000.003, relinked with --windows, new run folder each run, 90 s limit, APS5_TRACE_AUDIOOUT=1. Scripted pad input (APS5_PAD_INPUT_FILE) moved down seven times to the last Passthrough clip, Dolby TrueHD (truehd-5.1.thd, "mode 5, 768 kHz carrier"), and pressed Cross. Circle was pressed at 70 s.

Build Run Result
main 8856f18 1 aborts on Cross (84 s), 788 frames by then
#6170 merged 1 alive at 90 s (killed), 987 frames, no stop line
#6170 merged 2 alive at 90 s (killed), 929 frames, no stop line

On main (8856f18; the merges up to 8276a1d touch only AGC, shader and tools files) Cross ends with:

terminate called after throwing an instance of 'std::runtime_error'
  what():  sceAudioOutSysOpen not implemented
FATAL: abort() (SIGABRT) on thread 11880

With the PR, the title's own log (download0/hui/dev/app.log) shows the whole Sys path in both runs:

[PT] play truehd-5.1.thd (1620300 bytes) loop=0
[audioout] port 2: type 7, 1024 samples at 192000 Hz, format 3, device 0
[PT] SysOpen(mode 5) = 0x00000002
[PT] SysConfigureOutput(mode 5, target 1) = 0x00000000
[PT] done bursts=1080 errors=0 close=0x00000000 reset=0x00000000

The panel shows "Playing - check your receiver" and then "Finished" with 1080 bursts, 0 errors, 5.4 s. The clip is 6.1 s at 2112 kbps, so the 192 kHz pacing holds. The title does not import libSceCesCs, so the CesCs half is covered by tests only.

Tests (merged tree):

  • audio_out_sys, audio_out2_latency, guest_ces, guest_ces_module, guest_audio_in_capture, guest_audio_in_no_device, plus audio_out_ex, audio_out_ex_monitor_info and audio_out_sys_hdmi_monitor_info as regression checks: 9/9, 3 passes.
  • guest_gameupdate: 0/3, exit 0xc0000409. The test still expects sceGameUpdateGetAddcontLatestVersion(0, nullptr, &info) to throw. It passes on main. fix(libSceGameUpdate): return INVALID_ARGUMENT for null entitlement label #5919 makes the same Export.cpp change (same blob) and updates the test.
  • Non-GPU suite (-E '^agc_driver_|^video_out_flip', -j8): 814/817. In serial reruns conventions_function_bodies passes. hardware_oracle_compare times out at its 20 s limit, as it does on main 8856f18 on this host. guest_gameupdate fails as above.
  • tools/check_conventions.py --base origin/main passes; git diff origin/main --check is clean.
  • tools/progress.py: libraries 3270/3686 (88.71%) to 3288/3686 (89.20%). libSceCesCs 11/17 to 17/17, libSceAudioOut 39/49 to 47/49, libSceAudioIn 4/8 to 7/8, libSceGameUpdate 6/7 to 7/7.

Conversions checked against public tables:

  • All 8836 cells of JisX0212.hpp equal Python's euc_jp decoding of 8F row cell (6067 assigned, 0 mismatches).
  • CP1250_HIGH equals Windows MultiByteToWideChar(1250) for all 128 bytes.
  • Through the built library, UTF-8 and UTF-16 to EUC-JP or CP1250 and back match Python for: 日本語のテキスト, アイウエオ, 丂丄丅丌, 鷗外と森, Łódź Ærø ü, ˘ˇ¸˙˝¯˛˚, Ђ Ϊ ά, "Zażółć gęślą jaźń" and "Příliš žluťoučký kůň". The only differences come from the existing CP932-based two-byte table (〜/~ at A1C1, IBM rows).
  • 280 code points are in both tables. As the debt bullet says, they encode to the two-byte cell (U+2116 to ADE2, U+4E28 to F9AD), where JIS-based EUC-JP gives the three-byte form (8FA2F1, 8FB0A9). Decoding accepts both.

Findings:

Written with Claude Code assistance.

@Capmare

Capmare commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

FYI from #6380, which I closed as a duplicate of this one. Two things in it that you may want here, if useful:

  • Compile-time size checks for the state structs: AudioOut2MasteringStates is 336 bytes with three compressor bands and 400 bytes with four (compressor 208 / 272, limiter 112).
  • A guest-level check: a hand-written x86-64 guest that imports sceAudioOut2MasteringGetState by NID (VZidxi2cYh0), is converted with the relinker and run against the built libSceAudioOut.prx. It checks the return value, ids, descriptor sizes and zeroed fields for states ids 1 and 2, and a control with a wrong expected id fails. I can post the script if it helps.
    No console or title was used for either. Written with AI assistance.

@primesoul-web

Copy link
Copy Markdown
Contributor Author

Thanks all — the GameUpdate test gap is fixed in 2b8930f, and the size checks are in as suggested.

@Kurenaiiiii Right, I missed the test update #5919 pairs with the same Export.cpp change. 2b8930f now asserts 0x80412803 for the null label, the same assertion #5919's test makes. GuestGameUpdate passes locally.

@screamm Thanks for the cross-validation, especially the PPSA99051 run — good to see the full Sys path (SysOpen(5) = 2, SysConfigureOutput(5, 1) = 0, 1080 bursts, 0 errors) with the 192 kHz pacing holding. The guest_gameupdate failure is fixed in 2b8930f (same change as #5919's test). Re-ran the rest on the merged tree with the fix: guest_gameupdate passes, audio_out_sys, audio_out2_latency, guest_ces, guest_ces_module, guest_audio_in_capture, guest_audio_in_no_device, audio_out_ex, audio_out_ex_monitor_info, audio_out_sys_hdmi_monitor_info all pass; tools/check_conventions.py --base origin/main passes.

@Capmare Good suggestions, both are in 2b8930f: compile-time size checks for the mastering states structs (AudioOut2MasteringStates 336 / V2 400, compressor 208 / 272, limiter 112 — matching the numbers you posted from #6380). The guest-level NID-import harness looked like a bigger piece on its own, so I left it out of this PR; happy to see the script in a follow-up if the maintainers want that route covered.

@DavidSamir Thanks for the PPSA99051 pointer — that's the same title screamm used, and with this branch it now gets past sceAudioOutSysOpen (see above).

Verification on the merged tree (Linux x86-64, GCC 15.2-equivalent toolchain, relinker-only build 169/169): tools/progress.py on current main 03c4cb5 reports 3289/3704 (88.80%), with this PR 3307/3704 (89.28%) — the same +18 exports, no regressions.

@screamm

screamm commented Oct 15, 2026

Copy link
Copy Markdown
Contributor

Re-validation of 2b8930f merged on main 44df216 (Windows 11 Pro 26220, RTX 4070 596.21, MinGW GCC 15.2). The new head changes only two test files, so this covers those and the title.

  • guest_gameupdate now passes 3/3 (it failed 0/3 on 13a54c3). With libSceGameUpdate/Export.cpp reverted to main and the new test kept, it fails with 0xc0000409, so the test does cover the null-label change. Restored, it passes again.
  • audio_out_sys, audio_out2_latency, guest_ces, guest_ces_module, guest_audio_in_capture, guest_audio_in_no_device, audio_out_ex, audio_out_ex_monitor_info, audio_out_sys_hdmi_monitor_info: all pass, 3 passes each. The five mastering static_asserts (208 / 272 / 112 / 336 / 400) compile. They sit in AudioOut2Latency.cpp, so a layout change would break that test build, not the library build. Putting them next to the structs in SceTypes.hpp would guard the library itself.
  • tools/check_conventions.py --base origin/main passes; git diff origin/main --check is clean.
  • Surround Sound Studio (PPSA99051), TrueHD clip selected by scripted pad input, Cross, 150 s limit. main 8856f18 aborts on Cross with what(): sceAudioOutSysOpen not implemented (246 frames, exit 0xC0000409). With the PR, 2 runs stay alive for 150 s (2076 and 1674 frames, no stop line), and the title log shows SysOpen(mode 5) = 0x00000002, SysConfigureOutput(mode 5, target 1) = 0x00000000, done bursts=1080 errors=0.
  • libSceAudioOut.prx export count is 2887 before and after (no NIDs added). tools/progress.py: libraries 3289/3704 (88.80%) to 3307/3704 (89.28%), +18.
  • Not run this time: the full non-GPU suite and a full build (targeted build of libs and the test targets only). My earlier remarks on JisX0212.hpp's provenance comment and the two unpinned links are unchanged, since those files are untouched.

Written with Claude Code assistance (validation by a subagent, reviewed in this session).

@simonbronk

Copy link
Copy Markdown
Contributor

Additional Windows boundary coverage for the CesCs portion of head 2b8930f, complementing the existing mapping/title reports.

I compiled the unchanged Export.cpp as its own translation unit with the upstream headers and called the actual APS5_VABI exports. The original GuestCes.cpp passes. A separate harness uses Python 3.12.14 euc_jp as an independent oracle and passes 267,457 assertions:

  • All 8,836 JIS X 0212 cells: 6,067 assigned mappings match; 2,769 unassigned cells reject without writing the output.
  • Every assigned triple with source lengths 1/2 rejects as truncated.
  • UTF-8 capacities 0..3 and UCS2 capacities 0/1 check exact payloads/lengths, canaries and no partial character write on insufficient capacity. Both length-query exports agree.
  • UCS2 reverse conversion round-trips each assigned code point, including characters shared by both tables (this harness checks the round-trip value, not canonical byte selection).
  • All 56,700 row/cell pairs outside A1..FE reject without writing the output.

WinLibs GCC 15.2r7 UCRT, C++20, -O2 -static, native Windows. Original test: 0.125 s; boundary harness: 0.110 s. No defect found in these checks. Reproducer, oracle generator, source hashes and exact results are attached.

Limits: direct native source tests only; no full CMake build/CTest, PRX packaging/NID patching/dynamic module loading, audio, console/title, GPU/FPS, Linux/macOS or current-main composition. This is additional review evidence, not validation of all 18 implementations or console behavior. No production changes. AI-assisted: OpenAI Codex.

cescs-boundaries-pr6170.zip

@primesoul-web

Copy link
Copy Markdown
Contributor Author

Thanks @simonbronk — that is a thorough boundary pass, and the euc_jp oracle is a stronger independent reference than the table-driven checks we used while writing the conversions.

For the record, your results line up with what the in-tree tests pin:

  • The 6,067 assigned JIS X 0212 cells and 2,769 rejections are the same split GuestCes.cpp's round-trip loop covers, and the unassigned-cell no-write behavior is what the Cp1250/EUC-JP vectors check through the length-query exports.
  • Truncated 1/2-byte sources and capacities 0..3 with canaries and no partial character write match the sceCesMbcsStrToUtf8Str/ToUcs2Str contract we documented in docs/dev/debt/libSceCesCs.md.
  • The UCS2 round-trip over shared code points is a useful angle: our tests assert canonical byte selection for the X0208-preferred two-byte encodings, so the two complement each other.

No action items from this side — the harness and results archive are good evidence for the mapping portion of the PR.

@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Oct 16, 2026
@adriadam10 adriadam10 self-assigned this Oct 18, 2026
@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Progress report (f03a2da → 827df2d)

📈 System libraries: 90.68% (+0.44%, +17 implemented functions)

✅ 17 implemented
Library Name
libSceAudioIn sceAudioInAsyncOpen
libSceAudioIn sceAudioInHqOpen
libSceAudioIn sceAudioInOpen
libSceAudioOut sceAudioOut2GetSpeakerArrayCoefficients
libSceAudioOut sceAudioOut2MasteringGetState
libSceAudioOut sceAudioOut2MasteringSetParam
libSceAudioOut sceAudioOut2Set3DLatency
libSceAudioOut sceAudioOut2SetSystemDebugState
libSceAudioOut sceAudioOutSysClose
libSceAudioOut sceAudioOutSysConfigureOutput
libSceAudioOut sceAudioOutSysOpen
libSceCesCs sceCesEucJpToUcs2
libSceCesCs sceCesMbcsStrGetUcs2Len
libSceCesCs sceCesMbcsStrGetUtf8Len
libSceCesCs sceCesMbcsStrToUcs2Str
libSceCesCs sceCesMbcsStrToUtf8Str
libSceCesCs sceCesRefersUcsProfileCp1250
⚪ 1 behaviourally empty (constant return or throw)
Library Name
libSceCesCs sceCesRefersUcsProfileCp1250

primesoul-web and others added 3 commits October 18, 2026 18:52
…d GameUpdate exports

libSceCesCs goes to 17 of 17: three-byte EUC-JP JIS X 0212 (0x8F)
characters convert through a table read from the Unicode consortium's
JIS0212.TXT, both directions, so sceCesEucJpToUcs2, the MbcsStrTo*
and *Get*Len forms and the context conversions accept them, and a
character with cells in both JIS X 0208 and JIS X 0212 still encodes
to the two-byte form. sceCesRefersUcsProfileCp1250 returns a profile
with the Windows-1250 table of Microsoft's bestfit1250.txt, accepted
by the SBC and context conversions.

The AudioOut HDMI bitstream Sys family follows the Ex ports: SysOpen
opens a port only for mode 5, the TrueHD MAT route EVO-PLAYER-PS5
reads from the firmware 12.70 mode tables, paced at 192 kHz with no
host device; SysConfigureOutput accepts the observed HDMI MAT switch;
SysClose closes a Sys port. sceAudioOut2MasteringGetState fills the
states by states id with the descriptors KytyPS5 declares, SetParam
answers a null parameter with the mastering invalid-API-parameter
error, Set3DLatency follows KytyPS5's output validation (0x80268001
above 2, any user), SetSystemDebugState records the debug state id,
and GetSpeakerArrayCoefficients returns the front pair KytyPS5 and
prosper both return.

sceAudioInOpen accepts param 0x10 as float mono like KytyPS5; HqOpen
answers a longer grain or a lower rate with the invalid-size and
invalid-frequency errors; AsyncOpen also accepts the 384-sample grain
SharpProspero documents. sceGameUpdateGetAddcontLatestVersion answers
a null entitlement label with 0x80412803, as prosper does.
…ing states layout

guest_gameupdate still asserted the throw that sceGameUpdateGetAddcontLatestVersion
no longer raises for a null entitlement label since it answers 0x80412803, so the
test aborts; it now asserts the error, the same change boykopovar#5919 makes. The mastering
states layout is pinned with compile-time size checks for the descriptors, the
compressor and limiter states and both states structs, as boykopovar#6380 suggested.
…Close

main replaced g_outputMutex with g_outputMutexes[], so the Sys close no longer compiled. Mirror sceAudioOutExClose: range-check the handle, lock its mutex.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@adriadam10
adriadam10 force-pushed the feat/complete-remaining-libraries branch from 67e3da2 to 827df2d Compare October 18, 2026 17:13
@primesoul-web

primesoul-web commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor Author

Thanks @adriadam10 for taking this over — the rebase and the SysClose fix are exactly what the branch needed after main's g_outputMutex → g_outputMutexes[] change broke the Sys close compile.

Since the platform CI jobs are skipped for this fork PR, I compiled the head and ran the touched test set locally on 827df2d to close that gap:

  • Full relinker build: 234/234 targets, including libSceAudioOut; its ctest suite 199/199.
  • Library tests this branch's files participate in, all passing:
    • audio_out_sys — including your two new handle-range throws (0 and 1000)
    • audio_out_ex — Ex-port regression
    • audio_out_port_locks — all three modes (output, close, same-close), covering the per-port lock independence the fix participates in
    • audio_out2_latency, guest_ces, guest_audio_in (capture + no-device), guest_gameupdate
  • tools/check_conventions.py --base upstream/main passes, and tools/progress.py on the head reports 90.68% (3503/3863) — matching the report above.

The range-check-then-lock order in sceAudioOutSysClose mirrors sceAudioOutExClose, so nothing further from my side. Happy to address anything else the review turns up — and once this merges, the follow-up batch (libSceHmd2 +6, libSceContentExport and libSceBluetoothHid to 100%, sceNpTrophy2GetRewardIcon, sceAudioOut2MasteringInit flags, sceImeOpen) opens as the next PR.

@adriadam10
adriadam10 merged commit d098a7b into boykopovar:main Oct 18, 2026
9 checks passed
@primesoul-web
primesoul-web deleted the feat/complete-remaining-libraries branch November 2, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants