Comunidad de diseño web y desarrollo en internet online

Reproducir lista de audio con ComboBox

Citar            
MensajeEscrito el 17 May 2014 12:47 pm
Hola, estoy intentando que, mediante un ComboBox, cada vez que seleccione un mp3 este se ponga en marcha y que además, si ya está sonando alguno, este se detenga antes de poner en marcha el siguiente.
La primera parte ya esta hecha, que es el código que hay a continuación, pero no soy capaz de evitar que se solapen los audios, no soy capaz de detenerlo antes de reproducir el siguiente.
He probado con audio.close() y con canal.stop() entre otras muchas cosas, pero creo que me estoy ofuscando y tengo la sensación de que se me escapa algo muy sencillo.

Así que si me podeis echar una mano, estaría muy agradecido:

Código ActionScript :

import fl.controls.ComboBox;
import fl.data.DataProvider;
import flash.net.URLRequest;
import flash.events.Event;
import flash.media.SoundChannel;
import flash.events.MouseEvent;

//Crear lista del ComboBox

var canciones:Array = new Array( 
{label:"Seleccione MP3", data:""}, 
{label:"audio1", data:"audio1.mp3"}, 
{label:"audio2", data:"audio2.mp3"}, 
{label:"audio3", data:"audio3.mp3"} 
);

var listaMP3:ComboBox = new ComboBox();
listaMP3.width = 150;
listaMP3.dataProvider = new DataProvider(canciones);
listaMP3.addEventListener(Event.CHANGE, actualizar);

addChild(listaMP3);


var audio:Sound = new Sound();
var ruta:URLRequest= new URLRequest();
var canal:SoundChannel = new SoundChannel();

function actualizar(event:Event):void
{
   ruta.url = ComboBox(event.target).selectedItem.data;
   audio.load(ruta);
   canal = audio.play();
}

Por radikal_tribe

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 May 2014 12:15 pm
canal.stop() y audio.close() est[an bien, luego deberías hacer el load pero agregar una precarga antes de hacer el play. La precarga de sonido es muy parecida a la de cualquier loader, agregas un callback al evento complete, ejemplo

Código ActionScript :

var s:Sound = new Sound(); 
s.addEventListener(Event.COMPLETE, onSoundLoaded); 
var req:URLRequest = new URLRequest("bigSound.mp3"); 
s.load(req); 
 
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 May 2014 02:19 pm
Hola solisar, antes de nada, gracias por tu respuesta, aunque no me soluciona el problema, quizás por que no he terminado de formular bien la pregunta o porque no he entendido bien tu respuesta.
Lo que me gustaría conseguir es detener el audio que está sonando cada vez que selecciono uno nuevo del ComboBox. ¿donde y como sitúo el canal.stop() o el audio.close() para que tengan efecto?

Seleccionar del ComboBox > parar antiguo > reproducir nuevo

Si puedes ayudarme te lo agradecería.

Un saludo, y de nuevo, gracias

PD: Ah! Te aviso de que no soy programador :oops: .

Por radikal_tribe

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 May 2014 03:48 pm
Ah, ok, copy/paste mode, prueba asi

Código ActionScript :

var audio:Sound = new Sound();
var ruta:URLRequest= new URLRequest();
var canal:SoundChannel = new SoundChannel();

function actualizar(event:Event):void
{
   ruta.url = ComboBox(event.target).selectedItem.data;
   //detendo primero
   canal.stop();
   //cargo luego
   audio.load(ruta);
   audio.addEventListener(Event.COMPLETE, onSoundLoaded); 
}
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    localSound.play(); 
}

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 May 2014 06:10 pm
Hola solisarg, gracias otra vez por tu ayuda pero lamento decirte nuevamente que tu propuesta no ha resultado. He hecho un copy/paste de las modificaciones de la función actualizar y añadiendo la función onSoundLoaded como has puesto, pero nada.

He creado una solución haciendo mi propio ComboBox/menú desplegable con clips de película y utilizando los eventos de Mouse para controlar la reproducción de los audios (con MOUSE_DOWN y MOUSE_UP).

De esta manera es fácil cargarlos y descargarlos para controlarlos como si fuese un reproductor normalito de mp3, pero no se como trasladar eso al complemento de ComboBox.

Si pongo el audio.close() o el canal.stop() en la función actualizar, siempre me da el error #2037, da igual a la altura que lo ponga. :roll:

Si se te ocurre algo más, por favor, compártelo conmigo.

Un saludo!! Y gracias!! :)

Por radikal_tribe

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 May 2014 08:18 pm
Y que dice el error #2037?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 20 May 2014 01:24 am
Al codigo de Jorge se le olvido asignar canal al objeto sound....

Código ActionScript :

var audio:Sound = new Sound();
var ruta:URLRequest= new URLRequest();
var canal:SoundChannel ; /// = new SoundChannel(); no se instancia

