PDA

Volledige versie bekijken : Dynamisch flash music player [PHP/XML/Flash]


roelofs-hengelo
%Europe/Berlin %534 %2008, 13:49
Hallo iedereen,

Ik zit met een lastig probleem, en kom er helaas niet uit. Voordat ik het ga uitleggen, moet ik er wel bij zeggen dat ik niet heel erg bekend ben met AS. Simpele code's kan ik maken en ontcijferen, maar als het ingewikkelder word, word het voor mij ook wat lastiger. Ik heb het grootste gedeelte ook gemaakt, met behulp van tutorials. Zodra ik verder kom, zal ik deze post updaten

Ik ben nu bezig om een dynamische flash player te maken. Ik maak nu gebruik van de voglende bestanden:

playlist.php
playlist.xml
music_player.swf

playlist.php
Dit bestand leest de map uit waar de mp3's in staan, haalt de extensie .mp3 eraf, deelt de naam op in arties en nummer, en exporteerd dit naar playlist.xml. Ook word hierin de music_player.swf ingeladen. Zodat als de player word geopend, er direct word gekeken of er nieuwe/andere nummers zijn.

playlist.xml
Zoals hierboven al staat, word deze dynamisch aangemaakt door playlist.php, en de structuur is alsvolgd.

<songs>
<song id="01" file="mp3/artiest - nummer.mp3" name="Nummer" artist="Artiest"/>
</songs>

music_player.swf
Hierin word uiteraard de playlist.xml in ingeladen, en weergegeven. Ook zijn er knoppen om een ander nummer te kiezen, en het afspelen te stoppen. Dit werkt ook allemaal. Ook de preloader heb ik na een tijd aan de praat gekregen. Nu kan het debuggen beginnen, om te kijken of er ergens nog kleine fouten in zitten.

de swf is opgebouwd uit de volgende onderdelen:

textvak artiest - instance: display_txt
textvak nummer - instance: display2_txt
textvak percent - var: c
mc progressbar - instance: bar_full naam (instance of)*: bar_full
btn prev - instance: btn_rew naam (instance of)*: rewind
btn play - instance: btn_play naam (instance of)*: play
btn stop - instance: btn_stop naam (instance of)*: stop
btn next - instance: btn_fw naam (instance of)*: forward


*Weet niet of deze belangrijk zijn, dus heb ze er voor de zekerheid bij gezet.

met de volgende code:

loader = 2;
trace(loader);

// nieuwe XML aanmaken
playlist = new XML();
playlist.ignoreWhite = true;
// pad van XML
playlist.load("playlist.xml");
// als playlist word geladen, en dit is gelukt
playlist.onLoad = function(success) {
// dan de data uit de XML halen
if (success) {
_global.songfile = [];
_global.songname = [];
_global.songartist = [];
//loopje om alle gegevens binnen te halen.
for (var i = 0; i<playlist.firstChild.childNodes.length; i++) {
_global.songfile[i] = playlist.firstChild.childNodes[i].attributes.file;
_global.songartist[i] = playlist.firstChild.childNodes[i].attributes.artist;
_global.songname[i] = playlist.firstChild.childNodes[i].attributes.name;
// trace(songfile[i]+" "+songartist[i]+" "+songname[i]);
}
}
// als alles is geladen, een nieuwe MC aangemaken genaamt sound_mc
_root.createEmptyMovieClip("sound_mc",1);
// sound_mc is een geluidsbestand
_root.sound_mc.sound_obj = new Sound();
// kies een willekeurig nummer
_global.song_nr = random(songfile.length);
// maak van de gegevens een variabele?
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
};
// gedeelte hieronder heb ik niet kunnen ontcijferen, maar
// ik weet wel, dat hier de gegevens uit de XML worden ingeladen,
// mp3 word afgespeeld, en naam en artiest van nummer word weergegeven
// in de tekstvakken, leek mij ook logisch om hier de preloader in te plaatsen,
// maar om 1 of andere reden doet hij dat hier niet.

