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

Documentos relacionados