Раньше пресет эквалайзера в настройках был косметикой (лежал в DataStore, к звуку не подключён). Теперь — реальные системные эффекты на фикс. аудиосессии плеера: - AudioEffectsController: графический Equalizer (полосы устройства), BassBoost, Virtualizer (объём), LoudnessEnhancer (громкость тихих, до +12 дБ). Привязка к generateAudioSessionId() в PlayerController, переживает смену станций. Применение в реальном времени, сохранение в DataStore (commit на отпускании слайдера). - Отдельный экран EqualizerScreen (Настройки → ЗВУК → Эквалайзер): тумблер, системные пресеты + «Свой», слайдеры полос (±дБ), bass/virtualizer/loudness. - Эффекты best-effort: при отсутствии поддержки блок недоступен (null), UI скрывает. - Убран фейковый чип-пресет Flat/Rock/Pop/Jazz/Bass.
25 lines
914 B
Kotlin
25 lines
914 B
Kotlin
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()
|
|
}
|