fix(player): serialize live stream switching
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:pluriwave/estado/estado_radio.dart';
|
||||
import 'package:pluriwave/modelos/emisora.dart';
|
||||
import 'package:pluriwave/modelos/preset_ecualizador.dart';
|
||||
import 'package:pluriwave/servicios/servicio_audio.dart';
|
||||
|
||||
@@ -216,6 +218,41 @@ void main() {
|
||||
expect(audio.emisorasReproducidas, hasLength(2));
|
||||
});
|
||||
|
||||
test('ignora finalizaciones stale cuando se cambia de emisora rapido', () async {
|
||||
final audio = _AudioControlado();
|
||||
final radio = FakeServicioRadio();
|
||||
final primera = emisoraDemo(uuid: 'slow-1', nombre: 'Lenta');
|
||||
final segunda = emisoraDemo(uuid: 'fast-2', nombre: 'Rapida');
|
||||
final estado = EstadoRadio(
|
||||
audio: audio,
|
||||
favoritos: FakeServicioFavoritos(),
|
||||
radio: radio,
|
||||
servicioEcualizador: FakeServicioEcualizador(),
|
||||
resolverArchivoCustom: _archivoCustomVacio,
|
||||
iniciarAutomaticamente: false,
|
||||
);
|
||||
|
||||
await estado.inicializar();
|
||||
await estado.guardarPresetEcualizadorPorEmisora(
|
||||
primera.uuid,
|
||||
PresetEcualizador.rock,
|
||||
);
|
||||
await estado.guardarPresetEcualizadorPorEmisora(
|
||||
segunda.uuid,
|
||||
PresetEcualizador.jazz,
|
||||
);
|
||||
|
||||
final primeraFuture = estado.reproducir(primera);
|
||||
final segundaFuture = estado.reproducir(segunda);
|
||||
audio.completar(segunda.uuid);
|
||||
await segundaFuture;
|
||||
audio.completar(primera.uuid);
|
||||
await primeraFuture;
|
||||
|
||||
expect(estado.presetEcualizador, PresetEcualizador.jazz);
|
||||
expect(radio.ultimoUuidClick, segunda.uuid);
|
||||
});
|
||||
|
||||
test('reordenar favoritos reindexa de forma determinística', () async {
|
||||
final favoritos = FakeServicioFavoritos();
|
||||
await favoritos.agregar(emisoraDemo(uuid: 'a', nombre: 'A'));
|
||||
@@ -282,6 +319,40 @@ void main() {
|
||||
});
|
||||
}
|
||||
|
||||
class _AudioControlado extends ServicioAudio {
|
||||
final _estadoController = StreamController<EstadoReproduccion>.broadcast();
|
||||
final _pendientes = <String, Completer<void>>{};
|
||||
Emisora? _actual;
|
||||
|
||||
@override
|
||||
Emisora? get emisoraActual => _actual;
|
||||
|
||||
@override
|
||||
Stream<EstadoReproduccion> get estadoStream => _estadoController.stream;
|
||||
|
||||
@override
|
||||
Future<void> reproducir(Emisora emisora) async {
|
||||
final completer = Completer<void>();
|
||||
_pendientes[emisora.uuid] = completer;
|
||||
_actual = emisora;
|
||||
_estadoController.add(EstadoReproduccion.cargando);
|
||||
await completer.future;
|
||||
_estadoController.add(EstadoReproduccion.reproduciendo);
|
||||
}
|
||||
|
||||
void completar(String uuid) {
|
||||
_pendientes.remove(uuid)?.complete();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> aplicarPreset(PresetEcualizador preset) async {}
|
||||
|
||||
@override
|
||||
Future<void> dispose() async {
|
||||
await _estadoController.close();
|
||||
}
|
||||
}
|
||||
|
||||
Future<File> _archivoCustomVacio() async => _crearArchivoCustom(const []);
|
||||
|
||||
Future<File> _crearArchivoCustom(List<dynamic> emisoras) async {
|
||||
|
||||
Reference in New Issue
Block a user