feat(eq): add per-device equalizer with 4-level preset resolution

Introduce multi-device EQ support allowing each audio output device
(built-in speaker, wired, USB, individual Bluetooth by MAC) to have
its own equalizer preset, combined with existing per-station presets
for a full station×device matrix.

- Add DispositivoAudio model and ServicioDispositivoAudio interface
- Add Android platform channel (AudioDeviceCallback) for device detection
- Add iOS AudioDevicesPlugin (AVAudioSession route tracking)
- Extend ServicioEcualizador with device and matrix persistence keys
- Implement 4-level resolution: matrix > station > device > global
- Add advanced EQ settings section with feature toggle (off by default)
- Extend export/import to v3 with backward compatibility
- 184 tests passing, zero analyzer issues
This commit is contained in:
2026-06-27 11:33:53 +02:00
parent 8f42e67b48
commit 4632d53eb8
36 changed files with 2850 additions and 64 deletions
+36
View File
@@ -2269,6 +2269,42 @@ abstract class AppLocalizations {
/// In es, this message translates to:
/// **'https://stream.example.com:8000/radio'**
String get streamUrlHint;
/// No description provided for @advancedEqSectionTitle.
///
/// In es, this message translates to:
/// **'Opciones avanzadas de ecualización'**
String get advancedEqSectionTitle;
/// No description provided for @advancedEqEnableToggle.
///
/// In es, this message translates to:
/// **'Activar EQ por dispositivo'**
String get advancedEqEnableToggle;
/// No description provided for @advancedEqEnableToggleSubtitle.
///
/// In es, this message translates to:
/// **'Aplica automáticamente un preset de EQ distinto al cambiar la salida de audio.'**
String get advancedEqEnableToggleSubtitle;
/// No description provided for @advancedEqKnownDevicesTitle.
///
/// In es, this message translates to:
/// **'Dispositivos de audio conocidos'**
String get advancedEqKnownDevicesTitle;
/// No description provided for @advancedEqKnownDevicesEmpty.
///
/// In es, this message translates to:
/// **'No hay dispositivos registrados. Conectá uno para empezar.'**
String get advancedEqKnownDevicesEmpty;
/// No description provided for @advancedEqDevicePresetLabel.
///
/// In es, this message translates to:
/// **'Preset: {presetName}'**
String advancedEqDevicePresetLabel(Object presetName);
}
class _AppLocalizationsDelegate