diff --git a/android/src/screens/ChatScreen.tsx b/android/src/screens/ChatScreen.tsx index f5f7d66..d86dbfb 100644 --- a/android/src/screens/ChatScreen.tsx +++ b/android/src/screens/ChatScreen.tsx @@ -1038,19 +1038,24 @@ const ChatScreen: React.FC = () => { {!isUser && item.text.length > 0 && ( { - if (item.audioPath) { - audioService.playFromPath(item.audioPath); - } else { - // messageId mitschicken damit die Bridge das generierte Audio - // wieder mit der Nachricht verknuepft (fuer den naechsten Replay aus Cache) - rvs.send('tts_request' as any, { - text: item.text, - voice: localXttsVoiceRef.current, - speed: ttsSpeedRef.current, - messageId: item.messageId || '', - }); + onPress={async () => { + // Erst lokalen Cache pruefen — audioPath kann auf eine geloeschte + // Datei zeigen (TTS-Cache geleert oder Auto-Cleanup). In dem Fall + // ueber RVS neu rendern lassen statt stumm zu bleiben. + const cachePath = item.audioPath?.replace(/^file:\/\//, '') || ''; + const cached = cachePath ? await RNFS.exists(cachePath).catch(() => false) : false; + if (cached) { + audioService.playFromPath(item.audioPath!); + return; } + // messageId mitschicken damit die Bridge das generierte Audio + // wieder mit der Nachricht verknuepft (fuer den naechsten Replay aus Cache) + rvs.send('tts_request' as any, { + text: item.text, + voice: localXttsVoiceRef.current, + speed: ttsSpeedRef.current, + messageId: item.messageId || '', + }); }} > {'\uD83D\uDD0A'} diff --git a/android/src/services/audio.ts b/android/src/services/audio.ts index 83863ef..c681459 100644 --- a/android/src/services/audio.ts +++ b/android/src/services/audio.ts @@ -316,13 +316,19 @@ class AudioService { * unterdrueckt — der Focus bleibt fuer die ganze Konversation gehalten. */ private _releaseFocusDeferred(): void { if (this._conversationFocusActive) { + console.log('[Audio] _releaseFocusDeferred: Conversation aktiv → kein Release'); this._cancelDeferredFocusRelease(); return; } this._cancelDeferredFocusRelease(); + console.log('[Audio] _releaseFocusDeferred: in %dms', this.FOCUS_RELEASE_DELAY_MS); this.focusReleaseTimer = setTimeout(() => { this.focusReleaseTimer = null; - if (this._conversationFocusActive) return; + if (this._conversationFocusActive) { + console.log('[Audio] Focus-Release abgebrochen (Conversation jetzt aktiv)'); + return; + } + console.log('[Audio] AudioFocus jetzt released'); AudioFocus?.release().catch(() => {}); }, this.FOCUS_RELEASE_DELAY_MS); } @@ -1131,11 +1137,13 @@ class AudioService { } this.currentSound = sound; + console.log('[Audio] Sound.play startet (path=%s)', soundPath); // Naechstes Audio schon vorbereiten waehrend dieses abspielt this._preloadNext(); sound.play((success) => { + console.log('[Audio] Sound.play callback: success=%s queue=%d', success, this.audioQueue.length); if (!success) console.warn('[Audio] Wiedergabe fehlgeschlagen'); sound.release(); this.currentSound = null;