O aplicativo talvez queira saber quando a reprodução de um som é interrompida para que possa iniciar a reprodução de outro som ou limpar alguns recursos usados durante a reprodução anterior. A classe SoundChannel despacha um evento
Event.SOUND_COMPLETE
quando a reprodução do som é concluída. O aplicativo pode ouvir esse evento e tomar a ação apropriada, conforme mostrado a seguir:
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.");
}
A classe SoundChannel não despacha eventos de progresso durante a reprodução. Para relatar o progresso da reprodução, o aplicativo pode configurar seu próprio mecanismo de controle de tempo e rastrear a posição do indicador de reprodução do som.
Para calcular qual porcentagem de um som foi reproduzida, é possível dividir o valor da propriedade
SoundChannel.position
pelo comprimento dos dados do som que está sendo reproduzido:
var playbackPercent:uint = 100 * (channel.position / snd.length);
No entanto esse código relatará porcentagens exatas da reprodução apenas se os dados do som foram carregados completamente antes do início da reprodução. A propriedade
Sound.length
mostra o tamanho dos dados do som que estão sendo carregados no momento, não o tamanho eventual do arquivo de som inteiro. Para rastrear o progresso da reprodução de um fluxo de som que ainda está sendo carregado, o aplicativo deve estimar o tamanho eventual do arquivo de som inteiro e usar esse valor em seus cálculos. É possível estimar o comprimento eventual dos dados do som usando as propriedades
bytesLoaded
e
bytesTotal
do objeto Sound, da seguinte maneira:
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
O código a seguir carrega um arquivo de som maior e usa o evento
Event.ENTER_FRAME
como seu mecanismo de controle de tempo para mostrar o progresso da reprodução. Ele relata periodicamente a porcentagem de reprodução que é calculada como o valor da posição inicial dividido pelo comprimento total dos dados do som:
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);
}
Após o início do carregamento dos dados do som, esse código chama o método
snd.play()
e armazena o objeto SoundChannel resultante na variável
channel
. Em seguida, ele adiciona um ouvinte de eventos ao aplicativo principal para o evento
Event.ENTER_FRAME
e outro ouvinte de eventos ao objeto SoundChannel para o evento
Event.SOUND_COMPLETE
que ocorre quando a reprodução é concluída.
A cada vez que o aplicativo atinge um novo quadro em sua animação, o método
onEnterFrame()
é chamado. O método
onEnterFrame()
estima o comprimento total do arquivo de som com base na quantidade de dados que já foi carregada e, em seguida, calcula e exibe a porcentagem de reprodução atual.
Quando todo o som foi reproduzido, o método
onPlaybackComplete()
é executado, removendo o ouvinte do evento
Event.ENTER_FRAME
de forma que ele não tente exibir atualizações do progresso após a conclusão da reprodução.
O evento
Event.ENTER_FRAME
pode ser despachado muitas vezes por segundo. Em alguns casos, não é conveniente exibir o progresso da reprodução com tanta frequência. Nesses casos, o aplicativo pode configurar seu próprio mecanismo de controle do tempo usando a classe flash.util.Timer. Consulte
Trabalho com datas e horas
.