Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





DSound Mixer

Iniciado por Pogacha, 20 de Enero de 2008, 05:16:31 PM

« anterior - próximo »

Pogacha

Al fin termine de implementar mi propio mixer, pero aun me quedan algunas dudas.

Sobre DSound:
1 - ¿Se puede atacar el primary buffer directamente?
Hasta el momento estoy creando un buffer secundario, y este es el que relleno en cada actualización. ¿Puedo precindir de el y atacar el buffer primario? De ser así, ¿Que complicaciones traeria? ¿Se puede variar el tamaño del buffer primario?

2 - ¿Puede que al asignar el formato al buffer primario este no me lo tome? Al que yo apunto es 44100 - 16bit - stereo.
¿Por que esto podria pasar? ¿que puedo hacer?

Sobre tratamiento de señales de audio:
3 - Para re-samplear los samples no estoy haciendo interpolación lineal debido a que debo tener N muestras + 1 para poder hacerlo, se me ocurre como hacerlo agregando un sample mas para los buffer estaticos y haciendo un aparejo para los streamings. ¿Que es lo que se suele hacer?

4 - Para samplear a mayor resolucion supongo es obligatorio la interpolación lineal al menos, pero para samplear a menor resolucion me queda la duda, ¿que es lo que deberia hacer?

5 - Por ahora no hago cambio de volumen dinamico (o sea modular las muestras por una funcion lineal), pero no es complicado, la pregunta es: Hay mucha diferencia en el cambio de volumen dinamico? a cambio de volumen por actualizacion del buffer (lo cual seria modular el sample por una funcion escalonada).

Desde ya muchisimas gracias

synchrnzr

1. Por poder atacarlo puedes, pero no es muy recomendable. Además, el buffer primario en general no soporta notificaciones así que hacer el streaming directamente en el buffer primario puede ser algo complicadillo. Desde que se introdujo el modelo de drivers WDM, lo de atacar al buffer primario es una práctica desaconsejada. Básicamente, mezclar sonido así impedía que el propio mezclador del sistema pueda mezclar sonido de varias aplicaciones. Hacer la mezcla directamente en el buffer primario no tiene ninguna ventaja y sí muchas desventajas ¿Por qué quieres hacerlo así?

2. Podría pasar porque el dispositivo no lo soporte, pero... a mi no me ha pasado nunca, y menos con esa configuración, que yo casi te diría que debe estar soportada universalmente :shock:

3. Aquí puedes hacer cualquier invento. No sé si entendido bien lo que comentas, pero imagino que te refieres a tener un byte de reserva al principio del buffer. Antes de reproducir lo pones a 0 para interpolar y al final de cada buffer, el último sample lo dejas como byte de reserva para el siguiente buffer. No sé, esto no es muy complicado, no creo que tengas muchos problemas con ello.

4. Puedes hacer lo mismo, interpolación lineal; si tienes que sacar un sample de cada N, simplemente coje N samples y haz la media aritmética. Lo único que tiene que, como en general N no será entero, tendrás que ponderar el peso el último sample en función de la parte fraccionaria de N. Por ejemplo, si N = 2,5 y los samples empiezan en samp:

value = (samp[i] + samp[i+1] + samp[i+2] * 0,5) / 2,5

Como puedes ver es bastante intuitivo. Luego, tanto para el upsampling como para el downsampling podrías utilizar funciones de interpolación más complejas para conseguir que suene mejor (cúbica, spline, convolutiva...) Depende de lo que quieras conseguir.

5. Si puedes hacer el cambio dinámico siempre sonará mejor. La diferencia básicamente depende de lo rápido que cambie el volumen. Si cambia muy rápido te saldrá un cambio bastante brusco y escalonado, si el cambio es lento apenas hay diferencia.

Pogacha

1 - OK, no atacar buffer primario, mi pregunta era por que no tenia ni idea.

2 - OK

3 - Si, me costo 15 minutos nomas, le tenia mas miedo que otra cosa.

4 - OK, interpolación lineal, usaré interpolación lineal para upsampling tanto como para downsampling (el downsampling esta restringido a X/2)

5 - El tamaño del buffer esta tomado para que se update al menos 40 veces por segundo, y no se escucha mal así que lo dejare escalonado.

Es para tiempo real en un juego con req min Pentium 3 700mhz así que hasta por ahí estoy bien.

Muchas gracias.






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.