Commit Graph

346 Commits

Author SHA1 Message Date
MechaCat02
201553aea3 Instrument: file.read offset tracer + XMA-PARAM probe (voice RE)
Some checks failed
Orchestrator / Commit Message Validation (push) Has been skipped
Orchestrator / Lint (push) Failing after 1m52s
Orchestrator / Windows (x86-64) (push) Has been skipped
Orchestrator / Linux (x86-64) (push) Has been skipped
Orchestrator / Create Release (push) Has been skipped
Additive, cvar-gated instrumentation used to reverse-engineer Project
Sylpheed's cutscene-voice storage (movie -> continuous sound-stream cue
region). Default-off; no behaviour change.

- event_log.cc: MaybeEmitFileRead emits `file.read` events with the real
  NtReadFile ByteOffset (from r10), length, handle->path, and buffer VA, so a
  sound.pNN read offset can be mapped to a sound.pak TOC entry.
  Gate: --phase_a_fileio_only=true --phase_a_event_log_path=<file>.
- cpu_flags.cc: phase_a_fileio_only cvar (+ xma_param_probe).
- xma_context_new.cc: XMA-PARAM probe in XmaContextNew::Decode (the decoder the
  title actually uses) logging ctx/buffer/read-offset/channels/packets/byte_size
  /signature — to confirm which bytes get decoded for a given cutscene.

Used to produce /tmp/rt_fileio.jsonl (RT01A playthrough), which cracked the
movie->voice mapping now implemented in sylpheed-reborn. Next: run the same
file.read trace on an unbound hokyu (e.g. hokyu_LS_s03A) to resolve which
VOICE_D the game streams for the 13 manifest-unbound resupply cutscenes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 06:56:45 +02:00
MechaCat02
7b6902e08f [WIP] Audio/threading fixes + crash investigation; NEW ORACLE: crash is ours not the game
Some checks failed
Orchestrator / Commit Message Validation (push) Has been skipped
Orchestrator / Lint (push) Failing after 1m34s
Orchestrator / Windows (x86-64) (push) Has been skipped
Orchestrator / Linux (x86-64) (push) Has been skipped
Orchestrator / Create Release (push) Has been skipped
Snapshot for handoff. Contains the mission-audio + threading fixes and the
crash-investigation instrumentation (all diagnostic cvars default-OFF).

Fixes (behavioral):
- threading_posix.cc: reap-once guard on PosixCondition<Thread>::post_execution
  (double pthread_join at mission teardown -> fault loop -> audio death + freeze).
- xma_decoder.cc: work_event_->Set() in Pause() so the idle XMA worker observes
  paused_ and signals pause_fence_ (Pause() deadlock -> permanent audio death).
- audio_system / xma_context_master / xboxkrnl_audio / apu_flags / alsa: mission
  audio keepalive + guest_audio_flags + watchdogs.

Instrumentation (additive, default-off): xboxkrnl_debug cache-throw diag +
guest-catch dispatcher, xex_module PE/PDATA/EH scans, kernel_state mem_watch
(NOTE: mem_watch DEFAULTS TRUE -- an always-on host poll thread; prime crash suspect).

NEW ORACLE (see HANDOFF-crash-oracle-2026-07-16.md): stock 6e5b8324f built with
our toolchain + zero custom code = NO crash, NO sound-stop, plays the Ready Room.
=> the Ready-Room out_of_range crash is introduced by THESE changes, not the game
and not the (LTO-broken) build chain. Bisection plan + suspect ranking in the note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 22:43:50 +02:00
MechaCat02
f10484834c [APU] Fix mission-audio silence: ALSA underrun keepalive + guest_audio_flags
Two Linux mission-audio fixes for Project Sylpheed (audio played in
intro/menu but died when a mission finished loading, never returning):

- alsa_audio_driver: when the guest stalls (mission "Preparing for Sortie"
  load) and the ring buffer empties, feed silence to keep the PCM alive
  instead of sleeping. Previously the small buffer drained, XRUN'd, and
  playback never recovered (matches the known "audio muted permanently").
- xconfig: make the guest speaker config a cvar (guest_audio_flags,
  default Digital Stereo) instead of hardcoded Dolby Digital surround.

