feat(eq): настоящий эквалайзер + улучшайзеры звука (audiofx)

Раньше пресет эквалайзера в настройках был косметикой (лежал в DataStore, к звуку
не подключён). Теперь — реальные системные эффекты на фикс. аудиосессии плеера:
- AudioEffectsController: графический Equalizer (полосы устройства), BassBoost,
  Virtualizer (объём), LoudnessEnhancer (громкость тихих, до +12 дБ). Привязка к
  generateAudioSessionId() в PlayerController, переживает смену станций. Применение
  в реальном времени, сохранение в DataStore (commit на отпускании слайдера).
- Отдельный экран EqualizerScreen (Настройки → ЗВУК → Эквалайзер): тумблер,
  системные пресеты + «Свой», слайдеры полос (±дБ), bass/virtualizer/loudness.
- Эффекты best-effort: при отсутствии поддержки блок недоступен (null), UI скрывает.
- Убран фейковый чип-пресет Flat/Rock/Pop/Jazz/Bass.
This commit is contained in:
nk
2026-06-06 21:14:38 +03:00
parent 0c01eaab2d
commit e736c2393f
9 changed files with 679 additions and 33 deletions

View File

@@ -26,4 +26,20 @@ interface SettingsRepository {
// Цветовая тема приложения (id ThemePalette, напр. "forest"). По умолчанию "forest".
fun getThemePalette(): Flow<String>
suspend fun setThemePalette(id: String)
// ── Эквалайзер и улучшайзеры звука (android.media.audiofx) ──
fun getEqEnabled(): Flow<Boolean>
suspend fun setEqEnabled(enabled: Boolean)
// Индекс системного пресета эквалайзера; -1 = свой (ручные полосы).
fun getEqPreset(): Flow<Int>
suspend fun setEqPreset(index: Int)
// Уровни полос в миллибелах через запятую (под текущее число полос устройства).
fun getEqBands(): Flow<String>
suspend fun setEqBands(csv: String)
fun getEqBass(): Flow<Int> // 0..100 %
suspend fun setEqBass(value: Int)
fun getEqVirtualizer(): Flow<Int> // 0..100 %
suspend fun setEqVirtualizer(value: Int)
fun getEqLoudness(): Flow<Int> // 0..100 % → 0..+12 дБ
suspend fun setEqLoudness(value: Int)
}