fix(player): stabilize equalizer and visualizer
Build & Deploy Pluriwave / Análisis de código (push) Successful in 12s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m50s

This commit is contained in:
2026-05-21 21:56:25 +02:00
parent d0ceaac3f3
commit 921e972183
8 changed files with 427 additions and 228 deletions
+28 -4
View File
@@ -77,8 +77,11 @@ class ServicioAudio {
Future<void> setVolumen(double vol) => _handler.setVolumen(vol);
double get volumen => _handler.volumen;
bool get estaSonando => _handler.playbackState.value.playing;
Stream<int?> get androidAudioSessionIdStream =>
_handler.androidAudioSessionIdStream;
Stream<int?> get androidAudioSessionIdStream async* {
yield _handler.androidAudioSessionId;
yield* _handler.androidAudioSessionIdStream;
}
Future<void> dispose() async {}
// ── Ecualizador ───────────────────────────────────────────────────────────
@@ -88,6 +91,8 @@ class ServicioAudio {
Future<void> aplicarPreset(PresetEcualizador preset) =>
_handler.aplicarPreset(preset);
Future<void> setEcualizadorActivo(bool activo) =>
_handler.setEcualizadorActivo(activo);
Future<void> setBanda(int index, double db) => _handler.setBanda(index, db);
}
@@ -106,6 +111,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
StreamSubscription<PlaybackEvent>? _eventosSub;
StreamSubscription<int?>? _androidAudioSessionIdSub;
final _androidAudioSessionIdController = StreamController<int?>.broadcast();
int? _androidAudioSessionId;
Future<void> _colaCambioFuente = Future<void>.value();
int _revisionFuente = 0;
@@ -116,9 +122,12 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
AndroidEqualizer? get ecualizador => _eq;
bool _eqDisponible = false;
bool get ecualizadorDisponible => _eqDisponible;
bool _ecualizadorActivo = true;
bool get ecualizadorActivo => _ecualizadorActivo;
PresetEcualizador _presetActual = PresetEcualizador.flat;
PresetEcualizador get presetActual => _presetActual;
int? get androidAudioSessionId => _androidAudioSessionId;
Stream<int?> get androidAudioSessionIdStream =>
_androidAudioSessionIdController.stream;
@@ -166,6 +175,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
_androidAudioSessionIdSub = _player.androidAudioSessionIdStream.listen((
sessionId,
) {
_androidAudioSessionId = sessionId;
if (!_androidAudioSessionIdController.isClosed) {
_androidAudioSessionIdController.add(sessionId);
}
@@ -316,6 +326,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
_eq = AndroidEqualizer();
_eqDisponible = false;
_androidAudioSessionId = null;
_player = _crearPlayer();
await _player.setVolume(_volumen);
_conectarStreamsPlayer();
@@ -342,7 +353,7 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
final params = await _eq.parameters;
_eqDisponible = params.bands.isNotEmpty;
if (_eqDisponible) {
await _eq.setEnabled(true);
await _eq.setEnabled(_ecualizadorActivo);
await aplicarPreset(_presetActual);
}
} catch (_) {
@@ -355,6 +366,8 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
_presetActual = preset;
if (!_eqDisponible) return;
try {
await _eq.setEnabled(_ecualizadorActivo);
if (!_ecualizadorActivo) return;
final params = await _eq.parameters;
for (
int i = 0;
@@ -368,12 +381,12 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
/// Ajusta una banda individual.
Future<void> setBanda(int index, double db) async {
if (!_eqDisponible) return;
final bandas = List<double>.from(_presetActual.bandas);
if (index >= 0 && index < bandas.length) {
bandas[index] = db;
_presetActual = _presetActual.copyWithBandas(bandas);
}
if (!_eqDisponible || !_ecualizadorActivo) return;
try {
final params = await _eq.parameters;
if (index < params.bands.length) {
@@ -382,6 +395,17 @@ class PluriWaveAudioHandler extends BaseAudioHandler with SeekHandler {
} catch (_) {}
}
Future<void> setEcualizadorActivo(bool activo) async {
_ecualizadorActivo = activo;
if (!_eqDisponible) return;
try {
await _eq.setEnabled(activo);
if (activo) {
await aplicarPreset(_presetActual);
}
} catch (_) {}
}
Future<void> setVolumen(double vol) async {
_volumen = vol.clamp(0.0, 1.0);
await _player.setVolume(_volumen);