audio: the plain reverb, the delay, the biquad filter on a mix and the splitter destinations' filters #1063

Open
blushOFF wants to merge 4 commits from blushOFF/pr/audio-effects into main
blushOFF commented 2026-11-09 08:53:46 +00:00 (Migrated from github.com)

OoT calls nn::audio effects that the import handler took until now, so the mixes they sit on came out dry: no
reverb on the sub mixes the game gives one, no delay, and no filter on a mix. A gameplay log listed them as
unimplemented import (43 nn::audio symbols, with lr, so called). This implements them in host/nn_audio.c.

What it adds

  • Plain reverb (AddReverb, Set/IsReverb*, Set/GetReverbInputOutput): run on the existing I3DL2 network, from the
    plain reverb's parameters: linear early, late, reverb and out gains; the early mode as the size of the early-reflection
    taps (small room to cavern; none); the late mode as the late delay (room, hall, plate, cavern, maximum); pre-delay,
    decay time and high-frequency decay ratio. This is an approximation of the console's reverb, not a copy of it.
  • Delay (AddDelay, Set/GetDelay*, Set/IsDelayEnabled, SetDelayInputOutput): a delay line per channel; what
    comes back is low-passed (LowPassAmount), mixed with the neighbour channel's (ChannelSpread) and fed back
    (FeedbackGain); out = DryGain x input + the delayed signal. HOS_AUDIO_NO_DELAY=1 leaves it out (read with
    env_on, as HOS_AUDIO_NO_REVERB).
  • Biquad filter on a mix (AddBiquadFilter, SetBiquadFilterParameter, SetBiquadFilterEnabled,
    SetBiquadFilterInputOutput): the float TBiquadFilterParameter (enable @0, numerator @4, additive denominator @16,
    as the voices' float parameter), transposed direct form II as the voices' filters, with the same blow-up guard. It
    runs on SetBiquadFilterEnabled; the parameter's enable @0 is not read, because OoT leaves it 0 on mix 2's low pass
    while it turns the filter on.
  • Splitter destination filters (SetSplitterBiquadFilterParameter, sub mix and final mix): two filters per
    destination, applied to that destination's copy of the voice. The filter state is kept per splitter (OoT gives each
    voice a splitter of its own).
  • Accepted with nothing behind them: SetAuxEnabled, SetAuxInputOutput (aux stays pass-through),
    AcquireAudioOutputDeviceNotification, the device output volume and auto-tune calls, ListVirtualInputDevices, the
    voice-drop parameter.
  • Effects on a mix run in the order the game added them. Each running effect logs its wet level the first few times
    (audio: reverb 0 on mix 7: wet rms ...), as a check that it does something.

