Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





ayuda crear efecto disparo con audiere

Iniciado por hongo, 24 de Febrero de 2008, 04:23:07 PM

« anterior - próximo »

hongo

He dado vuelta google buscando alguna forma para hacer mediante audiere el tipico sonido de disparo en un juego tipo quake.

Y el problema es el siguiente, al cargar el sonido y poner ->play(), si el sonido se esta ejecutando, no hace nada. Entonces al disparar varias veces, solo la primera "bala" sale con sonido y las demas no. Hasta que termina de ejecutarse el sonido y ahi vuelve a sonar (pero ya pasaron 5 balas sin sonido).

Yo sé que se pude hacer, pero aún no logro programarlo.

si me echan una manito seria de gran ayuda.

Gracias!!

tamat

para eso se suelen usar los canales, destinas varios canales y vas lanzando cada sonido por un canal separado, la otra solucion es parar el sonido y volverlo a lanzar
Por un stratos menos tenso

[EX3]

Yo en dx_lib32 implemente un buffer de n canales (concretamente buffers de sonidos) que podias asginar manualmente o que la libreria asignara el primero que estuviera libre para poder reproducir multiples sonidos. No es muy complicado implementar esto, simplemente hacerte una lista de n canales y al asignar canal de forma automatica comprobar si esta o no en reproduccion (para dx_lib32 un canal en stop es automaticamente un canal libre).

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

hongo

Se agradece un monton, aunque creo que alguna vez lo pude implementar pero declarando las variables como sample o midi, eso no lo recuerdo.

El problema es que lo hice hace mucho tiempo y los fuentes se perdieron  :?

Lo de los canales me serviria, pero creo que no es la forma mas optima, ya que tendrias que abrir varios canales que no siempre se van a usar. Ademas de tener que llevar un control, tipo arreglo que me parece ocuparia mas tiempo además.

Gracias!

Saludos!

Zaelsius

Lo mejor es que te busques otra librería de sonido que gestione los canales por tí para este tipo de casos.

hongo

Estuve tratando de usar openAL, pero me encontraba con uno y otro problema y al final termino desanimandome.

Que libreria me recomiendan?, yo usé audiere porque es simple y facil de usar, que es lo que necesito actualmente.

[EX3]

Cita de: "hongo"Lo de los canales me serviria, pero creo que no es la forma mas optima, ya que tendrias que abrir varios canales que no siempre se van a usar. Ademas de tener que llevar un control, tipo arreglo que me parece ocuparia mas tiempo además.
No soy experto en audio pero que yo sepa los canales se usan justamente para eso, para mezclar diferentes secuencias de audio de forma simultanea.

La idea no es crear tantos canales como sonidos o replicas de un sonido quieres reproducir. Yo ultilizo una lista de 16 a 64 bufferes (buferes secundarios de DirectSound que simulan o hacen las veces de canales) segun demanda del programador al inicializar la clase de audio. Luego la gestion no es muy complicada como parace. Yo suelo tener un evento que se ejecuta en otro hilo, mediante un timer del sistema, cada milisegundo recorriendo la lista y asignando el estado a cada canal, si esta en reproduccion o se ha detenido, en cuyo caso el canal pasa a estar libre. El seleccionar automaticamente en que canal se debe reproducir lo solucione con una simple llamada que recorra la lista hasta toparse con el primer canal libre. Tambien lo podrias solucionar teniendo una variable que almacene la referencia o indice en la lista del ultimo canal libre. A mi al menos este sistema no me ha dado problemas nunca y funciona genial con tan solo 64 canales.

Sobre lo de buscar una libreria que gestione los canales, Fmod que yo recuerde tiene su propio sistema de canales y te ahorraria el paso de vigilar que canales estan o no en reproduccion. Despues, para asignar un canal libre, mediante una simple llamdada puedes obtener el indice del primer canal libre que encuentre la libreria.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

synchrnzr

