Skip to content

feat(audio-propagation): track source-owned configurable path slots - #56

Closed
JJenkx wants to merge 2 commits into
mainfrom
feat/audio-propagation-path-state
Closed

JJenkx wants to merge 2 commits into
mainfrom
feat/audio-propagation-path-state

Conversation

@JJenkx

@JJenkx JJenkx commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

What

Saros PPSA07631 v01.000.000 requests audio path0 immediately after source creation, before setting source attributes or calculating paths. The existing no-propagation model throws because it has no path handles.

Add a source-owned pool of36 initially empty, invalid path slots. Return stable handles by index, copy validated path configuration, expose the stored point count, and invalidate the handles when their source or system is destroyed. Reject malformed updates and references to another system's materials. The 224-byte path and48-byte point layouts and36-path maximum follow the public SharpProspero interop declarations. Fixed-pool allocation and reporting36 slots through the count query are inferred, not measured on a console.

The inactive-path renderer also validates whole float frames for formats0/1/2/4/5 (4/9/16/8/8 channels) and preserves the existing mix when every path is empty, invalid or muted. The public API describes an additive render contract; returning no contribution must not erase the caller's mix. A PID-matched Saros diagnostic sees format0 with4096 bytes of mono float PCM and16384 output bytes (1024 four-channel frames), and its18 configured slots have0 points with Invalid flags.

This is configuration/lifetime and inactive-path render support. Active nonempty acoustic rendering remains explicitly unsupported and throws before changing output. Ray-based path calculation, occlusion, reflections and reverb remain unimplemented. This draft is not a claim that Saros runs.

Tested

Current topic db91769497 on main 31bfc4e869. Linux strict C++20 compilation (-Wall -Wextra -Werror) and the existing audio-propagation test with added lifecycle/configuration cases pass. The project CMake guest_audio_propagation check also passes on the private Saros integration.

The tests cover immediate path lookup, stable first/last slots, bounds and null outputs, copied caller data, invalid and cross-system materials, nonfinite input, failure preserving old state, source/system teardown, and active rendering refusal without writes. A negative control removing only owned path-object teardown fails with path survived source destruction; restoring it passes. Conventions and whitespace checks pass. Full CI run 38538209446 passes head db91769497bb4a8dfd993801e9ed6fb87e7d14f4 against base 31bfc4e8693d86318824d83c47cfa418703a7cc8: Linux 1,071 passed / 46 skipped; Windows 738 passed / 402 skipped. guest_audio_propagation passes on both. Skipped cases and macOS remain unvalidated.

Saros native verification on a recorded integration with boykopovar#5716, boykopovar#5176, boykopovar#757/boykopovar#758, boykopovar#4706 and boykopovar#5647 passes the former path0 lookup and proceeds to sceAudioPropagationSourceRender: render format0 is unknown. The getter/configuration stage is exercised; rendering, title menu and gameplay remain unverified. None of those peer changes is included in this branch. No standalone current-main title unblock is established. No private game assets, screenshots, binary excerpts or raw game logs are included.

Current-main native check

On main d92a8dad plus the common private SPIRV-Tools teardown repair, Saros aborts at 70.25 seconds with sceAudioPropagationSourceGetAudioPath: index 0 out of range (0 audio paths). A focused current-main integration of this topic, boykopovar#6160's FS table and boykopovar#6094's atomic policy passes that getter and renders the Soltari intro logo by 240 seconds in a cold run. The full Linux Release build and nine selected shader/audio CTests pass on Radeon and Lavapipe. The cold run ends at its planned 300-second limit; a warm run then aborts around 100 seconds with GPU virtual-memory faults and Vulkan device loss. Both restore the temporary kernel setting. This establishes progress past the audio initialization failure, with menu/gameplay and active acoustic rendering still unverified. The exact public/private test revisions and remaining component assumptions are recorded in #73.

Checklist

  • One topic; based on recorded main
  • No new code comments, silent stubs or third-party implementation
  • Generic behavior; no title-specific condition
  • Depends on: none for the component; native validation stack listed above
  • Unblocks: none established on standalone current main
  • AI-assisted: yes

Earlier private integrations passed getter/setter initialization, then encountered the format0 refusal, computed call target at pc0x130 and unaligned BDA access. Those reports are historical; the current-main integration's remaining reproduced gate is the GPU fault described above.

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Progress report (31bfc4e → db91769)

📈 System libraries: 88.22% (+0.03%, +2 implemented functions)

✅ 2 implemented
Library Name
libSceAudioPropagation sceAudioPropagationPathGetNumPoints
libSceAudioPropagation sceAudioPropagationSourceSetAudioPath

@github-actions github-actions Bot added prx Other PRX libraries docs Documentation labels Oct 14, 2026
@JJenkx

JJenkx commented Oct 21, 2026

Copy link
Copy Markdown
Owner Author

Development and review continue in the upstream project at boykopovar#9006, which carries the source-owned path-slot work plus the render-format follow-up. Closing this fork-only review entry to keep the active review upstream. The branch is preserved.

@JJenkx JJenkx closed this Oct 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation prx Other PRX libraries

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant