PDA

Volledige versie bekijken : Sound_complete


Surfreak
%Europe/Berlin %460 %2008, 11:03
Hey,

ik ben nu bezig aan een music-player,
maar ik krijg het maar niet voor elkaar om na een nummer het volgende nummer te laten afspelen,

misschien weten jullie wat ik fout doe, ik ben nogal nieuw met AC3

var s:Sound = new Sound();
s.load(new URLRequest("http://www.youmees.nl/foto/muziek/Joy Williams - I Believe In You.mp3"))
var sc:SoundChannel= s.play();
SoundMixer.stopAll()
var num:Number = 1
var positie:Number=0

// einde muziek
sc.addEventListener(Event.SOUND_COMPLETE, einde);

function einde(e:Event){
s.load(new URLRequest("http://www.youmees.nl/foto/muziek/Hillsongs - United Live - Tell The World.mp3"))
var sc:SoundChannel=s.play()
trace("----");
}

Surfreak
%Europe/Berlin %722 %2008, 17:20
Niemand?? :(

of het ik het niet goed uitgelegd?

cflink
%Europe/Berlin %553 %2008, 13:16
Ik denk dat het hier in zit:
SoundMixer.stopAll()
var num:Number = 1
var positie:Number=0

Je vergeet de ; achter de regels, het is vreemd dat je geen foutmelding krijgt, maar ik denk dat het daar aan ligt. Sowieso vind ik de aanroep van SoundMixer.stopAll() na s.play() wat vreemd. Mocht je er nog niet uitkomen heb je hier misschien wat aan (uit de flash help):
package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.events.MouseEvent;
import flash.text.TextFormat;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.IOErrorEvent;

public class SoundChannel_event_soundCompleteExample extends Sprite {
private var channel:SoundChannel = new SoundChannel();
private var songList:Array = new Array();
private var listTextField:TextField = new TextField();
private var songFormat:TextFormat = new TextFormat();
private var arrayIndex:int = 0;
private var songSelected:Boolean = false;

public function SoundChannel_event_soundCompleteExample() {

listTextField.autoSize = TextFieldAutoSize.LEFT;
listTextField.border = true
listTextField.background = true;
listTextField.text = "Song1.mp3\n" + "Song2.mp3\n"
+ "Song3.mp3\n" + "Song4.mp3\n" + "PLAY";

songFormat.italic = true;

listTextField.addEventListener(MouseEvent.CLICK, clickHandler);

addChild(listTextField);
}

private function clickHandler(e:MouseEvent):void {
var index:int = listTextField.getLineIndexAtPoint(e.localX, e.localY);
var line:String = listTextField.getLineText(index);
var firstIndex:uint = listTextField.getLineOffset(index);
var playLine:uint = listTextField.numLines - 1;

if((index == playLine) && (songSelected == true)) {
listTextField.removeEventListener(MouseEvent.CLICK , clickHandler);
playNext();

} else if (index != playLine) {
songList.push(line.substr(0, (line.length - 1)));
listTextField.setTextFormat(songFormat, firstIndex,
(firstIndex + listTextField.getLineLength(index)));
songSelected = true;
}
}

private function playNext():void {

if(arrayIndex < songList.length) {
var snd:Sound = new Sound();
snd.load(new URLRequest(songList[arrayIndex]));
channel = snd.play();

channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
arrayIndex++;

} else {
songSelected = false;

while(arrayIndex > 0) {
songList.pop();
arrayIndex--;
}
}
}

private function soundCompleteHandler(e:Event):void {
playNext();
}

private function errorHandler(errorEvent:IOErrorEvent):void {
trace(errorEvent.text);
}
}
}

Jan
%Europe/Berlin %612 %2008, 14:42
Je vergeet de ; achter de regels, het is vreemd dat je geen foutmelding krijgt, maar ik denk dat het daar aan ligt.
Misschien dat dit veranderd is sinds Flash CS3 maar t.e.m. Flash 8pro is(was) er die verplichting niet en zal je er zeker geen warning of error message van krijgen.

Misschien teveel bezig geweest met JAVA of PHP ? ;)

Groeten,
Jan

cflink
%Europe/Berlin %662 %2008, 15:53
Ik ben een php-er... :-)
Ben bezig met Flash voor afstudeerproject en ben erg te spreken over AS 3 omdat het zo'n nette taal is. Goede type casting en ondersteuning voor OOP zijn echt pluspunten voor Flash. het mogen weglaten van de ; vind ik niet in dit straatje passen, misschien is het dan niet verplicht, maar het is in ieder geval een best-practice zullen we dan maar zeggen ;-)
Hoe zit het dan met de SoundMixer.stopAll() aanroep? is die niet een beetje vreemd?

Surfreak
%Europe/Berlin %691 %2008, 16:36
ik zal je de hele script geven,
ik heb dat gedaan omdat ik het geluid wil stoppen en pas met een button wil laten afspelen

var slc:SoundLoaderContext = new SoundLoaderContext(5000);
var s:Sound = new Sound();
s.load(new URLRequest("http://www.youmees.nl/foto/muziek/Joy Williams - I Believe In You.mp3"))
var sc:SoundChannel= s.play();
SoundMixer.stopAll()
var num:Number = 1
var positie:Number=0

