Start · Sprachen · JavaScript · Referenz · RTCDTMFSender.toneBuffer

RTCDTMFSender.toneBuffer

Eigenschaft

Schreibgeschützte Zeichenkette mit den DTMF-Tönen, die noch in der Warteschlange stehen und über die <code>RTCPeerConnection</code> an den Remote-Peer gesendet werden.

seit JavaScript Baseline: alle modernen Browser (Chrome 27+, Firef Kategorie: webapi

Signatur

RTCDTMFSender.toneBuffer

Beschreibung

Die Eigenschaft toneBuffer eines RTCDTMFSender enthält alle Töne, die noch nicht abgespielt wurden. Mit insertDTMF() wird der Puffer gefüllt. Nach jedem gesendeten Ton entfernt der Browser das erste Zeichen und löst das Ereignis tonechange aus. Ist der Puffer leer, ist die Übertragung abgeschlossen und toneBuffer ist ein leerer String "".

Gültige Zeichen sind die Ziffern 0–9, die Buchstaben A–D, * und # sowie das Komma ,. Das Komma fügt eine Pause von 2 Sekunden ein. Kleinbuchstaben a–d werden intern in Großbuchstaben umgewandelt. Enthält der String ungültige Zeichen, wirft insertDTMF() einen InvalidCharacterError.

In der Praxis dient toneBuffer dazu, den Fortschritt einer Wahlsequenz anzuzeigen, zum Beispiel bei IVR-Menüs („Drücken Sie 1 …“) oder beim Anwählen einer Durchwahl über ein WebRTC-SIP-Gateway. Außerdem lässt sich damit prüfen, ob noch Töne ausstehen, bevor neue angehängt werden.

Die Eigenschaft ist schreibgeschützt. Wer den Puffer leeren oder ersetzen will, ruft insertDTMF("") bzw. insertDTMF(neueTöne) auf. Jeder Aufruf von insertDTMF() ersetzt den gesamten Pufferinhalt.

Rückgabewert

Typ
string
Beschreibung
Die noch ausstehenden DTMF-Töne als Zeichenkette, z. B. "23#". Wenn nichts in der Warteschlange steht, ein leerer String "".

Beispiele

Warteschlange nach insertDTMF() auslesen

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const [track] = stream.getAudioTracks();
const sender = pc.addTrack(track, stream);

const dtmf = sender.dtmf;
if (dtmf?.canInsertDTMF) {
  dtmf.insertDTMF('1234#', 100, 70);
  console.log('Ausstehend:', dtmf.toneBuffer);
} else {
  console.log('DTMF derzeit nicht möglich (Verbindung noch nicht aufgebaut?)');
}
Ausstehend: 1234#

Fortschritt mit tonechange anzeigen

const dtmf = sender.dtmf;
const anzeige = document.querySelector('#dtmf-status');

dtmf.addEventListener('tonechange', (event) => {
  if (event.tone === '') {
    anzeige.textContent = 'Alle Töne gesendet.';
    return;
  }
  anzeige.textContent = `Sende "${event.tone}", verbleibend: "${dtmf.toneBuffer}"`;
});

dtmf.insertDTMF('0800,123');
Sende "0", verbleibend: "800,123" Sende "8", verbleibend: "00,123" … Alle Töne gesendet.

Töne anhängen statt ersetzen

// insertDTMF() ersetzt den Puffer – deshalb den Rest selbst übernehmen
const appendTones = (dtmf, tones) => {
  dtmf.insertDTMF(dtmf.toneBuffer + tones);
};

const cancelTones = (dtmf) => dtmf.insertDTMF('');

appendTones(sender.dtmf, '5');
console.log(sender.dtmf.toneBuffer);
z. B. "34#5" (je nach aktuellem Stand)

// Wichtig · Fallstricke

  • Ersetzen statt Anhängen: Jeder Aufruf von insertDTMF() überschreibt toneBuffer vollständig. Zum Anhängen den aktuellen Inhalt selbst voranstellen, wie in Beispiel 3.
  • Der Ton, der gerade abgespielt wird, steht nicht mehr in toneBuffer. Er ist nur über event.tone im tonechange-Ereignis zu sehen.
  • Die Groß- und Kleinschreibung kann nach dem Einfügen anders sein als in der Eingabe, weil a–d in Großbuchstaben umgewandelt werden. Zeichenketten deshalb nicht exakt mit der Eingabe vergleichen.
  • RTCRtpSender.dtmf ist bei Video-Sendern null. Ist canInsertDTMF false, zum Beispiel vor dem Verbindungsaufbau oder wenn die Gegenseite kein telephone-event aushandelt, wirft insertDTMF() einen InvalidStateError.
  • Kompatibilität: In allen modernen Browsern verfügbar. Ältere Chrome-Versionen nutzten das veraltete RTCPeerConnection.createDTMFSender().