(The practical fix on this box also needed log_mask=13 to stop kernel log
spam starving the audio pipeline during missions — config, not code.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 16:49:25 +02:00
oreyg
6e5b8324f4 [APU] Pace audio subsystem 2026-07-08 19:24:32 +02:00
Gliniak
49c700b9c5 [XMP] Return success for XMPGetMediaSources with 0 sources
- Renamed XMPDashInIt to XMPDashInit
- Added broadcast to XMPDashInit
- Renamed some unknown fields of XMP_SET_MEDIA_SOURCE_WORKSPACE
2026-06-06 10:59:38 +02:00
Gliniak
29311ddcdd [APU] Replaced min-max with clamp for queued frames 2026-05-26 22:58:46 +02:00
Gliniak
7e98ae6de3 [XMA] Invalidate output buffer if there is nothing to process
- Fixes 565507E4 hardlock on boot
2026-05-26 09:27:02 +02:00
oreyg
505697f980 [APU] XmaContextNew: refine output buffer invalidation 2026-05-25 11:54:18 +02:00
oreyg
09dbe2cd36 [APU] XmaContextNew: do not invalidate output_buffer_valid prematurely 2026-05-21 20:54:10 +02:00
Gliniak
99ea6da18a [XConfig] Implementation of XConfig 2026-05-19 07:50:16 +02:00
oreyg
b575c68418 [XMA] Enhances the existing XmaContextNew implementation with one derived from the AC6_recomp RexGlue SDK.
Key fixes versus the previous implementation:

    Packet walk across input-buffer boundaries: GetNextPacket and
    GetNextPacketReadOffset now resolve the actual target packet inside
    the next input buffer, instead of clamping to its first packet.

Resolves silent 'patches' in cinematics observed previously in AC6.

Co-authored-by: sal063 <ssalh0456@gmail.com>
2026-05-14 21:04:18 +02:00
Gliniak
74f34818e7 [Lint] Added InsertBraces to linter to unify codebase to one standard 2026-05-08 18:54:50 +02:00
Adrian
dc561e4df5 [XMP] Fixed XMP Overriding
Fixed cutscene audio in 58411446

Co-Authored-By: The-Little-Wolf <116989599+the-little-wolf@users.noreply.github.com>
2026-04-25 18:27:28 +02:00
Herman S.
7887efa69f [APU] fix potential semaphore leak on invalid client index 2026-04-13 12:16:24 +09:00
Herman S.
ade7e610bb [XMA] Fix stall detection false positive in Work loop
Stall detection was triggering during multi-pass subframe consumption
(e.g. stereo with subframe_decode_count < total subframes), breaking
audio looping in games like Tomb Raider. Now only detects a stall when
no subframes were pending, so Consume-only iterations aren't mistaken
for no-progress cycles. Fixes Halo 4 without regressing Tomb Raider.
2026-04-07 23:14:08 +09:00
Herman S.
0efd3a9610 [APU] Move XmaContext::Block() to base class with RAII locking 2026-03-09 14:15:14 +09:00
Herman S.
9371e73d92 [APU] Fix audio crashes during shutdown 2026-03-09 14:15:14 +09:00
AllanCat
10cecae4c2 [XMA] Fixed min output space gating to match Consume() write granularity
The decoder gate required a full frame of free blocks (4 mono / 8 stereo +
padding) before allowing a decode pass, but Consume() only writes
subframe_decode_count blocks per call. Games like TGM Ace with
subframe_decode_count=2 on a small ring buffer could never meet the old
threshold, causing a permanent decoder stall.
2026-03-07 11:46:21 +09:00
Gliniak
4b0007bfe5 [XMP] Fixed error caused by incorrect audio allocation for FFMPEG 2026-03-06 20:48:25 +01:00
Herman S.
71c5702ee8 [Build] Convert build system to raw cmake and remove premake layer 2026-03-04 17:37:36 +09:00
Herman S.
4757ab0931 [APU] Fix ffmpeg upgrade related logspam 2026-03-04 13:05:37 +09:00
Herman S.
cd5df622a9 [3PP] Switch FFmpeg to latest release with port of xmaframes codec
And pull out all the xenia specific build junk into
third_party/ffmpeg-xenia rather than keeping it checked in the
submodule
2026-03-04 13:05:31 +09:00
Herman S.
bc54720559 [XMA] Fix consume-only context resetting output buffer offsets
And remove the now-unused HasTightOutputBuffer heuristic
2026-02-26 10:28:49 +09:00
Herman S.
337afcf318 [XMA] fix unsigned underflow when packet has no frames 2026-02-24 14:32:54 +09:00
Herman S.
80a78c509f [XMA] Write back output_buffer_read_offset in StoreContextMerged 2026-02-24 14:32:54 +09:00
Herman S.
6265698eef [XMA] Swap input buffer on unresolvable split headers 2026-02-24 14:32:54 +09:00
Herman S.
d68ff7243a [XMA] Fix consume-only path write offset and drain check 2026-02-24 14:32:54 +09:00
Herman S.
6ee55aafb4 [XMA] Guard against subframe_decode_count being 0 2026-02-24 14:32:54 +09:00
Herman S.
013320c051 [XMA] Implement loop subframe precision 2026-02-24 14:32:54 +09:00
Herman S.
8586cc196d [XMA] Add diagnostic logging to new decoder 2026-02-24 14:32:49 +09:00
Herman S.
51c5936566 [XMA] convert GetNextPacketReadOffset from recursion to iterative loop 2026-02-24 12:41:08 +09:00
Herman S.
470e62af22 [XMA] detect full packet skip sentinel and advance rather than overshoot 2026-02-24 12:41:02 +09:00
Herman S.
a1eef3a2b8 [XMA] swap to valid buffer instead of stalling when current is invalid 2026-02-24 12:40:56 +09:00
Herman S.
d759938979 [XMA] skip split frame tails instead of decoding as complete frames 2026-02-24 12:40:47 +09:00
Herman S.
cc53e0252a [XMA] don't queue output subframes when frame decode fails 2026-02-24 12:40:39 +09:00
Herman S.
2c75055caf [XMA] treat frame_size 0 as end-of-packet padding (XMA1 compat) 2026-02-24 12:40:31 +09:00
Herman S.
d9747704be [XMA] Reserve headroom per decoded frame and account for it in gating
The 3-bit field at +24bit in DWORD 1 of the XMA context was named
subframe_skip_count but never actually used for skipping subframes.
Testing across multiple titles (PGR4, Halo Reach) shows the field
might control extra output buffer blocks that must be reserved per decoded
frame. Renaming the field to output_buffer_padding to reflect this
observed behavior and adding padding to the minimum output space threshold

Pdding blocks are reserved from the output budget after each frame is
fully consumed, preventing the decoder from overrunning the space
that the game expects to remain free.

This is still likely not entirely correct but reduces some of the
observed noise in current implementation.
2026-02-18 18:14:44 +09:00
Herman S.
3e3aee1ef2 [App] Update title to show apu and remove vulkan incomplete warning 2026-02-17 23:50:40 +09:00
Herman S.
fade0cd889 [APU] Add ALSA apu on Linux 2026-02-17 23:46:16 +09:00
Herman S.
2d6b7c6ca1 [XMA] Fix dedicated thread stalls by blocking guest audio thread
Includes various other thread safety and timing related adjustments
2026-02-17 13:57:32 +09:00
Herman S.
6e5b2a95b0 [XMA] Fix multiple audio issues in new decoder
- Handle XMA2 frames with headers split across packet boundaries
  (fixes audio cutoff in Capcom games)
- Output buffer minimum space check using actual frame size instead
  of SDC-based formula, allowing tight-buffer contexts to decode
  (fixes PGR4 engine sounds)
- Gate consume-only context clearing with tight-buffer heuristic to
  prevent disrupting playback while still allowing stream completion
  signaling (fixes Borderlands 2 dialog)
- Clamp read offset 0 to packet header size to prevent decode rejection
  loop (fixes Dirt 2 crashes)
2026-02-17 13:56:24 +09:00
Herman S.
7213f7e69b [XMA] Fix consume-only context clear being overwritten in new decoder 2026-02-17 13:54:19 +09:00
Herman S.
ea056849fa [XMA] Fix recursive lock acquisition in new decoder 2026-02-17 13:54:05 +09:00
Gliniak
547226fc0b [XMA] Cleanup in XmaDecoder::WriteRegister
- Replaced manual for loop with C++20 countr_zero standard call
2025-12-23 23:28:13 +01:00
Gliniak
0af253e230 [XMA] Separate error status into status and set fields
It's separate bit that defines if error is present
2025-12-05 22:29:09 +01:00
Gliniak
4494e40c71 [XMA] Added multiple versions of XMA decoders
- Fake: No decoding
- Master: 1:1 from base version of Xenia
- Old: Master with improvements
- New: Completely new decoder with better stability (but not compability)

Co-authored-by: Herman S. <429230+has207@users.noreply.github.com>
2025-12-03 20:05:41 +01:00
Gliniak
dd29365970 [APU] Switched to New XMA decoder as default
- Added codepath for "consume only" pass. This should resolve constant clicking in Source engine games.
- Added smaller performance improvements to decoder
2025-12-01 23:58:33 +01:00
Gliniak
4ebf8994de [XMA] Revert changes in old XMA decoder to state from master repository.
- If you have new issues with sound it is recommended to switch to new decoder.
2025-11-17 18:29:33 +01:00
Herman S.
707c79a82f [XMP] Ensure volume always set when driver created.
Fixes the issue of the volume starting at default and abruptly
adjusting to the game setting as it changes.
2025-10-29 09:50:07 +01:00
Gliniak
344e8538e0 [XMP] Make volume atomic, fixed issue with invalid SetVolume received from guest
- Replaced invalid log
2025-10-28 21:48:10 +01:00