Measured

  • Windows 11, RTX 3070, a Kokiri Forest save: the log shows audio: biquad filter 0 on mix 2, audio: delay 0 on mix 4, 6 channels, up to 500 ms, audio: reverb 0..2 on mix 7/8/9; the low pass the game keeps on mix 2
    (b 0.416 0.833 0.416, a -0.461 -0.205) now filters. 142 s of output dumped (HOS_AUDIO_DUMP) without clipping.
  • A scripted tour of 29 teleport destinations (#785's tools) with this in: no crash or device lost from it, no flicker.
  • tests/test_audio_effects.py (RUN_ALL_ARGS = ["--cc", "gcc"]; passes with gcc and clang under -Wall -Wextra -Werror) compiles the real delay and mix-filter
    section with synthetic signals: echoes at the delay time and at the feedback, dry gain, channel spread, a NaN input,
    a one-pole low pass (50 Hz kept, 12 kHz down by more than 20 dB) and unstable coefficients (silence, no burst).

Not done

  • I compared the result by logs and dumps, not by ear against the console.
  • The reverb modes are mapped to sizes and delays by hand; if someone has the console's reverb tables, the mapping in
    reverb_frame is where they go.
OoT calls `nn::audio` effects that the import handler took until now, so the mixes they sit on came out dry: no reverb on the sub mixes the game gives one, no delay, and no filter on a mix. A gameplay log listed them as `unimplemented import` (43 `nn::audio` symbols, with `lr`, so called). This implements them in `host/nn_audio.c`. ### What it adds - **Plain reverb** (`AddReverb`, `Set/IsReverb*`, `Set/GetReverbInputOutput`): run on the existing I3DL2 network, from the plain reverb's parameters: linear early, late, reverb and out gains; the early mode as the size of the early-reflection taps (small room to cavern; none); the late mode as the late delay (room, hall, plate, cavern, maximum); pre-delay, decay time and high-frequency decay ratio. This is an approximation of the console's reverb, not a copy of it. - **Delay** (`AddDelay`, `Set/GetDelay*`, `Set/IsDelayEnabled`, `SetDelayInputOutput`): a delay line per channel; what comes back is low-passed (`LowPassAmount`), mixed with the neighbour channel's (`ChannelSpread`) and fed back (`FeedbackGain`); out = `DryGain` x input + the delayed signal. `HOS_AUDIO_NO_DELAY=1` leaves it out (read with `env_on`, as `HOS_AUDIO_NO_REVERB`). - **Biquad filter on a mix** (`AddBiquadFilter`, `SetBiquadFilterParameter`, `SetBiquadFilterEnabled`, `SetBiquadFilterInputOutput`): the float `TBiquadFilterParameter` (enable @0, numerator @4, additive denominator @16, as the voices' float parameter), transposed direct form II as the voices' filters, with the same blow-up guard. It runs on `SetBiquadFilterEnabled`; the parameter's enable @0 is not read, because OoT leaves it 0 on mix 2's low pass while it turns the filter on. - **Splitter destination filters** (`SetSplitterBiquadFilterParameter`, sub mix and final mix): two filters per destination, applied to that destination's copy of the voice. The filter state is kept per splitter (OoT gives each voice a splitter of its own). - Accepted with nothing behind them: `SetAuxEnabled`, `SetAuxInputOutput` (aux stays pass-through), `AcquireAudioOutputDeviceNotification`, the device output volume and auto-tune calls, `ListVirtualInputDevices`, the voice-drop parameter. - Effects on a mix run in the order the game added them. Each running effect logs its wet level the first few times (`audio: reverb 0 on mix 7: wet rms ...`), as a check that it does something. ### Measured - Windows 11, RTX 3070, a Kokiri Forest save: the log shows `audio: biquad filter 0 on mix 2`, `audio: delay 0 on mix 4, 6 channels, up to 500 ms`, `audio: reverb 0..2 on mix 7/8/9`; the low pass the game keeps on mix 2 (b 0.416 0.833 0.416, a -0.461 -0.205) now filters. 142 s of output dumped (`HOS_AUDIO_DUMP`) without clipping. - A scripted tour of 29 teleport destinations (#785's tools) with this in: no crash or device lost from it, no flicker. - `tests/test_audio_effects.py` (`RUN_ALL_ARGS = ["--cc", "gcc"]`; passes with gcc and clang under `-Wall -Wextra -Werror`) compiles the real delay and mix-filter section with synthetic signals: echoes at the delay time and at the feedback, dry gain, channel spread, a NaN input, a one-pole low pass (50 Hz kept, 12 kHz down by more than 20 dB) and unstable coefficients (silence, no burst). ### Not done - I compared the result by logs and dumps, not by ear against the console. - The reverb modes are mapped to sizes and delays by hand; if someone has the console's reverb tables, the mapping in `reverb_frame` is where they go.
hckrman101 commented 2026-11-09 18:39:56 +00:00 (Migrated from github.com)

Hi! This PR has merge conflicts with main now (a lot has landed today). Could you merge main in or rebase and resolve them? Happy to give it a proper review once it's up to date.

Hi! This PR has merge conflicts with `main` now (a lot has landed today). Could you merge `main` in or rebase and resolve them? Happy to give it a proper review once it's up to date.
blushOFF commented 2026-11-09 20:57:15 +00:00 (Migrated from github.com)

Rebased on current main (7dbdcdc0), conflicts resolved. The patch itself is unchanged: effects_frame still runs on each mix before the final mix's channel map, so it sits before the new 5.1 path. tests/test_audio_effects.py passes on the rebased tree (6 cases). I have not replayed it in game since the rebase yet; I'll report here when that run is done.

Rebased on current `main` (7dbdcdc0), conflicts resolved. The patch itself is unchanged: `effects_frame` still runs on each mix before the final mix's channel map, so it sits before the new 5.1 path. `tests/test_audio_effects.py` passes on the rebased tree (6 cases). I have not replayed it in game since the rebase yet; I'll report here when that run is done.
hckrman101 (Migrated from github.com) reviewed 2026-11-09 22:45:00 +00:00
hckrman101 (Migrated from github.com) left a comment

Thanks for the rebase. I read through the whole diff; the effect code looks careful (handle ranges don't collide between reverbs/delays/mix filters, the NaN and blow-up guards are there, the delay reads all channels before writing so in-place in/out is fine, and the ARG() indices match the AddReverb/AddDelay/SetSplitterBiquadFilterParameter signatures). One thing to fix, plus a few smaller notes.

Test doesn't build with -Werror (verified). tests/test_audio_effects.py extracts the section from host/nn_audio.c into audio_effects.inc and compiles with -Wall -Wextra -Werror. The section contains static Delay delays[MAX_DELAYS]; and static BqFx bqfx[MAX_BQFX];, and the test never references either, so gcc stops with 'delays' defined but not used [-Werror=unused-variable] (same for bqfx). I reproduced it by running the same extraction on the head file and compiling tests/audio_effects_test.c with the same flags. Since the test is registered in run_all.py, it will fail there. Easiest fix is to reference them in the test (e.g. (void)delays; (void)bqfx;), or to start the extraction after those two declarations.

Smaller notes (nits unless you disagree):

  • The splitter filter state (bq_z) is per splitter, not per voice. The comment says OoT gives each voice its own splitter, which is fine, but if two voices ever share one splitter their samples will run through the same filter state. Worth keeping in mind.
  • SetBiquadFilterParameter on a mix ignores the parameter's enable flag at @0 (only SetBiquadFilterEnabled counts), while the splitter path honours it. If that's deliberate, a short comment would help.
  • The description says the voices' float biquad is left to #669; #669 is merged and that handler is already in the base, so that line is stale.
  • Only the SubMix overloads of AddBiquadFilter / AddReverb / AddDelay are implemented, which is fine if those are the only ones OoT imports.
  • No CI ran on this branch, and the author hasn't replayed it in game since the rebase, so the Windows build and runtime behaviour after the rebase are unconfirmed. main is also 14 commits ahead now.
Thanks for the rebase. I read through the whole diff; the effect code looks careful (handle ranges don't collide between reverbs/delays/mix filters, the NaN and blow-up guards are there, the delay reads all channels before writing so in-place in/out is fine, and the ARG() indices match the AddReverb/AddDelay/SetSplitterBiquadFilterParameter signatures). One thing to fix, plus a few smaller notes. **Test doesn't build with -Werror (verified).** `tests/test_audio_effects.py` extracts the section from host/nn_audio.c into `audio_effects.inc` and compiles with `-Wall -Wextra -Werror`. The section contains `static Delay delays[MAX_DELAYS];` and `static BqFx bqfx[MAX_BQFX];`, and the test never references either, so gcc stops with `'delays' defined but not used [-Werror=unused-variable]` (same for `bqfx`). I reproduced it by running the same extraction on the head file and compiling `tests/audio_effects_test.c` with the same flags. Since the test is registered in `run_all.py`, it will fail there. Easiest fix is to reference them in the test (e.g. `(void)delays; (void)bqfx;`), or to start the extraction after those two declarations. Smaller notes (nits unless you disagree): - The splitter filter state (`bq_z`) is per splitter, not per voice. The comment says OoT gives each voice its own splitter, which is fine, but if two voices ever share one splitter their samples will run through the same filter state. Worth keeping in mind. - `SetBiquadFilterParameter` on a mix ignores the parameter's enable flag at @0 (only `SetBiquadFilterEnabled` counts), while the splitter path honours it. If that's deliberate, a short comment would help. - The description says the voices' float biquad is left to #669; #669 is merged and that handler is already in the base, so that line is stale. - Only the SubMix overloads of AddBiquadFilter / AddReverb / AddDelay are implemented, which is fine if those are the only ones OoT imports. - No CI ran on this branch, and the author hasn't replayed it in game since the rebase, so the Windows build and runtime behaviour after the rebase are unconfirmed. main is also 14 commits ahead now.
@ -375,0 +477,4 @@
f->z[c][0] = z0, f->z[c][1] = z1;
}
}
hckrman101 (Migrated from github.com) commented 2026-11-09 22:45:00 +00:00

Unused in the test's extracted section, so -Wall -Wextra -Werror in tests/test_audio_effects.py fails with 'delays' defined but not used (same for bqfx below). See the review body.

Unused in the test's extracted section, so `-Wall -Wextra -Werror` in tests/test_audio_effects.py fails with `'delays' defined but not used` (same for `bqfx` below). See the review body.
hckrman101 (Migrated from github.com) reviewed 2026-11-09 23:23:51 +00:00
hckrman101 (Migrated from github.com) left a comment

Thanks for the ListVirtualInputDevices change, that one's fine. The blocker from my last review is still open, though: nothing changed in the test or the section it extracts, and CI is still red on both Python source checks jobs for exactly this (the only failing test in those runs is tests/test_audio_effects.py, which fails with 'bqfx' defined but not used and 'delays' defined but not used under -Wall -Wextra -Werror). The test extracts the delay/filter section but the functions that use delays[] / bqfx[] aren't in it, so the statics are unused. Easiest fix is to reference them in the fixture (e.g. (void)delays; (void)bqfx; in audio_effects_test.c), or use them from the test.

Still open from before, all nits: splitter filter state is per splitter rather than per voice; SetBiquadFilterParameter on a mix ignores the enable flag at @0 unlike the splitter path; the description still says the voices' float biquad is left to #669 (it's merged now); only the SubMix overloads of AddBiquadFilter/AddReverb/AddDelay exist.

