Signatur
Beschreibung
baseLatency liefert eine Gleitkommazahl in Sekunden. Sie gibt an, welche Verzögerung der AudioContext selbst verursacht, wenn er Audio vom AudioDestinationNode an das Audio-Subsystem des Betriebssystems weitergibt. Diese Latenz entsteht vor allem durch die interne Pufferung des Audio-Graphen (meist Vielfache von 128 Sample-Frames pro Render-Quantum).
Der Wert hängt stark von der Option latencyHint ab, die du beim Konstruktor new AudioContext({ latencyHint }) übergibst. Mit "interactive" (Standard) bekommst du die kleinstmögliche Latenz, "playback" nimmt mehr Latenz in Kauf und spart dafür Energie, "balanced" liegt dazwischen. Du kannst auch einen Zahlenwert in Sekunden als Wunsch angeben, der Browser muss sich aber nicht daran halten.
Brauchbar ist die Eigenschaft bei interaktiven Anwendungen wie Synthesizern, Rhythmusspielen oder Live-Monitoring. Dort musst du die Verzögerung kennen, um Audio mit visuellen Ereignissen oder Benutzereingaben abzustimmen. Für die gesamte Ausgabelatenz addierst du outputLatency dazu. Dieser Wert enthält zusätzlich die Verzögerung des Betriebssystems und der Hardware.
Rückgabewert
double, z. B. 0.005333 (≈ 256 Frames bei 48 kHz). Ist schreibgeschützt.Beispiele
Latenz je nach latencyHint vergleichen
const hints = ['interactive', 'balanced', 'playback'];
for (const latencyHint of hints) {
const ctx = new AudioContext({ latencyHint });
console.log(`${latencyHint}: ${(ctx.baseLatency * 1000).toFixed(2)} ms`);
await ctx.close();
}
Gesamte Ausgabelatenz berechnen
const ctx = new AudioContext({ latencyHint: 'interactive' });
const getTotalLatency = (context) => {
const base = context.baseLatency ?? 0;
const output = context.outputLatency ?? 0; // nicht überall verfügbar
return base + output;
};
console.log(`Gesamt: ${(getTotalLatency(ctx) * 1000).toFixed(1)} ms`);
Visuelles Feedback mit dem Ton synchronisieren
const ctx = new AudioContext();
const button = document.querySelector('#drum');
const pad = document.querySelector('#pad');
button.addEventListener('click', async () => {
if (ctx.state === 'suspended') await ctx.resume();
const osc = ctx.createOscillator();
osc.connect(ctx.destination);
const start = ctx.currentTime + 0.05;
osc.start(start);
osc.stop(start + 0.1);
// Ab jetzt vergehen 50 ms geplanter Vorlauf plus die Latenz des Kontexts
const delayMs = (0.05 + ctx.baseLatency + (ctx.outputLatency ?? 0)) * 1000;
setTimeout(() => pad.classList.add('flash'), delayMs);
setTimeout(() => pad.classList.remove('flash'), delayMs + 100);
});
// Wichtig · Fallstricke
- Nur bei
AudioContext:OfflineAudioContexthat diese Eigenschaft nicht, weil dort nicht in Echtzeit gerendert wird. - Nicht die ganze Latenz:
baseLatencyenthält keine Verzögerung durch Betriebssystem, Treiber oder Bluetooth-Kopfhörer. Dafür gibt esoutputLatency. Bei Bluetooth kann dieser Wert mehrere hundert Millisekunden betragen. latencyHintist nur ein Wunsch: Der Browser rundet auf Werte, die die Hardware unterstützt. Lies deshalb immerbaseLatencyaus, statt dich auf den angeforderten Wert zu verlassen.- Kompatibilität: Ältere Safari-Versionen (vor 14.1) und das veraltete
webkitAudioContextkennen die Eigenschaft nicht, sie liefern dannundefined. Plane deshalb einen Ersatzwert ein, z. B. mitctx.baseLatency ?? 0. - Einige Browser setzen den Wert zum Schutz vor Fingerprinting absichtlich auf eine gröbere Genauigkeit.