Skip to content

Redroadsl/TestFilter

Repository files navigation

TestFilter — Android 全局音频滤镜

无需 Root 即可为 Android 系统声音添加实时全局 EQ 效果的开源项目。
灵感来源于 HubeRSoundX (HXAudio),核心原理一致但完全独立实现并开源。 由于项目是vibe的,急需人才开发实用的UI……

原理

核心机制:DynamicsProcessing + audioSession = 0

Android 从 API 28 (Android 9) 起提供了 DynamicsProcessing 类,它是 AudioEffect 框架中最强大的多频段音频处理器,内置 4 个独立处理阶段:

  输入
    |
  PreEQ  (前级均衡器 — 目前进度)
    |
  MBC    (多频段压缩器 — 未使用)
    |
  PostEQ (后级均衡器 — 未使用)
    |
  Limiter(限幅器 — 未使用)
    |
  输出

关键之处在于构造 DynamicsProcessing 时传入 audioSession = 0

DynamicsProcessing(0, 0, config)
//                 ↑  ↑
//            priority │
//               audioSession = 0 → 全局输出混音器

audioSession = 0 是 Android AudioFlinger 的全局输出混音器会话 ID。任何 App 创建的 AudioEffect 只要绑定到这个会话,就可以影响所有经过 AudioFlinger 混音器的音频流。这是 Android 框架层的公开 API 特性,不是漏洞,也无需任何高级权限

为什么不需要 Root?

因为 AudioEffect (及其子类如 Equalizer, DynamicsProcessing, BassBoost 等) 是 Android 的公开 API。从 API 1 开始,任何 App 都可以向音频会话创建效果器。audioSession = 0 虽然被标记为 deprecated(Google 官方不建议用于全局输出),但在所有 API 等级(28~37)上均可正常使用,仅输出一条 deprecation warning。

唯一需要的权限是 MODIFY_AUDIO_SETTINGS——这是一个 normal-level 权限(安装时自动授予,无需运行时请求)。

局限

以下场景无法被全局 audio session 0 拦截,因为音频走的是硬件直通路径,绕过 AudioFlinger:

场景 原因
通话(Telephony) 走独立通话音频路径(HAL 层)
Audio Offload 播放 硬件 DSP 直接解码,不经过混音器
AAudio/OpenSL ES 独占模式 直接与 HAL 通信,绕开软件混音器
部分 USB DAC 直出 直接输出路径跳过效果链

技术栈

  • 语言: Kotlin
  • UI: Jetpack Compose + Material 3
  • 音频处理: android.media.audiofx.DynamicsProcessing (API 28+)
  • 持久化: DataStore Preferences
  • 前台服务: foregroundServiceType="mediaPlayback" (Android 14+)
  • 最低支持: Android 9 (API 28)
  • 目标 SDK: Android 16 (API 36)

架构

┌────────────────────────────────────────────────┐
│  AudioEffectService (前台服务)                  │
│  ├─ AudioEngine                                │
│  │    └─ DynamicsProcessing (session=0)        │
│  │         └─ PreEQ × 10 频段                  │
│  ├─ StateFlow<AudioEffectState>                │
│  └─ SettingsRepository (DataStore)              │
└──────────────┬─────────────────────────────────┘
               │ Binder + collect()
               ▼
┌────────────────────────────────────────────────┐
│  MainActivity + Compose UI                     │
│  ├─ EqualizerGraph (Canvas 频响曲线)           │
│  ├─ EqualizerPanel (10 频段滑块)               │
│  └─ PresetSelector (预设切换)                  │
└────────────────────────────────────────────────┘

文件结构

com/example/TestFilter/
├── MainActivity.kt              # Activity,绑定 Service,管理交互
├── audio/
│   ├── AudioEngine.kt           # DynamicsProcessing 封装,EQ 控制
│   ├── AudioEffectService.kt    # 前台服务,生命周期管理 + StateFlow
│   └── AudioEffectState.kt      # 状态数据类
├── data/
│   ├── PresetRepository.kt      # 预设曲线定义(可扩展)
│   └── SettingsRepository.kt    # DataStore 持久化
├── receiver/
│   └── BootReceiver.kt          # 开机广播(TODO)
└── ui/
    ├── MainScreen.kt            # 主界面组合
    └── components/
        ├── EqualizerGraph.kt    # Canvas 频响曲线绘制
        ├── EqualizerPanel.kt    # 10 频段垂直滑块
        └── PresetSelector.kt    # FilterChip 预设选择

数据流

用户拖动 EQ 滑块
  → onBandChanged(index, value)
    → AudioEffectService.updateBands(bands)
      → AudioEngine.setBandGains(bands)
        → DynamicsProcessing.setPreEqBandByChannelIndex(ch, i, EqBand)
      → SettingsRepository.saveBands(bands)  // DataStore 持久化

用户选择预设
  → onPresetSelected(name)
    → PresetRepository.getPreset(name).bands
    → AudioEffectService.updateBands(bands)
    → AudioEffectService.updatePreset(name)

快速开始

编译

此处省略环境安装步骤……

git clone https://github.com/Redroadsl/TestFilter.git
cd TestFilter
./gradlew assembleDebug

生成的 APK 位于 app/build/outputs/apk/debug/

安装与使用

  1. 安装 APK 到 Android 9+ 设备
  2. 首次打开会请求通知权限(Android 13+ 必需,因为前台服务需要通知)
  3. 点击顶部开关 → 服务启动,通知栏显示"音频滤镜已启用"
  4. 调整 EQ 滑块或选择预设 → 效果实时生效
  5. 即使退出 App,服务仍在后台运行,效果持续
  6. 再次打开 App 可关闭滤镜或继续调整

内置预设

预设 说明
Flat 所有频段 0dB,无效果
突出低音 提升 63~500Hz 低频段
突出高音 提升 4k~16kHz 高频段

PresetRepository.kt 中可随意添加自定义预设。

开发目标

  • 基于 DynamicsProcessing 的 10 段全局 EQ
  • 前台服务持久运行
  • 预设系统(可扩展)
  • DataStore 设置持久化
  • MBC 多频段压缩器支持
  • Limiter 限幅器支持
  • 频响曲线预设的导入/导出
  • 蓝牙设备自动检测与预设切换
  • 开机自启(BOOT_COMPLETED

鸣谢

  • HubeRSoundX (HXAudio) — 项目灵感来源
  • Android android.media.audiofx 框架
  • DeepSeek V4 Flash
  • OpenCode

License

GNU GPL v3

About

无Root为安卓添加全局音频效果的开源项目

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages