|
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.
|
|