mini-eq 0.7.2__tar.gz → 0.7.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. {mini_eq-0.7.2 → mini_eq-0.7.4}/AGENTS.md +45 -47
  2. {mini_eq-0.7.2 → mini_eq-0.7.4}/CHANGELOG.md +23 -0
  3. {mini_eq-0.7.2 → mini_eq-0.7.4}/MANIFEST.in +1 -0
  4. {mini_eq-0.7.2/src/mini_eq.egg-info → mini_eq-0.7.4}/PKG-INFO +14 -153
  5. mini_eq-0.7.4/README.md +91 -0
  6. {mini_eq-0.7.2 → mini_eq-0.7.4}/data/io.github.bhack.mini-eq.metainfo.xml +21 -2
  7. mini_eq-0.7.4/docs/development.md +193 -0
  8. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/flathub.md +27 -82
  9. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/performance.md +19 -0
  10. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/release.md +124 -91
  11. {mini_eq-0.7.2 → mini_eq-0.7.4}/extensions/gnome-shell/mini-eq@bhack.github.io/extension.js +15 -6
  12. {mini_eq-0.7.2 → mini_eq-0.7.4}/io.github.bhack.mini-eq.yaml +2 -2
  13. {mini_eq-0.7.2 → mini_eq-0.7.4}/pyproject.toml +2 -2
  14. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/app.py +88 -23
  15. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/core.py +24 -3
  16. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/dbus_control.py +1 -0
  17. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/deps.py +14 -5
  18. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/pipewire_backend.py +359 -33
  19. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/pipewire_routes.py +86 -45
  20. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/pipewire_stream_router.py +101 -4
  21. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/routing.py +174 -72
  22. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/settings.py +2 -2
  23. {mini_eq-0.7.2 → mini_eq-0.7.4/src/mini_eq.egg-info}/PKG-INFO +14 -153
  24. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq.egg-info/SOURCES.txt +15 -0
  25. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq.egg-info/requires.txt +1 -1
  26. mini_eq-0.7.4/tests/test_check_flatpak_runtime.py +39 -0
  27. mini_eq-0.7.4/tests/test_check_headless_pipewire_runtime.py +73 -0
  28. mini_eq-0.7.4/tests/test_check_live_ui_runtime.py +59 -0
  29. mini_eq-0.7.4/tests/test_github_workflows.py +119 -0
  30. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_app.py +73 -0
  31. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_core.py +14 -0
  32. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_dbus_control.py +1 -0
  33. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_deps.py +24 -4
  34. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_pipewire_backend.py +568 -55
  35. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_pipewire_stream_router.py +179 -6
  36. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_routing.py +294 -20
  37. mini_eq-0.7.4/tests/test_prepare_release.py +57 -0
  38. mini_eq-0.7.4/tests/test_release_preflight.py +171 -0
  39. mini_eq-0.7.4/tests/test_release_runtime_gate.py +178 -0
  40. mini_eq-0.7.4/tests/test_release_status.py +139 -0
  41. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/check_flatpak_runtime.py +17 -10
  42. mini_eq-0.7.4/tools/check_headless_pipewire_runtime.py +455 -0
  43. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/check_live_ui_runtime.py +116 -14
  44. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/check_pipewire_gobject.py +13 -0
  45. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/gnome-shell-extension/fake_mini_eq_control.py +28 -3
  46. mini_eq-0.7.4/tools/prepare_release.py +162 -0
  47. mini_eq-0.7.4/tools/release_gates.py +47 -0
  48. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/release_preflight.py +142 -22
  49. mini_eq-0.7.4/tools/release_runtime_gate.py +200 -0
  50. mini_eq-0.7.4/tools/release_status.py +445 -0
  51. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/run_flatpak_runtime_smoke_ci.sh +6 -3
  52. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/run_gnome_extension_dev_shell.sh +23 -9
  53. mini_eq-0.7.4/tools/run_headless_pipewire_runtime_smoke_ci.sh +36 -0
  54. mini_eq-0.7.4/tools/run_live_ui_runtime_smoke_ci.sh +36 -0
  55. mini_eq-0.7.4/tools/run_nested_flathub_extension_smoke.sh +168 -0
  56. mini_eq-0.7.2/README.md +0 -230
  57. mini_eq-0.7.2/tests/test_check_flatpak_runtime.py +0 -23
  58. mini_eq-0.7.2/tests/test_release_preflight.py +0 -63
  59. {mini_eq-0.7.2 → mini_eq-0.7.4}/LICENSE +0 -0
  60. {mini_eq-0.7.2 → mini_eq-0.7.4}/SECURITY.md +0 -0
  61. {mini_eq-0.7.2 → mini_eq-0.7.4}/data/io.github.bhack.mini-eq.desktop +0 -0
  62. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/screenshots/README.md +0 -0
  63. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/screenshots/mini-eq-dark.png +0 -0
  64. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/screenshots/mini-eq.png +0 -0
  65. {mini_eq-0.7.2 → mini_eq-0.7.4}/docs/social-preview.png +0 -0
  66. {mini_eq-0.7.2 → mini_eq-0.7.4}/extensions/gnome-shell/README.md +0 -0
  67. {mini_eq-0.7.2 → mini_eq-0.7.4}/extensions/gnome-shell/mini-eq@bhack.github.io/metadata.json +0 -0
  68. {mini_eq-0.7.2 → mini_eq-0.7.4}/extensions/gnome-shell/mini-eq@bhack.github.io/mini-eq-symbolic.svg +0 -0
  69. {mini_eq-0.7.2 → mini_eq-0.7.4}/python3-dependencies.yaml +0 -0
  70. {mini_eq-0.7.2 → mini_eq-0.7.4}/setup.cfg +0 -0
  71. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/__init__.py +0 -0
  72. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/__main__.py +0 -0
  73. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/analyzer.py +0 -0
  74. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/analyzer_widget.py +0 -0
  75. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/appearance.py +0 -0
  76. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/assets/icons/hicolor/scalable/apps/io.github.bhack.mini-eq.svg +0 -0
  77. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/assets/icons/hicolor/symbolic/apps/io.github.bhack.mini-eq-symbolic.svg +0 -0
  78. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/background.py +0 -0
  79. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/band_fader.py +0 -0
  80. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/cli.py +0 -0
  81. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/desktop_integration.py +0 -0
  82. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/ebur128.py +0 -0
  83. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/filter_chain.py +0 -0
  84. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/glib_utils.py +0 -0
  85. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/gtk_utils.py +0 -0
  86. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/instance.py +0 -0
  87. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/screenshot.py +0 -0
  88. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/style.css +0 -0
  89. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window.py +0 -0
  90. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_analyzer.py +0 -0
  91. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_graph.py +0 -0
  92. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_headroom.py +0 -0
  93. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_layout.py +0 -0
  94. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_preferences.py +0 -0
  95. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_presets.py +0 -0
  96. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_utility.py +0 -0
  97. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq/window_utils.py +0 -0
  98. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq.egg-info/dependency_links.txt +0 -0
  99. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq.egg-info/entry_points.txt +0 -0
  100. {mini_eq-0.7.2 → mini_eq-0.7.4}/src/mini_eq.egg-info/top_level.txt +0 -0
  101. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_flathub_manifest_drift.py +0 -0
  102. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_gnome_shell_extension.py +0 -0
  103. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_analyzer.py +0 -0
  104. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_appearance.py +0 -0
  105. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_atspi_widgets.py +0 -0
  106. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_background.py +0 -0
  107. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_cli.py +0 -0
  108. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_desktop_integration.py +0 -0
  109. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_ebur128.py +0 -0
  110. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_filter_chain.py +0 -0
  111. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_instance.py +0 -0
  112. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_live_ui_runtime.py +0 -0
  113. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_output_presets.py +0 -0
  114. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_pipewire_routes.py +0 -0
  115. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_settings.py +0 -0
  116. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_window.py +0 -0
  117. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_window_analyzer.py +0 -0
  118. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_window_graph.py +0 -0
  119. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_mini_eq_window_headroom.py +0 -0
  120. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_release_post_publish.py +0 -0
  121. {mini_eq-0.7.2 → mini_eq-0.7.4}/tests/test_version_metadata.py +0 -0
  122. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/benchmark_fader_drag.py +0 -0
  123. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/check_flathub_manifest_drift.py +0 -0
  124. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/check_gnome_shell_extension.py +0 -0
  125. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/check_test_hygiene.py +0 -0
  126. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/demo_runtime.py +0 -0
  127. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/pack_gnome_shell_extension.sh +0 -0
  128. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/profile_live_app.py +0 -0
  129. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/profile_sysprof.py +0 -0
  130. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/release_post_publish.py +0 -0
  131. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/render_demo_screenshot.py +0 -0
  132. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/render_social_preview.py +0 -0
  133. {mini_eq-0.7.2 → mini_eq-0.7.4}/tools/run_release_preflight_container.sh +0 -0