Fix the test build and this is good to go.

Thanks for the ListVirtualInputDevices change, that one's fine. The blocker from my last review is still open, though: nothing changed in the test or the section it extracts, and CI is still red on both Python source checks jobs for exactly this (the only failing test in those runs is tests/test_audio_effects.py, which fails with `'bqfx' defined but not used` and `'delays' defined but not used` under -Wall -Wextra -Werror). The test extracts the delay/filter section but the functions that use `delays[]` / `bqfx[]` aren't in it, so the statics are unused. Easiest fix is to reference them in the fixture (e.g. `(void)delays; (void)bqfx;` in audio_effects_test.c), or use them from the test. Still open from before, all nits: splitter filter state is per splitter rather than per voice; SetBiquadFilterParameter on a mix ignores the enable flag at @0 unlike the splitter path; the description still says the voices' float biquad is left to #669 (it's merged now); only the SubMix overloads of AddBiquadFilter/AddReverb/AddDelay exist. Fix the test build and this is good to go.
@ -375,0 +477,4 @@
f->z[c][0] = z0, f->z[c][1] = z1;
}
}
hckrman101 (Migrated from github.com) commented 2026-11-09 23:23:51 +00:00

This is the delays that -Werror flags as defined but not used in the extracted test section (same for bqfx at the BqFx declaration).

