2016-05-19 10 views
0

Ich versuche einen sehr einfachen Musik-Player mit Web Audio API zu erstellen. Eine der Voraussetzungen ist eine Funktion, die nach Beendigung eines Tracks automatisch gestartet wird.In HTML5 WebAudio wissen, ob der Sound gestoppt wurde oder beendet wurde?

Momentan abonniere ich das 'beendete' Event. Etwas entlang der Linien mit

nodeSource.onEnded = function() {} 
nodeSource.start(0, offset, duration); 

Das Problem kommt von der Tatsache, dass ‚onended‘ wird in zwei Fällen ausgelöst:

  • Sound Spielen fertig sind (genau das, was gebraucht wird)
  • jemand tatsächlich gestoppt den Ton (wird überhaupt nicht benötigt)

Ich brauche eine Möglichkeit, diese beiden Fälle zu trennen. Momentan konnte ich keinen Wert für die aktuelle Position innerhalb des Soundpuffers finden, daher konnte ich ihn mit dem Zeitpunkt vergleichen, an dem der Sound enden sollte.

Ich verstehe, dass es möglich ist, einen separaten Timer zu Beginn der Wiedergabe zu erstellen und dann zu überprüfen, ob der Sound noch richtig spielt, bevor es aufhören sollte, aber das ist eine wirklich seltsame Art, es zu tun.

Gibt es eine Möglichkeit, mit Web Audio selbst das zu bekommen, was ich brauche? Oder vielleicht eine andere, weniger komische Art?

+0

Wie stoppt der Benutzer den Ton? Haben Sie eine Schaltfläche, auf die geklickt wird? Wenn ja, wie Raymond Toy erwähnt, sollten Sie in der Lage sein, zwischen einem vom Benutzer initiierten "on-ended" -Ereignis und dem Zeitpunkt, zu dem das Lied tatsächlich fertig ist, zu entziffern. – tpdietz

+0

Ja, es gibt einen Button geklickt. Es scheint die beste Lösung zu sein, obwohl ich wirklich gehofft habe, dass es einen Weg gibt, WebAudio zu benutzen, um die Aufgabe zu lösen. – North

Antwort

1

Wenn jemand den Ton gestoppt hat, muss Ihr Programm das gewusst haben und den Ton gestoppt haben. Bevor Sie den Ton stoppen, entfernen Sie den onended Handler.

0

Alle Lösungen, die ich gefunden habe, hatten eine Art, einen Timer zu halten, ich glaube nicht, dass es einen Weg gibt, der sauberer ist.

Dies ist eine gute Lösung, die ich gefunden habe, verwenden Sie den Anschlag nicht, Code schreiben it.and zu pausieren, dann werden Sie den Auslöser

function stop() { 
    sourceNode.stop(0); 
    pausedAt = Date.now() - startedAt; 
    paused = true; 
}; 

[https://stackoverflow.com/a/18562855/3649914][1]

nicht aktivieren [ 1]: Code gefunden hier

Verwandte Themen