@@ -34,6 +34,8 @@ paths in ignored repo-local skills under `.agents/skills/`.
34
34
  - `io.github.bhack.mini-eq.yaml`: local Flatpak manifest.
35
35
  - `python3-dependencies.yaml`: generated Flatpak Python dependencies.
36
36
  - `tests/`: pytest suite for core behavior and non-visual integration seams.
37
+ - `docs/development.md`: source checkout, PyPI, local Flatpak, and extended
38
+ development test commands.
37
39
 
38
40
  ## Development Commands
39
41
 
@@ -61,15 +63,8 @@ and no-assert tests are candidates for human review, not automatic removals.
61
63
  GTK virtual methods, signal callbacks, property bindings, and other framework
62
64
  entry points often look unused to static analysis.
63
65
 
64
- For release/package checks:
65
-
66
- ```bash
67
- appstreamcli validate --no-net data/io.github.bhack.mini-eq.metainfo.xml
68
- desktop-file-validate data/io.github.bhack.mini-eq.desktop
69
- .venv/bin/python tools/check_gnome_shell_extension.py
70
- .venv/bin/python -m build
71
- .venv/bin/python -m twine check dist/*
72
- ```
66
+ For source install, PyPI package validation, local Flatpak builds, and extended
67
+ runtime smoke commands, use `docs/development.md`.
73
68
 
74
69
  The app depends on system GI/audio packages that Python packaging cannot fully
75
70
  install: GTK4, Libadwaita, PipeWire, a WirePlumber-managed session, and the
@@ -84,19 +79,40 @@ nested headless GNOME Shell session:
84
79
  MINI_EQ_RUN_ATSPI=1 .venv/bin/python -m pytest tests/test_mini_eq_atspi_widgets.py -q
85
80
  ```
86
81
 
87
- For a deeper live runtime smoke, run the real GTK app in a private
88
- PipeWire/WirePlumber graph with synthetic playback and AT-SPI UI driving:
82
+ For PipeWire graph behavior without nested GNOME/AT-SPI, run the headless
83
+ controller smoke. It owns synthetic stream routing, default-output moves,
84
+ monitor toggles, and active processing-link assertions:
85
+
86
+ ```bash
87
+ .venv/bin/python tools/check_headless_pipewire_runtime.py --timeout 35 --cycles 2
88
+ ```
89
+
90
+ For a deeper live UI smoke, run the real GTK app in a private PipeWire/WirePlumber
91
+ graph with synthetic playback and AT-SPI UI driving:
89
92
 
90
93
  ```bash
91
94
  .venv/bin/python tools/check_live_ui_runtime.py --timeout 35 --cycles 1
92
95
  MINI_EQ_RUN_LIVE_UI=1 .venv/bin/python -m pytest tests/test_mini_eq_live_ui_runtime.py -q
93
96
  ```
94
97
 
95
- When creating a fresh venv for pip/package validation, build pipewire-gobject in
96
- a plain wheel-build venv first, then install that wheel into a
97
- `--system-site-packages` Mini EQ venv. This keeps distro GI bindings visible at
98
- runtime without making Ubuntu/Debian `g-ir-scanner` import partial `distutils`
99
- modules from a system-site build venv.
98
+ The headless PipeWire smoke is the stable native controller/graph gate and is
99
+ part of release preflight. The live UI smoke is opt-in locally because it needs
100
+ nested GNOME Shell, AT-SPI, PipeWire, and WirePlumber. Treat it as a maintainer
101
+ confidence check on a supported recent GNOME/GTK stack; the blocking public
102
+ release runtime gates are release preflight and the Flatpak routing smoke.
103
+
104
+ For manual GNOME Shell extension testing against an installed Flatpak build,
105
+ run the nested devkit smoke. It loads the extension from this checkout and
106
+ launches the installed Flatpak app in the same isolated nested display and
107
+ session bus:
108
+
109
+ ```bash
110
+ tools/run_nested_flathub_extension_smoke.sh --replace-running
111
+ ```
112
+
113
+ When creating a fresh venv for pip/package validation, follow
114
+ `docs/development.md` so pipewire-gobject is built in a plain wheel-build venv
115
+ before being installed into a `--system-site-packages` Mini EQ venv.
100
116
 
101
117
  ## Change Guidelines
102
118
 
@@ -106,8 +122,11 @@ modules from a system-site build venv.
106
122
  - Keep the pipewire-gobject API boundary small, general-purpose, and
107
123
  app-facing. Mini EQ may validate new pipewire-gobject API in a real GTK app,
108
124
  but do not add Mini EQ-shaped concepts, preset/filter-chain policy, or
109
- hardware-selection policy to pipewire-gobject. WirePlumber stays the host
110
- session manager, not a bundled GI dependency.
125
+ hardware-selection policy to pipewire-gobject. When changing public
126
+ pipewire-gobject API, follow the sibling checkout's `AGENTS.md` bindable API
127
+ gate: plain C/C99 public scalar types, no public GLib collections, explicit
128
+ ownership/nullability annotations, and generated GIR/test updates. WirePlumber
129
+ stays the host session manager, not a bundled GI dependency.
111
130
  - Treat the Mini EQ D-Bus control interface as a project-internal app/Shell
112
131
  extension contract with version-skew tolerance. Keep `api_version = 1`
113
132
  additive only: add state fields, methods, and capabilities when needed, but do
@@ -166,19 +185,13 @@ Use `docs/social-preview.png` for GitHub and social link previews. This is not a
166
185
  Flathub quality-check input, so it may use branded/dark promotional composition,
167
186
  but it should be refreshed when the public screenshot changes materially.
168
187
 
169
- Generate the public release screenshot with deterministic demo data:
170
-
171
- ```bash
172
- PYTHONPATH=src python3 tools/render_demo_screenshot.py docs/screenshots/mini-eq.png
173
- PYTHONPATH=src python3 tools/render_demo_screenshot.py docs/screenshots/mini-eq-dark.png --appearance dark
174
- ```
175
-
176
188
  Do not commit screenshots that show personal device names, Bluetooth device
177
189
  names, usernames, hostnames, local paths, or private preset names. Prefer
178
190
  `tools/render_demo_screenshot.py` over desktop screenshots because it renders
179
191
  only the Mini EQ window from deterministic demo data. Keep the public release
180
192
  screenshot in the platform-default light appearance unless you are adding
181
193
  additional screenshots that intentionally demonstrate other appearance modes.
194
+ Use `docs/screenshots/README.md` for the generation commands.
182
195
 
183
196
  For visual or adaptive-layout changes, inspect deterministic screenshot
184
197
  matrices before considering the work done. Cover the minimum, default, narrow,
@@ -201,31 +214,16 @@ renders on light and dark backgrounds.
201
214
 
202
215
  ## Release And Security
203
216
 
204
- Use `docs/release.md` as the public release checklist. Before publishing
205
- release artifacts, verify the rendered README, package URLs, issue tracker,
206
- license, screenshots, and AppStream metadata.
207
- During release preparation, verify that version-bearing files agree:
208
- `pyproject.toml`, `CHANGELOG.md`, and the AppStream release entry and screenshot
209
- URL. The package `__version__` is derived from release metadata and should not
210
- be hardcoded separately.
211
-
212
- Before publishing artifacts, run the release preflight. Prefer the
213
- containerized wrapper when the host does not already have the `pipewire-gobject`
214
- sdist build dependencies installed:
217
+ Use `docs/release.md` as the public release checklist. Use
218
+ `tools/prepare_release.py`, `tools/release_status.py`,
219
+ `tools/run_release_preflight_container.sh`, and
220
+ `tools/release_post_publish.py` for repeatable release checks. Keep
221
+ owner-specific workflow dispatch, deployment approval, and local Flathub merge
222
+ steps in ignored repo-local skills under `.agents/skills/`.
215
223
 
216
- ```bash
217
- tools/run_release_preflight_container.sh
218
- ```
219
-
220
- Set `MINI_EQ_FLATHUB_MANIFEST` to a Flathub publishing manifest path when the
221
- containerized preflight should include the manifest drift check.
222
224
  The preflight owns the focused leak scan for `HEAD`, tracked worktree changes,
223
225
  and untracked non-ignored text files. Use Gitleaks as an extra check when
224
- release history or generated artifacts look suspicious:
225
-
226
- ```bash
227
- gitleaks git --no-banner --redact .
228
- ```
226
+ release history or generated artifacts look suspicious.
229
227
 
230
228
  Do not push local scratch branches or local safety tags.
231
229
  Do not rewrite public history unless the user explicitly asks for it and accepts
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.4 - 2026-05-11
4
+
5
+ - Run filter-chain readiness callbacks from the GLib main context when PipeWire
6
+ reports the virtual sink asynchronously, avoiding thread-loop sync failures
7
+ during system-wide EQ startup.
8
+ - Require pipewire-gobject 0.3.7 and re-apply the active filter controls when
9
+ PipeWire creates or activates links on the Mini EQ processing path, so audio
10
+ resumed after silence starts processing without requiring an A/B toggle.
11
+ - Refresh port-aware output preset scope when PipeWire reports route parameter
12
+ serial changes on the active output device.
13
+
14
+ ## 0.7.3 - 2026-05-11
15
+
16
+ - Require pipewire-gobject 0.3.6 and use its synchronous PipeWire registry,
17
+ metadata, node, and device APIs for startup and routing state.
18
+ - Replace Mini EQ's PipeWire startup and routing sleep loops with bounded sync
19
+ or registry-event waits for route params, virtual sink creation, and stream
20
+ routing.
21
+ - Avoid a headless startup hang when system-wide EQ fails synchronously before
22
+ the GLib main loop starts.
23
+ - Hide the GNOME Shell extension's mini analyzer while monitoring is turned
24
+ off, keeping the panel item available without showing stale meter bars.
25
+
3
26
  ## 0.7.2 - 2026-05-10
4
27
 
5
28
  - Finish GNOME Shell startup notification after Mini EQ's delayed first-window
@@ -9,6 +9,7 @@ include src/mini_eq/assets/icons/hicolor/symbolic/apps/*.svg
9
9
  include data/*.desktop
10
10
  include data/*.metainfo.xml
11
11
  include docs/flathub.md
12
+ include docs/development.md
12
13
  include docs/performance.md
13
14
  include docs/release.md
14
15
  include docs/social-preview.png
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mini-eq
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: Compact PipeWire system-wide parametric equalizer for Linux desktops.
5
5
  Author: bhack
6
6
  License-Expression: GPL-3.0-or-later
@@ -25,7 +25,7 @@ Requires-Python: >=3.11
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
27
  Requires-Dist: numpy>=1.26
28
- Requires-Dist: pipewire-gobject<0.4,>=0.3.5
28
+ Requires-Dist: pipewire-gobject<0.4,>=0.3.7
29
29
  Provides-Extra: test
30
30
  Requires-Dist: pytest>=8; extra == "test"
31
31
  Provides-Extra: dev
@@ -87,126 +87,26 @@ headphone measurement data, targets, and optimizer behind the web app.
87
87
 
88
88
  ## Install
89
89
 
90
- Recommended install paths:
91
-
92
- 1. Flathub, the preferred desktop install path.
93
- 2. PyPI, after the system desktop/audio dependencies below are installed.
94
- 3. Source checkout, for development or testing unreleased changes.
95
-
96
- Install from Flathub:
90
+ The recommended desktop install path is Flathub:
97
91
 
98
92
  ```bash
99
93
  flatpak install flathub io.github.bhack.mini-eq
100
94
  flatpak run io.github.bhack.mini-eq
101
95
  ```
102
96
 
103
- Mini EQ depends on system desktop/audio packages that Python packaging cannot
104
- fully install: GTK 4.12+ and Libadwaita 1.7+ GI bindings, PyGObject, PipeWire,
105
- WirePlumber as the session manager, and the native libraries required by
106
- pipewire-gobject. Install PyGObject from your distro, such as `python3-gi` or
107
- `python3-gobject`, rather than adding a PyPI PyGObject dependency to Mini EQ.
108
-
109
- If your distro ships older GTK or Libadwaita builds, prefer the Flatpak build.
110
-
111
- Package names vary by distro release. If pip builds pipewire-gobject from its
112
- source distribution, install the GLib, GObject-Introspection, and PipeWire
113
- development packages first. Virtual environments that need distro GI bindings
114
- should use `--system-site-packages`; on Ubuntu/Debian, build the
115
- pipewire-gobject wheel in a plain venv first, then install that wheel into the
116
- system-site Mini EQ venv.
117
-
118
- These are good starting points:
119
-
120
- ```bash
121
- # Ubuntu / Debian
122
- sudo apt install \
123
- gir1.2-adw-1 \
124
- gir1.2-gtk-4.0 \
125
- gobject-introspection \
126
- libgirepository1.0-dev \
127
- libglib2.0-dev \
128
- libpipewire-0.3-dev \
129
- meson \
130
- ninja-build \
131
- pkg-config \
132
- pipewire \
133
- python3-cairo \
134
- python3-pip \
135
- python3-gi \
136
- python3-setuptools \
137
- python3-venv \
138
- wireplumber \
139
- libebur128-1
140
-
141
- # Fedora
142
- sudo dnf install \
143
- gtk4 \
144
- libadwaita \
145
- gobject-introspection-devel \
146
- glib2-devel \
147
- meson \
148
- ninja-build \
149
- pkgconf-pkg-config \
150
- pipewire \
151
- pipewire-devel \
152
- python3-cairo \
153
- python3-gobject \
154
- python3-pip \
155
- wireplumber \
156
- libebur128
157
-
158
- # Arch Linux
159
- sudo pacman -S \
160
- gtk4 \
161
- libadwaita \
162
- gobject-introspection \
163
- glib2 \
164
- meson \
165
- ninja \
166
- pkgconf \
167
- pipewire \
168
- python-cairo \
169
- python-gobject \
170
- python-pip \
171
- wireplumber \
172
- libebur128
173
- ```
174
-
175
- Install the Python package after the system packages are present:
97
+ PyPI and source installs are available for development or for systems with a
98
+ recent GTK/Libadwaita stack plus PyGObject, PipeWire, WirePlumber, and native
99
+ pipewire-gobject build/runtime packages already installed:
176
100
 
177
101
  ```bash
