Uw toepassing wil mogelijk weten wanneer het afspelen van een geluid wordt gestopt, om met het afspelen van een ander geluid te kunnen beginnen, of om resources vrij te maken die tijdens de eerdere afspeelbewerking werden gebruikt. De klasse SoundChannel verzendt de gebeurtenis
Event.SOUND_COMPLETE
wanneer het afspelen van het corresponderende geluid is voltooid. Uw toepassing kan naar deze gebeurtenis luisteren en op basis daarvan actie ondernemen, zoals hieronder wordt weergegeven:
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("smallSound.mp3");
snd.load(req);
var channel:SoundChannel = snd.play();
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
}
De klasse SoundChannel verzendt tijdens het afspelen geen voortgangsgebeurtenissen. Om melding te kunnen maken van de voortgang van het afspelen, kunt u een eigen tijdsmechanisme voor uw toepassing opzetten en de positie van de geluidsafspeelkop bijhouden.
Als u wilt berekenen welk percentage van een geluid is afgespeeld, deelt u de waarde van de eigenschap
SoundChannel.position
door de lengte van de geluidsgegevens die worden afgespeeld:
var playbackPercent:uint = 100 * (channel.position / snd.length);
Met deze code worden echter alleen nauwkeurige afspeelpercentages gemeld als de geluidsgegevens volledig geladen waren voordat met afspelen werd begonnen. De eigenschap
Sound.length
geeft de grootte van de momenteel geladen geluidsgegevens aan, niet de uiteindelijke grootte van het hele geluidsbestand. Als u de voortgang wilt bijhouden van het afspelen van een streaming geluid dat nog steeds wordt afgespeeld, moet uw toepassing een schatting maken van de uiteindelijke grootte van het hele geluidsbestand en deze waarde in de berekeningen gebruiken. U kunt een schatting van de uiteindelijke lengte van de geluidsgegevens maken door als volgt gebruik te maken van de eigenschappen
bytesLoaded
en
bytesTotal
:
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
Met de volgende code wordt een groter geluidsbestand geladen en wordt de gebeurtenis
Event.ENTER_FRAME
gebruikt als tijdsmechanisme voor weergave van de voortgang van het afspelen. Het afspeelpercentage wordt periodiek gemeld; dit wordt berekend als de huidige positiewaarde gedeeld door de totale lengte van de geluidsgegevens:
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new
URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
snd.load(req);
var channel:SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
function onEnterFrame(event:Event):void
{
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint =
Math.round(100 * (channel.position / estimatedLength));
trace("Sound playback is " + playbackPercent + "% complete.");
}
function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
Nadat is gestart met het laden van de geluidsgegevens, roept deze code de methode
snd.play()
aan en wordt het resulterende object SoundChannel opgeslagen in de variabele
channel
. Vervolgens wordt er een gebeurtenislistener aan de hoofdtoepassing toegevoegd voor de gebeurtenis
Event.ENTER_FRAME
, en wordt een gebeurtenislistener aan het object SoundChannel toegevoegd voor de gebeurtenis
Event.SOUND_COMPLETE
, die optreedt zodra het afspelen is voltooid.
Steeds wanneer de toepassing een nieuw frame binnen de animatie bereikt, wordt de methode
onEnterFrame()
aangeroepen. De methode
onEnterFrame()
maakt een schatting van de totale lengte van het geluidsbestand op basis van de hoeveelheid gegevens die al zijn geladen, waarna wordt berekend en weergegeven welk percentage al is afgespeeld.
Wanneer het hele geluid is afgespeeld, wordt de methode
onPlaybackComplete()
uitgevoerd en wordt de gebeurtenislistener voor de gebeurtenis
Event.ENTER_FRAME
verwijderd, zodat er niet wordt geprobeerd om de voortgang van het afspelen te blijven bijwerken als het afspelen eenmaal is voltooid.
De gebeurtenis
Event.ENTER_FRAME
kan een groot aantal maal per seconde worden verzonden. In sommige gevallen zult u de voortgang van het afspelen niet zo vaak willen weergeven. In die gevallen kunt u een eigen tijdsmechanisme voor uw toepassing opzetten met behulp van de klasse flash.util.Timer; zie
Werken met datums en tijden
.