MovieClip.prototype.songStarter = function(file, name, artist) {
this.sound_obj.loadSound(file,false);
// preloader

_root.sound_mc.onEnterFrame = function() {

loaded1 = sound_mc.sound_obj.getBytesLoaded();
total1 = sound_mc.sound_obj.getBytesTotal();
// dit word weergegegeven in de text vakken
c = Math.ceil((loaded1/total1)*100)+"%";
loaded = Math.ceil(loaded1/100)*.1+" kB";
total = Math.ceil(total1/100)*.1+" kB";
var percent = loaded1/total1;
scale = 100*percent;
// Als scale meer als 20 is, geef dan de artiest, en nummer weer in de teksvakken
if (scale>20) {
this._parent.display_txt.text = artist;
this._parent.display2_txt.text = name;
bar_full._xscale = scale;
if (scale == 100) {
loader = 1;

volgende = "ja";
vorige = "ja";
delete this.onEnterFrame;
this.sound_obj.loadSound(file,true);

// Aansturen van de knoppen
i = 2;
j = 1;
trace("vorige: "+vorige);
trace("volgende: "+volgende);

btn_play.onRelease = function() {
if (i == 2) {
trace("doe niets");
} else {
this._parent.sound_mc.sound_obj.loadSound(file,tru e);
i = 2;
j = 1;
trace("start met spelen");
}
};
btn_stop.onRelease = function() {
if (j == 1) {
this._parent.sound_mc.sound_obj.stop();
trace("stop met spelen");
i = 1;
j = 2;
} else {
trace("doe niets");
}
};
btn_fw.onRelease = function() {
if (vorige == "ja" || volgende == "ja") {
(song_nr == songfile.length-1) ? _global.song_nr=0 : _global.song_nr++;
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
trace("Volgende is in gedrukt, en speeld het volgende nummer.");
volgende = "nee";
vorige = "nee";
}
if (vorige == "nee" || volgende == "nee") {
trace("Volgende is in gedrukt, en doet niets.");
}
};
btn_rev.onRelease = function() {
if (vorige == "ja" || volgende == "ja") {
(song_nr == 0) ? _global.song_nr=songfile.length-1 : _global.song_nr--;
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
trace("Vorige is in gedrukt, en speeld het vorige nummer.");
vorige = "nee";
volgende = "nee";
}
if (volgende == "nee" || vorige == "nee") {
trace("Vorige is in gedrukt, en doet niets.");
}
};
/// Knoppen houden hier op
}
// Als scale onder 20 is, geef dan "Loading..." weer in het tekstvak
} else {
this._parent.display_txt.text = "Loading...";
this._parent.display2_txt.text = " ";
bar_full._xscale = scale;
}
};
};

Tot nu toe, werkt de balk, het percentage gedeelte, en ook het afspelen, ook werken de knoppen pas, als deze nog niet eerder is ingedrukt (er is geen actie aan de play knop, als er al word afgespeeld)

Het enigste wat ik nu nog zoek, is dat de totale tijd van het nummer word weergegeven, en de tijd dat deze al bezig is met spelen.

Ik heb ook geprobeerd om zoveel mogelijk comments te gebruiken, zodat het misschien wat makkelijker is voor jullie om de code te begrijpen. *correct me if I'm wrong :)*
nu is mijn vraag aan jullie natuurlijk, of jullie weten hoe ik dit kan oplossen :)

Alvast bedankt,

Stef Roelofs

** Als deze helemaal klaar is, zal ik proberen om er een tutorial over te maken :#

roelofs-hengelo
%Europe/Berlin %346 %2008, 09:19
Helemaal niemand die dit weet?

Of vraag ik het bijna onmogelijke van Flash :)

Nauzer
%Europe/Berlin %365 %2008, 09:46
Wat je wil is eigenlijk vrij simpel.
Zo zou ik te werk gaan:

Je creeert een TextField (of eigenlijk 2).

In je AS code vraag je van je Sound object de volgende twee properties op:
Sound.duration //en
Sound.position
// In jou geval iets als
_root.sound_mc.sound_obj.duration // en
_root.sound_mc.sound_obj.position

// Het is in AS 2.0 trouwens sterk af te raden om _root te gebruiken...
Let op dat de properties waarden in Miliseconden geven, dus je moet ze zelf nog even met een eenvoudige formule bewerken om er de gewenste tijdsweergave van de maken.

Sound.position kun je bijv. in je onEnterFrame functie toekennen aan een TextField omdat die iedere zoveel tijd verandert.