// einde muziek
sc.addEventListener(Event.SOUND_COMPLETE, einde);

function einde(e:Event){
s.load(new URLRequest("http://www.youmees.nl/foto/muziek/Hillsongs - United Live - Tell The World.mp3"))
var sc:SoundChannel=s.play()
trace("----");
}



// play-stop button
BT_stop.addEventListener(MouseEvent.CLICK, klik)
function klik (e:MouseEvent){
if (num == 1){
var sc:SoundChannel=s.play()
num=2
}else if ( num == 2){
SoundMixer.stopAll();
num=1
}
}

// versier stuk
var byteArray:ByteArray = new ByteArray();

function maakhet(e:Event){
SoundMixer.computeSpectrum(byteArray,true)

graphics.clear();

for (var i:Number=0; i < 4; i++){
graphics.lineStyle(1,0x000000)
graphics.beginFill(0x000000,0.9)
graphics.drawRect(i*8+100, 100, 5, -byteArray.readFloat()*30)
}
}
this.addEventListener(Event.ENTER_FRAME, maakhet)
en ik ben er achtergekomen als ik het zonder die button doe dat de Sound_complete het wel doet.

maar hoe moet ik het dan doen met die button??

en die ; er achter, wat is dat eigenlijk? heb geen opleiding of zo gehad hier voor.
alles zelf geleerd:P, weet niet denk uit slordigheid nooit gedaan:P

cflink
%Europe/Berlin %726 %2008, 17:26
In principe moet je elke expressie of methode/functie aanroep afsluiten met een ;
Ik weet niet of Flash <enter> goed genoeg vindt, maar in php, java, javascript en andere programmeertalen is de ; verplicht.
Ik snap ook niet waarom je de muziek start als je 'm niet wil starten. En hou je wel rekening met de laadtijd van de mp3?
Dus misschien moet het ongeveer zo?

// definieer variabelen
var slc:SoundLoaderContext = new SoundLoaderContext(5000);
var s:Sound = new Sound();
var sc:SoundChannel = new SoundChannel();
var num:Number = 1;
var positie:Number=0;
// var BT_stop is ergens anders gedefinieerd??

// add Event Listeners
BT_stop.addEventListener(MouseEvent.CLICK, klik);
sc.addEventListener(Event.SOUND_COMPLETE, einde);

// laad mp3 (netter in try - catch)
try
{
s.load(new URLRequest("http://www.youmees.nl/foto/muziek/Joy Williams - I Believe In You.mp3"), slc); // waarvoor maak je anders een SoundLoaderContext?
}
catch (e:Error)
{
trace(e.message);
}
//SoundMixer.stopAll(); // overbodig want er speelt nog niks toch?


// functies
function einde(e:Event){
s.load(new URLRequest("http://www.youmees.nl/foto/muziek/Hillsongs - United Live - Tell The World.mp3"));
// var sc:SoundChannel=s.play(); // je moet sc niet opnieuw declareren
sc = s.play();
trace("----");
}

function klik (e:MouseEvent)
{
if (num == 1)
{
// var sc:SoundChannel=s.play(); // je moet sc niet opnieuw declareren
sc = s.play();
num = 2;
}
else if ( num == 2)
{
SoundMixer.stopAll();
num = 1;
}
}

Ik weet niet of dit gaat werken, maar hoop dat je er wat aan hebt. Succes

Surfreak
%Europe/Berlin %742 %2008, 17:49
oky, het word al wat duidelijker :)

eeuu maar ik snap niet hoe de try en catch werkt, is dat nieuw in AC3?

var BT_stop is ergens anders gedefinieerd??
wat bedoel je hier mee??

EDIT:
eeuu ik heb hem er zo in geplakt, maar hij doet niks als het 1e liedje is afgelopen :S

cflink
%Europe/Berlin %486 %2008, 11:41
try ... catch is een standaard constructie in programmeertalen om iets te proberen (try) waarvan je niet zeker weet of het goed gaat (door externe omstandigheden zoals bereikbaarheid van een server) en mocht het verkeerd gaan de fout op te vangen (catch) en netjes af te handelen in plaats van het programma te laten crashen.

BT_stop is zo te zien je button, maar die wordt in jouw code niet gedefinieerd. Ik ga er vanuit dat dat ergens anders gebeurt, want anders zou je die button niet eens zien... vandaar die opmerking.

Vreemd dat ie het niet doet, maar ik heb de code ook niet getest. Hou er wel rekening mee dat het laden van een mp3 enige tijd in beslag neemt. krijg je ook je trace message niet te zien? geen foutmelding?

P.S. het is Action Script 3 => AS3

Surfreak
%Europe/Berlin %579 %2008, 13:53
oky:)

BT_stop is een MC met de instancename BT_...

ik krijg geen trace of error :S
net of hij de function 'einde' helemaal niet aanroept

en ik heb er ook een try/catch in de function einde gezet, of kan dat niet?:P