Files
AnyPS5/docs/dev/debt/libSceAudioPropagation.md
T
Dean 8902eb56f7 Merge pull request #12851 from xdCloudy/feat/libSceAudioPropagation-introspection-9
feat(libSceAudioPropagation): implement report and system APIs
2026-11-05 08:19:26 +13:00

8.0 KiB

libSceAudioPropagation technical debt

Additional callable exports

  • Additional callable exports - 8 entries present in both version-labelled images are import-resolution declarations only. Neither label independently authenticates retail firmware provenance. Parameter lists, return types and behavior are unverified; parameterless int declarations are placeholders, not verified ABI contracts. Every entry throws through NotImplemented_nid_no_patch. Unidentified names use literal NID aliases. No runtime functionality is implemented. Data exports require separate layout and ownership analysis. Identified candidate names match their NIDs in the public symbol database or supplemental catalog.
Name NID
sceAudioPropagationSourceQueryAudioPaths yW8FldaufkU
Unknown TrQMW7ARZXY
Unknown ZSdiF+pXrF8
Unknown fOTrQvqzABM
Unknown fhMkXxnE8aw
Unknown laU0fM-tTsc
Unknown mdH4mANi9GI
Unknown o0gGIp1vd6A

Silent stubs

  • libSceAudioPropagation lacks acoustic propagation: attributes have no effect, sources expose 36 initially empty, invalid path slots and no rays, rendering preserves the destination mix without adding path contributions, and allocated CPU work memory is mostly unused. Ray results and audio paths accept empty lists and throw otherwise; sceAudioPropagationSourceCalculateAudioPaths returns the initial native validation errors, then goes through NotImplemented_nid_no_patch, as propagation is not implemented. Room, portal, source and material handles are tracked, but destruction after their system is destroyed silently succeeds without native lifetime semantics being confirmed. Occlusion, reflections and reverb are absent.

Unknown function info

  • sceAudioPropagationSourceSetAudioPath: native evidence establishes a 64-bit path handle, a read-only 224-byte path description and a float gain. The four 48-byte points contain a room handle, gain and position; trailing eight-byte fields remain opaque. Updates copy the description and validate room ownership. Each source owns 36 initially invalid, empty slots, following public SharpProspero MaxPaths and SAROS's immediate lookup of slot 0. Allocation before calculation, the count of 36 and update validation precedence are inferred, not measured on a console. Native lookup error codes and their handle/null/index precedence are retained. Source/system destruction invalidates owned slots. Active nonempty path rendering still throws.
  • libSceAudioPropagation: system options use a recovered 56-byte record; the field at byte 24 and final eight bytes remain semantically unresolved. CPU memory requirements and option limits are recovered; GPU memory queries throw because their platform-specific runtime condition is unresolved. Descriptor validation, ray ownership and path generation are unimplemented. Native rendering accepts multiple mutable records; the host accepts public formats 0/1/2/4/5 (4/9/16/8/8 float channels), preserves the output mix without path contributions and clears the returned channel count; non-format-2 behavior remains unverified on a console. Frame capacity and source-count limits follow the recovered options. Other formats throw; native validation precedence remains unimplemented.
  • sceAudioPropagationResetAttributes remains unimplemented. Native validation accepts attribute 10 with a declared value size of 0x6d0, but its reset loop writes through offset 0x6f0; the extra 0x20 bytes exceed the validated range, so the safe general behavior is unresolved.
  • sceAudioPropagationSourceQueryInfo remains unimplemented because the source attribute fields copied into the output have no confirmed mapping to the public attribute IDs. The source system handle, path capacity, and final constant are observed, but the position, direction, and attribute 2/3 semantics are not.
  • sceAudioPropagationReportApi dispatches the recovered categories 0 and 1 through the registered callback table. Behavior for categories outside that range is not established; the host throws instead of indexing outside the recovered table.
  • libSceAudioPropagation: Firmware 13.60 synchronization and callback evidence: module SHA-256 044A0FF285A5FB9093075487EA22D282588F2FA22C84131485F5AC1713037DA5, analyzed with Ghidra 12.1.4. sceAudioPropagationSystemLock at 0x3130 passes the mutex at system offset 0xe0 to imported helper _qXct3c1skg_C_D; a nonzero result goes to the module's error helper with code 5. sceAudioPropagationSystemUnlock at 0x31b0 passes the same mutex to _bp9gcNLwMI_C_D and discards its return value. The helper implementations are not present in this module, so native recursion, owner validation, and unmatched-unlock behavior are unresolved. The host tracks an owner and recursion depth, rejects unmatched or cross-thread unlock with ErrorInvalidArgument, and returns ErrorInvalidArgument when the owning thread tries to destroy a locked system rather than deadlocking.
  • sceAudioPropagationReportApi at 0x127b0 increments the category's active-dispatch counter under its spin lock, releases that lock before calling the eight static callback slots, then decrements the counter. Registration at 0x12990 waits for the counter to reach zero; unregister at 0x12ae0 does the same before clearing a slot. Thus callbacks execute outside the counter spin lock, while register/unregister wait for active category dispatches. The native callback loop passes the same local report record to every handler. The host snapshots slots under its registry mutex, invokes callbacks outside it, gives each callback a separate report-argument cursor, and waits for active invocations on that registration before unregistering.
  • libSceAudioPropagation: Native report registrations are the static slot addresses: category 0 uses 0x3a8d0 through 0x3a940 in 0x10-byte steps; category 1 uses 0x3a950 through 0x3a9c0. At 0x12990, the module stores the callback and user data even when the output-registration pointer is null; it only omits writing the slot address. At 0x12ae0, unregister compares the supplied address to each static slot and clears the matching slot. Consequently, after a slot is reused, an old registration pointer can unregister the new callback. The host preserves this native pointer-reuse behavior; its regression test and this limitation are intentional.
  • sceAudioPropagationSystemQueryInfo at 0x3220 returns 0x8a700002 (ErrorInvalidHandle) unless the output pointer is nonnull, the system resolves, and the size is exactly 0x30; it writes 1 to output offset 0x18 (parameter24). sceAudioPropagationSystemQueryMemory at 0x2f10 (NID 7xyAxrusLko) requires the options field at offset 0x18 to equal 6; SystemQueryInfo's 1 is a different output field and is not a valid query-memory input. No binary or disassembly is included in this repository.
  • Initialization exports ending in Init, plus sceAudioPropagationSystem, are not exported: the SDK declares the helpers static inline and none is in the SDK stub library or the supplied native module. Diagnostic layouts are recovered. The final system word and the fourth position/direction words have no confirmed semantics.