• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Absolut kompliziertes Skript das kein Mensch versteht.

xorg1990

Neues Mitglied
Tacho, ich habe ein dickes Problem mit eine Skript das sehr, sehr, sehr, kompliziert ist.
Der originale Link ist: http://websdr.ewi.utwente.nl:8901/websdr-sound.js
Eine übersichtlichere Version ist zu finden auf: http://dm4tr.bplaced.net/websdr/websdr-sound.js

Ok, fangen wir an.
Ganz oben steht:

Code:
var A=null,V=window.AudioContext||window.webkitAudioContext;
    if(V){document.ct||(document.ct=new V);

bedeutet “document.ct” enthält webkitAudio, soweit so gut.

Dann kommt der web Audio Teil:
Code:
if(p=document.ct){
        p.sampleRate=g;
        var g=p.sampleRate,f=2048;sup_iOS&&(f*=2);
        try{
            C=p.createScriptProcessor(f,1,1)
        }
        catch(ka){
            C=p.createJavaScriptNode(f,1,1)
        }
        C.onaudioprocess=ca;
        this.p=C;
        z=p.createConvolver();
        C.connect(z);
        z.connect(p.destination);
        var v,f=p.createBuffer(1,512,g);
        v=f.getChannelData(0);
        v.set(fa);
        D[0]=f;
        f=p.createBuffer(1,512,g);
        v=f.getChannelData(0);
        v.set(ea);
        D[1]=f;
        f=p.createBuffer(1,512,g);
        v=f.getChannelData(0);
        v.set(ga);
        D[2]=f;
        f=p.createBuffer(1,512,g);
        v=f.getChannelData(0);
        v.set(ha);
        D[3]=f;
        z.normalize=!1;
        z.buffer=D[0]

Dazu eine Frage was macht v.set(fa), was ist set()? fa sind Filterkoeffizienten, v ist ein Float32Array das übrigens nirgendwo erstellt wird.

Jetzt der Interessante Teil:

Code:
    var aa,s,U,G=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],w=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],K=0,ia=0,l=new WebSocket("ws://websdr.ewi.utwente.nl:8901/~~stream");
    l.binaryType="arraybuffer";
    var E=500;
    l.onmessage=function(b){
        p||doe();
        var d=(16384+e-n-((new Date).getTime()-H)*y/1E3)%8192;E+=0.01*(d-E);
        E>2*B&&(n=(8192+e-B)%8192,d=E=B);
        x=1+1E-5*(E-B);1.002<x&&(x=1.002);
        0.998>x&&(x=0.998);
        document.getElementById("debug").innerHTML=Math.round(d)+" "+Math.round(B)+" "+Math.round(E)+" "+Math.round(1E6*(x-1))+"ppm"+n+" "+Math.round(y)+"Hz<br>";
        var d=new Uint8Array(b.data),c;
        b=e;
        for(c=0;c<d.length;c++){
            var g=0,h=0;
            if(112==(d[c]&240))smeter=256*(d[c]&15)+d[c+1],c++;
            else if(0==d[c]){
                ia++;
                var a;
                for(a=0;128>a;a++)r[e+a]=da[d[c+1+a]];
                e+=128;8192<=e&&(e-=8192);
                c+=128;
                var k;
                for(k=0;20>k;k++)G[k]=w[k]=0;K=0
            }
            else if(16<=d[c]&&95>=d[c])h=4,g=2,s=6-(d[c]>>4);
            else if(d[c]&128)h=1,g=2;
            else if(1==d[c])y=256*d[c+1]+d[c+2],Y=0<y?1:0,c+=2;
            else if(2==d[c])aa=256*d[c+1]+d[c+2],c+=2;
            else if(3==d[c])U=d[c+1],k=d[c+1]&15,k!=P&&(P=k,z&&(z.buffer=D[P])),c++;
            else if(4==d[c]){
                for(a=0;128>a;a++)
                r[e+a]=0;
                e+=128;8192<=e&&(e-=8192);
                for(k=0;20>k;k++)G[k]=w[k]=0;
                K=0
            }

„var d=new Uint8Array(b.data),c;” bedeutet das ein neues Uint8Array angelegt wird , mit der Größe des Arraybuffers der websocket Verbindung , verstehe ich das richtig??
Dann kommt eine for Schleife „for(c=0;c<d.length;c++)“, die c solange erhöht bis c genau so groß ist wie d.

Dann verlässt mich mein Wissen bei „if(112==(d[c]&240))smeter=256*(d[c]&15)+d[c+1],c++;“
was bitte schön bedeutet „d[c]&240“? d ist das Uint8Array aber was macht c in dem Array, werden da die Werte
ausgelesen die c enthält??

Dann ist da noch was. Oben ist ein Array w mit 20 werten unten steht dann
“for(k=0;20>k;k++)G[k]=w[k]=0;K=0” wird da der Inhalt von k in das Array w geschrieben? Wen ja an welcher Stelle?


Was macht dieses Skript?
Es filtert PCM Daten aus einem Websocket/TCP Packet und schreibt es dann in die web Audio API.
neben bei wird noch das I/Q-Verfahren angewandt.

Warum poste ich das?
Bei mir funktioniert das Skript nicht, der Browser friert ein. Der Grund ist meine TCP Pakete sind größer als die vom websdr Twente. Außerdem brauch ich das sdr und i/Q geschrabbel nicht. Mich integriert nur wie die es hinbekommen haben die Daten vom Websocket an die Web Audio API zu senden.

Die Frage, wie man ein websocket arraybuffer zur web audio api sendet, kam übrigens schon öfters bei stackoverflow , konnte aber keiner beantworten.
Der WebSDR Twente ist die einzige Seite wo das Skript erfolgreich angewendet wird.
Nur verstehen tut‘s keiner.

Mfg, xorg1990
 
Werbung:
Zurück
Oben