Equalizer (nativ), Dolby-Atmos-Zugang und Auto-Wiedergabe bei Kopfhoerern

- Native Bruecke AudioEffectsBridge.kt: Equalizer + BassBoost + Virtualizer
  auf der Audio-Session des Players, inkl. System-Klangeffekt-Panel
- Dart-Seite AudioEffects: Presets, Baender, Bass/Immersiv, persistiert
- EqualizerScreen nach Vorlage inkl. Drehregler (CustomPainter)
- Auto-Wiedergabe bei verbundenen Kopfhoerern (Klinke + Bluetooth)
- MODIFY_AUDIO_SETTINGS im Manifest
- Einstellungen: neuer Bereich "Ton"

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011snPXPafPC5i87o68H14W7
This commit is contained in:
2026-08-20 18:35:06 +02:00
co-authored by Claude Opus 5
parent 7aa98864aa
commit 1325badf90
13 changed files with 1020 additions and 1 deletions
+45
View File
@@ -9,7 +9,9 @@ import '../services/cache_manager.dart';
import '../services/logger_service.dart';
import '../services/navidrome_service.dart';
import '../services/offline_mode.dart';
import '../player/audio_effects.dart';
import 'app_settings.dart';
import 'equalizer_screen.dart';
import 'library_stats.dart';
/// Settings-Tab: Bibliotheks-Statistik, Berechtigungen, Navidrome, Über Melo.
@@ -37,6 +39,21 @@ class _SettingsScreenState extends State<SettingsScreen> {
if (mounted) setState(() => _cacheSize = size);
}
/// Öffnet die Klangeffekt-Oberfläche des Systems (auf POCO/Xiaomi ist das
/// Dolby Atmos). Nicht jedes Gerät bietet sie an.
Future<void> _oeffneSystemKlangeffekte(BuildContext context) async {
final effects = context.read<AudioEffects>();
final messenger = ScaffoldMessenger.of(context);
final geoeffnet = await effects.openSystemPanel();
if (!geoeffnet) {
messenger.showSnackBar(
const SnackBar(
content: Text('Dieses Gerät bietet keine System-Klangeffekte an'),
),
);
}
}
@override
Widget build(BuildContext context) {
final db = context.read<MeloDb>();
@@ -89,6 +106,34 @@ class _SettingsScreenState extends State<SettingsScreen> {
},
),
const Divider(height: 1),
const _SectionLabel('Ton'),
ListTile(
leading: const Icon(Icons.graphic_eq),
title: const Text('Equalizer'),
subtitle: const Text('Klangprofile, Bass und Immersives Audio'),
trailing: const Icon(Icons.chevron_right),
onTap: () => Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const EqualizerScreen()),
),
),
ListTile(
leading: const Icon(Icons.surround_sound),
title: const Text('Dolby Atmos'),
subtitle: const Text('Klangeffekte des Systems öffnen'),
trailing: const Icon(Icons.open_in_new),
onTap: () => _oeffneSystemKlangeffekte(context),
),
Consumer<AppSettings>(
builder: (context, settings, _) => SwitchListTile(
secondary: const Icon(Icons.headset),
title: const Text('Automatische Wiedergabe'),
subtitle: const Text(
'Startet, sobald Kopfhörer verbunden werden (auch Bluetooth)'),
value: settings.autoPlayOnHeadphones,
onChanged: settings.setAutoPlayOnHeadphones,
),
),
const Divider(height: 1),
const _SectionLabel('Darstellung'),
Consumer<AppSettings>(
builder: (context, settings, _) => SwitchListTile(