/** * Ringback-Sound für ausgehende Voice-Calls. * * Warum nicht InCallManager.startRingback? * - Auf iOS nutzt InCallManager System-Ringback, der je nach Locale/User- * Setting unterschiedlich klingt (oft fällt es auf den User-Ringtone * zurück → verwirrend, weil das wie ein eingehender Call klingt). * - Wir wollen einen konsistenten "tüüüt-tüüüt"-Ton (EU-Festnetz-Standard * 425 Hz, 1s an / 4s aus, ITU-T E.180) auf BEIDEN Plattformen. * * Asset: `assets/sounds/ringback_eu.mp3` — selbst generiert mit ffmpeg, * CC0 (Public Domain, kein Lizenz-Risiko). */ import { Audio, InterruptionModeAndroid, InterruptionModeIOS } from 'expo-av'; let sound: Audio.Sound | null = null; export async function startRingback(): Promise { try { // Audio-Mode aktiv setzen damit der Ton im Earpiece spielt // (NICHT laut über Speaker — wie bei echten Anrufen). await Audio.setAudioModeAsync({ playsInSilentModeIOS: true, allowsRecordingIOS: false, interruptionModeIOS: InterruptionModeIOS.DoNotMix, interruptionModeAndroid: InterruptionModeAndroid.DoNotMix, shouldDuckAndroid: true, playThroughEarpieceAndroid: true, staysActiveInBackground: false, }); if (sound) { try { await sound.unloadAsync(); } catch {} sound = null; } const { sound: s } = await Audio.Sound.createAsync( require('../assets/sounds/ringback_eu.mp3'), { shouldPlay: true, isLooping: true, volume: 1.0 }, ); sound = s; } catch (e: any) { // Best-effort — falls Sound-System hängt soll der Call trotzdem weiterlaufen. console.warn('[ringback] start failed', e?.message ?? e); } } export async function stopRingback(): Promise { if (!sound) return; const s = sound; sound = null; try { await s.stopAsync(); } catch {} try { await s.unloadAsync(); } catch {} }