Anruf: es klingelt jetzt wirklich -- vorher gab es gar keinen Ton

Filipe: „ist das normal dass es nicht mal klingelt wenn man anruft?"

Nein. Und der Grund war so einfach wie peinlich: Es gab ueberhaupt
keinen Ton. Weder beim Anrufer noch beim Angerufenen. Der Anruf zeigte
einen Kasten auf dem Bildschirm, sonst nichts -- wer nicht zufaellig
hinsah, merkte nichts, und wer anrief, wusste nie, ob ueberhaupt etwas
passiert.

Damit erklaert sich auch, warum heute Abend alles „kaputt" wirkte,
obwohl Verbindung, Raum, Anmeldung und Code stimmten: Ein stummes
Telefon ist von einem defekten nicht zu unterscheiden.

ZWEI TOENE, JE NACH SEITE:
  Angerufener  zwei weiche Toene (880/660 Hz), dann Pause -- alle
               2,4 Sekunden, dazu Vibration, wo das Geraet sie kann.
  Anrufer      ein leiseres, langsameres Freizeichen (440 Hz). Ein
               stiller Kasten mit laufender Uhr sagt nur, DASS etwas
               passiert; ein Freizeichen sagt, was.

OHNE TONDATEI. Ein .mp3 waere eine Datei mehr im Netz, eine
Lizenzfrage und ein Ladefehler, der genau dann auffaellt, wenn man ihn
braucht. Zwei Sinustoene aus dem Browser reichen. Sanft ein- und
ausgeblendet, weil ein hart geschalteter Sinus knackt -- und das
Knacken ist das Unangenehme daran.

Der Ton hoert auf, sobald jemand rangeht (`dabei`), sobald die
Verbindung steht und beim Auflegen. Drei Stellen, weil ein
Freizeichen, das waehrend des Gespraechs weiterlaeuft, das ist, was
man an Telefonanlagen hasst.

EHRLICH DAZU: Browser lassen Ton erst zu, wenn jemand auf der Seite
etwas angeklickt hat. Wer die Seite gerade erst geoeffnet hat, hoert
unter Umstaenden nichts -- dann bleibt die Benachrichtigung des
Geraets der Weg. Das ist eine Regel des Browsers, keine Entscheidung
von uns.

Geprueft: pruef-anruf 100 -> 101. Gemessen wird am Oszillator, nicht
am Lautsprecher: Ob wirklich etwas zu hoeren ist, haengt an Geraet und
Lautstaerke -- dass die Seite Toene ERZEUGT, laesst sich messen.
Gegenprobe (Freizeichen ausgebaut): „0 Toene erzeugt", rot.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-18 23:59:25 +02:00
co-authored by Claude Opus 5
parent 0137ced9c2
commit c87c396ef5
35 changed files with 528 additions and 404 deletions
+97 -2
View File
@@ -159,7 +159,12 @@
};
v.onconnectionstatechange = () => {
if (v.connectionState === 'connected') lage('Verbunden');
if (v.connectionState === 'connected') {
/* Ab hier redet man miteinander -- ein Freizeichen daneben
waere das, was man an einer Telefonanlage hasst. */
tonAus();
lage('Verbunden');
}
/* `failed` heisst: Es kommt nichts mehr. Das gehoert gesagt --
ein Kasten, der ewig „Verbindung …" zeigt, laesst einen warten,
wo nichts mehr kommt. */
@@ -268,6 +273,9 @@
$('anruf-video').hidden = !mitVideo;
if (mitVideo) $('anruf-video').setAttribute('aria-pressed', 'true');
lage('Es klingelt …');
/* DAS FREIZEICHEN. Ein stiller Kasten mit laufender Uhr sagt nur,
dass etwas passiert -- nicht, was. */
freiTon();
uhrLaufen();
const a = await fetch(`/workspace/api/anruf/${raumId}/start`, {
@@ -334,6 +342,7 @@
}
async function auflegen(melden) {
tonAus();
klingelnAus();
if (!anruf) { const k = $('anruf'); if (k) k.hidden = true; return; }
const raumId = anruf.raumId;
@@ -525,6 +534,9 @@
function klingelnZeigen(raumId, von, mitVideo) {
klingelnAus();
/* UND ES KLINGELT WIRKLICH. Vorher stand hier nur ein Kasten --
wer nicht zufaellig hinsah, merkte nichts. */
klingelTon();
const k = el('div', 'anruf-klingelt');
k.id = 'anruf-klingelt';
k.setAttribute('role', 'alertdialog');
@@ -548,7 +560,87 @@
zu einem Gespräch da, an dem längst niemand mehr teilnimmt. */
setTimeout(klingelnAus, 46000);
}
function klingelnAus() { $('anruf-klingelt')?.remove(); }
/* ---------- DER KLINGELTON (18.09.2026) --------------------------
Filipe: „ist das normal dass es nicht mal klingelt wenn man
anruft?"
Nein. Es gab gar keinen Ton -- weder beim Anrufer noch beim
Angerufenen. Ein Anruf zeigte einen Kasten auf dem Bildschirm,
sonst nichts. Wer nicht zufaellig hinsah, merkte nichts; und wer
anrief, wusste nie, ob ueberhaupt etwas passiert. Genau das
fuehlt sich an wie „geht nicht".
OHNE TONDATEI. Ein Klingelton als .mp3 waere eine Datei mehr im
Netz, eine Lizenzfrage und ein Ladefehler, der genau dann
auffaellt, wenn man ihn braucht. Zwei Sinustoene aus dem Browser
reichen -- das ist, was ein Telefon auch tut.
LEISE UND KURZ. Kein durchdringendes Schrillen: zwei weiche
Toene, dann Pause. Das traegt durch einen Raum, ohne jemanden zu
erschrecken -- dieselbe Ueberlegung wie bei allem Sichtbaren hier.
WARUM ES TROTZDEM STUMM BLEIBEN KANN: Browser lassen Ton erst zu,
wenn jemand auf der Seite etwas angeklickt hat. Wer die Seite
gerade erst geoeffnet hat, hoert deshalb unter Umstaenden nichts
-- dann bleibt die Benachrichtigung des Geraets der Weg. Das ist
eine Regel des Browsers, keine Entscheidung von uns. */
let tonWerk = null; /* der Taktgeber, solange es klingelt */
let tonRaum = null; /* AudioContext -- erst bei Bedarf */
function tonAn(hoehe, laenge, lautstaerke) {
try {
if (!tonRaum) {
const K = window.AudioContext || window.webkitAudioContext;
if (!K) return;
tonRaum = new K();
}
if (tonRaum.state === 'suspended') tonRaum.resume().catch(() => {});
const o = tonRaum.createOscillator();
const v = tonRaum.createGain();
o.type = 'sine';
o.frequency.value = hoehe;
/* Sanft ein und aus: Ein hart geschalteter Sinus knackt, und
genau das Knacken ist das Unangenehme daran. */
const t = tonRaum.currentTime;
v.gain.setValueAtTime(0, t);
v.gain.linearRampToValueAtTime(lautstaerke, t + 0.03);
v.gain.linearRampToValueAtTime(0, t + laenge);
o.connect(v).connect(tonRaum.destination);
o.start(t);
o.stop(t + laenge + 0.05);
} catch { /* kein Ton -- die Benachrichtigung bleibt der Weg */ }
}
/** Es klingelt bei dem, der angerufen wird: zwei Toene, dann Pause. */
function klingelTon() {
tonAus();
const takt = () => { tonAn(880, 0.22, 0.16); setTimeout(() => tonAn(660, 0.26, 0.16), 300); };
takt();
tonWerk = setInterval(takt, 2400);
/* Und das Geraet darf mitvibrieren, wo es das kann. */
try { navigator.vibrate?.([250, 200, 250]); } catch { /* egal */ }
}
/** Das Freizeichen bei dem, der anruft -- leiser und langsamer.
*
* Damit er weiss, DASS es laeuft. Ein stiller Kasten mit einer
* laufenden Uhr sagt nur, dass etwas passiert; ein Freizeichen
* sagt, WAS. */
function freiTon() {
tonAus();
const takt = () => tonAn(440, 0.5, 0.07);
takt();
tonWerk = setInterval(takt, 3000);
}
function tonAus() {
if (tonWerk) { clearInterval(tonWerk); tonWerk = null; }
try { navigator.vibrate?.(0); } catch { /* egal */ }
}
function klingelnAus() { tonAus(); $('anruf-klingelt')?.remove(); }
/* ---------- Was vom Server kommt --------------------------------------- */
@@ -561,6 +653,9 @@
return;
}
if (d.art === 'dabei') {
/* Jemand ist rangegangen -- auch wenn die Verbindung noch ein
paar Sekunden braucht, klingelt hier nichts mehr. */
tonAus();
if (!anruf || d.raum_id !== anruf.raumId) return;
if (d.person?.id === ichId) return;
/* NICHT „Verbunden" MELDEN, SOLANGE NICHTS VERBUNDEN IST.