function actualizar(event:Event):void
{
   ruta.url = ComboBox(event.target).selectedItem.data;
   //detendo primero, si es q ya estamos reproduciendo uno, sino canal = null.
  if( canal ) canal.stop();
   //cargo luego
   audio.load(ruta);
   audio.addEventListener(Event.COMPLETE, onSoundLoaded); 
}
function onSoundLoaded(event:Event):void 
{ 
    var localSound:Sound = event.target as Sound; 
    canal = localSound.play();  // no se instancia new SoundChannel()... la instancia sale del objeto sound.
}

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 20 May 2014 04:11 pm
Hola a ti también Rodrigo y hola de nuevo solisarg

Rodrigo, he probado tu propuesta y tampoco soy capaz de hacer que esto se ponga en marcha. Me devuelve el siguiente error.

Error: Error #2037: Se llamó a las funciones en una secuencia incorrecta o la llamada anterior no se produjo correctamente.
at flash.media::Sound/_load()
at flash.media::Sound/load()
at AudioComboBox_fla::MainTimeline/actualizar()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at fl.controls::ComboBox/onListChange()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at fl.controls::SelectableList/handleCellRendererClick()


El código final que he insertado es el siguiente, por si lo queréis probar

Código ActionScript :

import fl.controls.ComboBox;
import fl.data.DataProvider;
import flash.net.URLRequest;
import flash.events.Event;
import flash.media.SoundChannel;
import flash.events.MouseEvent;

//Crear lista del ComboBox

var canciones:Array = new Array( 
{label:"Seleccione MP3", data:""}, 
{label:"audio1", data:"audio1.mp3"}, 
{label:"audio2", data:"audio2.mp3"}, 
{label:"audio3", data:"audio3.mp3"} 
);

var listaMP3:ComboBox = new ComboBox();
listaMP3.width = 200;
listaMP3.dataProvider = new DataProvider(canciones);
listaMP3.addEventListener(Event.CHANGE, actualizar);

addChild(listaMP3);

//Creación de elementos de audio

var audio:Sound = new Sound();
var ruta:URLRequest= new URLRequest();
var canal:SoundChannel;

//Funciones del ComboBox

function actualizar(event:Event):void
{
   ruta.url = ComboBox(event.target).selectedItem.data;
   if (canal)
   {
      canal.stop();
   }
   audio.load(ruta);
   audio.addEventListener(Event.COMPLETE, onSoundLoaded);
}
function onSoundLoaded(event:Event):void
{
   var localSound:Sound = event.target as Sound;
   canal = localSound.play();
}


Un saludo y gracias por vuestros aportes :)

Por radikal_tribe

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 20 May 2014 07:08 pm
Ya me acuerdo de este problema, no se puede reutilizar el sonido, hay que crear uno nuevo cada vez, algo asi

Código ActionScript :

var audio:Sound;

function actualizar(event:Event):void
{
   ruta.url = ComboBox(event.target).selectedItem.data;
   if (canal)
   {
      canal.stop();
   }
   audio = new Sound();
   audio.load(ruta);
   audio.addEventListener(Event.COMPLETE, onSoundLoaded);
}
function onSoundLoaded(event:Event):void
{
   var localSound:Sound = event.target as Sound;
   canal = localSound.play();
}


Yo siempre pensé que se podía reutilizar, pero luego de este hilo con edavio http://foros.cristalab.com/cargar-audio-mp3-para-reproducir-t112101/ descubrí que no :)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 20 May 2014 08:35 pm
PERFECTO!!! ^^

Muchas gracias Jorge (solisarg), eres un fenómeno :cool: , ese era el problema.
Pongo el código completo por si a alguien le puede resultar útil.

Un saludo y gracias también a rodrigo, por colaborar :) . Ahora a celebrarlo :beer: :beer:

ComboBox que selecciona y reproducte una lista de archivos de audio:

Código ActionScript :

import fl.controls.ComboBox;
import fl.data.DataProvider;
import flash.net.URLRequest;
import flash.events.Event;
import flash.media.SoundChannel;
import flash.events.MouseEvent;

//Crear lista del ComboBox

var canciones:Array = new Array(
 
{label:"audio1", data:"audio1.mp3"}, 
{label:"audio2", data:"audio2.mp3"}, 
{label:"audio3", data:"audio3.mp3"} 
);

var listaMP3:ComboBox = new ComboBox();
listaMP3.dropdownWidth = 210;
listaMP3.width = 200;
listaMP3.move(5, 5);
listaMP3.dataProvider = new DataProvider(canciones);
listaMP3.addEventListener(Event.CHANGE, actualizar);

addChild(listaMP3);

var audio:Sound = new Sound();
var ruta:URLRequest = new URLRequest("audio1.mp3");
var canal:SoundChannel;
audio.load(ruta);
canal = audio.play();

function actualizar(event:Event):void
{
   ruta.url = ComboBox(event.target).selectedItem.data;
   if (canal)
   {
      canal.stop();
   }
   audio = new Sound();
   audio.load(ruta);
   audio.addEventListener(Event.COMPLETE, siAudioCargado);
}
function siAudioCargado(event:Event):void
{
   var audioCargado:Sound = event.target as Sound;
   canal = audioCargado.play();
}



Le he añadido la opción de reproducir un audio al abrir el archivo de manera automática.

Saludos, y de nuevo, gracias!!!

Por radikal_tribe

5 de clabLevel



 

chrome

 

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