feat(alarmas): agregar fade-in configurable en activacion
This commit is contained in:
@@ -25,9 +25,12 @@ class PantallaAlarmaSonando extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
static const _volumenInicialFadeIn = 0.05;
|
||||
static const _fadeStep = Duration(milliseconds: 250);
|
||||
final AudioPlayer _fallbackPlayer = AudioPlayer();
|
||||
StreamSubscription<EstadoReproduccion>? _estadoSub;
|
||||
Timer? _fallbackTimer;
|
||||
Timer? _fadeInTimer;
|
||||
bool _fallbackActivo = false;
|
||||
bool _radioIntentada = false;
|
||||
bool _audioFlutterConfirmado = false;
|
||||
@@ -40,7 +43,7 @@ class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
|
||||
Future<void> _iniciarAlarma() async {
|
||||
final radio = context.read<EstadoRadio>();
|
||||
await _fallbackPlayer.setVolume(widget.alarma.volumen.clamp(0.0, 1.0));
|
||||
await _fallbackPlayer.setVolume(_volumenInicialFadeIn);
|
||||
await _fallbackPlayer.setLoopMode(LoopMode.one);
|
||||
|
||||
final emisora = widget.alarma.emisora;
|
||||
@@ -50,10 +53,11 @@ class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
}
|
||||
|
||||
_radioIntentada = true;
|
||||
await radio.audio.setVolumen(widget.alarma.volumen.clamp(0.0, 1.0));
|
||||
await radio.audio.setVolumen(_volumenInicialFadeIn);
|
||||
if (!widget.audioPrearrancado) {
|
||||
unawaited(radio.reproducir(emisora));
|
||||
}
|
||||
_iniciarFadeIn();
|
||||
|
||||
_estadoSub = radio.estadoStream.listen((estado) {
|
||||
if (estado == EstadoReproduccion.reproduciendo && mounted) {
|
||||
@@ -78,10 +82,43 @@ class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
_fallbackActivo = true;
|
||||
await _fallbackPlayer.setAsset(_assetFallback(widget.alarma.sonidoInterno));
|
||||
await _fallbackPlayer.play();
|
||||
_iniciarFadeIn();
|
||||
await _confirmarAudioFlutterListo();
|
||||
if (mounted) setState(() {});
|
||||
}
|
||||
|
||||
void _iniciarFadeIn() {
|
||||
_fadeInTimer?.cancel();
|
||||
final volumenObjetivo = widget.alarma.volumen.clamp(0.0, 1.0);
|
||||
final inicio = _volumenInicialFadeIn.clamp(0.0, volumenObjetivo);
|
||||
final segundosFade = widget.alarma.fadeInSegundos.clamp(0, 60);
|
||||
if (segundosFade <= 0 || volumenObjetivo <= inicio) {
|
||||
unawaited(_aplicarVolumenGlobal(volumenObjetivo));
|
||||
return;
|
||||
}
|
||||
final duracionTotalMs = segundosFade * 1000;
|
||||
final pasos = (duracionTotalMs / _fadeStep.inMilliseconds).ceil();
|
||||
var pasoActual = 0;
|
||||
_fadeInTimer = Timer.periodic(_fadeStep, (timer) {
|
||||
if (!mounted) {
|
||||
timer.cancel();
|
||||
return;
|
||||
}
|
||||
pasoActual++;
|
||||
final t = (pasoActual / pasos).clamp(0.0, 1.0);
|
||||
final volumenActual = inicio + (volumenObjetivo - inicio) * t;
|
||||
unawaited(_aplicarVolumenGlobal(volumenActual));
|
||||
if (t >= 1) timer.cancel();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _aplicarVolumenGlobal(double volumen) async {
|
||||
if (!mounted) return;
|
||||
final radio = context.read<EstadoRadio>();
|
||||
await radio.audio.setVolumen(volumen.clamp(0.0, 1.0));
|
||||
await _fallbackPlayer.setVolume(volumen.clamp(0.0, 1.0));
|
||||
}
|
||||
|
||||
Future<void> _confirmarAudioFlutterListo() async {
|
||||
if (_audioFlutterConfirmado) return;
|
||||
_audioFlutterConfirmado = true;
|
||||
@@ -95,6 +132,7 @@ class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
final alarmas = context.read<EstadoAlarmas>();
|
||||
final navigator = Navigator.of(context);
|
||||
_fallbackTimer?.cancel();
|
||||
_fadeInTimer?.cancel();
|
||||
await _estadoSub?.cancel();
|
||||
await _fallbackPlayer.stop();
|
||||
await radio.audio.pausar();
|
||||
@@ -107,6 +145,7 @@ class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
final alarmas = context.read<EstadoAlarmas>();
|
||||
final navigator = Navigator.of(context);
|
||||
_fallbackTimer?.cancel();
|
||||
_fadeInTimer?.cancel();
|
||||
await _estadoSub?.cancel();
|
||||
await _fallbackPlayer.stop();
|
||||
await radio.audio.pausar();
|
||||
@@ -117,6 +156,7 @@ class _PantallaAlarmaSonandoState extends State<PantallaAlarmaSonando> {
|
||||
@override
|
||||
void dispose() {
|
||||
_fallbackTimer?.cancel();
|
||||
_fadeInTimer?.cancel();
|
||||
_estadoSub?.cancel();
|
||||
_fallbackPlayer.dispose();
|
||||
super.dispose();
|
||||
|
||||
Reference in New Issue
Block a user