Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/autoeq-live.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: AutoEQ Live

on:
workflow_dispatch:
schedule:
- cron: "17 6 * * 1"

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}
cancel-in-progress: true

jobs:
autoeq-live:
name: AutoEQ.app compatibility
runs-on: ubuntu-24.04
timeout-minutes: 10

steps:
- name: Check out repository
uses: actions/checkout@v6

- name: Install check dependencies
run: |
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install numpy

- name: Run AutoEQ live compatibility check
run: PYTHONPATH=src .venv/bin/python tools/check_autoeq_live.py
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ jobs:
README.md|pyproject.toml|MANIFEST.in|src/*|tests/*|data/*|extensions/*)
test=true
;;
tools/check_gnome_shell_extension.py|tools/check_headless_pipewire_runtime.py|tools/pack_gnome_shell_extension.sh|tools/prepare_release.py|tools/release_gates.py|tools/release_preflight.py|tools/release_runtime_gate.py|tools/release_status.py|tools/run_headless_pipewire_runtime_smoke_ci.sh|tools/run_live_ui_runtime_smoke_ci.sh)
tools/check_autoeq_live.py|tools/check_gnome_shell_extension.py|tools/check_headless_pipewire_runtime.py|tools/pack_gnome_shell_extension.sh|tools/prepare_release.py|tools/release_gates.py|tools/release_preflight.py|tools/release_runtime_gate.py|tools/release_status.py|tools/run_headless_pipewire_runtime_smoke_ci.sh|tools/run_live_ui_runtime_smoke_ci.sh)
test=true
;;
esac
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Changelog

## 0.8.0 - 2026-05-13

- Add direct AutoEq profile search, curve preview, and on-demand headphone
correction import.
- Show generated AutoEq target, preamp, source, and filter count before
importing a profile.
- Remember window size across launches and show current release notes in the
About dialog.
- Clarify modified curves and auto preset state in the GNOME Shell extension.

## 0.7.4 - 2026-05-11

- Run filter-chain readiness callbacks from the GLib main context when PipeWire
Expand Down
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ include python3-dependencies.yaml
include src/mini_eq/style.css
include src/mini_eq/assets/icons/hicolor/scalable/apps/*.svg
include src/mini_eq/assets/icons/hicolor/symbolic/apps/*.svg
include src/mini_eq/assets/schemas/*.gschema.xml
include data/*.desktop
include data/*.metainfo.xml
include docs/flathub.md
Expand Down
25 changes: 15 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,21 @@ also show live LUFS loudness.
separate Start at Login preference and optional active-at-login routing.
- Optional GNOME Shell extension for quick panel access to routing, EQ,
analyzer status, presets, and auto preset links.
- Equalizer APO preset import from the UI or `--import-apo`, including
compatible presets exported by [AutoEq](https://autoeq.app/).
- Search and import headphone correction presets from
[AutoEq](https://autoeq.app/) directly in the app, or import Equalizer
APO-style text presets from a local file or `--import-apo`.

## AutoEq And APO Presets

Mini EQ can import Equalizer APO-style parametric EQ text presets. This makes it
usable with headphone correction presets exported by
[AutoEq](https://autoeq.app/): export an Equalizer APO/parametric EQ preset from
AutoEq, then use **Import Equalizer APO...** in Mini EQ or start the app with
`mini-eq --import-apo path/to/ParametricEQ.txt`. The
[AutoEq project](https://github.com/jaakkopasanen/AutoEq) provides the source,
headphone measurement data, targets, and optimizer behind the web app.
Mini EQ can search [AutoEq.app](https://autoeq.app/) headphone profiles,
preview the correction curve for a selected profile, and import a generated
Equalizer APO-style parametric EQ preset. Use **Import from AutoEq...** from the
main menu, search by headphone model, select a profile, then import it. Profile
data and generated presets come from AutoEq.app on demand and are cached
locally.

Local APO text presets are still supported: use **Import Equalizer APO...** in
Mini EQ or start the app with `mini-eq --import-apo path/to/ParametricEQ.txt`.

## Install

Expand Down Expand Up @@ -75,7 +78,9 @@ https://extensions.gnome.org/extension/9803/mini-eq-controls/

## Notes

Runtime data is stored under `~/.config/mini-eq`.
User presets and output preset links are stored under `~/.config/mini-eq`.
AutoEq profile data and downloaded presets are cached under
`~/.cache/mini-eq/autoeq`.

`pip install mini-eq` installs only the Python package. The recent desktop and
audio system packages listed in
Expand Down
16 changes: 13 additions & 3 deletions data/io.github.bhack.mini-eq.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,32 @@
<description>
<p>Mini EQ lets you adjust the sound from your desktop before it reaches your speakers or headphones.</p>
<p>Use ten compact bands to shape bass, mids, and treble, save presets for different outputs, compare the processed sound with the original, and monitor levels while you listen.</p>
<p>Import Equalizer APO and AutoEq presets when you want to start from an existing correction for your headphones or speakers.</p>
<p>Search AutoEq headphone corrections from the app, preview the curve, or import Equalizer APO presets from local files.</p>
</description>
<screenshots>
<screenshot type="default">
<image>https://raw.githubusercontent.com/bhack/mini-eq/v0.7.4/docs/screenshots/mini-eq.png</image>
<image>https://raw.githubusercontent.com/bhack/mini-eq/v0.8.0/docs/screenshots/mini-eq.png</image>
<caption>Adjust sound output with equalizer controls</caption>
</screenshot>
<screenshot>
<image>https://raw.githubusercontent.com/bhack/mini-eq/v0.7.4/docs/screenshots/mini-eq-dark.png</image>
<image>https://raw.githubusercontent.com/bhack/mini-eq/v0.8.0/docs/screenshots/mini-eq-dark.png</image>
<caption>Use the equalizer with dark style</caption>
</screenshot>
</screenshots>
<url type="homepage">https://github.com/bhack/mini-eq</url>
<url type="bugtracker">https://github.com/bhack/mini-eq/issues</url>
<url type="vcs-browser">https://github.com/bhack/mini-eq</url>
<releases>
<release version="0.8.0" date="2026-05-13">
<description>
<ul>
<li>Add direct AutoEq profile search, curve preview, and on-demand headphone correction import.</li>
<li>Show generated AutoEq target, preamp, source, and filter count before importing a profile.</li>
<li>Remember window size across launches and show current release notes in the About dialog.</li>
<li>Clarify modified curves and auto preset state in the GNOME Shell extension.</li>
</ul>
</description>
</release>
<release version="0.7.4" date="2026-05-11">
<description>
<ul>
Expand Down
2 changes: 1 addition & 1 deletion docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ python3 -m venv --system-site-packages ~/.local/share/mini-eq/venv
~/.local/share/mini-eq/venv/bin/mini-eq
```

Install the desktop launcher and icon for the current user:
Install the desktop launcher, icon, and GSettings schema for the current user:

```bash
mini-eq --install-desktop
Expand Down
3 changes: 3 additions & 0 deletions docs/flathub.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ status as the authoritative screenshot-mirroring check.

- Mini EQ is an upstream-maintained GTK/Libadwaita graphical application.
- The app ID `io.github.bhack.mini-eq` matches the GitHub repository ownership.
- The Flatpak is Wayland-only. Do not add X11 fallback permissions unless the
release intentionally trades the extra screen-contents access warning for X11
session support.
- The app requires `xdg-run/pipewire-0` to create and use PipeWire audio nodes.
- PyGObject comes from `org.gnome.Platform`; bundling it from PyPI would risk
mismatches with the runtime GLib, GTK, and GObject-Introspection stack.
Expand Down
19 changes: 19 additions & 0 deletions docs/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ python3 tools/prepare_release.py "$version" \
The helper only updates public version metadata: `pyproject.toml`,
`CHANGELOG.md`, the top AppStream release entry, and AppStream screenshot tag
URLs. It does not commit, tag, publish, or touch maintainer-local release state.
The AppStream release entry is also shown in the app's About dialog, so keep
these notes concise and user-facing.

Mini EQ is pre-`1.0.0`. Use patch releases for fixes and listing/package polish,
and minor releases for user-facing features or workflow changes. Do not claim
Expand Down Expand Up @@ -229,6 +231,23 @@ run the app interactively with real music before release. Exercise
enable/disable, output switching, preset changes, analyzer display, shutdown,
and stream restoration against the actual desktop audio graph.

Run the AutoEQ.app live compatibility check whenever AutoEQ import behavior,
AutoEQ request formatting, or AutoEQ parser assumptions changed:

```bash
PYTHONPATH=src python3 tools/check_autoeq_live.py
```

This check reaches the live AutoEQ.app service, validates the current
`/entries`, `/targets`, and `/equalize` shapes, and imports the generated APO
text with Mini EQ's parser. By default it probes the first parsed AutoEQ
profile, with CLI overrides available for debugging a specific profile. Treat
a failure as a live-service availability or format-drift signal to investigate.
Do not treat temporary AutoEQ.app downtime as an automatic blocker for unrelated
fixes, but decide explicitly whether the release can ship with a known
external-service issue. The `AutoEQ Live` GitHub Actions workflow runs the same
check weekly and can be dispatched manually.

Run the deterministic performance check when a release touches UI
responsiveness, graph drawing, filter parameter updates, analyzer work, routing
callbacks, or PipeWire event handling. Use `docs/performance.md` for the exact
Expand Down
6 changes: 4 additions & 2 deletions extensions/gnome-shell/mini-eq@bhack.github.io/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,9 @@ class MiniEqIndicator extends PanelMenu.Button {
? Boolean(unpackValue(state.analyzer_enabled))
: true;
const presetName = unpackValue(state.preset_name) || _('Current State');
const curveLabel = unpackValue(state.curve_label) || presetName;
const outputPresetName = unpackValue(state.output_preset_name) || '';
const outputPresetLabel = unpackValue(state.output_preset_label) || outputPresetName;
const capabilities = unpackValue(state.capabilities) || [];
this._capabilities = new Set(Array.isArray(capabilities) ? capabilities : []);
const canQuit = this._capabilities.has('quit');
Expand All @@ -367,9 +369,9 @@ class MiniEqIndicator extends PanelMenu.Button {
this._routingItem.setSensitive(running);
this._eqItem.setSensitive(running && routed);
this._presetsItem.setSensitive(running);
this._presetsItem.label.text = running ? _('Preset: %s').format(presetName) : _('Presets');
this._presetsItem.label.text = running ? _('Curve: %s').format(curveLabel) : _('Presets');
this._statusItem.label.text = this._statusText(running, routed, eqEnabled);
this._outputPresetItem.label.text = this._outputPresetText(running, outputPresetName);
this._outputPresetItem.label.text = this._outputPresetText(running, outputPresetLabel);
this._quitItem.visible = running && canQuit;
}

Expand Down
5 changes: 3 additions & 2 deletions io.github.bhack.mini-eq.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ runtime-version: "50"
sdk: org.gnome.Sdk
command: mini-eq
finish-args:
- --socket=fallback-x11
- --socket=wayland
- --share=ipc
- --share=network
- --device=dri
- --filesystem=xdg-run/pipewire-0:ro
- --env=PIPEWIRE_MODULE_DIR=/app/lib/pipewire-0.3:/usr/lib/x86_64-linux-gnu/pipewire-0.3:/usr/lib/aarch64-linux-gnu/pipewire-0.3:/usr/lib/pipewire-0.3
Expand Down Expand Up @@ -136,6 +135,8 @@ modules:
- python3 -m pip install --no-index --no-deps --no-build-isolation --prefix=${FLATPAK_DEST} .
- install -Dm644 data/io.github.bhack.mini-eq.desktop -t ${FLATPAK_DEST}/share/applications
- install -Dm644 data/io.github.bhack.mini-eq.metainfo.xml -t ${FLATPAK_DEST}/share/metainfo
- install -Dm644 src/mini_eq/assets/schemas/io.github.bhack.mini-eq.gschema.xml -t ${FLATPAK_DEST}/share/glib-2.0/schemas
- glib-compile-schemas --strict ${FLATPAK_DEST}/share/glib-2.0/schemas
- cp -a src/mini_eq/assets/icons ${FLATPAK_DEST}/share/
sources:
- type: dir
Expand Down
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "mini-eq"
version = "0.7.4"
version = "0.8.0"
description = "Compact PipeWire system-wide parametric equalizer for Linux desktops."
readme = "README.md"
requires-python = ">=3.11"
Expand Down Expand Up @@ -77,6 +77,7 @@ mini_eq = [
"style.css",
"assets/icons/hicolor/scalable/apps/*.svg",
"assets/icons/hicolor/symbolic/apps/*.svg",
"assets/schemas/*.gschema.xml",
]

[tool.pytest.ini_options]
Expand Down
22 changes: 22 additions & 0 deletions src/mini_eq/assets/schemas/io.github.bhack.mini-eq.gschema.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
<schema id="io.github.bhack.mini-eq" path="/io/github/bhack/mini-eq/">
<key name="window-width" type="i">
<range min="980" max="4096"/>
<default>1360</default>
<summary>Window width</summary>
<description>The width of the main Mini EQ window.</description>
</key>
<key name="window-height" type="i">
<range min="600" max="2160"/>
<default>720</default>
<summary>Window height</summary>
<description>The height of the main Mini EQ window.</description>
</key>
<key name="window-maximized" type="b">
<default>false</default>
<summary>Window maximized state</summary>
<description>Whether the main Mini EQ window was maximized.</description>
</key>
</schema>
</schemalist>
Loading