Skip to content

Releases: SiputBiru/eqtui

v0.1.1

05 Jun 01:45

Choose a tag to compare

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.

Magnitude is evaluated in direct rectangular form rather than the expanded closed-form $|H(e^{j\omega})|$ formula — avoids floating-point cancellation that lost precision at frequencies far from a band's centre.

Full Changelog: v0.1.1-alpha.7...v0.1.1

v0.1.1-alpha.7

29 May 13:58

Choose a tag to compare

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_CLIENTS limit (single-user desktop app)
    • Peer credentials check (socket lives in $XDG_RUNTIME_DIR)
    • catch_unwind wrapper (panics propagate naturally)

    The daemon's core functionality (PipeWire pipeline, Unix socket IPC,
    event push to clients) is unchanged.

  • Replaced regex crate with manual parsing in PEQ file loader.
    Two regex patterns replaced with strip_prefix/split/parse.
    Faster compile, smaller binary.

Full Changelog: v0.1.1-alpha.6...v0.1.1-alpha.7

v0.1.1-alpha.6

25 May 12:19

Choose a tag to compare

Stability & Polish

Audio Engine Fixes

  • Remove std::sync::RwLock from 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 Relaxed atomic ordering on peak meters — replaced with Release/Acquire pairs for correct visibility on ARM (Apple Silicon, Raspberry Pi, AWS Graviton)
  • Move pw-link -I subprocess 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.toml after 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 restart support)

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 C before the filter is ready
  • Source: ? indicator when null-sink input state can't be determined
  • --help and --version CLI 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_devices entries on rapid double-C prevented
  • Float test tolerance fixed (f32::EPSILON1e-3)

Code Quality

  • Consolidated 11 standalone default-value functions into typed impl blocks with const defaults
  • 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

24 May 11:20

Choose a tag to compare

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

23 May 12:11

Choose a tag to compare

v0.1.1-alpha.3

23 May 08:35

Choose a tag to compare