|
|
|
@@ -868,11 +868,16 @@ class AudioService {
|
|
|
|
|
final?: boolean;
|
|
|
|
|
silent?: boolean;
|
|
|
|
|
}): Promise<string> {
|
|
|
|
|
// _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; }
|
|
|
|
|
|
|
|
|
|