This is the `delays` that -Werror flags as defined but not used in the extracted test section (same for `bqfx` at the BqFx declaration).
hckrman101 commented 2026-11-10 17:48:56 +00:00 (Migrated from github.com)

Heads-up: this conflicts with main now (a lot landed today). Could you merge main into the branch (or rebase) and resolve the conflicts? Thanks!

Heads-up: this conflicts with main now (a lot landed today). Could you merge main into the branch (or rebase) and resolve the conflicts? Thanks!
Joey-Magnus (Migrated from github.com) requested changes 2026-11-11 21:45:50 +00:00
Joey-Magnus (Migrated from github.com) left a comment

The blocker from both earlier reviews is still there. I ran python -I -B tests/test_audio_effects.py on this head and gcc stops with 'bqfx' defined but not used and 'delays' defined but not used under -Werror. That's the only failure in the red Python source checks, so it comes from this PR. Adding (void)delays; (void)bqfx; in tests/audio_effects_test.c is enough to fix it.

Beyond that:

  • The branch conflicts in host/nn_audio.c, where main has since added 5.1 output, bounds on the reverb delays, and #2190's device recovery. It also conflicts in tests/run_all.py, which now uses per-file RUN_ALL_ARGS, so the ARGS line should move into test_audio_effects.py.
  • nn_audio.c:412 reads HOS_AUDIO_NO_DELAY with getenv(...) != NULL. HOS_AUDIO_NO_REVERB beside it uses env_on since #2042, so this one should too.

