Comunidad de diseño web y desarrollo en internet online

Problemas con SOUND_COMPLETE

Citar            
MensajeEscrito el 18 Feb 2010 04:22 pm
Hola a todos!!!

Tengo un problema con una aplicación en la que tengo que controlar unos audios.
Tengo un boton Play y un boton Pausa.

Si no hago pausa, el evento SOUND_COMPLETE funciona a la perfecion…PERO…si hago pausa no me detecta el fin del audio.
Incluso la propiedad position del audio no me retorna el mismo dato al final del audio dependiendo si hago pausa o no. Es mas, cuanto mas pausas hago mas desfase hay

QUE HAGO MAL? ME TIENE LOCO!!!!

El codigo que estoy usando es este:

Código ActionScript :

var snd:Sound = new Sound();
var canal:SoundChannel = new SoundChannel();
var pausePos:int;
var estado:String = "play";

//listener de los botones
btPlay.addEventListener(MouseEvent.CLICK, playAudio);
btPausa.addEventListener(MouseEvent.CLICK, pausaAudio);

//cargo el audio
snd.load(new URLRequest("miAudio.mp3"));

//empezamos en play
canal = snd.play();

function playAudio(evento:MouseEvent):void {
                if (estado != "play") {
                               if (estado == "pausa") {
                                               canal = snd.play(pausePos);
                               } else {
                                               snd.play();
                               }
                               estado="play";
                }
}

function pausaAudio(evento:MouseEvent):void {
                if (estado == "play") {
                               canal.stop();
                               pausePos = canal.position;
                               estado = "pausa";
                }
}

//control del audio
canal.addEventListener(Event.SOUND_COMPLETE, onAcabaAudio);

function onAcabaAudio(evento:Event) {
                trace( "Acabo el audio")
}

this.addEventListener(Event.ENTER_FRAME, controlaAudio)
function controlaAudio(evento:Event):void {
                trace(canal.position)
}

stop();



Ni que decir tiene que es URGENTISIMO!!!
Gracias de antemano!!!

Por Manolito_BCN

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 18 Feb 2010 08:37 pm
Hola,
creo que así funcionará, y además se simplifica un poco tu código al no usar la variable estado:

Código ActionScript :

var snd:Sound = new Sound();
var canal:SoundChannel = new SoundChannel();
var pausePos:Number = 0;

//listener de los botones 
btPlay.addEventListener(MouseEvent.CLICK, playAudio);
btPausa.addEventListener(MouseEvent.CLICK, pausaAudio);

//cargo el audio 
snd.load(new URLRequest("miAudio.mp3"));

//empezamos en play 
canal = snd.play();

function playAudio(evento:MouseEvent):void
{
   canal = snd.play(pausePos);
}

function pausaAudio(evento:MouseEvent):void
{
   canal.stop();
   pausePos = canal.position;
}

//control del audio 
canal.addEventListener(Event.SOUND_COMPLETE, onAcabaAudio);

function onAcabaAudio(evento:Event)
{
   trace( "Acabo el audio");
}

this.addEventListener(Event.ENTER_FRAME, controlaAudio);
function controlaAudio(evento:Event):void
{
   trace(canal.position);
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 18 Feb 2010 09:29 pm
Gracias por la respuesta pero si no controlas el estado no haces pausa si no stop :(

Por Manolito_BCN

25 de clabLevel



 

msie7
Citar            
MensajeEscrito el 18 Feb 2010 11:57 pm
Es verdad, no me había fijado en lo que pasa si pulsas varias veces a play xD.
Me parece que el problema va a ser que al hacer canal = snd.play(pausePos); dentro de playAudio cada vez se crea un canal diferente y por eso se pierden los eventos asignados. Una solución sería volver a crear ese evento SOUND_COMPLETE cada vez que se pulse play (y eliminarlo al pulsar pausa). Sería algo como esto (en lugar de usar la variable "estado" uso un Boolean, pero por lo demás es igual que tu código):

Código ActionScript :

var snd:Sound = new Sound();
var canal:SoundChannel = new SoundChannel();
var pausePos:int = 0;
var playing:Boolean = true;

//listener de los botones 
btPlay.addEventListener(MouseEvent.CLICK, playAudio);
btPausa.addEventListener(MouseEvent.CLICK, pausaAudio);

//cargo el audio 
snd.load(new URLRequest("miAudio.mp3"));

//empezamos en play 
canal = snd.play();

function playAudio(evento:MouseEvent):void
{
   if (playing) return;
   canal = snd.play(pausePos);
   canal.addEventListener(Event.SOUND_COMPLETE, onAcabaAudio);
   playing = true;
}

function pausaAudio(evento:MouseEvent):void
{
   if (!playing) return;
   canal.removeEventListener(Event.SOUND_COMPLETE, onAcabaAudio);
   canal.stop();
   pausePos = canal.position;
   playing = false;
}

//control del audio 
canal.addEventListener(Event.SOUND_COMPLETE, onAcabaAudio);

function onAcabaAudio(evento:Event)
{
   trace( "Acabo el audio");
}

this.addEventListener(Event.ENTER_FRAME, controlaAudio);
function controlaAudio(evento:Event):void
{
   trace(canal.position);
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 19 Feb 2010 12:23 pm
Efectivamente Isidoro, ese era el problema!!! Muchisimas gracias!!!!! Me has salvado te debo una!!

Finalmente me he hecho un clase para controlar el proceso:

Código ActionScript :

package {

   import flash.display.Sprite;
   import flash.media.Sound;
   import flash.media.SoundChannel;
   import flash.events.Event;
   import flash.events.MouseEvent;
   import flash.net.URLRequest;
   

   public class PlayPause extends Sprite {

      private var sonido:Sound;
      private var canal:SoundChannel;
      private var sonando:Boolean = false;
      private var posicion:int;

      public function PlayPause(){
         //crear el sonido y iniciarlo
         sonido = new Sound(new URLRequest("MiAudio.mp3"));
         canal = sonido.play();
         sonando = true;
         canal.addEventListener(Event.SOUND_COMPLETE, controlAudio);
      }

      public function onPlayPause(evento:MouseEvent):void {         
         //si se reproduce pararlo y guardar posicion
         if (sonando) {
            posicion = canal.position;
            canal.stop();
            sonando = false
            evento.target.gotoAndPlay("off")
            canal.removeEventListener(Event.SOUND_COMPLETE, controlAudio);
         } else {
            //si no se reproduce reiniciarlo en la posicion guardada
            canal = sonido.play(posicion);
            sonando = true
            evento.target.gotoAndPlay("on")
            canal.addEventListener(Event.SOUND_COMPLETE, controlAudio);
         }
      }
      
      public function controlAudio(evento:Event):void{
         trace("fin audio")
         
      }   
      
   }
}


Despues en el escenario tengo un mc con nombre de instancia btPlayPause que tiene dos frames "on" y "off" y le paso el metodo onPlayPause de la sigueinte manera:

Código ActionScript :

var audio:PlayPause = new PlayPause
btPlayPause.addEventListener(MouseEvent.CLICK, audio.onPlayPause)



De nuevo GRACIAS

Por Manolito_BCN

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 19 Feb 2010 11:43 pm
Me alegro de que funcione, y buena idea eso de gestionarlo con una clase. Sólo un detalle: Si no vas a gestionar el MovieClip del botón play-pause con tu clase, no hace falta que extienda a Sprite (aunque también puedes hacer que la clase lo gestione todo).

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.