Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida SDL - Audio

Guida SDL

Capitolo 14° - Audio

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

<< Precedente Prossimo >>
A proposito dell'autore

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.