import 'dart:math' as math; /// Liest einen ReplayGain-Wert aus einem Tag wie "-6.54 dB". /// Gibt null zurück, wenn im Tag nichts Brauchbares steht. double? parseReplayGain(String? raw) { if (raw == null) return null; final match = RegExp(r'-?\+?\d+(\.\d+)?').firstMatch(raw.trim()); if (match == null) return null; return double.tryParse(match.group(0)!.replaceFirst('+', '')); } /// Rechnet eine ReplayGain-Angabe in Dezibel in einen Lautstärkefaktor um. /// /// Angeglichen wird ausschließlich **nach unten**: laute Titel werden leiser /// gemacht. Über 100 % hinaus kann der Player nicht verstärken, deshalb /// bleiben Titel mit positivem Wert unverändert. double volumeForGain(double? gainDb) { if (gainDb == null || gainDb >= 0) return 1.0; return math.pow(10, gainDb / 20).toDouble().clamp(0.0, 1.0); }