fix: dB-Range -85, Mute haert auch laufende TTS, VoIP-Anrufe + Bild-Bubble
Bug 1 — dB-Range erweitert: VAD_SILENCE_DB_MIN von -55 auf -85 dB. Damit hat Stefan einen weiten Regler-Spielraum wenn die adaptive Auto-Erkennung in seiner Umgebung nicht zuverlaessig greift. Bug 5 — Mute-Button stoppt laufende TTS nicht: audioService bekommt jetzt einen internen _muted-Flag. handlePcmChunk setzt silent automatisch wenn _muted true ist, playAudio kehrt frueh zurueck. Verhindert Race zwischen User-Klick auf Mute und einem TTS-Chunk der im selben JS-Tick ankommt (vorher: Ref-Update via useEffect erst nach dem Re-Render → Chunks "rutschten durch"). Plus ttsCanPlayRef wird im toggleMute-Handler synchron aktualisiert. Bug 4 — VoIP/Messenger-Anrufe erkennen: AudioFocusModule emittiert jetzt "AudioFocusChanged" Events mit type "loss"/"loss_transient"/"gain". WhatsApp/Signal/Discord/etc. requestn AudioFocus_GAIN_TRANSIENT_EXCLUSIVE wenn ein Anruf reinkommt — wir fangen das in phoneCall.ts ab und rufen halt + pauseForCall genau wie beim klassischen Anruf. Plus getMode() Polling-Fallback (alle 3s) weil GAIN nicht zuverlaessig kommt wenn wir den Focus selbst released haben — sobald AudioMode wieder NORMAL ist, resumeFromCall. Bug 6 — Bilder als "Strich": attachmentImage hatte width: '100%' in einer Bubble mit maxWidth: '80%' ohne explizite Parent-Breite → RN rendert auf 0px Breite. Neue ChatImage- Komponente nutzt Image.getSize um die echte aspectRatio zu messen + setzt sie dynamisch. Bubble passt sich dem Bild an. Bugs 2 (lange Texte mid-cutoff) + 3 (Spotify resumed) — brauchen ADB-Logs. ADB-WLAN ueber 192.168.177.22:5555 schlaegt fehl (refused) — bei Android 11+ braucht's Wireless-Debugging-Pairing-Code. Stefan kann den nennen sobald er soweit ist. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -90,7 +90,7 @@ const VAD_SPEECH_MIN_MS = 500; // ms Sprache bevor Aufnahme zaehlt — l
|
||||
// nicht zuverlaessig greift. Range -55..-15 dB. Speech-Schwelle wird auf
|
||||
// override+10 dB gesetzt (Speech muss klar lauter als Stille sein).
|
||||
export const VAD_SILENCE_DB_DEFAULT = -38; // wenn User Manuell-Modus waehlt
|
||||
export const VAD_SILENCE_DB_MIN = -55; // sehr empfindlich, fast jeder Pegel ist "Sprache"
|
||||
export const VAD_SILENCE_DB_MIN = -85; // extrem empfindlich, praktisch alles gilt als Sprache
|
||||
export const VAD_SILENCE_DB_MAX = -15; // sehr unempfindlich, nur lautes Reden gilt
|
||||
export const VAD_SILENCE_DB_OVERRIDE_KEY = 'aria_vad_silence_db_override';
|
||||
|
||||
@@ -610,7 +610,9 @@ class AudioService {
|
||||
/** Base64-kodiertes Audio in die Queue stellen und abspielen */
|
||||
async playAudio(base64Data: string): Promise<void> {
|
||||
if (!base64Data) return;
|
||||
|
||||
// Mute-Flag respektieren — robust gegen Race-Conditions zwischen User-
|
||||
// Klick auf Mute und einem TTS-Chunk der im selben Tick eintrifft.
|
||||
if (this._muted) return;
|
||||
this.audioQueue.push(base64Data);
|
||||
if (!this.isPlaying) {
|
||||
this._playNext();
|
||||
@@ -677,7 +679,9 @@ class AudioService {
|
||||
final?: boolean;
|
||||
silent?: boolean;
|
||||
}): Promise<string> {
|
||||
const silent = !!payload.silent;
|
||||
// Globaler Mute-Flag uebersteuert das per-Call silent — verhindert
|
||||
// Race-Conditions wenn der User zwischen Chunks den Mute-Knopf drueckt.
|
||||
const silent = !!payload.silent || this._muted;
|
||||
if (!silent && !PcmStreamPlayer) {
|
||||
console.warn('[Audio] PcmStreamPlayer Native Module nicht verfuegbar');
|
||||
return '';
|
||||
@@ -937,6 +941,17 @@ class AudioService {
|
||||
}
|
||||
}
|
||||
|
||||
/** Mute: alle eingehenden TTS-Chunks/WAVs werden ignoriert bis wieder
|
||||
* unmuted. Robuster als ein React-Ref weil hier kein Re-Render-Race ist
|
||||
* — die Bridge kann einen Chunk im selben JS-Tick liefern in dem der
|
||||
* User Mute geklickt hat. */
|
||||
private _muted: boolean = false;
|
||||
setMuted(muted: boolean): void {
|
||||
this._muted = muted;
|
||||
if (muted) this.stopPlayback();
|
||||
}
|
||||
isMuted(): boolean { return this._muted; }
|
||||
|
||||
/** Laufende Wiedergabe stoppen + Queue leeren */
|
||||
stopPlayback(): void {
|
||||
// Foreground-Service auch stoppen — sonst bleibt die Notification haengen
|
||||
|
||||
Reference in New Issue
Block a user