390 likes | 500 Views
Direct Sound. Componente de sonido de la API para aplicaciones multimediales de Microsoft: DirectX. La Física del sonido.
E N D
Direct Sound Componente de sonido de la API para aplicaciones multimediales de Microsoft: DirectX.
La Física del sonido • El sonido es generado por ondas de energía liberadas de objetos que chocan entre si. Luego estas ondas de energía producen cambios de presión, lo que al final es captado por los tímpanos.
La Física del sonido • La forma en que las tarjetas de sonido producen sonido en forma de ondas de sonido, luego los cambios de voltaje amplificado, el que es recibido por parlantes que vibran, estas vibraciones, producen cambios en la presión del aire y son consideradas sonidos.
Sonido en Computadores. • Al principio de la era computacional, los primeros computadores no fueron pensados para ser equipos multimediales, sino simples calculadoras. • Por ello solo se contaba con los “beeps” para avisar mensajes.
Sonido en Computadores. • En los 70 aparecen las primeras tarjetas de Sonido que usaban FM. • Los primeros Mac ya manejaban sonido. • En DOS de Microsoft, se podía contar con sonido, gracias a que existían ya a esas alturas T de Sonido. Pero para ello se necesitaba que el juego o aplicación misma se hiciera cargo de hacer funcionar la tarjeta de sonido.
Direct X & DirectSound • En 1995 aparece DirectX, con la idea de ser una API, con la cual, los programadores de video juegos se olvidarían del hardware que el usuario este utilizando, dejando la responsabilidad al SO. • Parte de DirectX 1, es DirectSound, que en ese tiempo solo ofrecía efectos básicos de paneo izquierdo y derecho.
Direct X & DirectSound • DirectSound 3 introdujo en concepto de Directsound3d (DS3D), que ofrecía comandos para ubicar sonidos en un espacio 3D. • Fue hasta DS5 que estas librerías pudieron ser aceleradas por componentes alternativos, lo que redujo sustancialmente el consumo de CPU.
DirectSound hoy • Lo que hoy nos ofrece DirectSound: • Tocar archivos o recursos en formato WAV. • Tocar varios sonidos de manera simultanea. • Asignar alta prioridad a los sonidos. • Localizar sonidos en ambientes 3-D. • Agregar efectos como Ecos y Coros, y cambiar los parámetros de estos de manera dinámica. • Capturar sonidos en formato WAV desde un micrófono u otros dispositivos.
Api inside. • La Api de DirectSound, está formado por objetos COM de Microsoft. • Todo objeto DirectSound, DS, debe estar asociado a lo que llamaremos buffer primario. Sobre este buffer no tenemos permisos ni de escritura ni de lectura en Windows NT / Windows 2000. En este buffer se almacena la mezcla de sonidos que se le entregará a la tarjeta de sonido.
DirectSound en VxD. • Bajo el modelo de drivers virtuales, VxD, las mezclas de los buffers son hechas en Dsound.vxd. Esto implica que es posible acceder al buffer primario de manera directa. En este caso, se accede al buffer del DMA que usa la T de sonido. Es posible setear propiedades del buffer de esta manera, incluso cambiar las propiedades del mismo hardware.
Windows Driver Model (WDM) • No hay acceso al buffer primario, DS manda los datos al mezclador del kernel. • El mezclador del kernel se encarga de convertir los formatos de audio que recibe en uno común. Mezclar y enviar a la T De Sonido. • Es capaz de mezclar WaveOut con DS.
Buffers de sonido. • Para mezclar un conjunto de sonidos, se usan buffers secundarios. Luego se mezclan y se reproducen en el buffer primario de manera simultanea. • Para escribir sobre un buffer secundario, primero debemos hacer un lock, a un trozo de ese buffer. Escribir lo que deseemos en esos bytes y desbloquearlo, con unlock. DS te permite bloquear un trozo mientras se está reproduciendo otro, siempre con cierta seguridad para evitar mezclas no deseadas.
Buffers de sonido. • Cada aplicación debe crear al menos un buffer secundario, para almacenar y tocar los sonidos. • Un buffer secundario puede ser destruido en cualquier momento, puede ser estático y que almacene un sonido simple, o también puede tocar los sonidos de forma streaming, en caso de que el consumo de memoria fuese mayor. • Los buffers secundarios se mezclan simplemente al tocar los sonidos al mismo tiempo, cualquiera sea el número, sólo dependerá del poder de procesamiento.
Características de los buffers. • Formato : el formato de cada buffer debe ser el mismo que el del wav que se tocará. • Controls. Volumen, frecuencia, y movimiento 3d son algunos de los controles para cada buffer. • Location. Un buffer puede estar en memoria manejado por hardware, o en memoria manejado por software.
Programación del API DirectSound • Lo primero de todo, debemos crear un objeto DirectSound, llamando a la siguiente función: HRESULT WINAPI DirectSoundCreate( LPGUID lpGuid, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter );
Programación del API DirectSound • El primer y tercer parámetro debe estar a 0, y el segundo es un puntero a un objeto DirectSound, creado tras la llamada a esta función. El código sería como sigue: LPDIRECTSOUND pDS; HRESULT hRes = :: DirectSoundCreate(0, &pDS,0); If (hRes == DS_OK) { ...
Programación del API DirectSound • Tras ello, debemos de establecer al objeto DS lo que la librería llama el cooperative level. Básicamente, eso consiste en asociar el objeto a una ventana de la aplicación, indicando la prioridad que tiene respecto al resto de aplicaciones ejecutándose. • Se realiza mediante el método del objeto COM DS: HRESULT SetCooperativeLevel ( HWND hwnd, DWORD dwLevel );
Tras ello, creamos el buffer secundario y establecemos su formato interno, número de canales, frecuencia... Se realiza mediante el siguiente código: DSBUFFERDESC bufferDesc; memset(&bufferDesc, 0, sizeof(DSBUFFERDESC)); bufferDesc.dwSize = sizeof(DSBUFFERDESC); bufferDesc.dwFlags = DSBCAPS_PRIMARYBUFFER |DSBCAPS_STICKYFOCUS; bufferDesc.dwBufferBytes = 0; bufferDesc.lpwfxFormat = NULL; hRes = pDS->CreateSoundBuffer (&bufferDesc,&primaryBuffer, NULL);
if (hRes == DS_OK) { // Establecemos el formato, 48kz, 16bits, stereo WAVEFORMATEX format; memset(&format, 0, sizeof(WAVEFORMATEX)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 2; // stereo format.nSamplesPerSec = F_MUEST; format.nAvgBytesPerSec = 4 * F_MUEST ; format.nBlockAlign = 4; format.wBitsPerSample = 16; format.cbSize = 0; hRes = primaryBuffer->SetFormat(&format);
HRESULT Lock ( DWORD dwWriteCursor, DWORD dwWriteBytes, LPVOID lplpvAudioPtr1, LPDWORD lpdwAudioBytes1, LPVOID lplpvAudioPtr2, LPDWORD lpdwAudioBytes2, DWORD dwFlags ); El primer parámetro indica a partir de que posición se desea bloquear. El segundo, el número de bytes que se quieren tomar. El tercero y el quinto son punteros a void, que se rellenarán con las direcciones donde escribir. El cuarto y sexto parámetro devuelven las longitudes en bytes de sus respectivos trozos de memoria. El último parámetros es un conjunto de flags entre los que señalo DSBLOCK_ENTIREBUFFER, para bloquear el buffer completo Programación del API DirectSound
Programación del API DirectSound • Después de esto, se debe escribir en las posiciones indicadas por los punteros. Y al terminar, desbloquear el buffer mediante la siguiente llamada: HRESULT Unlock( LPVOID lpvAudioPtr1, DWORD dwAudioBytes1, LPVOID lpvAudioPtr2, DWORD dwAudioBytes2 );
Programación del API DirectSound • Cuando se quiera reproducir un buffer secundario, se indica mediante la llamada Play. HRESULT Play ( DWORD dwReserved1, DWORD dwReserved2, DWORD dwFlags );
Programación del API DirectSound • Los 2 primeros parámetros son 0, y el tercero, se le puede agregar un flag de looping. • Al hacer play, el contenido de este buffer secundario es mezclado por la libreria en el buffer primario, asi, si habian sonidos ya en el buffer primario, estos son reproducidos simultanemamente.
Manejo de sonido 3D • Cordenadas usadas son las cartesianas, eje x de izq a der, eje y de arriba abajo, y eje z, lejos a cerca. • Para la posicion se usan metros. • Velocidad se mide por unidades en cada eje por segundo, es decir m/s.
Sonido 3D:Percepción de posición • Ruido general : Una fuente de sonido que se aleja, se percibe como una disminución cte de sonido. Esto se le llama rolloff. • Diferencia interaural de intensidad : Sonidos que vienen del lado derecho se perciben más fuerte por el oído derecho.
Sonido 3D:Percepción de posición • Diferencia de tiempo interaural : Un sonido que viaja hacia el oyente desde la derecha, llegará antes al oído derecho que al izq. • Amortiguación (Rolloff) Dada la forma de la persona, los sonidos que vienen desde atrás, así como los que vienen de la derecha y son oídos por el oído izq., son amortiguados.
Sonido 3D:Distancia Mínima y máxima • Sonido cambia de acuerdo a la distancia, pero existe una distancia mínima a la cual el sonido es percibido de la misma forma. • Distancia default para un buffer es de un metro, ( unidad básica ) • La distancia máxima en Un billón, pero para evitar mal uso en caso de que existan drivers DxV, se aconseja preocuparse de esto.
Sonido 3D:Processing Mode • Tres modelos de procesar la información 3D Normal Relativo a la cabeza Disabled
Sonido 3D:Efecto Doppler. • La velocidad en DS sólo se usa para calcular efectos Doppler. • Cambio en el tono debido a un cambio en la frecuancia de las ondas de sonido.
Sonidos 3D:Cono De Sonido. • Estos conos de sonido sirven para tratar con fuentes de sonido, que se localizan en determinado punto del espacio.
Efectos • Los efectos que se pueden aplicar a los sonidos con la librería de DS son los siguientes. • Chorus • Compression • Distortion • Echo • Environmental Reverberation • Flange • Gargle • Parametric Equalizer • Waves Reverberation
DirectSound and DirectMusic • DirectSound y DirectMusic son componentes separados de DirectX, que tienen funcionalidades muy parecidas. Ambos reproducen sonidos WAV, y DirectMusic al final sintetiza todos los sonidos en ondas que son reproducidos por los buffers de DirectSound. • DirectMusic es una solución mucho más completa para la mayoría de las aplicaciones y juegos. Es capaz de reproducir todo tipo de sonidos. DirectSound es mas requerida para el manejo de recursos a bajo nivel. Especial para el manejo de latencias y uso de recursos más adecuado. • Interacción entre ambas es fuerte, a través de DS, manejar buffers manejados por DirectMusic.
Links • http://msdn.microsoft.com/directx