Skip to content

Resolve through EasyEffects to its configured output device - #8713

Open
tzssangglass wants to merge 1 commit into
omacom:quattrofrom
tzssangglass:fix/easyeffects-output-sink-resolution
Open

Resolve through EasyEffects to its configured output device#8713
tzssangglass wants to merge 1 commit into
omacom:quattrofrom
tzssangglass:fix/easyeffects-output-sink-resolution

Conversation

@tzssangglass

@tzssangglass tzssangglass commented Aug 28, 2026

Copy link
Copy Markdown

Problem

With Easy Effects as the default output ("Process all outputs"), the volume keys, the OSD, and the audio panel slider adjust the virtual easyeffects_sink instead of the physical sink:

  • Loudness doesn't change. With a dynamics plugin in the chain (e.g. autogain), the input-level change is normalized away -- the OSD moves while the speakers stay exactly as loud.

Root cause

omarchy-audio-output-sink resolves a DSP sink's physical output by scanning pactl list sink-inputs for the forwarding stream (matching the sink name, or application.name = "EasyEffects"). Current EasyEffects forwards through direct PipeWire node links (ee_soe_output_level:output_* -> alsa_output...:playback_*), which never appear as PulseAudio sink-inputs at all. The scan finds nothing, so the script falls back to returning easyeffects_sink itself -- exactly the case the header comment warns about: "the display moves while the speakers do not".

Verified live: during active playback through Easy Effects, pactl list sink-inputs shows only the apps playing into easyeffects_sink; no EasyEffects stream toward the physical sink exists.

Fix

EasyEffects persists its configured output device in ~/.config/easyeffects/db/easyeffectsrc ([StreamOutputs] outputDevice=). When the stream scan finds nothing and the selected sink is easyeffects_sink, read the physical sink from there:

  • validated against the live sink list (pactl list sinks short), so a stale/unplugged device falls through to the existing fallback unchanged
  • complements the existing EasyEffects stream matcher -- setups where the forwarding stream does appear keep working exactly as before
  • works whether or not audio is currently flowing (the node links only exist during playback; the config is always there)

Reproduction

# Easy Effects running, Process-all-outputs on, default output = Easy Effects Sink,
# EE output device = speakers, autogain (or any dynamics) in the chain
omarchy-audio-output-sink
# before: easyeffects_sink          <- virtual sink, wrong target for volume
# after:  alsa_output...Speaker__sink  <- physical sink

omarchy-audio-output-volume +5
# before: OSD moves, loudness unchanged (autogain normalizes it)
# after:  loudness actually changes, easyeffects_sink untouched

Verification

Case Result
Default = Easy Effects Sink, playing resolves to physical speaker, keys change real loudness
Default = Easy Effects Sink, idle (no links) same, via persisted config
Default = physical sink (EE off) unchanged (early return)
Missing/stale easyeffectsrc falls back to previous behavior
omarchy speaker-tuning filter chain unchanged (stream scan runs first)

Tested on Omarchy 4.0.1 with Easy Effects 7.x, PipeWire/WirePlumber.

Copilot AI balanced review requested due to automatic review settings August 28, 2026 03:14

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review any files in this pull request.


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@tzssangglass
tzssangglass marked this pull request as draft August 28, 2026 03:19
The sink-input scan misses EasyEffects because it forwards through
direct PipeWire node links that never appear as PulseAudio streams.
Volume keys and the audio panel then end up adjusting the virtual
easyeffects_sink: the OSD moves while loudness stays put -- an autogain
or limiter in the chain normalizes the change away.

EasyEffects persists its configured output device in easyeffectsrc, so
read the physical sink from there when the stream scan finds nothing.
The device is validated against the live sink list, and anything
unexpected falls through to the existing behavior.
@tzssangglass
tzssangglass force-pushed the fix/easyeffects-output-sink-resolution branch from 6ad5908 to f6eb5ae Compare August 28, 2026 07:38
@tzssangglass
tzssangglass marked this pull request as ready for review August 28, 2026 07:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants