### Guide/Autoeq
# AutoEQ & Headphone Correction
**English** · [简体中文](autoeq.zh-CN.md)
FineTune can apply headphone-specific frequency response corrections using profiles from the [AutoEQ](https://github.com/jaakkopasanen/AutoEq) project. This compensates for your headphones' natural frequency curve, giving you a flatter, more accurate sound.
## How It Works
Every pair of headphones colors the sound differently. Some boost bass, others are harsh in the treble. AutoEQ measures these deviations and generates corrective EQ filters. FineTune applies these filters per-device, so each pair of headphones gets its own correction profile.
Corrections are applied on top of FineTune's 10-band EQ, so you can still tweak the sound to your taste after applying a profile.
## Browse Built-in Profiles
1. Click the **wand icon** next to any headphone device in FineTune
2. Search for your headphone model by name
3. Select a profile. It's applied immediately.
Profiles are fetched on demand from the AutoEQ database and cached locally for offline use. The database includes thousands of headphones from major brands (Sony, Sennheiser, Apple, Bose, Audio-Technica, Beyerdynamic, and more).
> **Tip:** If your exact model isn't listed, try searching for the product line — similar models often share frequency response characteristics.
## Import Custom Profiles
If you have a custom measurement or want to use a profile from another source:
1. Click **"Import ParametricEQ.txt..."** at the bottom of the AutoEQ panel
2. Select your `.txt` file
3. The profile is imported and applied to the selected device
4. Use the **Correction** switch in the picker to A/B the profile without removing it
FineTune accepts [EqualizerAPO](https://sourceforge.net/projects/equalizerapo/) ParametricEQ.txt files:
```
Preamp: -6.2 dB
Filter 1: ON PK Fc 100 Hz Gain -2.3 dB Q 1.41
Filter 2: ON LSC Fc 105 Hz Gain 7.0 dB Q 0.71
Filter 3: ON HSC Fc 8000 Hz Gain 2.1 dB Q 0.71
```
### Supported Filter Types
| Code | Type | Description |
|------|------|-------------|
| `PK` / `PEQ` | Peaking | Boost or cut a narrow frequency range |
| `LS` / `LSC` | Low shelf | Boost or cut everything below a frequency |
| `HS` / `HSC` | High shelf | Boost or cut everything above a frequency |
Up to 10 filters per profile. The `Preamp` line sets a global gain offset to prevent clipping.
## Where to Get Profiles
- **Built-in search** — The easiest way. Thousands of headphones are available directly in FineTune.
- **[autoeq.app](https://www.autoeq.app/)** — Web-based tool with more options. Select **EqualizerAPO ParametricEq** as the equalizer app, download the file, and import it into FineTune.
- **[AutoEQ GitHub](https://github.com/jaakkopasanen/AutoEq)** — The full repository of measurements and generated profiles.
- **Custom measurements** — If you've measured your headphones yourself (e.g., with a MiniDSP EARS or similar), you can create a ParametricEQ.txt file in any text editor following the format above.
## Managing Profiles
- Each device remembers its assigned profile independently
- To temporarily bypass a profile, click the wand icon and turn **Correction** off
- To remove a profile entirely, click the wand icon and select **No correction**
- Favorite frequently-used profiles for quick access with the star icon — favorited profiles appear at the top of search results and are shown when the search field is empty
---
### Guide/Autoeq.Zh CN
# AutoEQ 与耳机校正
[English](autoeq.md) · **简体中文**
> 本翻译由社区维护,更新可能晚于英文版。最新内容请以 [English version](autoeq.md) 为准。
> *This translation is community-maintained and may lag the English version. See the [English version](autoeq.md) for the most current information.*
FineTune 可以使用来自 [AutoEQ](https://github.com/jaakkopasanen/AutoEq) 项目的耳机专属频响校正配置。它会针对你耳机本身的频率曲线做补偿,让声音更平直、更准确。
## 工作原理
每副耳机对声音的染色都不一样:有的低频偏多,有的高频刺耳。AutoEQ 测量出这些偏离,并生成对应的修正 EQ 滤波器。FineTune 会按设备分别应用这些滤波器,所以每副耳机都拥有自己独立的校正配置。
校正会叠加在 FineTune 的 10 段 EQ 之上,因此应用一份配置之后,你仍然可以按个人口味继续微调。
## 浏览内置配置
1. 点击 FineTune 中任一耳机设备旁的 **魔棒图标**
2. 按型号搜索你的耳机
3. 选中一个配置,立即生效
配置会按需从 AutoEQ 数据库拉取,并在本地缓存以便离线使用。数据库覆盖了主流厂商上千款耳机(Sony、Sennheiser、Apple、Bose、Audio-Technica、Beyerdynamic 等)。
> **小贴士:** 如果你的具体型号没出现在列表里,可以试着搜索同一产品线 —— 相近型号的频响特性往往相近。
## 导入自定义配置
如果你有自己的测量结果,或者想用其他来源的配置:
1. 点击 AutoEQ 面板底部的 **"Import ParametricEQ.txt..."**
2. 选择你的 `.txt` 文件
3. 配置会被导入并应用到当前选中的设备
4. 使用选择器中的 **Correction** 开关,可以在不删除配置的前提下做 A/B 对比
FineTune 接受 [EqualizerAPO](https://sourceforge.net/projects/equalizerapo/) 的 ParametricEQ.txt 文件:
```
Preamp: -6.2 dB
Filter 1: ON PK Fc 100 Hz Gain -2.3 dB Q 1.41
Filter 2: ON LSC Fc 105 Hz Gain 7.0 dB Q 0.71
Filter 3: ON HSC Fc 8000 Hz Gain 2.1 dB Q 0.71
```
### 支持的滤波器类型
| 代码 | 类型 | 说明 |
|------|------|-------------|
| `PK` / `PEQ` | Peaking | 在某段窄频带上提升或衰减 |
| `LS` / `LSC` | Low shelf | 提升或衰减某频率以下的所有内容 |
| `HS` / `HSC` | High shelf | 提升或衰减某频率以上的所有内容 |
每份配置最多 10 个滤波器。`Preamp` 行设定一个全局增益偏移,用于避免削波。
## 在哪里获取配置
- **内置搜索** —— 最方便的方式。FineTune 直接内置了上千款耳机
- **[autoeq.app](https://www.autoeq.app/)** —— 网页版工具,选项更丰富。把 equalizer app 选成 **EqualizerAPO ParametricEq**,下载文件后导入 FineTune 即可
- **[AutoEQ GitHub](https://github.com/jaakkopasanen/AutoEq)** —— 完整的测量数据与生成配置仓库
- **自行测量** —— 如果你自己测量了耳机(例如用 MiniDSP EARS 之类的设备),可以按上面的格式在任意文本编辑器里手写一个 ParametricEQ.txt 文件
## 管理配置
- 每台设备都会独立记住自己绑定的配置
- 要临时旁路一个配置,点击魔棒图标并把 **Correction** 关掉
- 要彻底移除一个配置,点击魔棒图标并选择 **No correction**
- 用星标图标把常用的配置加入收藏,方便快速访问 —— 收藏过的配置会出现在搜索结果顶部,搜索框为空时也会一并显示
---
### Guide/Troubleshooting
# Troubleshooting
## No sound / audio stops working
FineTune requires the **Screen & System Audio Recording** permission to capture and route app audio.
1. Open **System Settings** → **Privacy & Security** → **Screen & System Audio Recording**
2. Find FineTune in the list and enable it
3. **Restart FineTune** — the permission doesn't take effect until relaunch
If you previously denied the permission prompt, you'll need to enable it manually from System Settings.
## App not appearing
FineTune only shows apps that are **actively playing audio**. If an app isn't visible:
- Make sure the app is actually producing sound (start playback)
- Check if the app is hidden. Open **edit mode** (pencil icon) and look for the eye icon next to the app name. A crossed-out eye means the app is being ignored.
- Some apps use helper processes for audio. Try restarting the app.
## App causing audio issues
Some apps don't work well with CoreAudio process taps — particularly audio processors, DAWs, VoIP tools, and apps that do their own low-level audio routing. Symptoms include distorted audio, echo, or audio cutting out.
**Fix:** Open **edit mode** (pencil icon) and click the eye icon to ignore the problematic app. This tears down the process tap entirely for that app, so it goes back to normal macOS audio routing.
Common apps that may need to be ignored:
- Audio Hijack, Loopback, and other Rogue Amoeba apps
- Some VoIP/conferencing tools with custom audio engines
- FaceTime, WhatsApp, and other calling apps (tapping can break echo cancellation, causing volume ducking)
## Volume slider not working
There are two cases.
**Per-app slider.** Some apps use helper processes to play audio rather than the main app process, so the slider you see might be controlling the wrong process. Try restarting the app. If the issue persists, check edit mode to see if the app appears as a different process name.
**Per-device slider.** When you open a device, FineTune picks a volume backend automatically:
- **Hardware**: the device reports a native volume control (most USB DACs, AirPods, built-in speakers).
- **DDC**: an external display that responds to the monitor-control protocol.
- **Software**: FineTune attenuates inside its own audio graph.
Auto-detection gets it right for most devices, but some USB DACs and HDMI/DisplayPort outputs advertise a hardware slider that doesn't actually move the output level. If the device slider doesn't change the volume, open the device inspector (the info button on the device row) and turn on **Software volume**. FineTune remembers the choice per device. The toggle is hidden when auto-detect already picked Software, because there's no alternative backend to switch to.
## Audio device not switching automatically
FineTune uses a **device priority list** to decide which output device to use. When a device connects, FineTune only switches to it if it's ranked higher than the current device. When a device disconnects, FineTune falls back to the next highest-priority device that's still connected.
By default, devices are added to the bottom of the list in the order they're first seen. Since your Mac's built-in speakers are always connected, they end up at the top (highest priority), so FineTune won't auto-switch to headphones, external speakers, or other devices when they connect.
**This is a one-time setup.** Once you set your preferred order, it's saved permanently and works across app restarts.
**How to reorder:**
1. Click the **pencil icon** in the menu bar popup to enter edit mode
2. **Drag** devices to reorder, or **click the priority number** and type a new position
3. Click the **checkmark** to exit edit mode — your order is saved
The device at position 1 has the highest priority. FineTune will always prefer the highest-priority device that's currently connected.
Input and output devices have **separate priority lists** — switch between them using the tabs in edit mode.
> **Note:** For AirPods, taking them out of your ears and putting them back in (without the case) is handled by macOS Automatic Ear Detection. FineTune doesn't interfere with that.
## Input devices not showing
FineTune's input device monitoring requires separate microphone permission.
1. Open **System Settings** → **Privacy & Security** → **Microphone**
2. Find FineTune and enable it
3. Restart FineTune
## Media keys don't control FineTune
Media keys (F10 / F11 / F12) are opt-in and require the **Accessibility** permission so FineTune can observe the keystrokes.
1. Open **System Settings** → **Privacy & Security** → **Accessibility**
2. Enable FineTune in the list. If it's already on, toggle it off and back on to clear a rare permission-bootstrap race.
3. Open FineTune Settings → **Media Keys & HUD**, turn on **Control volume with media keys**, and pick a HUD style (Tahoe or Classic) or disable the HUD
If the keys still don't work right after launch, a WindowServer handoff can briefly swallow the first keypress. Try once more; subsequent presses are reliable.
## Volume HUD not appearing
- Check Settings → **Media Keys & HUD**. The HUD is off by default and has to be enabled separately from the media-key toggle.
- Switch HUD styles if one isn't rendering. Tahoe uses macOS 26's system HUD look; Classic matches the older translucent rounded-rect style.
## EQ not applying / sounds the same
- The EQ is enabled by default. Check that the **toggle switch** in the EQ panel header is on.
- The default preset is **Flat** (all bands at 0 dB), which makes no audible changes. Select a different preset or adjust the bands manually.
- EQ is **per-app**, not per-device. Make sure you're adjusting the EQ for the correct app.
- If using AutoEQ headphone correction, that's separate from the 10-band EQ. Verify a profile is assigned to the correct device via the wand icon
## Audio quality sounds degraded
- Check if volume boost is set above 1x — high boost levels can cause clipping on loud passages
- If using EQ, large boosts across multiple bands can push levels too high. Try pulling bands down instead of boosting others up.
- AutoEQ profiles include a preamp gain reduction to prevent clipping; manual EQ does not, so be mindful of total gain
- Try resetting the app to defaults: `open "finetune://reset"` in Terminal
---
### Guide/Url Schemes
# URL Schemes
Control FineTune from Terminal, shell scripts, [Shortcuts](https://support.apple.com/guide/shortcuts-mac), [Raycast](https://raycast.com), or any app that can open URLs. This makes it easy to automate volume changes, build keyboard shortcuts, or integrate FineTune into your workflow.
## Actions
| Action | Format | Description |
|--------|--------|-------------|
| Set volume | `finetune://set-volumes?app=BUNDLE_ID&volume=PERCENT` | Set volume (0–100, or up to 400 with boost) |
| Step volume | `finetune://step-volume?app=BUNDLE_ID&direction=up` | Nudge volume up or down by ~5% |
| Set mute | `finetune://set-mute?app=BUNDLE_ID&muted=true` | Mute or unmute an app |
| Toggle mute | `finetune://toggle-mute?app=BUNDLE_ID` | Toggle mute state |
| Set device | `finetune://set-device?app=BUNDLE_ID&device=DEVICE_UID` | Route an app to a specific output |
| Reset | `finetune://reset` | Reset all apps to 100% and unmuted |
## Examples
```bash
# Set Spotify to 50% volume
open "finetune://set-volumes?app=com.spotify.client&volume=50"
# Set different volumes for different apps at once
open "finetune://set-volumes?app=com.spotify.client&volume=80&app=com.hnc.Discord&volume=40"
# Mute multiple apps at once
open "finetune://set-mute?app=com.spotify.client&muted=true&app=com.apple.Music&muted=true"
# Step Discord volume down
open "finetune://step-volume?app=com.hnc.Discord&direction=down"
# Route an app to a specific device
open "finetune://set-device?app=com.spotify.client&device=YOUR_DEVICE_UID"
# Reset everything
open "finetune://reset"
```
## Use Cases
**Meeting mode** — Mute everything except your video call app:
```bash
open "finetune://set-mute?app=com.spotify.client&muted=true&app=com.apple.Music&muted=true"
```
**Focus playlist** — Set music to a low background level and silence notifications:
```bash
open "finetune://set-volumes?app=com.spotify.client&volume=30&app=com.apple.systemuiserver&volume=0"
```
**Gaming setup** — Boost a game and lower Discord:
```bash
open "finetune://set-volumes?app=com.game.example&volume=400&app=com.hnc.Discord&volume=40"
```
These commands work in Terminal, shell scripts, Automator, Raycast script commands, macOS Shortcuts (using "Open URL"), and any other tool that can open URLs.
## Finding Bundle IDs
App names shown in FineTune map to bundle IDs. Common ones:
| App | Bundle ID |
|-----|-----------|
| Spotify | `com.spotify.client` |
| Apple Music | `com.apple.Music` |
| Chrome | `com.google.Chrome` |
| Safari | `com.apple.Safari` |
| Discord | `com.hnc.Discord` |
| Slack | `com.tinyspeck.slackmacgap` |
| Zoom | `us.zoom.xos` |
| Firefox | `org.mozilla.firefox` |
| Arc | `company.thebrowser.Browser` |
To find any app's bundle ID:
```bash
osascript -e 'id of app "App Name"'
```
## Finding Device UIDs
In FineTune, click the pencil icon to enter edit mode, tap the **info button** on a device row to open the device inspector, then click the copy button next to the UID to put it on the clipboard.
---
### CONTRIBUTING
# Contributing to FineTune
Thank you for your interest in contributing to FineTune!
## Building from Source
1. Clone the repository:
```bash
git clone https://github.com/ronitsingh10/FineTune.git
cd FineTune
```
2. Open in Xcode:
```bash
open FineTune.xcodeproj
```
3. Set your development team in Xcode:
- Select the FineTune target
- Go to Signing & Capabilities
- Select your team from the dropdown
4. Build and run (Cmd+R)
## Submitting Issues
- Check existing issues before creating a new one
- Include macOS version and steps to reproduce
- For audio issues, include which apps were playing audio
## Pull Requests
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/my-feature`)
3. Make your changes
4. Test with multiple audio sources and output devices
5. Commit your changes
6. Push to your fork and open a pull request
## Code Style
- Follow existing patterns in the codebase
- Use `@Observable` and `@MainActor` for state management
- Audio callback code must be real-time safe (no allocations, locks, or ObjC)
- Views: props first, callbacks for mutations, `@State` only for local UI state
## Audio Callback Guidelines
Code running in `processAudio()` must be real-time safe:
- No memory allocations (`malloc`, `new`, `Array.append`)
- No locks (`NSLock`, `DispatchSemaphore`, `os_unfair_lock`)
- No Objective-C messaging
- No file I/O or logging
- No Swift `print()` statements
## Testing
Before submitting:
- Test with 2+ output devices
- Test device hot-plug (disconnect during playback)
- Test with 5+ apps playing audio simultaneously
---
### README
English · 简体中文