Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Reproducción De Buffers Simultaneos Con Directsoun

Iniciado por Barbarian, 27 de Diciembre de 2005, 10:17:10 AM

« anterior - próximo »

Barbarian

 Hola, soy nuevo en estos foros y también en esto de la programación de videojuegos. Tengo un problema, a ver si alguien puede ayudarme:

Tengo dos sonidos pequeños almacenados en dos buffers estáticos de directsound y quiero reproducirlos exactamente en el mismo instante de tiempo. Mi problema es que entre las dos llamadas sucesivas:
lpBufferSonido1->play(0,0,0)
lpBufferSonido2->play(0,0,0)

pasa un pequeño instante de tiempo que hace que ya no suenen simultáneamente.

Mi pregunta es: ¿Hay alguna forma de conseguir el sonido simultáneo, o debo utilizar un buffer canalizado y copiar en él ambos sonidos utilizando convenientemente la posición de escritura?

Muchas gracias

Pogacha

 La verdad es que no creo que haya una demora demasiado importante entre llamadas ... lo mas probable es que ponga en cola los sonidos y las cargue al buffer primario desde una interrupcion ( al menos así era en las viejas SB ) con el nuevo hardware de aceleración la verdad es que no se como será.
Lo que te recomiendo es que primero te cerciores de que en realidad estan sonado diferido, despues has la prueba de unir ambos buffers en un tercero, y como tercera puedes desplazar la posicion inicial de la segunda muestra para que alcanze a la primera.
Para mi lo mas probable es que no halla diferencia temporal entre llamadas:
Sampleo 44K, buffer primario de 4K vs ordenador de 1ghz -> podes llenar el buffer 10 veces por cada sample como minimo.

Saludos.

marcode

 Prueba a reiniciar la posición inmediatamente después.


lpBufferSonido1->play(0,0,0)
lpBufferSonido2->play(0,0,0)

lpBufferSonido1->SetCurrentPosition(0);
lpBufferSonido2->SetCurrentPosition(0);

size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

zupervaca

 Aunque suene extraño yo en el dibMotor uso DirectMusic para evitar ese problema, no pasa en todos los ordenadores (en el portátil viejo que tengo pasaba, pero en el que tengo ahora no), DirectMusic te permite reproducir sonido 3D además de que te da soporte para varios tipos de archivos, osease, te soluciona la vida en Windows.

Barbarian

 Gracias a todos por vuestras respuestas, veamos...

Pochaga: Mi equipo es algo antiguo (un K6-2 a 500 Mhz) y efectivamente, noto un pequeño retardo entre ambas llamadas. Cuando me dices que "una los dos buffers en un tercero", ¿te refieres a crear un nuevo buffer, mezclar en él los dos sonidos y reproducir el nuevo buffer? no lo había pensado, pero mi idea era intentar reproducir directamente los buffers que ya tenía, sin tener que crear otro. Más que nada porque pueden sonar varios sonidos, diferentes, que se determinan durante el juego, no durante la fase de carga, y creo que esa operación puede ser lenta ¿no?

Marcode: Desgraciadamente lo he probado y no me ha funcionado.

Zupervaca: ¿Es posible con DirectMusic sincronizar el momento en el que deben sonar dos sonidos, por ejemplo PCM? No se nada de directmusic. En cierta ocasión escuché un comentario de que era tan difícil como Direct3D. ¿Es cierto?

zupervaca

 Lamentablemente la parte mas complicada de DirectMusic es que para hacer las cosas debes de crear unas cuantas instancias lo que conlleva empollarse un API bastante gordo, pero cuando mas o menos entiendes su metodología lo ves hasta bien ya que es muy flexible, si no quieres liarte mucho te recomiendo seguir con DirectSound ya que es la programación a mas bajo nivel que existe, en DirectX claro.

marcode

 Si no lo haces ya así, prueba a crearlos con el flag DSBPLAY_LOCHARDWARE, para asegurarte de que se crean por hardware.

También que no tenga el flag DSBCAPS_LOCDEFER si es un buffer estático.

Otra prueba, fijar el nivel cooperativo con DSSCL_PRIORITY.

Otra más, con GetCurrentPosition comprobar que han empezado a reproducirse los dos para sincronizarlos con SetCurrentPosition. Aunque es mejor usar notificaciones para que avisen al llegar a un punto, pero es más coñazo el aprender a hacerlo.

size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

[EX3]

 
Cita de: "zupervaca"DirectMusic te permite reproducir sonido 3D además de que te da soporte para varios tipos de archivos, osease, te soluciona la vida en Windows.
Una pregunta, que formatos soporta nativamente DirectMusic por que hasta hace un par de años que me mire documentacion, ejemplos y demas solo vi que podia reproducir MIDI y similares, pero nada de archivos de Ondas. Primera noticia que tengo al respecto y la verdad que me interesaria siempre y cuando no precise codecs como me ocurre con DirectShow, que lo utilizo para la reproduccion de MP3 y OGG con un codec externo.

Salu2...

P.D.: Trabajo con DirectX8, lo digo por si ha habido alguna diferencia abismal en la version 9 que no me haya enterado :ph34r:  
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

zupervaca

 He estado mirando como habia hecho la reproduccion de musica en el dibMotor y en esta parte uso DirectShow, para la parte que uso DirectMusic es para la de efectos especiales que es con archivos WAV, no obstante me parece que habia escogido DirectMusic por que daba un soporte estandar de lectura de archivo WAV aunque no estoy seguro.