CitarLo de los canales me serviria, pero creo que no es la forma mas optima, ya que tendrias que abrir varios canales que no siempre se van a usar. Ademas de tener que llevar un control, tipo arreglo que me parece ocuparia mas tiempo además.

Te preocupa mucho la eficiencia. Un canal que no se usa, no gasta CPU, así que ya puedes tener 10000 canales abiertos que si no suena nada... En todo caso te ocupará un poco de memoria. El control si no lo llevas tú es porque lo lleva el motor; control lo tendrá que haber siempre, y el overhead será el mismo, pero es un overhead despreciable.

Es cierto que tanto Audiere como OpenAL son de un nivel bastante bajo y te obligan a controlar estos temas. Hasta DirectSound a pelo ya tiene un interface de más alto nivel para algunas cosas (aunque tampoco gestiona canales) Si quieres una librería de más alto nivel, entonces ya te tienes que ir a las de pago, como dice EX3; BASS, FMOD, etc... aunque las licencias para pequeños proyectos suelen ser bastante asequibles. Es el precio por ahorrarte unas cuántas líneas de código :)

sync

hongo

Gracias maestros, me queda claro.

Voy a ver como manejo el tema de los canales en Audiere, y de paso ver que tal funka DirectSound.

Se agradece!

hongo

Llegando a la casa llego a probar algo como esto, para llenar el arreglo

for(int i=0;i<10;i++)
{
 disparo=OpenSound(sistemaSonido, "fire.wav", false);
}


y luego para ejecutarlo

for(int i=0;i<10;i++)
{
 if(!disparo->isPlaying)
   disparo->play();
}

que les parece??

Lord Destiny

a mi me gustaba mas hacer esto:

disparo=OpenSound(sitemaSonido, "fire.wav", false);

.....

if(!disparo->isPlaying){
  disparo->play();
}else{
 disparo->stop();
 disparo->play();
}

seria algo asi (no se que librerias, clases, etc.. usas), lo bueno de esto es que te ahorras usar mas de un canal, lo "malo" esque el sonido de los disparos no se superpone (depende del tipo de sonido queda mejor que superponiendolos o no)

hongo

Sirve, pero el sonido se cortaria.... en caso de por ejemplo, querer lanzar varias granadas o misiles a la vez, son sonidos largos. Y la idea es que se escuchen completamente y no que se corten.

Tei

Cita de: "hongo"Sirve, pero el sonido se cortaria.... en caso de por ejemplo, querer lanzar varias granadas o misiles a la vez, son sonidos largos. Y la idea es que se escuchen completamente y no que se corten.

Me vais a permitir meter la pata.

No se del tema que estais hablando, pero habeis descrito un sistema de "pool" del que se toman recursos no ocupados. Y eso si sabria programarlo. Os lo pongo en pseudocodigo.



function getCanalLibre(canal,  sonidoImportante=false){

//Busca uno libre (que no tiene sonidos produciendose)
 for(t=0;t<MAX_CANALES;t++){
  if ( !esOcupado(t)) return t;
}
 
 if (!sonidoImportante)
      return 0; //no hay canales libres, no emitas ese sonido

//...todos ocupados...

 //Busca el canal que este apunto de terminar de reproducir un sonido
 tiempoacabar = 9999999;
designadoMatar = -1;

 for(t=0;t<MAX_CANALES;t++){
    if ( k=getTiempoTerminarReproduccionCanal(t) < tiempoacabar)  {
        designadoMatar = t;
        tiempoacabar = k;
   }
 }

 //consumiremos este
 return designadoMatar;

}


Aqui ademas de buscar el primero libre, si estan todos libres se "come" el canal que este apunto de dejar de reproducir un sonido.  Ademas, le pasas como parametro si el sonido es realmente importante. Para que si hay saturacion, sonidos poco utiles (como pasos) no se coman a otros mas importantes (como disparos).

Ignorar este mensaje si resulta OT.

hongo

Interesante aplicación Tei, ni se me habia ocurrido.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.