Sound.duration kun je voor iedere nieuwe song eenmalig setten, die hoeft niet in je onEnterFrame.

Succes...

PS, kijk ook eens in de Flash Help (AS 2.0) bij de "Sound Class" daar staan alle dingen die je kunt opvragen van een Sound Object (properties) en dingen die je kunt doen met een Sound object (methods) heel duidelijk omschreven ;)

roelofs-hengelo
%Europe/Berlin %598 %2008, 15:21
Dank je wel de
Sound.duration // en de
Sound.position ik had het zelf nooit gevonden :) , ik heb het met de totale tijd wel voor elkaar gekregen, alleen de huidige positie niet.

Totale code die ik nu heb:

loader = 2;
trace(loader);

// nieuwe XML aanmaken
playlist = new XML();
playlist.ignoreWhite = true;
// pad van XML
playlist.load("playlist.xml");
// als playlist word geladen, en dit is gelukt
playlist.onLoad = function(success) {
// dan de data uit de XML halen
if (success) {
_global.songfile = [];
_global.songname = [];
_global.songartist = [];
_global.lijst = [];
//loopje om alle gegevens binnen te halen.
for (var i = 0; i<playlist.firstChild.childNodes.length; i++) {
// bestands locatie
_global.songfile[i] = playlist.firstChild.childNodes[i].attributes.file;
// artiest van nummer
_global.songartist[i] = playlist.firstChild.childNodes[i].attributes.artist;
// naam nummer van nummer
_global.songname[i] = playlist.firstChild.childNodes[i].attributes.name;
// playlist
_global.lijst[i] = _global.songartist[i]+" - "+_global.songname[i]+"\n";
//lijst = (_global.songartist[i]+" - "+_global.songname[i]);

// Playlist weergeven


//speellijst_text.text = lijst;
}
}
// als alles is geladen, een nieuwe MC aangemaken genaamt sound_mc
_root.createEmptyMovieClip("sound_mc",1);
// sound_mc is een geluidsbestand
_root.sound_mc.sound_obj = new Sound();
// kies een willekeurig nummer
_global.song_nr = random(songfile.length);
// maak van de gegevens een variabele?
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
};
// gedeelte hieronder heb ik niet kunnen ontcijferen, maar
// ik weet wel, dat hier de gegevens uit de XML worden ingeladen,
// mp3 word afgespeeld, en naam en artiest van nummer word weergegeven
// in de tekstvakken, leek mij ook logisch om hier de preloader in te plaatsen,
// maar om 1 of andere reden doet hij dat hier niet.

MovieClip.prototype.songStarter = function(file, name, artist) {
this.sound_obj.loadSound(file,false);
// preloader

_root.sound_mc.onEnterFrame = function() {

loaded1 = sound_mc.sound_obj.getBytesLoaded();
total1 = sound_mc.sound_obj.getBytesTotal();
// dit word weergegegeven in de text vakken
c = Math.ceil((loaded1/total1)*100)+"% Geladen";
loaded = Math.ceil(loaded1/100)*.1+" kB";
total = Math.ceil(total1/100)*.1+" kB";
var percent = loaded1/total1;
scale = 100*percent;
// Als scale meer als 20 is, geef dan de artiest, en nummer weer in de teksvakken
if (scale>20) {


this._parent.display_txt.text = artist;
this._parent.display2_txt.text = name;
bar_full._xscale = scale;
if (scale == 100) {
loader = 1;
// totale weergeven <- werkt
var totalSeconds:Number = this._parent.sound_mc.sound_obj.duration/1000;
trace(this._parent.sound_mc.sound_obj.duration+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
trace("Totale tijd is gelukt");
totaleTijd.text = minutes+":"+seconds;

// Bereken positie van het nummer <- werkt ook, alleen blijft op nul staan zonder refresh.

var totalSeconds:Number = this._parent.sound_mc.sound_obj.position/1000;
trace(this._parent.sound_mc.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
positieTijd.text = minutes+":"+seconds;





// Knoppen dingen geval
volgende = "ja";
vorige = "ja";
delete this.onEnterFrame;
this.sound_obj.loadSound(file,true);




// Aansturen van de knoppen
i = 2;
j = 1;
//trace("vorige: "+vorige);
//trace("volgende: "+volgende);

btn_play.onRelease = function() {
if (i == 2) {
trace("doe niets");
} else {
this._parent.sound_mc.sound_obj.loadSound(file,tru e);
i = 2;
j = 1;
trace("start met spelen");
}
};
btn_stop.onRelease = function() {
if (j == 1) {
this._parent.sound_mc.sound_obj.stop();
trace("stop met spelen");
i = 1;
j = 2;
} else {
trace("doe niets");
}
};
btn_fw.onRelease = function() {
if (vorige == "ja" || volgende == "ja") {
(song_nr == songfile.length-1) ? _global.song_nr=0 : _global.song_nr++;
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
trace("Volgende is in gedrukt, en speeld het volgende nummer.");
volgende = "nee";
vorige = "nee";
}
if (vorige == "nee" || volgende == "nee") {
trace("Volgende is in gedrukt, en doet niets.");
}
};
btn_rev.onRelease = function() {
if (vorige == "ja" || volgende == "ja") {
(song_nr == 0) ? _global.song_nr=songfile.length-1 : _global.song_nr--;
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
trace("Vorige is in gedrukt, en speeld het vorige nummer.");
vorige = "nee";
volgende = "nee";
}
if (volgende == "nee" || vorige == "nee") {
trace("Vorige is in gedrukt, en doet niets.");
}
};
/// Knoppen houden hier op
}
// Als scale onder 20 is, geef dan "Loading..." weer in het tekstvak
} else {
this._parent.display_txt.text = "Loading...";
this._parent.display2_txt.text = " ";
bar_full._xscale = scale;
}
};
};

Deze pakt hij niet
this._parent.sound_mc.sound_obj.onEnterframe = function (){
var totalSeconds:Number = this._parent.sound_mc.sound_obj.position/1000;
trace(this._parent.sound_mc.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
positieTijd.text = minutes+":"+seconds;
}
En deze ververst zichelf niet

this._parent.sound_mc.sound_obj.onLoad = function (){
var totalSeconds:Number = this._parent.sound_mc.sound_obj.position/1000;
trace(this._parent.sound_mc.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
positieTijd.text = minutes+":"+seconds;
}



Als ik deze manieren in een oneindige while loop zet:
i = 0;
while(i == 0) {
trace ("oneindige loop")
}
dan reageerd Flash niet meer.

roelofs-hengelo
%Europe/Berlin %600 %2008, 15:24
Dank je wel de
Sound.duration // en de
Sound.position ik had het zelf nooit gevonden :) , ik heb het met de totale tijd wel voor elkaar gekregen, alleen de huidige positie niet.

Totale code die ik nu heb:

loader = 2;
trace(loader);

// nieuwe XML aanmaken
playlist = new XML();
playlist.ignoreWhite = true;
// pad van XML
playlist.load("playlist.xml");
// als playlist word geladen, en dit is gelukt
playlist.onLoad = function(success) {
// dan de data uit de XML halen
if (success) {
_global.songfile = [];
_global.songname = [];
_global.songartist = [];
_global.lijst = [];
//loopje om alle gegevens binnen te halen.
for (var i = 0; i<playlist.firstChild.childNodes.length; i++) {
// bestands locatie
_global.songfile[i] = playlist.firstChild.childNodes[i].attributes.file;
// artiest van nummer
_global.songartist[i] = playlist.firstChild.childNodes[i].attributes.artist;
// naam nummer van nummer
_global.songname[i] = playlist.firstChild.childNodes[i].attributes.name;
// playlist
_global.lijst[i] = _global.songartist[i]+" - "+_global.songname[i]+"\n";
//lijst = (_global.songartist[i]+" - "+_global.songname[i]);

// Playlist weergeven


//speellijst_text.text = lijst;
}
}
// als alles is geladen, een nieuwe MC aangemaken genaamt sound_mc
_root.createEmptyMovieClip("sound_mc",1);
// sound_mc is een geluidsbestand
_root.sound_mc.sound_obj = new Sound();
// kies een willekeurig nummer
_global.song_nr = random(songfile.length);
// maak van de gegevens een variabele?
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
};
// gedeelte hieronder heb ik niet kunnen ontcijferen, maar
// ik weet wel, dat hier de gegevens uit de XML worden ingeladen,
// mp3 word afgespeeld, en naam en artiest van nummer word weergegeven
// in de tekstvakken, leek mij ook logisch om hier de preloader in te plaatsen,
// maar om 1 of andere reden doet hij dat hier niet.

MovieClip.prototype.songStarter = function(file, name, artist) {
this.sound_obj.loadSound(file,false);
// preloader

_root.sound_mc.onEnterFrame = function() {

loaded1 = sound_mc.sound_obj.getBytesLoaded();
total1 = sound_mc.sound_obj.getBytesTotal();
// dit word weergegegeven in de text vakken
c = Math.ceil((loaded1/total1)*100)+"% Geladen";
loaded = Math.ceil(loaded1/100)*.1+" kB";
total = Math.ceil(total1/100)*.1+" kB";
var percent = loaded1/total1;
scale = 100*percent;
// Als scale meer als 20 is, geef dan de artiest, en nummer weer in de teksvakken
if (scale>20) {


this._parent.display_txt.text = artist;
this._parent.display2_txt.text = name;
bar_full._xscale = scale;
if (scale == 100) {
loader = 1;
// totale weergeven <- werkt
var totalSeconds:Number = this._parent.sound_mc.sound_obj.duration/1000;
trace(this._parent.sound_mc.sound_obj.duration+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
trace("Totale tijd is gelukt");
totaleTijd.text = minutes+":"+seconds;

// Bereken positie van het nummer <- werkt ook, alleen blijft op nul staan zonder refresh.

var totalSeconds:Number = this._parent.sound_mc.sound_obj.position/1000;
trace(this._parent.sound_mc.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
positieTijd.text = minutes+":"+seconds;





// Knoppen dingen geval
volgende = "ja";
vorige = "ja";
delete this.onEnterFrame;
this.sound_obj.loadSound(file,true);




// Aansturen van de knoppen
i = 2;
j = 1;
//trace("vorige: "+vorige);
//trace("volgende: "+volgende);

btn_play.onRelease = function() {
if (i == 2) {
trace("doe niets");
} else {
this._parent.sound_mc.sound_obj.loadSound(file,tru e);
i = 2;
j = 1;
trace("start met spelen");
}
};
btn_stop.onRelease = function() {
if (j == 1) {
this._parent.sound_mc.sound_obj.stop();
trace("stop met spelen");
i = 1;
j = 2;
} else {
trace("doe niets");
}
};
btn_fw.onRelease = function() {
if (vorige == "ja" || volgende == "ja") {
(song_nr == songfile.length-1) ? _global.song_nr=0 : _global.song_nr++;
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
trace("Volgende is in gedrukt, en speeld het volgende nummer.");
volgende = "nee";
vorige = "nee";
}
if (vorige == "nee" || volgende == "nee") {
trace("Volgende is in gedrukt, en doet niets.");
}
};
btn_rev.onRelease = function() {
if (vorige == "ja" || volgende == "ja") {
(song_nr == 0) ? _global.song_nr=songfile.length-1 : _global.song_nr--;
_root.sound_mc.songStarter(songfile[song_nr],songname[song_nr],songartist[song_nr]);
trace("Vorige is in gedrukt, en speeld het vorige nummer.");
vorige = "nee";
volgende = "nee";
}
if (volgende == "nee" || vorige == "nee") {
trace("Vorige is in gedrukt, en doet niets.");
}
};
/// Knoppen houden hier op
}
// Als scale onder 20 is, geef dan "Loading..." weer in het tekstvak
} else {
this._parent.display_txt.text = "Loading...";
this._parent.display2_txt.text = " ";
bar_full._xscale = scale;
}
};
};

Deze pakt hij niet
this._parent.sound_mc.sound_obj.onEnterframe = function (){
var totalSeconds:Number = this._parent.sound_mc.sound_obj.position/1000;
trace(this._parent.sound_mc.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
positieTijd.text = minutes+":"+seconds;
}
En deze ververst zichelf niet

this._parent.sound_mc.sound_obj.onLoad = function (){
var totalSeconds:Number = this._parent.sound_mc.sound_obj.position/1000;
trace(this._parent.sound_mc.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
positieTijd.text = minutes+":"+seconds;
}



Als ik deze manieren in een oneindige while loop zet:
i = 0;
while(i == 0) {
trace ("oneindige loop")
}
dan reageerd Flash niet meer.

Hij refresht niet meer automatisc, waarschijnlijk omdat
delete this.onEnterFrame;
ook gebruikt word in dat stukje, om te kijken of die al op 100 is met laden.
als ik deze eruit haal, word er een ander nummer ingeladen als deze voorbij 20% is.

weten jullie hoe ik dit kan oplossen, ik blijf maar doorvragen hoor :)

Alvast bedankt

Nauzer
%Europe/Berlin %608 %2008, 15:36
Haal het stuk van je knoppen sowieso uit de onEnterFrame... die worden nu steeds opnieuw "geregistreerd", terwijl dat helemaal niet nodig is...

Het slimste is om de code die je hebt voor het update van het positie-textvak in de bestaande onEnterFrame zet en deze gewoon niet verwijdert ;)

delete this.onEnterFramekan dan weg;)

// al jou code laat ik even weg! moet er natuurlijk wel gewoon in ;)
_root.sound_mc.onEnterFrame = function() {
// jou andere code hier...
// zet dat buttons stuk buiten de onEnterFrame
var totalSeconds:Number = this.sound_obj.position/1000;
trace(this.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
// staat positieTijd (textfield) op je stage? ... > dan is het _root.positieTijd namelijk
positieTijd.text = minutes+":"+seconds;
}

roelofs-hengelo
%Europe/Berlin %680 %2008, 17:20
maar als ik delete this.onEnterFrame verwijder, dan begint hij van voor af aan weer met spelen als die :) als ik hem laat staan, en niet een download ga simulaten, dan geeft hij wel de juiste tijd aan, maar dan haperd de muziek :)

grootste gedeelte van de code
MovieClip.prototype.songStarter = function(file, name, artist) {
this.sound_obj.loadSound(file,false);
// preloader
_root.song_mc.onEnterFrame = function() {
loaded1 = song_mc.sound_obj.getBytesLoaded();
total1 = song_mc.sound_obj.getBytesTotal();
// dit word weergegegeven in de text vakken
c = Math.ceil((loaded1/total1)*100)+"% Geladen";
loaded = Math.ceil(loaded1/100)*.1+" kB";
total = Math.ceil(total1/100)*.1+" kB";
var percent = loaded1/total1;
scale = 100*percent;
// Als scale meer als 20 is, geef dan de artiest, en nummer weer in de teksvakken
if (scale>20) {
btn_play.onRelease = function() {
trace ("niets");
}
btn_stop.onRelease = function() {
trace ("niets");
}
btn_fw.onRelease = function() {
trace ("niets");
}
btn_rev.onRelease = function() {
trace ("niets");
}

this._parent.display_txt.text = artist;
this._parent.display2_txt.text = name;
bar_full._xscale = scale;
if (scale == 100) {
loader = 1;
// totale weergeven
var totalSeconds:Number = this._parent.song_mc.sound_obj.duration/1000;
trace(this._parent.song_mc.sound_obj.duration+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
trace("Totale tijd is gelukt");
totaleTijd.text = minutes+":"+seconds;
// Positie uitrekenen
var totalSeconds:Number = this.sound_obj.position/1000;
trace(this.sound_obj.position+" ms ("+Math.round(totalSeconds)+" seconds)");
var minutes:Number = Math.floor(totalSeconds/60);
var seconds = Math.floor(totalSeconds)%60;
if (seconds<10) {
seconds = "0"+seconds;
}
_root.positieTijd.text = minutes+":"+seconds;
this.sound_obj.loadSound(file,true);
delete this.onEnterFrame;
///////////////
/// ///
/// knoppen ///
/// ///
///////////////
// Als scale onder 20 is, geef dan "Loading..." weer in het tekstvak
}
} else {
this._parent.display_txt.text = "Loading...";
this._parent.display2_txt.text = " ";
bar_full._xscale = scale;
}
};
};


en als ik de knoppen uit de onEnterFrame haal, dan kunnen ze ook worden ingedrukt als hij nog bezig is met laden, en dan gaat ie direct een 2e (en als je nog een paar keer klikt, de 3e, 4e, 5e, enz inladen) dus dat zit er als een soort beveiliging in.