1 PROGRAMACIÓN MULTIMEDIA INTRODUCCIÓN A LA API MULTIMEDIA DE WINDOWS
2 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 2 zVídeoVídeo zSonido MIDISonido MIDI zIntroducciónIntroducción zControl del TiempoControl del Tiempo
3 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 3 Cabeceras WINDOWS.H DIGITALV.H MCIAVI.H MMSYSTEM.H MSACM.H, VCR.H VFW.H Introducción Librerías MSACM32.LIB WINMM.LIB VFW32.LIB
4 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 4 Versión del sistema multimedia: BOOL GetVersionEx( LPOSVERSIONINFO lpVersionInformation ); typedef struct _OSVERSIONINFO{ DWORD dwOSVersionInfoSize; DWORD dwMajorVersion; DWORD dwMinorVersion; DWORD dwBuildNumber; DWORD dwPlatformId; TCHAR szCSDVersion[ 128 ]; } OSVERSIONINFO; Introducción (2)
5 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 5 Tipos de datos multimedia: -Archivos MIDI. Series de comandos que un sintetizador (incluido en las tarjetas de sonido) interpreta -Archivos WAV. Grabaciones digitales de sonido -Vídeos. Archivos multi-pista, con imágenes (.AVI) y sonido (WAV) Introducción (3)
6 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 6 Ventanas Multimedia: Ventanas especiales que incorporan un botón play, un botón stop, un trackbar, un menú emergente y, en su caso, una zona de visualización MCIWndCreate(hwndParent, g_hinst, WS_VISIBLE | WS_CHILD | MCIWNDF_SHOWALL, "sample.avi"); Introducción (4)
7 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 7 Funciones de consulta: UINT auxGetNumDevs(void); UINT midiInGetNumDevs(void); UINT midiOutGetNumDevs(void); UINT waveInGetNumDevs(void); UINT waveOutGetNumDevs(void); MMRESULT auxGetDevCaps( UINT uDeviceID, LPAUXCAPS lpCaps, UINT cbCaps ); Introducción (5)
8 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 8 Funciones de consulta: MMRESULT midiInGetDevCaps( UINT uDeviceID, LPMIDIINCAPS lpMidiInCaps, UINT cbMidiInCaps ); MMRESULT midiOutGetDevCaps( UINT uDeviceID, LPMIDIOUTCAPS lpMidiOutCaps, UINT cbMidiOutCaps ); Introducción (6)
9 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 9 Funciones de consulta: MMRESULT waveInGetDevCaps( UINT uDeviceID, LPWAVEINCAPS pwic, UINT cbwic ); MMRESULT waveOutGetDevCaps( UINT uDeviceID, LPWAVEOUTCAPS pwoc, UINT cbwoc ); Introducción (7)
10 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 10 Funciones de consulta: typedef struct { WORD wMid; WORD wPid; MMVERSION vDriverVersion; CHAR szPname[MAXPNAMELEN]; WORD wTechnology; WORD wReserved1; DWORD dwSupport; } AUXCAPS; Introducción (8)
11 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 11 Funciones de consulta: typedef struct { WORD wMid; WORD wPid; MMVERSION vDriverVersion; CHAR szPname[MAXPNAMELEN]; DWORD dwSupport; } MIDIINCAPS; Introducción (9)
12 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 12 Funciones de consulta: typedef struct { WORD wMid; WORD wPid; MMVERSION vDriverVersion; CHAR szPname[MAXPNAMELEN]; WORD wTechnology; WORD wVoices; WORD wNotes; WORD wChannelMask; DWORD dwSupport; } MIDIOUTCAPS; Introducción (10)
13 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 13 Funciones de consulta: typedef struct { WORD wMid; WORD wPid; MMVERSION vDriverVersion; CHAR szPname[MAXPNAMELEN]; DWORD dwFormats; WORD wChannels; WORD wReserved1; DWORD dwSupport; } WAVEOUTCAPS; Introducción (11)
14 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 14 Funciones de consulta: typedef struct { WORD wMid; WORD wPid; MMVERSION vDriverVersion; CHAR szPname[MAXPNAMELEN]; DWORD dwFormats; WORD wChannels; WORD wReserved1; } WAVEINCAPS; Introducción (12)
15 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 15 Funciones de apertura y cierre: midiInOpen() midiInClose() midiOutOpen() midiOutClose() waveInOpen() waveInClose() waveOutOpen() waveOutClose() Introducción (13)
16 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 16 Funciones de manejo de errores: midiInGetErrorText() midiOutGetErrorText() waveInGetErrorText() waveOutGetErrorText() Introducción (14)
17 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 17 Funciones de manejo de errores: MMRESULT midiInGetErrorText( MMRESULT wError, LPSTR lpText, UINT cchText ); Introducción ( y 15)
18 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 18 -MIDI: Musical Instrument Digital Interface (Interfaz digital para instrumentos musicales) -Estándar creado a principios de los 80 para la interconexión de instrumentos musicales. Sonido MIDI
19 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 19 Canales y mapeador MIDI Sonido MIDI Dispositivo MIDI 1 Dispositivo MIDI 2 INOUT IN
20 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 20 Canales y mapeador MIDI Sonido MIDI Dispositivo MIDI 1 Dispositivo MIDI 2 INOUT IN Dispositivo MIDI 3 Dispositivo MIDI 4 THRU IN THRU
21 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 21 #include int PASCAL WinMain (HINSTANCE, HINSTANCE, LPSTR,int) { UINT Entrada = midiInGetNumDevs(); UINT Salida = midiOutGetNumDevs(); char Buffer[128]; Sonido MIDI
22 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 22 sprintf (Buffer, “Hay %d dispositivo (s) de entrada \n y %d dispositivo (s) de salida, Entrada,Salida); MessageBox (NULL, Buffer, “NumeroDispositivosMidi”, MB_ICONINFORMATION); return 0; } Sonido MIDI
23 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 23 Mensajes MIDI: - Tipos de mensajes: canal (reproducir el sonido de una nota, cambiar de instrumento, etc) y sistema (selección de un ritmo, afinación). - Un mensaje consta de un byte de estado y uno o varios de datos. Sonido MIDI
24 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 24 Byte de estado: 1xxxcccc comando canal de destino Sonido MIDI
25 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 25 Comandos: 0: Desactivación de nota 1: Activación de nota 2: Postpulsación polifónica 3: Modificación de control 4: Selección de programa 5: Postpulsación única 6: Alteración de tono 7: Mensaje de sistema Sonido MIDI
26 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 26 Funciones para mandar mensajes: Simples: midiOutShortMessage() Múltiples: MIDIHDR midiOutPrepareHeader() midiOutLongMsg() midiOutUnprepareHeader() midiOutReset(), midiOutGetVolume(), midiOutSetVolume() Sonido MIDI
27 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 27 Lectura de mensajes. Funciones: Simples: midiInStart() Múltiples: MIDIHDR midiInPrepareHeader() midiInAddBuffer() midiInUnprepareHeader() midiInStop() midiInReset() Sonido MIDI
28 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 28 - Tarjeta de sonido: sintetizador - Puede recibir y mandar mensajes (API) - Puede reproducir ficheros MIDI (conjunto de comandos) - Puede resolver conflictos (Mapeador) Sonido MIDI
29 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 29 Vídeo - Funciones AVIFile: API de alto nivel. - Permiten manejar archivos RIFF sin necesidad de manipular su estructura interna. - Archivos RIFF: WAV y AVI
30 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 30 Vídeo (2) - AVIs: Soportan varios canales. - Canales: Bajo nivel, “chunks”; Alto nivel, “streams” -Funciones contenidas en una DLL - Para utilizarlas, uso de AVIFileInit(); (AVIFileExit())
31 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 31 Apertura y Cierre de Ficheros: AVIFileOpen() AVIFileAddRef() (Apertura múltiple) AVIFileRelease() Vídeo (3)
32 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 32 Vídeo (4) Lectura de Ficheros: AVIFileInfo() AVIFileReadData() Escritura de Ficheros: AVIFileWriteData()
33 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 33 typedef struct { DWORD dwMaxBytesPerSec; DWORD dwFlags; DWORD dwCaps; DWORD dwStreams; DWORD dwSuggestedBufferSize; DWORD dwWidth; DWORD dwHeight; DWORD dwScale; DWORD dwRate; DWORD dwLength; DWORD dwEditCount; char szFileType[64]; } AVIFILEINFO; Vídeo (5)
34 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 34 Uso del “ClipBoard” AVIPutFileOnClipboard() AVIGetFromClipboard() AVIClearClipboard() Vídeo (6)
35 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 35 “Streams”. Apertura y Cierre: - AVIFileGetStream() (combinada con AVIFileOpen()) - AVIStreamOpenFromFile() - AVIStreamAddRef() - AVIStreamRelease() Vídeo (7)
36 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 36 “Streams”. Lectura: - AVIStreamInfo() - AVIStreamReadFormat() - AVIStreamRead() Vídeo (8)
37 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 37 “Streams”. Creación de un fichero: Nuevo: AVISave() GetSaveFileNamePreview() Existente: AVIFileCreateStream() Vídeo (9)
38 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 38 “Streams”. Configuración: AVIStreamSetFormat() AVIStreamWrite() AVIStreamWriteData() Vídeo (10)
39 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 39 Ejemplos. Apertura de un AVI: VOID LoadAVIFile(LPCSTR szFile, HWND hwnd) { LONG hr; PAVIFILE pfile; AVIFileInit(); hr = AVIFileOpen(&pfile, szFile,OF_SHARE_DENY_WRITE, 0L); if (hr != 0){ ErrMsg("Unable to open %s", szFile); return; } Vídeo (11)
40 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 40 // Aquí irían funciones que trabajan con el archivo abierto AVIFileRelease(pfile); AVIFileExit(); } Vídeo (12)
41 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 41 Ejemplos. Trabajando con Streams: void InsertAVIFile(PAVIFILE pfile, HWND hwnd, LPSTR lpszFile) { int i; gcpavi = 0; for (i = gcpavi; i < MAXNUMSTREAMS; i++) { gapavi[i] = NULL; if (AVIFileGetStream(pfile, &gapavi[i], 0L, i - gcpavi) != AVIERR_OK) break; if (gapavi[i] == NULL) break; } Vídeo (13)
42 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 42 if (gcpavi == i) { ErrMsg("Unable to open %s", lpszFile); if (pfile) AVIFileRelease(pfile); return; } else { gcpavi = i - 1; } // Funciones para procesar datos } Vídeo (y 14)
43 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 43 -Crítico en ciertas aplicaciones -Cuando no es crítico, se puede usar SetTimer() Control del tiempo
44 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 44 UINT SetTimer( HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ); Control del tiempo (2)
45 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 45 timeGetTime, timeGetSystemTime (mmedia.hlp) Control del tiempo (3)
46 Programación MultimediaIntroducción a la API Multimedia de Windows © Carlos A. Lázaro Carrascosa. Laboratorio de Comunicación Oral R.W.N. 46 timeGetDevCaps() timeBeginPeriod() timeEndPeriod() timeSetEvent() timeKillEvent() Control del tiempo (y 4)
47 PROGRAMACIÓN MULTIMEDIA INTRODUCCIÓN A LA API MULTIMEDIA DE WINDOWS