feat(recording): add safety limits and adaptive headers
Build & Deploy Pluriwave / Análisis de código (push) Successful in 23s
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m37s

This commit is contained in:
2026-05-22 15:24:14 +02:00
parent 2320dbdc5f
commit 8190c4ab8d
34 changed files with 1445 additions and 459 deletions
+34
View File
@@ -7,6 +7,7 @@ import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
import 'package:path_provider/path_provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart';
import '../modelos/emisora.dart';
import '../modelos/preset_ecualizador.dart';
@@ -143,6 +144,7 @@ class EstadoRadio extends ChangeNotifier {
EstadoGrabacionRadio get estadoGrabacion => grabacion.estado;
bool get grabacionActiva => grabacion.estado.activa;
String? get directorioGrabacion => grabacion.directorioConfigurado;
int get maxBytesGrabacion => grabacion.maxBytes;
/// Lista principal (home): custom + populares, sin duplicados.
List<Emisora> get emisorasInicio {
@@ -203,6 +205,12 @@ class EstadoRadio extends ChangeNotifier {
if (estado == EstadoReproduccion.error && timer.activo) {
unawaited(timer.cancelar());
}
if ((estado == EstadoReproduccion.detenido ||
estado == EstadoReproduccion.pausado ||
estado == EstadoReproduccion.error) &&
grabacion.estado.activa) {
unawaited(grabacion.detener());
}
notifyListeners();
});
}
@@ -456,6 +464,9 @@ class EstadoRadio extends ChangeNotifier {
Future<void> reproducir(Emisora emisora) async {
final revision = ++_revisionReproduccion;
if (grabacion.estado.activa) {
await grabacion.detener();
}
_emisoraSeleccionada = emisora;
notifyListeners();
try {
@@ -496,6 +507,26 @@ class EstadoRadio extends ChangeNotifier {
Future<void> detenerGrabacion() => grabacion.detener();
Future<void> detenerReproduccion() async {
if (grabacion.estado.activa) {
await grabacion.detener();
}
await audio.detener();
notifyListeners();
}
Future<void> cambiarMaxBytesGrabacion(int bytes) async {
await grabacion.guardarMaxBytes(bytes);
notifyListeners();
}
Future<bool> abrirDirectorioGrabacion() async {
final ruta = await directorioGrabacionEfectivo();
await Directory(ruta).create(recursive: true);
final uri = Uri.directory(ruta);
return launchUrl(uri, mode: LaunchMode.externalApplication);
}
Future<void> cambiarDirectorioGrabacion(String path) async {
await grabacion.guardarDirectorio(path);
notifyListeners();
@@ -510,6 +541,9 @@ class EstadoRadio extends ChangeNotifier {
grabacion.directorioEfectivo();
Future<void> togglePlay() async {
if (audio.estaSonando && grabacion.estado.activa) {
await grabacion.detener();
}
await audio.togglePlay();
notifyListeners();
}