178
- python3 -m venv /tmp/mini-eq-pwg-build
179
- /tmp/mini-eq-pwg-build/bin/python -m pip install --upgrade pip
180
- /tmp/mini-eq-pwg-build/bin/python -m pip wheel 'pipewire-gobject>=0.3.5,<0.4' -w /tmp/mini-eq-wheelhouse
181
-
182
- python3 -m venv --system-site-packages ~/.local/share/mini-eq/venv
183
- ~/.local/share/mini-eq/venv/bin/python -m pip install --upgrade pip
184
- ~/.local/share/mini-eq/venv/bin/python -m pip install --no-index --find-links /tmp/mini-eq-wheelhouse 'pipewire-gobject>=0.3.5,<0.4'
185
- ~/.local/share/mini-eq/venv/bin/python -m pip install mini-eq
186
- ~/.local/share/mini-eq/venv/bin/mini-eq --check-deps
187
- ~/.local/share/mini-eq/venv/bin/mini-eq
188
- ```
189
-
190
- For a source checkout:
191
-
192
- ```bash
193
- python3 -m pip install -e .
102
+ python3 -m pip install mini-eq
194
103
  mini-eq --check-deps
195
104
  mini-eq
196
105
  ```
197
106
 
198
- For a source checkout without installing the package:
199
-
200
- ```bash
201
- PYTHONPATH=src python3 -m mini_eq --check-deps
202
- PYTHONPATH=src python3 -m mini_eq
203
- ```
204
-
205
- Install the desktop launcher and icon for the current user:
206
-
207
- ```bash
208
- mini-eq --install-desktop
209
- ```
107
+ See [Development](https://github.com/bhack/mini-eq/blob/main/docs/development.md)
108
+ for distro package names, PyPI virtualenv details, source checkout commands,
109
+ tests, and local Flatpak builds.
210
110
 
211
111
  ## GNOME Shell Extension
212
112
 
@@ -216,53 +116,14 @@ routing, EQ, analyzer status, presets, and auto preset links.
216
116
  Install it from GNOME Shell Extensions:
217
117
  https://extensions.gnome.org/extension/9803/mini-eq-controls/
218
118
 
219
- ## Test
220
-
221
- ```bash
222
- python3 -m pip install -e '.[dev]'
223
- python3 -m ruff check .
224
- python3 -m ruff format --check .
225
- python3 -m pytest -q
226
- ```
227
-
228
- Some integration tests are skipped automatically when optional PipeWire runtime
229
- tools are not installed.
230
-
231
- Check the pipewire-gobject GI compatibility surface:
232
-
233
- ```bash
234
- PYTHONPATH=src python3 tools/check_pipewire_gobject.py
235
- ```
236
-
237
- ## Flatpak
238
-
239
- The Flatpak manifest uses the GNOME runtime. It does not ship a full PipeWire
240
- daemon or session manager; it builds only the local PipeWire filter-chain module
241
- and SPA builtin filter-graph support that Mini EQ loads inside the app process.
242
- It also builds pipewire-gobject for Mini EQ's app-facing PipeWire access and
243
- bundles NumPy and libebur128 for analyzer and live LUFS support.
244
-
245
- Install the local build tools:
246
-
247
- ```bash
248
- flatpak --user install flathub org.flatpak.Builder org.gnome.Sdk//50
249
- ```
250
-
251
- Build and install the local Flatpak:
252
-
253
- ```bash
254
- flatpak run org.flatpak.Builder --user --install --force-clean --install-deps-from=flathub \
255
- flatpak-build io.github.bhack.mini-eq.yaml
256
- flatpak run io.github.bhack.mini-eq --check-deps
257
- flatpak run io.github.bhack.mini-eq
258
- ```
259
-
260
119
  ## Notes
261
120
 
262
121
  Runtime data is stored under `~/.config/mini-eq`.
263
122
 
264
- `pip install mini-eq` installs only the Python package. The system packages
265
- above are still required for the app to connect to GTK, PipeWire, and the host
123
+ `pip install mini-eq` installs only the Python package. The recent desktop and
124
+ audio system packages listed in
125
+ [Development](https://github.com/bhack/mini-eq/blob/main/docs/development.md)
126
+ are still required for the app to connect to GTK, PipeWire, and the host
266
127
  WirePlumber-managed session.
267
128
 
268
129
  ## Acknowledgements
@@ -0,0 +1,91 @@
1
+ # Mini EQ
2
+
3
+ [![CI](https://github.com/bhack/mini-eq/actions/workflows/ci.yml/badge.svg)](https://github.com/bhack/mini-eq/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/mini-eq.svg?cacheSeconds=3600)](https://pypi.org/project/mini-eq/)
5
+ [![GitHub release](https://img.shields.io/github/v/release/bhack/mini-eq?sort=semver)](https://github.com/bhack/mini-eq/releases)
6
+ [![License](https://img.shields.io/github/license/bhack/mini-eq.svg)](https://github.com/bhack/mini-eq/blob/main/LICENSE)
7
+
8
+ <a href="https://flathub.org/apps/io.github.bhack.mini-eq"><img width="240" alt="Get it on Flathub" src="https://flathub.org/api/badge?locale=en"/></a>
9
+
10
+ Mini EQ is a small system-wide parametric equalizer for PipeWire desktops.
11
+ It uses GTK/Libadwaita for the UI, pipewire-gobject for app-facing PipeWire
12
+ routing, metadata, and monitor streams, and PipeWire filter-chain with builtin
13
+ biquad filters for the equalizer. When libebur128 is available, the monitor can
14
+ also show live LUFS loudness.
15
+
16
+ ![Mini EQ screenshot](https://raw.githubusercontent.com/bhack/mini-eq/main/docs/screenshots/mini-eq.png)
17
+
18
+ ## Features
19
+
20
+ - System-wide parametric EQ for PipeWire desktop playback.
21
+ - GTK/Libadwaita interface with a compact 10-band fader workflow.
22
+ - PipeWire routing and default-output tracking through pipewire-gobject.
23
+ - PipeWire filter-chain DSP using builtin biquad filters.
24
+ - Optional spectrum analyzer and LUFS loudness readout through a PipeWire monitor
25
+ capture stream.
26
+ - Auto preset links can follow the detected PipeWire port when available and
27
+ fall back to the selected EQ output when a port is not reported.
28
+ - Optional background mode keeps the EQ active after closing the window, with a
29
+ separate Start at Login preference and optional active-at-login routing.
30
+ - Optional GNOME Shell extension for quick panel access to routing, EQ,
31
+ analyzer status, presets, and auto preset links.
32
+ - Equalizer APO preset import from the UI or `--import-apo`, including
33
+ compatible presets exported by [AutoEq](https://autoeq.app/).
34
+
35
+ ## AutoEq And APO Presets
36
+
37
+ Mini EQ can import Equalizer APO-style parametric EQ text presets. This makes it
38
+ usable with headphone correction presets exported by
39
+ [AutoEq](https://autoeq.app/): export an Equalizer APO/parametric EQ preset from
40
+ AutoEq, then use **Import Equalizer APO...** in Mini EQ or start the app with
41
+ `mini-eq --import-apo path/to/ParametricEQ.txt`. The
42
+ [AutoEq project](https://github.com/jaakkopasanen/AutoEq) provides the source,
43
+ headphone measurement data, targets, and optimizer behind the web app.
44
+
45
+ ## Install
46
+
47
+ The recommended desktop install path is Flathub:
48
+
49
+ ```bash
50
+ flatpak install flathub io.github.bhack.mini-eq
51
+ flatpak run io.github.bhack.mini-eq
52
+ ```
53
+
54
+ PyPI and source installs are available for development or for systems with a
55
+ recent GTK/Libadwaita stack plus PyGObject, PipeWire, WirePlumber, and native
56
+ pipewire-gobject build/runtime packages already installed:
57
+
58
+ ```bash
59
+ python3 -m pip install mini-eq
60
+ mini-eq --check-deps
61
+ mini-eq
62
+ ```
63
+
64
+ See [Development](https://github.com/bhack/mini-eq/blob/main/docs/development.md)
65
+ for distro package names, PyPI virtualenv details, source checkout commands,
66
+ tests, and local Flatpak builds.
67
+
68
+ ## GNOME Shell Extension
69
+
70
+ Mini EQ also has an optional GNOME Shell extension for quick panel access to
71
+ routing, EQ, analyzer status, presets, and auto preset links.
72
+
73
+ Install it from GNOME Shell Extensions:
74
+ https://extensions.gnome.org/extension/9803/mini-eq-controls/
75
+
76
+ ## Notes
77
+
78
+ Runtime data is stored under `~/.config/mini-eq`.
79
+
80
+ `pip install mini-eq` installs only the Python package. The recent desktop and
81
+ audio system packages listed in
82
+ [Development](https://github.com/bhack/mini-eq/blob/main/docs/development.md)
83
+ are still required for the app to connect to GTK, PipeWire, and the host
84
+ WirePlumber-managed session.
85
+
86
+ ## Acknowledgements
87
+
88
+ Mini EQ is inspired in part by [EasyEffects](https://github.com/wwmm/easyeffects)
89
+ and the broader [PipeWire](https://pipewire.org/) audio tooling ecosystem.
90
+ Mini EQ is a separate project focused on a compact system-wide parametric EQ
91
+ workflow.
@@ -33,11 +33,11 @@
33
33
  </description>
34
34
  <screenshots>
35
35
  <screenshot type="default">
36
- <image>https://raw.githubusercontent.com/bhack/mini-eq/v0.7.2/docs/screenshots/mini-eq.png</image>
36
+ <image>https://raw.githubusercontent.com/bhack/mini-eq/v0.7.4/docs/screenshots/mini-eq.png</image>
37
37
  <caption>Adjust sound output with equalizer controls</caption>
38
38
  </screenshot>
39
39
  <screenshot>
40
- <image>https://raw.githubusercontent.com/bhack/mini-eq/v0.7.2/docs/screenshots/mini-eq-dark.png</image>
40
+ <image>https://raw.githubusercontent.com/bhack/mini-eq/v0.7.4/docs/screenshots/mini-eq-dark.png</image>
41
41
  <caption>Use the equalizer with dark style</caption>
42
42
  </screenshot>
43
43
  </screenshots>
@@ -45,6 +45,25 @@
45
45
  <url type="bugtracker">https://github.com/bhack/mini-eq/issues</url>
46
46
  <url type="vcs-browser">https://github.com/bhack/mini-eq</url>
47
47
  <releases>
48
+ <release version="0.7.4" date="2026-05-11">
49
+ <description>
50
+ <ul>
51
+ <li>Run filter-chain readiness callbacks from the GLib main context when PipeWire reports the virtual sink asynchronously.</li>
52
+ <li>Re-apply active filter controls when PipeWire creates or activates links on the Mini EQ processing path.</li>
53
+ <li>Refresh port-aware output preset scope when PipeWire reports route parameter serial changes on the active output device.</li>
54
+ </ul>
55
+ </description>
56
+ </release>
57
+ <release version="0.7.3" date="2026-05-11">
58
+ <description>
59
+ <ul>
60
+ <li>Require pipewire-gobject 0.3.6 and use its synchronous PipeWire registry, metadata, node, and device APIs for startup and routing state.</li>
61
+ <li>Replace Mini EQ's PipeWire startup and routing sleep loops with bounded sync or registry-event waits for route params, virtual sink creation, and stream routing.</li>
62
+ <li>Avoid a headless startup hang when system-wide EQ fails synchronously before the GLib main loop starts.</li>
63
+ <li>Hide the GNOME Shell extension's mini analyzer while monitoring is turned off.</li>
64
+ </ul>
65
+ </description>
66
+ </release>
48
67
  <release version="0.7.2" date="2026-05-10">
49
68
  <description>
50
69
  <ul>