diff --git a/android/src/services/audio.ts b/android/src/services/audio.ts index 22c2136..0ad4a6b 100644 --- a/android/src/services/audio.ts +++ b/android/src/services/audio.ts @@ -868,11 +868,16 @@ class AudioService { final?: boolean; silent?: boolean; }): Promise { + // _stoppedMessageId: User hat diese Antwort mid-Wiedergabe gestoppt + // (Mute geklickt). Auch wenn Mute jetzt wieder aus ist, soll diese + // Antwort nicht weiterspielen. Erst eine neue messageId resetted das. + const incomingMsgId = payload.messageId || ''; + const stoppedByUser = !!this._stoppedMessageId && incomingMsgId === this._stoppedMessageId; // Globaler Mute-Flag uebersteuert das per-Call silent — verhindert // Race-Conditions wenn der User zwischen Chunks den Mute-Knopf drueckt. // _pausedForCall: AudioTrack ist gestoppt waehrend Anruf — Chunks weiter // sammeln (fuer WAV-Cache), aber NICHT in den Player schicken. - const silent = !!payload.silent || this._muted || this._pausedForCall; + const silent = !!payload.silent || this._muted || this._pausedForCall || stoppedByUser; if (!silent && !PcmStreamPlayer) { console.warn('[Audio] PcmStreamPlayer Native Module nicht verfuegbar'); return ''; @@ -913,6 +918,13 @@ class AudioService { this.pausedMessageId = ''; this.pausedPosition = 0; } + // Stop-Marker zuruecksetzen wenn neue messageId — neue Antwort darf + // wieder normal abspielen, egal ob Mute zwischendurch aktiv war. + if (this._stoppedMessageId && this._stoppedMessageId !== messageId) { + console.log('[Audio] Neue Antwort (msgId=%s) — Stop-Marker fuer %s zurueckgesetzt', + messageId, this._stoppedMessageId); + this._stoppedMessageId = ''; + } this.pcmStreamActive = true; this.pcmMessageId = messageId; this.pcmSampleRate = sampleRate; @@ -1181,11 +1193,26 @@ class AudioService { * abgespielt. Wird in pauseForCall gesetzt, in endCallPause/resumeFrom- * Interruption zurueckgenommen. */ private _pausedForCall: boolean = false; + /** Wenn der User mid-Wiedergabe Mute drueckt: messageId der ABGEBROCHENEN + * Antwort merken. Folge-Chunks dieser msgId werden silent ignoriert, auch + * wenn der User Mute wieder ausschaltet — kein "Resume mid-Antwort". Eine + * NEUE messageId resetted das, dann spielt's wieder normal. */ + private _stoppedMessageId: string = ''; setMuted(muted: boolean): void { console.log('[Audio] setMuted: %s (currentSound=%s pcmStreamActive=%s)', muted, this.currentSound ? 'aktiv' : 'null', this.pcmStreamActive); this._muted = muted; - if (muted) this.stopPlayback(); + if (muted) { + // Aktuell laufende Antwort als "verworfen" markieren — nachfolgende + // chunks dieser msgId werden silent gehalten auch wenn der User Mute + // gleich wieder ausschaltet. Erst eine NEUE Antwort darf wieder reden. + const activeMsgId = this.pcmMessageId || this.currentPlaybackMsgId; + if (activeMsgId) { + this._stoppedMessageId = activeMsgId; + console.log('[Audio] Antwort %s als gestoppt markiert', activeMsgId); + } + this.stopPlayback(); + } } isMuted(): boolean { return this._muted; }