Programación de Sonido con DirectX - max.esimez.ipn.mx · • Simular una orquesta sinfónica...

28
Programación de Sonido con DirectX Dr. Maximino Peña Guerrero Escuela Superior de Ingeniería Mecánica y Eléctrica del Instituto Politécnico Nacio- nal, Academia de Acústica, Unidad Profesional Adolfo López Matéos, Zacatenco D.F.

Transcript of Programación de Sonido con DirectX - max.esimez.ipn.mx · • Simular una orquesta sinfónica...

Programación de Sonido con DirectX

Dr. Maximino Peña Guerrero

Escuela Superior de Ingeniería Mecánica y Eléctrica del Instituto Politécnico Nacio-nal, Academia de Acústica, Unidad Profesional Adolfo López Matéos, ZacatencoD.F.

OBJETIVO

• Presentar las características de DirectX que nos permi-ten capturar y generar sonidos con una computadora digital.

• Describir las ventajas y desventajas de DirectX.

• Describir cómo se utiliza con los compiladores Visual Studio .NET C#, C++, entre otros.

• Mencionar por qué no se utiliza DirectX con UNIX (Linux)

• Mostrar un programa sencillo de ejemplo

Problemática• La simulación de eventos del mundo real requiere demucho procesamiento en paralelo.

• Simular una orquesta sinfónica requiere de por lo menos unos 20 procesos que generen sonido de manera simul-tánea.

• La Realidad Virtual requiere procesar una gran cantidad de datos, video tridimencional en tiempo real, sonido tridimencional en tiempo real, entre muchas otras variables.

• MS-Windows no permite el acceso directo al hard-ware de audio o video, u otros dispositivos de entrada o salida.

Problemática (continuacion)• Programar muchos eventos paralelos utilizando APIWin32 es complejo y tardado.

• Es posible programar Threads (hilos), pero ellos debenconvivir en sincronía, lo cual hace la programación máscompleja.

• Además, los paradigmas (modelos) de programación en MS Windows cambian rápidamente.

• Es necesario una biblioteca estable para la simulacióngráfica en tres dimensiones con sonido y otros efectosespeciales.

¿Qué es DirectX?• DirectX: Es una biblioteca de componentes de software que facilitan la programación gráfica de audio y video en tiempo real.

• Componente: Es un objeto software diseñado para dar un servicio específico; está construido con clases, métodos y datos.

• DirectX ha sido diseñado por el equipo de Microsoft dirigidos al principio por Bradley Bargen (1996) y actualmente por Tom Miller .

• Managed DirectX 9 es la versión de código administrado para la familia .NET, dicponible con Visual Studio .NETExpress (C#, C++, Basic, Java, etc.)

¿Cuáles son los componentes DirectX?• DirectDraw: Proporciona animación suave usando inter-cambio de páginas de video, acceso a coprocesadores gráficos especializados y administración de la memoria de video. Sirve de base a los componentes DirectShow y Direct3D.

• Direct3D: Proporciona interfases de alto y bajo nivel para motores render de 3D por software y por hardware.

• DirectSound: Proporciona sonido estéreo y 3D con mezcla de sonido por hardware así como administración de la memoria de la tarjeta de sonido.

¿Cuáles son los comp ... DirectX ? (cont.)• DirectPlay: Incluye servicios de mensajería indepen-dientes del medio para crear juegos con varios jugado-res, así como las funciones necesarias para organizar y ejecutar un juego multijugador.

• DirectInput: Proporciona entrada de baja latencia desde una amplia variedad de dispositivos de entrada y permite el funcionamiento de dispositivos de salida, incluyendo peroféricos activos de juego (como el joystick Sidewin-der Force Feedback de Microsoft).

• DirectSetup: Proporciona la instalación automática de los controladores de DirectX.

SISTEMA DE AUDIO DirectSoundAplicación Win32

MIDI, etc.Windows audio DDI

DirectSound

DirectSound HAL

HAL

Hardware de SonidoFuente: Sánchez99 p. 34

HAL: Hardware Abstraction Layer

WAVE

Cómo funciona DirectSound

Mezclador porSoftware

Buffer Primario

Buffers por Hardware

Tarjeta

de

Sonido

Altavoces

Buffers por Software(secundarios)

Mezclador por Hardware

Fuente: bargen98 p. 192

¿Cómo programar DirectSound?1. Iniciar una estructura del tipo WAVEFORMATEX que

describa el formato del sonido.2. Iniciar una estructura del tipo DSBUFFERDESC con

los parámetros del buffer, incluyendo un apuntador a su estructura WAVEFORMATEX.

3. Llamar al método CreateSoundBuffer() para crear el buffer.

4. Bloquear todo el buffer o solamente una parte.5. Copiar datos (normalmente desde un archivo o desde

un recurso) a la parte bloqueada del buffer.6. Desbloquear el buffer.7. Fijar, si es necesario, la posición de reproducción. 8. Reproducir el buffer.9. Si se trata de un buffer canalizado, repetir los pasos 4,

5 y 6. Fuente: Bargen98, p. 215

Programando DirectSound

#include <windows.h>#include <dsound.h>#include <math.h>#include "Resource.h"

#define BPS 8 // Bits por muestra.#define SPS 22050 // Muestras por segundo.#define NCH 1 // Numero de canales.#define PI 3.1416 // Ya la sabemos#define FC1 1000 // Frecuencia 1#define TAM1 64000 // Tamaño del buffer 1

Programando DirectSound

// VariablesHWND hdlg;HRESULT bien;LPDIRECTSOUND dsnd;LPDIRECTSOUNDBUFFER buffer;WAVEFORMATEX wfmt;DSBUFFERDESC bdes;LPVOID buflck = NULL;DWORD nbytes = TAM1;

// Prototipos de métodos.int Error(LPCSTR);VOID FillBuffer(PBYTE,int,int);

// Prototipo de diálogo en Windows.BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

Programando DirectSound (cont..)// Punto de entrada a la aplicaciónint WINAPI WinMain

(HINSTANCE hInstance, HINSTANCE hPrevIsntance, LPSTR lpCmdLine, int nShowCmd)

{DialogBox(

NULL,MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DialogProc

);return(1);

}

Programando DirectSound (cont..)BOOL CALLBACK DialogProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM

lParam){switch(msg){case WM_INITDIALOG:

hdlg = hDlg;// Reservar memoria con ceros.

memset(&wfmt,0,sizeof(WAVEFORMATEX));// Iniciar driver de sonido.

wfmt.wFormatTag = WAVE_FORMAT_PCM;wfmt.nChannels = NCH;wfmt.nSamplesPerSec = SPS;wfmt.nBlockAlign= NCH * (BPS/8);wfmt.nAvgBytesPerSec= wfmt.nSamplesPerSec * wfmt.nBlockAlign;wfmt.wBitsPerSample = BPS;

// Reservar memoria para el descriptor del buffer.memset(&bdes, 0, sizeof(DSBUFFERDESC));

// Inicializar el descriptor del buffer.bdes.dwSize = sizeof(DSBUFFERDESC);bdes.dwFlags = DSBCAPS_GLOBALFOCUS;bdes.dwBufferBytes = TAM1;bdes.lpwfxFormat = &wfmt;

Programando DirectSound (cont..)

// Crear objeto directdound.bien=DirectSoundCreate(0, &dsnd, NULL);

if (bien!=DS_OK){

Error("Error DirectSoundCreate");}

// Poner nivel cooperativo.bien = dsnd->SetCooperativeLevel(hdlg, DSSCL_NORMAL);if (bien!=DS_OK){

Error("Error SetCooperativeLevel");}

Programando DirectSound (cont..)// Crear el buffer de sonido.bien = dsnd->CreateSoundBuffer(&bdes, &buffer, NULL);if (bien!=DS_OK){

Error("Error CreateSoundBuffer"); }

// Asegurar segmento de memoria para que no lo toque el swappingbuffer->Lock(0,0,&buflck,&nbytes,0,0,DSBLOCK_ENTIREBUFFER);

// Llenar buffer con datosif (buflck) FillBuffer((PBYTE)buflck,FC1,TAM1);

// Desasegurar el segmento de memoriabuffer->Unlock(buflck,nbytes,NULL,0);

// Tocar el sonido.buffer->SetCurrentPosition(0);buffer->Play(0,0,0);break;

Programando DirectSound (cont..)// SALIDA DE WinMain() case WM_SYSCOMMAND:

// Detener sonido y salir.buffer->Stop();buffer->Release();dsnd->Release();EndDialog(hdlg, 0);

break;}return(false);}

Programando DirectSound (cont..)// Procesamiento de Erroresint Error(LPCSTR Msg){

MessageBox(

hdlg,Msg,

"Mensaje de error",MB_OK

);EndDialog(hdlg, 0);return(0);

}

Programando DirectSound (cont..)// Generadora de un sonido puro (función seno)VOID FillBuffer(PBYTE pBuffer,int iFreq,int cuantos){

static double fAngle ;int i;

for (i=0;i<cuantos;i++){

pBuffer[i]=(BYTE) (127+127*sin(fAngle));fAngle += 2 * PI* iFreq / SPS;if (fAngle > 2*PI) fAngle -= 2 * PI;

}}

DIRECTSOUND: directsound –reproducir un buffer estático

Dr. Maximino Peña Guerrero, file: PlayStatic, Diciembre 19, 2005

Ejemplo DirectX (Ceballos)

Ejemplo DirectX (Microsoft)

Ejemplo DirectX (Microsoft)

Ejemplo Drivers (Juan Símuta Peña)

Procesamiento de Partituras

Mezcladora ALSA

CONCLUSIONES

• “DirectX proporciona acceso de bajo nivel al hardware multimedia independiente del dispositivo.”

• “Al usar una capa de abstracción de software y una capa de emulación de hardware, DirectX ofrece una serie de consistentes prestaciones sobre una amplia variedad de configuraciones de hardware aumentando al mismo tiempo la posibilidad de funcionamiento por hardware.”

• Simulando con DirectX se “pueden aprovechar los avances del hardware a medida que se vayan originando, incluso después de que un juego comience a venderse.”

REFERENCIAS

Dr. Maximino Peña Guerrero, file: PlayStatic, Diciembre 19, 2005