Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sobre DirectSound

Iniciado por synchrnzr, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

synchrnzr

                                Hola,

A ver si alguien se ha encontrado con este problema, que parece una estupidez pero hace tiempo que busco la solución y no he encontrado ninguna satisfactoria:

¿Cómo puedo tener mezclar 30 buffers del mismo sample sin tener q replicar el sample 30 veces?

Sé que existe una llamada para duplicar los buffers ( void DuplicateJanderClander(nosequeparametros tenía) ), pero recuerdo q tenía una restricción q hacía que, o bien la llamada en cuestión me duplicaba también el espacio en memoria (con lo cuál no me servía de nada) o bien no me servía por algún otro motivo q no recuerdo (cuando digo memoria me refiero tanto a RAM del PC como de la tarjeta de sonido)

No me he querido meter en DirectAudio, tal vez ahí está la solución pero me da mazo de pereza, a más q los Audiopaths me repelen totalmente y el DL2 aún más ^_^'

Sync :guay:                                

Drácula

                                Hace tiempo que hice un poco de DSound. e estado mirando el código y lo que yo haría sería aplicar el mismo segmento sobre varios AudioPath diferentes. Pero creo que esa no es la solución que buscas!!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

synchrnzr

                                No acaba de serlo, pero gracias por el intento :ojo:

Joer, que éxito... ¿a lo mejor es tan fácil q la gente no me contesta pq me toman por novato? XDD

Mira que me he tirado tiempo mirándomelo...

Sync :guay:                                

Frodrig

                                Uhmmm, no se si te podre ayudar, porque DirectX lo toque al comienzo de creacion de Crisol para realizar la libreria propia y despues de un añico pues no lo tengo tan fresco como puedas tenerlo tu u otra persona del foro.

A ver, en Crisol yo uso un servidor de recursos de tal forma que cuando registras un sonido, este te devuelve un handle a un arbol. Ese handle sera devuelto a todos aquellos clientes que soliciten registrar el mismo sonido. En las librerias de DirectX que yo implemente, tengo dos clases para trabajar con DirectSound:

CDXDSWAVBuffer
CDXDSWAVSound

La primera lo que hace es mantener, en memoria, el sonido digitalizado mientras que la segunda es la que se encarga de actuar de cliente a ese buffer sin necesidad de tener que replicar los datos.

En otras palabras, cuando se registra un sonido en el servidor de recursos y ese sonido AUN no existe, se crea una instancia a CDXDSWAVBuffer y otra a CDXDSWAVSound. El que registra trabajara con la instancia CDXDSWAVSound creada y todos aquellos clientes que vengan despues a registrar el mismo sonido utilizaran nuevas instancias CDXDSWAVSound pues de lo que se trata es de que no se repitan los datos en memoria.

Bueno, despues de este lio marinero sobre arquitectura, que tu seguro que te sabes de sobra pero que puede ser util para alguien que lea el post, te cuento de forma mas particular.

En la clase CDXDSWAVBuffer hay un metodo llamado Create que recibe el nombre del archivo .wav. Dentro de ese metodo se crea un buffer de sonido llamando a la funcion de DirectSound:

CreateSoundBuffer

Hasta ahi bien, ¿no?. Bueno, pues despues resulta que la clase CDXDSWAVSound posee otro metodo Create en donde, entre otras cosas, se realiza una llamada a la funcion:

DuplicateSoundBuffer

Esta funcion debera de recibir, como ya te imaginaras, el puntero LPDIRECTSOUNDBUFFER (encapsulado en la clase
CDXDSWAVBuffer) para que sepa donde estan los datos que debe de utilizar para crearse y funcionar.

Te dejo el apartado de notas de mi codigo que asocie al metodo Create de la clase CDXDSWAVSound. Por cierto, lo mas gracioso viene ahora: es codigo para las DX 7 :sonriendo:, pero bueno, supongo que a alguien habre ayudado.



// Notas:

// - MUY IMPORTANTE: La llamada a este metodo no siempre tendra exito.

//   DirectX no dejara crear un buffer duplicado en software si el

//   original esta en hardware.

// - Al duplicar un buffer, realmente se crea una referencia a otro

//   buffer ya existente pero pudiendo modificar sus atributos y

//   pudiendo tocarlo o pararlo libremente. El unico problema

//   se derivara al querer cambiar el contenido del buffer.



Saludos.                                

synchrnzr

                                Ya he comentado antes que no podía utilizar DuplicateSoundBuffer (ya recuerdo por qué motivo, era porque utilizo el flag DSBCAPS_CTRLFX para efectos ambientales)

Y por otro lado, también comentaba que el DuplicateSoundBuffer muchas veces replica también el sample en memoria.

De todas formas, gracias por el intento :ojo:

Sync :guay:                                






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.