Presentación de PowerPoint - Página Dr. Maximino Peña Guerrero
Transcripción
Presentación de PowerPoint - Página Dr. Maximino Peña Guerrero
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 Nacional, Academia de Acústica, Unidad Profesional Adolfo López Matéos, Zacatenco D.F. OBJETIVO • Presentar las características de DirectX que nos permiten 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 de mucho procesamiento en paralelo. • Simular una orquesta sinfónica requiere de por lo menos unos 20 procesos que generen sonido de manera simultá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 hardware de audio o video, u otros dispositivos de entrada o salida. Problemática (continuacion) • Programar muchos eventos paralelos utilizando API Win32 es complejo y tardado. • Es posible programar Threads (hilos), pero ellos deben convivir en sincronía, lo cual hace la programación más compleja. • Además, los paradigmas (modelos) de programación en MS Windows cambian rápidamente. • Es necesario una biblioteca estable para la simulación gráfica en tres dimensiones con sonido y otros efectos especiales. ¿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 .NET Express (C#, C++, Basic, Java, etc.) ¿Cuáles son los componentes DirectX? • DirectDraw: Proporciona animación suave usando intercambio 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 independientes del medio para crear juegos con varios jugadores, 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 Sidewinder Force Feedback de Microsoft). • DirectSetup: Proporciona la instalación automática de los controladores de DirectX. SISTEMA DE AUDIO DirectSound Aplicación Win32 DirectSound HAL: Hardware Abstraction Layer HAL MIDI, etc. WAVE Windows audio DDI DirectSound HAL Hardware de Sonido Fuente: Sánchez99 p. 34 Cómo funciona DirectSound Mezclador por Software Buffers por Software Altavoces Buffer Primario Tarjeta (secundarios) de Buffers por Hardware Sonido 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 #define #define #define #define #define BPS 8 SPS 22050 NCH 1 PI 3.1416 FC1 1000 TAM1 64000 // Bits por muestra. // Muestras por segundo. // Numero de canales. // Ya la sabemos // Frecuencia 1 // Tamaño del buffer 1 Programando DirectSound // Variables HWND 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ón int 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 swapping buffer->Lock(0,0,&buflck,&nbytes,0,0,DSBLOCK_ENTIREBUFFER); // Llenar buffer con datos if (buflck) FillBuffer((PBYTE)buflck,FC1,TAM1); // Desasegurar el segmento de memoria buffer->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 Errores int 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