Files
pluriwave/openspec/changes/archive/2026-06-27-multi-device-eq/design.md
T
FreeTLab bccc5c48b8
Build & Deploy PluriWave / Análisis de código (push) Successful in 38s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 2m30s
docs(openspec): add SDD artifact trail for recent alarm and EQ changes
Persist the exploration, proposal, spec, design, tasks, and
verify/archive reports produced during the multi-device EQ,
alarm-countdown, and notification-visual-polish SDD cycles.
2026-07-04 12:42:11 +02:00

2.8 KiB

Design: Multi-Device Equalizer

Technical Approach

Add a device dimension to the existing 2-level EQ resolution (station > global) by introducing a platform channel bridge for device detection, a Dart service abstraction, and extending EstadoEcualizador to resolve through a 4-level hierarchy. Follows existing project patterns: ChangeNotifier state, SharedPreferences persistence via ServicioEcualizador, platform channels in MainActivity.kt, and constructor-injected fakes for testing.

Architecture Decisions

ADR-1: Platform Channel vs Package

Decision: Custom platform channel pluriwave/audio_devices

  • Rationale: Project already has 3 platform channels. Pattern is established. BT MAC from AudioManager.getDevices() requires no extra permission.

ADR-2: Device Service as Abstract Class

Decision: Abstract ServicioDispositivoAudio with real + fake implementations

  • Rationale: Testable without platform channels. Matches existing service pattern.

ADR-3: Composite Key for Matrix Persistence

Decision: "stationUuid:deviceId" string key in flat map

  • Rationale: Simple serialization. ~80 bytes/entry, predictable SP size.

ADR-4: Resolution Wiring Point

Decision: EstadoEcualizador subscribes and resolves internally

  • Rationale: Single owner of resolution logic. Handler stays thin and testable.

ADR-5: EQ Re-application After _recrearPlayer()

Decision: State layer keeps _presetActual updated on device/station change

  • Rationale: Handler unchanged. State layer ensures _presetActual is always resolved.

ADR-6: Feature Toggle Scope

Decision: SP key eq_multi_device_enabled_v1 read by EstadoEcualizador

  • Rationale: Zero behavioral change when off. Toggle at state layer fully isolates feature.

Data Flow

Platform (Android/iOS)
        |
AudioDeviceCallback / routeChangeNotification
        |
EventChannel: pluriwave/audio_devices
        |
ServicioDispositivoAudio (Stream<DispositivoAudio>)
        |
EstadoEcualizador (4-level resolution: matrix > station > device > global)
        |
aplicarPresetActivo(resolved)
        |
ServicioAudio + ServicioEcualizador

File Changes

19 files modified or created:

  • lib/modelos/dispositivo_audio.dart (NEW)
  • lib/servicios/servicio_dispositivo_audio.dart (NEW)
  • android/app/src/main/kotlin/.../MainActivity.kt (MODIFIED)
  • ios/Runner/AudioDevicesPlugin.swift (NEW)
  • ios/Runner/AppDelegate.swift (MODIFIED)
  • lib/servicios/servicio_ecualizador.dart (MODIFIED)
  • lib/estado/estado_ecualizador.dart (MODIFIED)
  • lib/servicios/servicio_export_import.dart (MODIFIED)
  • lib/pantallas/pantalla_ajustes.dart (MODIFIED)
  • lib/l10n/app_en.arb (MODIFIED)
  • lib/l10n/app_es.arb (MODIFIED)
  • test/ — 8 new/extended test files

(See Engram observation #2187 for complete design document with all interfaces and contracts)