Guida SDL
Capitolo 14° - Audio
Audio
La libreria SDL gestisce bene anche l'aspetto riguardante i suoni. Nel dettaglio, la libreria ci mette a disposizione una serie di funzioni che rendono facile la riproduzione di file audio: SDL_LoadWav(), SDL_OpenAudio(), SDL_PauseAudio(). SDL chiama automaticamente una funzione di callback che copia i campioni dalla memoria di sistema al buffer della scheda audio. Questa funzione dev'essere creata dall'utente e il suo indirizzo, assieme ai valori della frequenza di campionamento e della risoluzione dei campioni, deve essere specificato nella struttura SDL_AudioSpec: typedef struct{ int freq; Uint16 format; Uint8 channels; Uint8 silence; Uint16 samples; Uint32 size; void (*callback)(void *userdata, Uint8 *stream, int len); void *userdata; } SDL_AudioSpec; freq - Frequenza di campionamento Il numero di campioni copiati nel buffer della scheda audio al secondo. I valori più comuni sono 11025, 22050 e 44100. Più il valore è alto, migliore è il suono. format - Formato audio (1) Specifica la dimensione ed il tipo di ogni campione: AUDIO_U8 - Campioni di tipo Unsigned 8-bit AUDIO_S8 - Signed 8-bit AUDIO_U16 o AUDIO_U16LSB - Unsigned 16-bit little-endian AUDIO_S16 o AUDIO_S16LSB - Signed 16-bit little-endian AUDIO_U16MSB - Unsigned 16-bit big-endian AUDIO_S16MSB - Signed 16-bit big-endian AUDIO_U16SYS - Sia AUDIO_U16LSB che AUDIO_U16MSB dipendenti dal sistema endianness specifico AUDIO_S16SYS - Sia AUDIO_S16LSB che AUDIO_S16MSB dipendenti dal sistema endianness specifico. channels - Numero di canali: 1 mono, 2 stereo silence - Valore di silenzio del buffer audio (calcolato automaticamente) samples - Dimensione del buffer audio, in campioni size - Dimensione, in byte, del buffer audio (calcolato automaticamente) callback(..) - Funzone di callback per copiare i campioni nel buffer della scheda audio userdata - Puntatore ai parametri da passare alla funzione di callback. Riporto qui di seguito un esempio di funzione di callback, presa da http://www.libsdl.org: #define NUM_SOUNDS 2 struct sample { Uint8 *data; Uint32 dpos; Uint32 dlen; } sounds[NUM_SOUNDS]; void mixaudio(void *unused, Uint8 *stream, int len) { int i; Uint32 amount; for ( i=0; i<NUM_SOUNDS; ++i ) { amount = (sounds[i].dlen-sounds[i].dpos); if ( amount > len ) { amount = len; } SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME); sounds[i].dpos += amount; } } Questo invece è un esempio di struttura SDL_AudioSpec. SDL_AudioSpec fmt; /* Setta l'audio a 16-bit stereo 22Khz */ fmt.freq = 22050; fmt.format = AUDIO_S16; fmt.channels = 2; fmt.samples = 512; /* Un buon valore per i giochi */ fmt.callback = mixaudio; fmt.userdata = NULL; SDL permette anche la gestione dell'audio da CD-ROM. Riporto qui di seguito la semplice funzione ricavata dal sito http://www.libsdl.org: void PlayTrack(SDL_CD *cdrom, int track) { if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) { SDL_CDPlayTracks(cdrom, track, 0, track+1, 0); } while ( SDL_CDStatus(cdrom) == CD_PLAYING ) { SDL_Delay(1000); } } Si spiega da sola. (1) Big, Middle e Little Endian sono le tre tipologie alternative alla memorizzazione di dati con dimensione base superiore al byte. Per endianness si intende generalmente l'ordine dei byte.
Laurea in Ingegneria Informatica. Dottorato in Neuroingegneria.
Conosco i linguaggi C/C++, Java, Delphi, jsp e servlet, PHP, SQL, Bash, R, Matlab, Lisp. Esperienza con le librerie SDL e OpenGL, Ogre3D e Ode, MFC e CLR, Winsock.
Conoscenza base di: VB, Assembly.
|