![]() |
Encadenar sonidos????
Saludos a todos... Como puedo reproducir dos sonidos (ficheros waw) de forma consecutiva, o sea, primero uno y cuando termine que reproduzca el otro. Lo he intentado con PlaySound pero el segundo es el unico que se oye...
Gracias por su tiempo y colaboracion... |
No dices como lo has intentado con PlaySound, así que voy a suponer que utilizaste el parámetro SND_ASYNC, por eso solo se escucha el segundo sonido. Prueba usando el parámetro SND_SYNC, de esta forma la función PlaySound no termina hasta que el sonido se ha reproducido. Es decir:
|
cierto es que el parametro usado es snd_async.. pero no puedo esperar a que snd_sync termine ya que esta funcion la tengo dentro de un cronometro que checa cosas y lanzaria esos sonidos
|
Pensándolo mejor podemos darle otra vuelta de tuerca al código. Estaría bien que el sonido se reproducirá de forma asíncrona al resto del programa, pero manteniendo el orden de reproducción. Así que vamos a utilizar un Thread que se ejecutara el paralelo con el resto de la aplicación, para ello vamos a definir una clase derivada de TThread a la que llamaremos TSound. Esta clase tendrá un método llamado Add que permitirá añadir archivos wav a la lista de reproducción. Por lo demás se comportara como un Thread normal, que podremos pausar y continuar. Vamos con un poco de código:
Para utilizarlo, tenemos que crearlo y añadirle archivos a la lista de reproducción. Algo así:
Como ves este código es sensiblemente mas complejo que el que puse en el mensaje anterior, puedes usar uno u otro dependiendo de las necesidades de tu aplicación. EDITO: Corregir un error con la propiedad FreeOnTerminate |
:D Caramba, parece que te leo el pensamiento
|
Parece que esto es lo que necesito.... lo pruebo y te confirmo... una cosa... todo el primer codigo descrito es para crear una unidad nueva del proyecto no?
|
Cita:
|
Lo he hecho haciendolo en una unidad y cuando llamo al procedimiento create me da error. lo he decladado asi:
unit UnidadSonidos; interface uses Classes,Windows; type TSound = class(TThread) private FList: TStringList; FMutex: THandle; protected procedure Execute; override; public constructor Create; destructor Destroy; override; procedure Add(Path: String); end; implementation { TSound } uses MMSystem; y a partir de aqui como tu me has indicado. En la prmera linea del CREATE me da el error de violacion???? |
Uso Delphi6 enterprise....(por si sirve de algo)
|
:confused: Exactamente ¿que error te da?
Por otra parte a mi me quedaría una unit mas o menos así:
Me compila y no me da error alguno. |
Tal y como acabas de describir tengo la unidad.. y errores de compilacion ninguno, pero cuando realizado la llamada al create me lanza el error ACCESS VIOLATION
|
Estas diciendo que te da un error al ejecutar esta sentencia:
Puede parecerte una tontería, pero ¿estas colocando la T delante de Sound? |
pues aunque parezca una TonTeria pues parece ser que no lo es .... vaya Tela con T de los ... menso mal que eres un maquina.... mi mas sinceras felicitaciones y muchisimas gracias.... si me das tu email podemos seguir en contacto para cuando me haga falta algo... gracias de nuevo por tu colaboracion
Un saludo. |
¿Hay alguna forma de que estos sonidos que se han añadido a la lista de reproduccion, se reproduzcan uno detras de otro en modo asincrono? Ya que asi, tengo que esperar a que acaben todas las canciones para poder seguir trabajando en la ventana en la que estoy, y me gustaria estar en mi ventana haciendo cosas mientras se va escuchando la lista de reproduccion.
Luego he tenido que poner el metodo Execute en la parte publica porque sino no puedo llamarlo desde otra Unit no? Gracias¡ |
Cita:
Si usas el código tal como lo pongo en el ejemplo no tendrás ningún problema. |
Vale, muchas gracias jeje. Me va bien, creia que para poner la lista en marcha habia que hacer el .execute pero lo hace directamente al añadir una canción y lo ejecuta de forma asincrona y puedo seguir trabajando en la ventana.
Ahora tengo otra pregunta: El caso es que tengo en un resource varias canciones de varios cds; pongo un cd en cada panel y segun elija el cd, me sale un panel u otro con las canciones de ese cd. Bien, por ejemplo en un panel tengo 14 canciones. y cada cancion tiene un boton asociado, es decir: Código:
procedure TV_Principal.Button1Click(Sender: TObject); Código:
procedure TV_Principal.Button5Click(Sender: TObject); Haber si puedes ayudarme, gracias¡ |
Hola de nuevo, he estado investigando, y me sale algun error:
Por ejemplo al ejecutar una cancion lo que quiero es lo que te he comentado en el comentario anterior, que me pare la lista de reproduccion que se estaba ejecutando (si es que se estaba ejecutando alguna), y que me ejecute la nueva lista relacionada con la cancion de ese boton, por ejemplo la lista que empieza por la cancion numero 5. ¿Como hago para que la lista que se estaba ejecutando, si es que habia alguna, se pare al cambiar de cancion (button), y luego me ejecute la lista de esa cancion? Hasta ahora lo que he hecho es declarar la lista arriba del todo, y que sea global para toda la unit principal que tengo, de modo que al ejecutar cualquier cancion, ace sus efectos en la misma lista. Ejemplo, las canciones numero 2 y 7: Código:
Gracias por la ayuda |
Alguien puede ayudarme cn sto?
|
La franja horaria es GMT +2. Ahora son las 13:28:16. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi