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

34 lines
8.0 KiB
Markdown

# libSceAudioPropagation technical debt
### Additional callable exports
- [Additional callable exports](../../../core/libs/prx/libSceAudioPropagation/InventoryExports.cpp) - 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](https://github.com/zecoxao/sce_symbols/blob/2883963a0a514ba6e77407a08ef4730a65e88254/aerolib.csv) or [supplemental catalog](https://github.com/claimore22/ps5rs/blob/2304be5131221bae0dac24b9767cabffda33f747/data/nids.csv).
| Name | NID |
| --- | --- |
| `sceAudioPropagationSourceQueryAudioPaths` | `yW8FldaufkU` |
| `Unknown` | `TrQMW7ARZXY` |
| `Unknown` | `ZSdiF+pXrF8` |
| `Unknown` | `fOTrQvqzABM` |
| `Unknown` | `fhMkXxnE8aw` |
| `Unknown` | `laU0fM-tTsc` |
| `Unknown` | `mdH4mANi9GI` |
| `Unknown` | `o0gGIp1vd6A` |
### Silent stubs
- [libSceAudioPropagation](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp): 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp): 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp): 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`](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp): 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`](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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](../../../core/libs/prx/libSceAudioPropagation/Export.cpp) 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.