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

@@ -0,0 +1,24 @@
package com.radiola.ui.equalizer
import androidx.lifecycle.ViewModel
import com.radiola.service.AudioEffectsController
import com.radiola.service.EqState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject
@HiltViewModel
class EqualizerViewModel @Inject constructor(
private val audioEffects: AudioEffectsController
) : ViewModel() {
val state: StateFlow<EqState> = audioEffects.state
fun setEnabled(on: Boolean) = audioEffects.setEnabled(on)
fun selectPreset(index: Int) = audioEffects.selectPreset(index)
fun setBand(index: Int, levelMb: Int) = audioEffects.setBand(index, levelMb)
fun setBass(value: Int) = audioEffects.setBass(value)
fun setVirtualizer(value: Int) = audioEffects.setVirtualizer(value)
fun setLoudness(value: Int) = audioEffects.setLoudness(value)
fun commit() = audioEffects.commit()
}