[EX3]

 
Cita de: "zupervaca"me parece que habia escogido DirectMusic por que daba un soporte estandar de lectura de archivo WAV aunque no estoy seguro.
Ayer me estuve recorriendo toda la documentacion de DirectMusic de DirectX 8.1 y tampoco vi nada referente a lectura de WAV, es mas, el ejemplo que tengo sobre DirectMusic me rechaza cualquier formato que no sea MIDI o sus formatos nativos. Seguramente estes usando DirectSound, que es el unico que trabaja unica y exclusivamente con WAV, al menos lo deduzco por lo del uso de efectos especiales que este incorpora.

Y ahora que ha salido el tema, como afecta en rendimiento el uso de los efectos especiales con DirectSound? Tira de soft o de hard? Merece la pena implementarlos o es prefereible tener copias de los sonidos con el efecto ya aplicado para evitar perdida de velocidad?

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

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

Pogacha

Cita de: "[EX3"] Merece la pena implementarlos o es prefereible tener copias de los sonidos con el efecto ya aplicado para evitar perdida de velocidad?
Me parece una pregunta capseosa, verdad?
Lo mas probable es que los efectos tiren de soft, puede que un juego tal como el reverb o el hall si lo hagan  pero seguramente dependerá de las posibilidades del hardware y no creo que las placas genericas tengan tales capacidades ...
Saludos

synchrnzr

 
CitarAyer me estuve recorriendo toda la documentacion de DirectMusic de DirectX 8.1 y tampoco vi nada referente a lectura de WAV, es mas, el ejemplo que tengo sobre DirectMusic me rechaza cualquier formato que no sea MIDI o sus formatos nativos. Seguramente estes usando DirectSound, que es el unico que trabaja unica y exclusivamente con WAV, al menos lo deduzco por lo del uso de efectos especiales que este incorpora.

WAV sobre DirectMusic no me suena nada, lo que sí estará soportado es en DirectAudio. Pero yo utilizaría DirectSound. Respecto a la lectura de WAVs, hay alguna clase CWaveFile (o algo así) con los ejemplos del SDK que la puedes usar libremente en tu código y te irá la mar de bien.

CitarY ahora que ha salido el tema, como afecta en rendimiento el uso de los efectos especiales con DirectSound? Tira de soft o de hard? Merece la pena implementarlos o es prefereible tener copias de los sonidos con el efecto ya aplicado para evitar perdida de velocidad?

Bueno, afecta según el tipo de efecto. Respecto a si tiran de hard o de soft, depende de los flags que utilices y de las capacidades del hard. Ahora mismo no hay demasiadas tarjetas con aceleración hardware para efectos, por lo general van por software y se chupan su tajadita de CPU.

En cualquier caso, si el efecto que quieres aplicar no es necesario que se aplique en tiempo real, siempre es mucho mejor tener el sonido con el efecto aplicado. Es como los lightmaps; puedes precalcular un lightmap con las luces estáticas de la escena, pero para las luces dinámicas, tienes que aplicar la iluminación al renderizar. Si quieres un efecto doppler, que depende de la velocidad de un emisor cuya velocidad puede variar durante el juego, tendrás que aplicarlo en tiempo real. Si quieres un efecto de phaser o de flanger para hacer un sonido más chulo, haz que el WAV ya tenga el efecto y deja la CPU libre para otras cosas ;)

sync

zupervaca

 
CitarAyer me estuve recorriendo toda la documentacion de DirectMusic de DirectX 8.1 y tampoco vi nada referente a lectura de WAV, es mas, el ejemplo que tengo sobre DirectMusic me rechaza cualquier formato que no sea MIDI o sus formatos nativos. Seguramente estes usando DirectSound, que es el unico que trabaja unica y exclusivamente con WAV, al menos lo deduzco por lo del uso de efectos especiales que este incorpora.
Pasate por aquí en concreto esta parte:
Citar
The following table lists the standard types of loadable objects, together with their class identifiers (the rguidClass parameter of various methods that deal with objects) and the usual file name extension.
Object type Class                              Extension
Wave            CLSID_DirectSoundWave wav

Aquí tenéis un sitio donde aprender a controlar DirectMusic y archivos WAV.

Una última cosa DirectAudio es el conjunto de todas las librerías referentes a sonido en DirectX.

synchrnzr

 
CitarUna última cosa DirectAudio es el conjunto de todas las librerías referentes a sonido en DirectX

En realidad, a dia de hoy, sólo es un alias de DirectSound :P

sync

Barbarian

 
Cita de: "marcode"Si no lo haces ya así, prueba a crearlos con el flag DSBPLAY_LOCHARDWARE, para asegurarte de que se crean por hardware.

También que no tenga el flag DSBCAPS_LOCDEFER si es un buffer estático.

Otra prueba, fijar el nivel cooperativo con DSSCL_PRIORITY.

Otra más, con GetCurrentPosition comprobar que han empezado a reproducirse los dos para sincronizarlos con SetCurrentPosition. Aunque es mejor usar notificaciones para que avisen al llegar a un punto, pero es más coñazo el aprender a hacerlo.
Por mi parte, he seguido las indicaciones anteriores:
- Creo los buffers estáticos en el hardware
- Nivel cooperativo DSSCL_PRIORITY
- Reproduzco los dos sonidos y hago un bucle que se repite sin hacer nada hasta que el getCurrentPosition de ambos sonidos es distinto de cero.
- Inmediatamente pongo la posición de reproducción de los dos sonidos a cero

Desgraciadamente sigo notando el desfase entre sonidos. Quizás mi ordenador es demasiado lento y no le sirva esta técnica. Creo que mañana podré probarlo en un K7 a 1400, a ver que tal.







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.