fix(alarms): prevent overlapping playback
This commit is contained in:
+50
-11
@@ -63,6 +63,8 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
|
||||
StreamSubscription<AlarmaMusical>? _alarmaVencidaSubscription;
|
||||
EstadoRadio? _estadoSuscrito;
|
||||
bool _alarmaInicialProcesada = false;
|
||||
bool _alarmaSonandoActiva = false;
|
||||
String? _alarmaSonandoId;
|
||||
|
||||
static const _paginas = [
|
||||
PantallaInicio(),
|
||||
@@ -224,21 +226,58 @@ class _PaginaPrincipalState extends State<_PaginaPrincipal> {
|
||||
setState(() => _indice = 3);
|
||||
return;
|
||||
}
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => PantallaAlarmaSonando(alarma: alarma!),
|
||||
fullscreenDialog: true,
|
||||
),
|
||||
);
|
||||
await _mostrarAlarmaSonando(alarma);
|
||||
}
|
||||
|
||||
Future<void> _abrirAlarmaDirecta(AlarmaMusical alarma) async {
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder: (_) => PantallaAlarmaSonando(alarma: alarma),
|
||||
fullscreenDialog: true,
|
||||
),
|
||||
await _mostrarAlarmaSonando(alarma);
|
||||
}
|
||||
|
||||
Future<void> _mostrarAlarmaSonando(AlarmaMusical alarma) async {
|
||||
final alarmas = context.read<EstadoAlarmas>();
|
||||
alarmas.marcarEjecucionGestionada(alarma);
|
||||
|
||||
if (_alarmaSonandoActiva) {
|
||||
debugPrint(
|
||||
'[PluriWave][alarmas] alarma ignorada porque ya hay una activa id=${alarma.id} activa=$_alarmaSonandoId',
|
||||
);
|
||||
await alarmas.android.ocultarNotificacionAlarma(alarma.id);
|
||||
return;
|
||||
}
|
||||
|
||||
_alarmaSonandoActiva = true;
|
||||
_alarmaSonandoId = alarma.id;
|
||||
|
||||
try {
|
||||
await _prearrancarAudioAlarma(alarma);
|
||||
if (!mounted) return;
|
||||
await Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(
|
||||
builder:
|
||||
(_) => PantallaAlarmaSonando(
|
||||
alarma: alarma,
|
||||
audioPrearrancado: alarma.emisora != null,
|
||||
),
|
||||
fullscreenDialog: true,
|
||||
),
|
||||
);
|
||||
} finally {
|
||||
if (_alarmaSonandoId == alarma.id) {
|
||||
_alarmaSonandoActiva = false;
|
||||
_alarmaSonandoId = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _prearrancarAudioAlarma(AlarmaMusical alarma) async {
|
||||
final emisora = alarma.emisora;
|
||||
if (emisora == null) return;
|
||||
final radio = context.read<EstadoRadio>();
|
||||
debugPrint(
|
||||
'[PluriWave][alarmas] prearrancar emisora alarma id=${alarma.id} emisora=${emisora.nombre}',
|
||||
);
|
||||
await radio.audio.setVolumen(alarma.volumen.clamp(0.0, 1.0));
|
||||
unawaited(radio.reproducir(emisora));
|
||||
}
|
||||
|
||||
void _mostrarTimerDialog(BuildContext context) {
|
||||
|
||||
Reference in New Issue
Block a user