• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Objektcallback auf mehrere ander Objekt aufteilen

xorg1990

New member
Hi, habe mal wieder in kleines Problem mit der Objektorientierung in js.

Ich erstelle auf meiner Seite einmalig ein Objekt namens Player was in dem Objekt GrabberStack gespeichert ist.
GrabberStack["Player"] = new player(data.GrabberID, data.Stream_URL);

Nun kommt eine jquery each Schleife die weitere Objekte erstellt und Attribute setzt:

Code:
$.each(loadedData.Grabber, function(key, value) {
            if (key in GrabberStack) {
                GrabberStack[key]["Window"] = new Window(key, data.GrabberID, "CSH_" + key, "texterea_" + key)
                GrabberStack[key]["Resampler"] = new Resampler(GrabberStack.Player.getSampleRate(), value.UserRate, 4096);
                GrabberStack[key]["Window"].setContrast(value.contrast);
                GrabberStack[key]["Window"].setScrollIntervall(value.ScrollInter);
                //create callbacks
                GrabberStack.Player.SamplesCallback = function(sampleBuffer) {
                    GrabberStack[key]["Resampler"].resample(sampleBuffer);
                }
            }

Es bekommt nur der zuletzt erstellte Resampler Daten, die andren fallen flach.
Der Resampler ist noch eine eben tiefer im GrabberStack Objekt:
GrabberStack[key]["Resampler"].

Wie bekomme ich es nun hin das jeder Resampler Daten bekommt?
Es darf nur einen Player pro Dokument geben, dass ich wichtig.
 
GrabberStack.Player.SamplesCallback ist eine Variable, der Du ein Funktionsobjekt zuweist. Mit jeder Zuweisung überschreibst Du die vorige Funktion, so dass am Schleifenende nur die letzte drinsteht.
Man könnte das Problem lösen, indem man die Zuweisung aus der Schleife herausnimmt und die Callback-Funktion folgender Maßen definiert:
Code:
GrabberStack.Player.SamplesCallback = function(sampleBuffer) {
      $.each(loadedData.Grabber, function(key, value) {
          GrabberStack[key]["Resampler"].resample(sampleBuffer);
      });
};
 
Ja das würde funktionieren, hab ich nach gar nicht daran gedacht die each schleife in den callback zu packen.:cool:

Gibt es dafür noch ne andre lösung über .call oder .apply, bind was weiß ich was.

Weil der sampleCallback triggert ~20 mal in der sec. was ganz schön an der cpu load nagt wenn ich das so mache.

mfg,
xorg1990
 
Gute Idee, kannte ich noch gar nicht. Die Argumentliste könntest Du in dem $.each aufbauen, das sowieso vorhanden ist. .call muss jedoch auch die Argumentliste durchiterieren, aber möglicher Weise ist das bei einem Array performanter als bei einem komplexen Objekt. Du kannst es ja mal untersuchen.
 
Nun kommt eine jquery each Schleife die weitere Objekte erstellt und Attribute setzt:

Code:
$.each(loadedData.Grabber, function(key, value) {
            if (key in GrabberStack) {
                GrabberStack[key]["Window"] = new Window(key, data.GrabberID, "CSH_" + key, "texterea_" + key)
                GrabberStack[key]["Resampler"] = new Resampler(GrabberStack.Player.getSampleRate(), value.UserRate, 4096);
                GrabberStack[key]["Window"].setContrast(value.contrast);
                GrabberStack[key]["Window"].setScrollIntervall(value.ScrollInter);
                //create callbacks
                GrabberStack.Player.SamplesCallback = function(sampleBuffer) {
                    GrabberStack[key]["Resampler"].resample(sampleBuffer);
                }
            }

Es bekommt nur der zuletzt erstellte Resampler Daten, die andren fallen flach.
und wo wird das callback überhaupt aufgerufen? also wo wird ein asynchroner vorgang gestartet, der bei beendigung das callback startet?
hier muss doch schon sichergestellt werden, dass das nacheinander passiert, da du nur einen "Player" hast.
 
hesst schrieb:
und wo wird das callback überhaupt aufgerufen?

Das habe ich in dem Player Objekt als leere Methode da stehen.
player.prototype.SamplesCallback = function() {};

Dann wiederum habe ich eine Methode play und darin wird dann
this.SamplesCallback getriggert
Code:
player.prototype.play = function(ev) {
 this.SamplesCallback(outputLeft);
}

Methode Play wir vom web audio scriptprocessor aufgerufen, deshalb 20 mal in der sec.
 
du willst also in play an allen resamplern die funktion resample aufrufen.
da kannst du jquery.each weglassen oder nicht, das spielt keine rolle.
die zeit geht in den 5 resample-funktionen drauf.
hier kannst du mal sehen, ob du in der 2., 3., 4. oder 5. resample-funktion auf ergebnisse der vorherigen aufrufe zurückgreifen kannst. die müsstest du dann zwischenspeichern.
 
Zurück
Oben