You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When `--osc_port` is non-zero (default: 9009), the engine accepts OSC messages on `127.0.0.1:<port>` for live parameter updates: `/realtime/gain`, `/realtime/focus`, `/realtime/speaker_mix_db`, `/realtime/sub_mix_db`, `/realtime/paused`, `/realtime/elevation_mode`.
112
+
When `--osc_port` is non-zero (default: 9009), the engine accepts OSC messages on `127.0.0.1:<port>` for live parameter updates: `/realtime/gain_db`, `/realtime/focus`, `/realtime/speaker_mix_db`, `/realtime/sub_mix_db`, `/realtime/paused`, `/realtime/elevation_mode`.
113
113
114
114
### Quick dev rebuild (engine only)
115
115
@@ -153,14 +153,14 @@ Options:
153
153
154
154
The build system is CMake + shell scripts. No Python required.
-`"LFE"` maps to WAV channel 3 when the file has ≥ 4 channels — matches `--lfe-mode hardcoded` passed to CULT
64
65
- Sources that cannot be mapped using this convention are a hard failure (not silently skipped)
@@ -119,12 +120,14 @@
119
120
**Thread safety:** Capture is only active during single-threaded startup stages. In `start()`, capture is explicitly restored before `mStreaming->startLoader()` to avoid racing with the background loader thread. No capture occurs during audio callback execution.
120
121
121
122
**Files changed:**
123
+
122
124
-`source/spatial_engine/realtimeEngine/src/EngineSession.hpp` — added `getFailureDiagnostics()` and `storeFailureDiagnostics()` declarations; added `mFailureDiagnostics` member
123
125
-`source/spatial_engine/realtimeEngine/src/EngineSession.cpp` — added `TeeStreamBuf`, `StageCapture`; wired into `loadScene`, `applyLayout`, `start`; added `getFailureDiagnostics()` and `storeFailureDiagnostics()` implementations
-`source/gui/imgui/src/App.cpp` — added `appendFailureDiagnostics()` implementation; called at all five failure points in `doLaunchEngine()`
126
128
127
129
**Failure log format:**
130
+
128
131
```
129
132
=== Failure diagnostics ===
130
133
Stage: load scene (ADM streaming)
@@ -150,10 +153,12 @@ Terminal output:
150
153
**Motivation:** The previous Transcoder tab only exposed `cult-transcoder transcode` (ADM→LUSID Scene). CULT now supports two additional subcommands (`package-adm-wav`, `adm-author`) that were inaccessible from the GUI.
151
154
152
155
**Files changed:**
156
+
153
157
-`source/gui/imgui/src/App.hpp` — added workflow state members and constants for all three workflows
154
158
-`source/gui/imgui/src/App.cpp` — `renderTranscodeTab()` rebuilt with `BeginTabBar("##tc_workflow")`
155
159
156
160
**Three sub-tabs now exposed:**
161
+
157
162
1.**ADM to LUSID Scene** (`cult-transcoder transcode`) — converts ADM XML or ADM WAV/BWF metadata to `scene.lusid.json`
158
163
2.**ADM WAV to LUSID Package** (`cult-transcoder package-adm-wav`) — extracts ADM, converts metadata, splits interleaved audio into a LUSID package directory
159
164
3.**LUSID to ADM Export** (`cult-transcoder adm-author`) — authors LUSID package material into Logic-compatible ADM BWF/WAV + sidecar ADM XML
@@ -241,6 +246,7 @@ Terminal output:
241
246
**Problem:** After the April 17 normalized DBAP upgrade, fast-moving sources produced audible pops or gain steps. Root cause: `mPrevSafePos[si]` was always written as the block-center guard-resolved position (`safePos`), even for fast-mover blocks whose last rendered audio corresponded to the last sub-step (near `positionEnd`). Under normalized DBAP, the dominant speaker gain can jump 4× (from `1/sqrt(N) ≈ 0.25` equidistant to `≈1.0` near-speaker) across the normalization basin boundary. When `positionEnd` and block-center straddle that boundary, the Bug 9.1 `doBlend` anchor on the following block was wrong — it injected a discontinuity rather than smoothing one.
242
247
243
248
**Fix (Spatializer.hpp):**
249
+
244
250
- Fast-mover loop now captures `lastSubSafePos = subSafePos` at `j == kNumSubSteps - 1`
245
251
- Fast-mover branch writes its own state immediately after the loop: `mPrevSafePos[si] = lastSubSafePos`, `mPrevGuardFired[si] = 0`, `mPrevWasFastMover[si] = 1`
246
252
- Normal-path state update guarded by `!isFastMover`; clears `mPrevWasFastMover[si] = 0`
0 commit comments