Talvolta è necessario che l'applicazione sappia quando si interrompe la riproduzione di un suono per poter avviare la riproduzione di un altro suono o per eliminare le risorse utilizzate durante la riproduzione precedente. La classe SoundChannel invia un evento
Event.SOUND_COMPLETE
quando termina la riproduzione del relativo audio. L'applicazione può intercettare questo evento ed eseguire le operazioni appropriate, come mostrato di seguito:
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.");
}
La classe SoundChannel non invia eventi progress durante la riproduzione. Per generare un rapporto sull'avanzamento della riproduzione, l'applicazione può impostare un proprio meccanismo di gestione temporale e tenere traccia della posizione dell'indicatore di riproduzione dell'audio.
Per calcolare la percentuale di audio che è stata riprodotta, potete dividere il valore della proprietà
SoundChannel.position
per la lunghezza dei dati audio in corso di riproduzione:
var playbackPercent:uint = 100 * (channel.position / snd.length);
Tuttavia, questo codice riporta delle percentuali di riproduzione accurate solo se i dati audio sono stati interamente caricati prima dell'inizio della riproduzione. La proprietà
Sound.length
mostra le dimensioni dei dati audio in corso di caricamento, non le dimensioni finali dell'intero file audio. Per tenere traccia dell'avanzamento della riproduzione di un file audio in streaming che è ancora in fase di caricamento, l'applicazione deve stimare le dimensioni finali dell'intero file audio e utilizzare tale valore nei calcoli. Potete stimare la lunghezza finale dei dati audio mediante le proprietà
bytesLoaded
e
bytesTotal
dell'oggetto Sound, come indicato di seguito:
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
Il codice seguente carica un file audio di dimensioni maggiori e utilizza l'evento
Event.ENTER_FRAME
come meccanismo di gestione temporale per la visualizzazione dell'avanzamento della riproduzione. Genera un report periodico della percentuale di riproduzione, che viene calcolata dividendo il valore della posizione corrente per la lunghezza totale del file audio:
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);
}
Una volta avviato il caricamento dei dati audio, questo codice chiama il metodo
snd.play()
e memorizza l'oggetto SoundChannel risultante nella variabile
channel
. Quindi, aggiunge un listener di eventi all'applicazione principale per l'evento
Event.ENTER_FRAME
e un altro listener di eventi all'oggetto SoundChannel per l'evento
Event.SOUND_COMPLETE
che si verifica quando la riproduzione è completata.
Ogni volta che l'applicazione raggiunge un nuovo fotogramma della propria animazione, viene chiamato il metodo
onEnterFrame()
. Il metodo
onEnterFrame()
stima la lunghezza totale del file audio in base alla quantità di dati che sono già stati caricati, quindi calcola e visualizza la percentuale di riproduzione corrente.
Quando è stato riprodotto l'intero file audio, viene eseguito il metodo
onPlaybackComplete()
e viene rimosso il listener di eventi per l'evento
Event.ENTER_FRAME
in modo che non tenti di visualizzare gli aggiornamenti sull'avanzamento dopo che la riproduzione è terminata.
L'evento
Event.ENTER_FRAME
può essere inviato molte volte al secondo. In determinate circostanze, non è necessario visualizzare l'avanzamento della riproduzione con tale frequenza. In questo caso, l'applicazione può impostare il proprio meccanismo di gestione temporale mediante la classe flash.util.Timer (vedete
Operazioni con data e ora
).