Releases: SiputBiru/eqtui
v0.1.1
0.1.1 — 2026-06-05
Live Frequency Response Graph
-
Replaced the static placeholder chart in the right panel with a live combined magnitude response of all active EQ bands.
- Evaluates each biquad filter's
$|H(e^{j\omega})|$ at 200 log-spaced frequencies (20 Hz – 20 kHz), summing contributions in dB. - Uses the same Audio EQ Cookbook coefficient formulas as the daemon — the curve matches the actual audio pipeline.
- Y-axis changed from 60–100 dB SPL to ±24 dB relative gain, centred on a 0 dB reference line.
- Preamp value shown in the title bar. Curve and border dim when bypassed or when no bands are present.
- Evaluates each biquad filter's
Magnitude is evaluated in direct rectangular form rather than the expanded closed-form
Full Changelog: v0.1.1-alpha.7...v0.1.1
v0.1.1-alpha.7
0.1.1-alpha.7 — 2026-05-29
Codebase Reduction
-
Deleted
src/config.rs(−153 lines). The TOML config system for
keybindings really not being used often, dropping the support -
Debloated
src/daemon.rs(−254 lines, −32%). Removed:- Double-fork POSIX daemonization (unnecessary — TUI spawns the daemon)
- State persistence to
state.toml(daemon runs for session lifetime) - Signal handler + watcher thread (simplified shutdown path)
- Rate limiter and
MAX_CLIENTSlimit (single-user desktop app) - Peer credentials check (socket lives in
$XDG_RUNTIME_DIR) catch_unwindwrapper (panics propagate naturally)
The daemon's core functionality (PipeWire pipeline, Unix socket IPC,
event push to clients) is unchanged. -
Replaced
regexcrate with manual parsing in PEQ file loader.
Two regex patterns replaced withstrip_prefix/split/parse.
Faster compile, smaller binary.
Full Changelog: v0.1.1-alpha.6...v0.1.1-alpha.7
v0.1.1-alpha.6
Stability & Polish
Audio Engine Fixes
- Remove
std::sync::RwLockfrom real-time audio path — zero locks on the PipeWire RT thread, eliminating xruns during EQ changes - Merge redundant peak detection loops into a single pass (~30–40% less peak overhead per buffer)
- Fold preamp multiplication into
AudioEq::process()— eliminates an extra O(n) buffer pass - Fix
Relaxedatomic ordering on peak meters — replaced withRelease/Acquirepairs for correct visibility on ARM (Apple Silicon, Raspberry Pi, AWS Graviton) - Move
pw-link -Isubprocess off the PipeWire mainloop into a dedicated thread — eliminates periodic audio glitches on complex PW graphs
Daemon Reliability
- Crash recovery: daemon auto-saves state (bands, preamp, bypass, connected devices) to
~/.local/share/eqtui/state.tomlafter every
change and restores on startup - TUI reconnection: retry loop with exponential backoff (1s → 2s → 4s → 8s) when the daemon disconnects; TUI stays alive and automatically resumes
- Daemon connection status shown in the monitoring panel (Connected / Reconnecting... / Disconnected)
- Kill orphaned daemon processes on auto-launch timeout (SIGTERM)
- Truncate daemon log on start to prevent unbounded growth
- Graceful shutdown on SIGTERM/SIGINT with clean PipeWire teardown
- Auto-recover from PipeWire disconnects (
eqtui restartsupport)
TUI Improvements
- Preamp value shown above the L/R peak meters in the monitoring panel
- More keybind hints in the status bar (bypass, profiles, reset, command/visual mode)
- Notification when pressing
Cbefore the filter is ready Source: ?indicator when null-sink input state can't be determined--helpand--versionCLI flags
Bug Fixes
- Profile save errors now surfaced instead of silently swallowed
- TUI state updated after daemon confirmation in connect/disconnect, preventing phantom device states
- Bypass mode no longer applies preamp attenuation (unity gain)
- Reject connecting the null sink or filter to itself (feedback loop guard)
- Duplicate
connected_devicesentries on rapid double-Cprevented - Float test tolerance fixed (
f32::EPSILON→1e-3)
Code Quality
- Consolidated 11 standalone default-value functions into typed
implblocks withconstdefaults - Extracted duplicated profile update and band-bumping logic
- Memoized regex compilation in PEQ parser (
LazyLock<Regex>) - Safe regex capture access replacing panic-prone direct indexing
Note
actually we can just call it 0.1.1 to make it the official stable release but idk man i still want to see if there is other vuln or bug.
Full Changelog: v0.1.1-alpha.5...v0.1.1-alpha.6
v0.1.1-alpha.5
Fixes
- Critical: audio xruns on EQ changes — Removed RwLock from the real-time audio thread. EQ processing now runs entirely on the PipeWire mainloop thread with zero lock acquisitions.
- Critical: TUI hangs on event thread failure — Event thread no longer panics silently when the channel drops. Exits cleanly instead of freezing the TUI.
- UX: zero-value cell editing — Entering insert mode on a frequency/gain/Q cell at 0 now starts with an empty input field. No more deleting "0.0" before typing a new value.
Performance
- Preamp folded into EQ processing — Preamp multiplication is now applied inside the biquad chain's output pass, eliminating one full buffer traversal per audio callback.
- Peak detection loop merged — Left and right channel peak scanning combined into a single pass.
Internal
- Removed EffectPlugin trait (single implementation, no longer needed)
- Pipeline::set_bands() removed — EQ config flows through the command channel
- 0 new dependencies
Full Changelog: v0.1.1-alpha.4...v0.1.1-alpha.5
v0.1.1-alpha.4
Full Changelog: v0.1.1-alpha.3...v0.1.1-alpha.4