The earlier nits are still open: splitter filter state is per splitter, the mix biquad ignores the enable flag at @0, and the description still mentions #669, which has merged.

The blocker from both earlier reviews is still there. I ran `python -I -B tests/test_audio_effects.py` on this head and gcc stops with `'bqfx' defined but not used` and `'delays' defined but not used` under `-Werror`. That's the only failure in the red Python source checks, so it comes from this PR. Adding `(void)delays; (void)bqfx;` in tests/audio_effects_test.c is enough to fix it. Beyond that: - The branch conflicts in host/nn_audio.c, where main has since added 5.1 output, bounds on the reverb delays, and #2190's device recovery. It also conflicts in tests/run_all.py, which now uses per-file `RUN_ALL_ARGS`, so the ARGS line should move into test_audio_effects.py. - nn_audio.c:412 reads `HOS_AUDIO_NO_DELAY` with `getenv(...) != NULL`. `HOS_AUDIO_NO_REVERB` beside it uses env_on since #2042, so this one should too. The earlier nits are still open: splitter filter state is per splitter, the mix biquad ignores the enable flag at @0, and the description still mentions #669, which has merged.
blushOFF commented 2026-11-11 22:42:10 +00:00 (Migrated from github.com)

Thanks for the reviews, and sorry the blocker sat there for so long. Rebased on current main (d3353393), and the new commit (7c83fd2e) addresses the review:

  • -Werror blocker: tests/audio_effects_test.c now references the section's delays[] and bqfx[] tables ((void)delays, (void)bqfx;). python -I -B tests/test_audio_effects.py --cc gcc passes (7 cases), and so does clang, both under -Wall -Wextra -Werror. The test file includes hookshot_env.h for the extracted section.
  • Conflicts: host/nn_audio.c sits on main's 5.1 output, the reverb delay bounds and #2190's device recovery. RUN_ALL_ARGS = ["--cc", "gcc"] lives in tests/test_audio_effects.py, and tests/run_all.py is main's.
  • HOS_AUDIO_NO_DELAY is read with env_on, like HOS_AUDIO_NO_REVERB. tests/test_env_on.py failed on the old head and passes now.
  • Mix biquad enable @0: the filter runs only when SetBiquadFilterEnabled and the parameter's enable are both on. The state is reset when the parameter turns it back on. A new test case covers it: with the parameter off, the mix goes through untouched.
  • #669: the stale code comment is gone, and the description no longer mentions it.
  • Splitter filter state: I left it per splitter, on the assumption written in the code that OoT gives each voice its own splitter. If a splitter were shared between voices, their filter states would mix. I can move the state per voice if you prefer.

On this tree, tests/run_all.py on Windows gives 372 passed and 5 failed. The 5 failures (test_fpx_sticky, test_pipeline_play_cache, test_setup_tar_diagnostics, test_portable_setup_paths, test_prepare_stall) also fail here without this PR, so they come from my local setup.

In game (Windows 11, RTX 3070, a copy of a Kokiri save), a teleport tour of Kokiri Forest, Hyrule Field and Kakariko with the audio dumped: no crash or device lost, and 0 unimplemented import for nn::audio. The log shows the biquad filter on mix 2 (b 0.416 0.833 0.416, a -0.461 -0.205), the delay on mix 4 and the reverbs on mixes 7 to 9. (That biquad line is printed from SetBiquadFilterEnabled alone, so this run does not show whether the game sets the parameter's enable too; I have not checked that yet.) 204 s of output were dumped with 0 clipped samples.

Thanks for the reviews, and sorry the blocker sat there for so long. Rebased on current `main` (d3353393), and the new commit (7c83fd2e) addresses the review: - **`-Werror` blocker:** `tests/audio_effects_test.c` now references the section's `delays[]` and `bqfx[]` tables (`(void)delays, (void)bqfx;`). `python -I -B tests/test_audio_effects.py --cc gcc` passes (7 cases), and so does clang, both under `-Wall -Wextra -Werror`. The test file includes `hookshot_env.h` for the extracted section. - **Conflicts:** `host/nn_audio.c` sits on main's 5.1 output, the reverb delay bounds and #2190's device recovery. `RUN_ALL_ARGS = ["--cc", "gcc"]` lives in `tests/test_audio_effects.py`, and `tests/run_all.py` is main's. - **`HOS_AUDIO_NO_DELAY`** is read with `env_on`, like `HOS_AUDIO_NO_REVERB`. `tests/test_env_on.py` failed on the old head and passes now. - **Mix biquad enable @0:** the filter runs only when `SetBiquadFilterEnabled` and the parameter's enable are both on. The state is reset when the parameter turns it back on. A new test case covers it: with the parameter off, the mix goes through untouched. - **#669:** the stale code comment is gone, and the description no longer mentions it. - **Splitter filter state:** I left it per splitter, on the assumption written in the code that OoT gives each voice its own splitter. If a splitter were shared between voices, their filter states would mix. I can move the state per voice if you prefer. On this tree, `tests/run_all.py` on Windows gives 372 passed and 5 failed. The 5 failures (`test_fpx_sticky`, `test_pipeline_play_cache`, `test_setup_tar_diagnostics`, `test_portable_setup_paths`, `test_prepare_stall`) also fail here without this PR, so they come from my local setup. In game (Windows 11, RTX 3070, a copy of a Kokiri save), a teleport tour of Kokiri Forest, Hyrule Field and Kakariko with the audio dumped: no crash or device lost, and 0 `unimplemented import` for `nn::audio`. The log shows the biquad filter on mix 2 (b 0.416 0.833 0.416, a -0.461 -0.205), the delay on mix 4 and the reverbs on mixes 7 to 9. (That biquad line is printed from `SetBiquadFilterEnabled` alone, so this run does not show whether the game sets the parameter's enable too; I have not checked that yet.) 204 s of output were dumped with 0 clipped samples.
blushOFF commented 2026-11-11 23:07:48 +00:00 (Migrated from github.com)

Follow-up on the mix biquad's enable @0: I checked it in game, and gating on it was wrong, so 487e2e82 takes it back.

With a log line that shows the parameter's enable, the Kokiri tour prints audio: biquad filter 0 on mix 2 (off by its parameter): b 0.416 0.833 0.416 a -0.461 -0.205. OoT turns that low pass on with SetBiquadFilterEnabled and gives it real coefficients, but leaves byte @0 of the float parameter at 0. With the gate, 7c83fd2e silently turned off the filter this PR is mostly about.

The filter runs on SetBiquadFilterEnabled alone again, as before. The code comment now says why @0 is not read, and the test case for it is gone. tests/test_audio_effects.py passes (6 cases, gcc and clang, -Werror), and host/nn_audio.c passes a clang -Wall -fsyntax-only. The full rebuild and in-game run of this exact head are still to come; I'll post here if they show anything.

Follow-up on the mix biquad's enable @0: I checked it in game, and gating on it was wrong, so 487e2e82 takes it back. With a log line that shows the parameter's enable, the Kokiri tour prints `audio: biquad filter 0 on mix 2 (off by its parameter): b 0.416 0.833 0.416 a -0.461 -0.205`. OoT turns that low pass on with `SetBiquadFilterEnabled` and gives it real coefficients, but leaves byte @0 of the float parameter at 0. With the gate, 7c83fd2e silently turned off the filter this PR is mostly about. The filter runs on `SetBiquadFilterEnabled` alone again, as before. The code comment now says why @0 is not read, and the test case for it is gone. `tests/test_audio_effects.py` passes (6 cases, gcc and clang, `-Werror`), and `host/nn_audio.c` passes a clang `-Wall -fsyntax-only`. The full rebuild and in-game run of this exact head are still to come; I'll post here if they show anything.
Owner

@Joey-Magnus reviewed on GitHub · 2026-11-12 14:32 UTC · original

The -Werror blocker is fixed. I ran tests/test_audio_effects.py on 487e2e8 and it passes (6 cases), and HOS_AUDIO_NO_DELAY now goes through env_on (nn_audio.c:422). The red Python jobs on this head were main's own breakage at the time (test_env_on on HOS_FPS_LOG, plus test_pcache_header_read and test_psychov35 on Windows), not this PR. The comment explaining why @0 isn't read on the mix biquad settles that point.

What blocks it now is #1544, which merged this morning. It processes Aux buffers, keeps biquad history per voice and per splitter destination, and orders effects across types with its own effect_order (nn_audio.c:315 and 470). The branch conflicts in host/nn_audio.c again, and it's more than a text conflict:

  • The splitter destination filters here duplicate main's SetSplitterBiquadFilterParameter. Keep main's per-voice state and drop yours, which also closes the per-splitter state point.
  • SetAuxEnabled is an empty stub here, but main implements it now, so the stub has to go.
  • The plain reverb, the delay and the mix biquad should go into main's effect_order instead of adding a second ordering.

The title "audio: ..." fails the Conventional Commit check. "feat(audio): ..." would pass.

> [@Joey-Magnus](https://github.com/Joey-Magnus) reviewed on GitHub · 2026-11-12 14:32 UTC · [original](https://github.com/NotRexed/Hookshot/pull/1063#pullrequestreview-5876197653) The -Werror blocker is fixed. I ran tests/test_audio_effects.py on 487e2e8 and it passes (6 cases), and HOS_AUDIO_NO_DELAY now goes through env_on (nn_audio.c:422). The red Python jobs on this head were main's own breakage at the time (test_env_on on HOS_FPS_LOG, plus test_pcache_header_read and test_psychov35 on Windows), not this PR. The comment explaining why @0 isn't read on the mix biquad settles that point. What blocks it now is #1544, which merged this morning. It processes Aux buffers, keeps biquad history per voice and per splitter destination, and orders effects across types with its own effect_order (nn_audio.c:315 and 470). The branch conflicts in host/nn_audio.c again, and it's more than a text conflict: - The splitter destination filters here duplicate main's SetSplitterBiquadFilterParameter. Keep main's per-voice state and drop yours, which also closes the per-splitter state point. - SetAuxEnabled is an empty stub here, but main implements it now, so the stub has to go. - The plain reverb, the delay and the mix biquad should go into main's effect_order instead of adding a second ordering. The title "audio: ..." fails the Conventional Commit check. "feat(audio): ..." would pass. <!-- github-sync:r:5876197653 -->
Commenting is not possible because the repository is archived.
No description provided.