JavaScript String an Flash

PapstRatze

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
436
Tag,

hab ein Problem und 10€ übrig:
Ich steh gerade total auf dem Schlauch (8€). Versuche schon eine weile einen Text von JavaScript an eine Flashdatei zu übergeben.

Von Vorne:
Ich versuche ein Array, welches mit ca. 44100 float-Zahlen gefüllt ist an ein Flash zu übergeben. (Der, der sich schon mal mit Sounds beschäftigt hat weiß bereits worum es geht.) Das wird nötig, da dieser kleine, leider zu unrecht geliebte IE ein Problem mit DataUri's hat. Die Wiedergabe des so erstellten Tons in Flash habe ich mir durch die "richtigen", schwer zu findenden Beispiele zusammen gestellt. Funktioniert auch einwandfrei, wenn ich das Array direkt in Flash fülle.

Um es aber vorwegzunehmen ich habe eigentlich von Flash/ActionScript kaum eine Ahnung. Es würde mich freuen, wenn trotz all meiner Suche nun doch raus kommt, dass man ab Flash 10 bereits Arrays übergeben kann, da aufgrund der Größe ein einfaches umwandeln in einen String auch nicht möglich ist.

Aktuell versuche ich jeden Eintrag einzeln zu Übergeben, ich glaube das ist totaler Humbug aber wie gesagt ich hab keinen Plan von Flash :).

So jetzt aber mal ein bisschen Code ;) -Auszug aus dem JQuery-Plugin welches ich erstellt habe-
Code:
var soundArray = (new Function(inputSourceCode)());
                for (var i = 0; i < soundArray.length; i++) {
                    $("#_flash").playFlash(''+soundArray[i]);
                }
Das ganze ist schön eingebettet in ein Try-Catch, weshalb ich zumindest weiß, das es ab der dritten Zeile zum Abbruch kommt :(.
Nun der Flash-Part:
Code:
public class Main extends Sprite 
	{		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		private var j:uint = 0; private var soundArray:Array; private var sampleRate:uint; private var k:uint = 0;
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			ExternalInterface.addCallback("playFlash", create);
		}
		
		public function create(soundVal:String):void
		{
			if(k < 44100){
			soundArray[j] = parseFloat(soundVal);
			k++;
			}
			else {
			var mySound:Sound = new Sound(); 
			mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator); 
			mySound.play();
			k = 0;
			}
		}
		
		private function sineWaveGenerator(event:SampleDataEvent):void 
		{
			if(j < 44100){
				for (j; j < 8192; j++) 
				{
					event.data.writeFloat(soundArray[j]);
					event.data.writeFloat(soundArray[j]);
				}
				j += 8192;
			}
		}
		
	}
Wie gesagt, die Funktion aus dem Flash wird versucht in einem Plugin aufzurufen, das eigentliche Objekt ist aber bereits in der HTML eingebunden. Wollte es eigentlich auch erst in dem Plugin erstellen, das führte aber zum direkt Absturz von Opera :evillol:

Vielleicht sehe ich den Wald vor lauter Bäumen nicht mehr (6€), aber ich komm einfach nicht weiter. Ist es ein Fehler in der Flash-Datei oder doch einfach ein Falscher Aufruf in JQuery?
Fragen über Fragen (4€)...

Jetzt habe ich noch 4€ und bestimmt bald einen Tipp wie ich weiter komme :D
 
Probiers mal besser mit einem Aufruf, anstatt X tausend verschiedenen Aufrufen. Da kann die Schnittstelle glaube schnell überfordert sein.
 
Hmm leider landet es immer noch im catch (habe die Schleifeinbedingung einfach mal auf i < 1 gesetzt).

Liegt es ggf. an irgendeiner Sicherheitsebene?. Lassen die Scripts über einen Opera-United Server laufen. Also kein echter Server, könnte es sein, dass das zu Problemen führt?

#Edit: Nach weiteren Stunden des Testens und kleinen Änderungen, was das einfügen des Flashs in die Seite angeht, bin ich zu der Schlussfolgerung gekommen:
"Es wird wohl aller Voraussicht nach am Flash liegen, weshalb die Geschichte nicht funktioniert.

Nutze jetzt swfObject zum einbetten und versuche dann den Code aufzurufen.
Code:
swfobject.embedSWF("AudioFlash.swf", "FlashAudio", "100", "100", "10.0.0", "swfobject/expressInstall.swf");
            function getMovie(movieName) {
                return document.getElementById(movieName);
            };
            var flash = getMovie("FlashAudio");
            flash.playFlash("");
Habe auch anstelle der function getMovie einfach:
Code:
var flash = $("#FlashAudio");
ausprobiert, funktionierte auch nicht.

Das ärgerliche alle Tutorials verwenden die sündhaft Teure Software von Adobe zum erstellen der .swf Datei. Da ich nicht bereit bin mir dieses für meine Zwecke überdimensionierte Paket anzuschaffen, hoffe ich, dass jemand versiertes mir sagen kann, wo der Fehler im Code versteckt ist...
 
Zuletzt bearbeitet:
Du kannst via FlashVars einem SWFObject Eigenschaften übergeben. Dies funktioniert aber nur mit Strings. Also entweder übergibst deine 41000 Floats als String oder du musst dir was anderes überlegen.

Ein minimaler WebService bzw AMF Conncetion via RemoteObjetcs wären denkbar. Ebenso könnte man mit JS eine XML (mit den Daten)irgendwo ablegen und den Pfad zu dieser via flashvars übergeben. Das wäre in meinen Augen das einfachste. Kommt natürlich aber auch auf deine Architektur an und was genau du machen willst.
 
In einer XML ablegen wäre doch eigentlich gar nicht so schlecht, wobei ich dann aber sichergehen sollte, dass die XML nach Verwendung wieder gelöscht wird. Eine Option die ich mir direkt nach dem Einkaufen anschauen werden :).

Alle Floats als ein string geht nicht, da JS-Strings (literal) auf 1024 Zeichen beschränkt ist, wenn ich mich nicht ganz täusche.

Aber das Problem ist, dass er ja nicht mal die Funktion aufrufen kann. (Code nach dem Aufruf wird nicht mehr ausgeführt, ergo liegt dort ein Problem ;)) Naja, mal schauen.
 

Ähnliche Themen

Zurück
Oben