Differenze tra le versioni di "La gestione mediante le funzioni esterne dell'API di SDL"

Da Gambas-it.org - Wikipedia.
 
(14 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
La libreria '''''SDL''''' è un [http://it.wikipedia.org/wiki/Application_programming_interface API] multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.
+
#redirect[[Eseguire_un_file_audio_mediante_le_funzioni_esterne_dell'API_di_SDL]]
 
 
 
 
Per poter utilizzare le funzioni esterne di ''SDL'' in Gambas, si richiameranno anche separatamente per lo più le seguenti librerie (con le attuali versioni):
 
libSDL-1.2.so.0.11.4
 
libSDL_mixer-1.2.so.0.12.0
 
libSDL_sound-1.0.so.1.0.2
 
E' possibile riprodurre più suoni contemporaneamente utilizzando le funzioni della sub-libreria mixer audio multi-canale ''SDL_mixer''.
 
 
 
 
 
==Eseguire un file WAV intercettando il canale sul quale viene eseguito==
 
E' possibile eseguire file '''WAV''' su flussi audio, definiti ''canali''. L'esecuzione sarà effettuata usando la funzione ''Mix_PlayChannelTImed''. Questa risorsa consente di eseguire sino a 32 file audio di formato WAV contemporaneamente. La predetta funzione intercetterà il canale sul quale il file WAV viene eseguito, restituendone un valore di tipo ''puntatore'' che ne consentirà la successiva gestione.
 
 
 
Di seguito mostreremo un semplice codice per eseguire un solo file audio WAV.
 
'''Private''' Const AUDIO_S16SYS As Integer = 32784      <FONT color=gray>' ''Campioni a 16-bit''</font>
 
'''Private''' Const SDL_INIT_AUDIO As Byte = 10
 
'''Private''' Const STEREO As Byte = 2
 
 
 
Library "libSDL-1.2:0.11.4"
 
 
<FONT color=gray>' ''int SDL_Init(Uint32 flags)''</font>
 
'''Private''' Extern SDL_Init(flags As Integer) As Integer
 
 
<FONT color=gray>' ''char * SDL_GetError(void)''</font>
 
'''Private''' Extern SDL_GetError() As String
 
 
<FONT color=gray>' ''void SDL_Quit(void)''</font>
 
'''Private''' Extern SDL_Quit()
 
 
 
Library "libSDL_mixer-1.2:0.12.0"
 
 
<FONT color=gray>' ''char * Mix_GetError(void)''</font>
 
'''Private''' Extern Mix_GetError() As String
 
 
<FONT color=gray>' ''int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)''</font>
 
'''Private''' Extern Mix_OpenAudio(frequency As Integer, formatSh As Short, channels As Byte, chunksize As Integer) As Integer
 
 
<FONT color=gray>' ''Mix_Chunk * Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)''</font>
 
'''Private''' Extern Mix_LoadWAV_RW(src As Pointer, freesrc As Integer) As Pointer
 
 
<FONT color=gray>' ''int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)''</font>
 
'''Private''' Extern Mix_PlayChannelTimed(channel As Integer, chunk As Pointer, loops As Integer, ticks As Integer) As Integer
 
 
<FONT color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)''</font>
 
'''Private''' Extern Mix_FreeChunk(chunk As Pointer)
 
 
<FONT color=gray>' ''void Mix_CloseAudio(void)''</font>
 
'''Private''' Extern Mix_CloseAudio()
 
 
 
Library "libSDL_sound-1.0:1.0.2"
 
 
<FONT color=gray>' ''SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)''</font>
 
'''Private''' Extern SDL_RWFromFile(src As String, mode As String) As Pointer
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim err, channel As Integer
 
  Dim audio_rate As Integer = 44100  <FONT color=gray>' ''Imposta la frequenza che verrà usata da "SDL_mixer"''</font>
 
  Dim audio_buffers As Short = 4096  <FONT color=gray>' ''Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire i campioni audio''</font>
 
  Dim fl, sound As Pointer
 
 
 
<FONT color=gray>' ''Inizializza il dispositivo SDL audio:''</font>
 
    err = SDL_Init(SDL_INIT_AUDIO)
 
    If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL: " & SDL_GetError())
 
 
<FONT color=gray>' ''Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:''</font>
 
    err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
 
    If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
 
   
 
<FONT color=gray>' ''Carica il file WAV:''</font>
 
    fl = SDL_RWFromFile("''/percorso/del/file.wav''", "rb")
 
    If IsNull(fl) Then Error.Raise("Errore nel caricamento del file !")
 
 
    sound = Mix_LoadWAV_RW(fl, 1)
 
 
<FONT color=gray>' ''Esegue il file WAV caricato, ed intercetta il canale sul quale viene eseguito.''
 
' ''Passando il valore -1 al primo argomento della funzione, il campione audio sarà eseguito sul primo canale audio disponibile:''</font>
 
    channel = Mix_PlayChannelTimed(-1, sound, 0, 0)
 
    If channel = -1 Then Error.Raise("Impossibile eseguire il file WAV: " & Mix_GetError())
 
 
<FONT color=gray>' ''Attende che sia terminato il file WAV:''</font>
 
    While Mix_Playing(channel) <> 0
 
      Wait 0.01
 
    Wend
 
 
<FONT color=gray>' ''Libera la memoria precedentemente allocata per l'esecuzione sonora:''</font>
 
    Mix_FreeChunk(sound)
 
 
 
<FONT color=gray>' ''Chiude l'interfaccia audio SDL e SDL_mixer:''</font>
 
    Mix_CloseAudio()
 
 
 
    SDL_Quit()
 
 
'''End'''
 
 
 
 
 
===Eseguire due o più file audio WAV===
 
Di seguito mostreremo un codice esemplificativo, nel quale verranno eseguiti due file WAV:
 
'''Private''' Const AUDIO_S16SYS As Integer = 32784      <FONT color=gray>' ''Campioni a 16-bit''</font>
 
'''Private''' Const SDL_INIT_AUDIO As Byte = 10
 
'''Private''' Const STEREO As Byte = 2
 
 
 
Library "libSDL-1.2:0.11.4"
 
 
<FONT color=gray>' ''int SDL_Init(Uint32 flags)''</font>
 
'''Private''' Extern SDL_Init(flags As Integer) As Integer
 
 
<FONT color=gray>' ''char * SDL_GetError(void)''</font>
 
'''Private''' Extern SDL_GetError() As String
 
 
<FONT color=gray>' ''void SDL_Quit(void)''</font>
 
'''Private''' Extern SDL_Quit()
 
 
 
Library "libSDL_mixer-1.2:0.12.0"
 
 
<FONT color=gray>' ''char * Mix_GetError(void)''</font>
 
'''Private''' Extern Mix_GetError() As String
 
 
<FONT color=gray>' ''int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)''</font>
 
'''Private''' Extern Mix_OpenAudio(frequency As Integer, formatSh As Short, channels As Byte, chunksize As Integer) As Integer
 
 
<FONT color=gray>' ''Mix_Chunk * Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)''</font>
 
'''Private''' Extern Mix_LoadWAV_RW(src As Pointer, freesrc As Integer) As Pointer
 
 
<FONT color=gray>' ''int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks)''</font>
 
'''Private''' Extern Mix_PlayChannelTimed(channel As Integer, chunk As Pointer, loops As Integer, ticks As Integer) As Integer
 
 
<FONT color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)''</font>
 
'''Private''' Extern Mix_FreeChunk(chunk As Pointer)
 
 
<FONT color=gray>' ''void Mix_CloseAudio(void)''</font>
 
'''Private''' Extern Mix_CloseAudio()
 
 
 
Library "libSDL_sound-1.0:1.0.2"
 
 
<FONT color=gray>' ''SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)''</font>
 
'''Private''' Extern SDL_RWFromFile(src As String, mode As String) As Pointer
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim err, channel As Integer
 
  Dim channel as New Integer[]
 
  Dim audio_rate As Integer = 44100  <FONT color=gray>' ''Imposta la frequenza che verrà usata da "SDL_mixer"''</font>
 
  Dim audio_buffers As Short = 4096  <FONT color=gray>' ''Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire i campioni audio''</font>
 
  Dim fl, sound As New Pointer[]
 
 
 
<FONT color=gray>' ''Inizializza il dispositivo SDL audio:''</font>
 
    err = SDL_Init(SDL_INIT_AUDIO)
 
    If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL: " & SDL_GetError())
 
 
<FONT color=gray>' ''Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:''</font>
 
    err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
 
    If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
 
   
 
<FONT color=gray>' ''Carica il primo file WAV:''</font>
 
    fl.Add(SDL_RWFromFile("''/percorso/del/primo/file.wav''", "rb"))
 
    If IsNull(fl[0]) Then Error.Raise("Errore nel caricamento del 1° file !")
 
 
<FONT color=gray>' ''Carica il secondo file WAV:''</font>
 
    fl.Add(SDL_RWFromFile("''/percorso/del/secondo/file.wav''", "rb"))
 
    If IsNull(fl[1]) Then Error.Raise("Errore nel caricamento del 2° file !")
 
 
 
    With sound
 
      .Add(Mix_LoadWAV_RW(fl[0], 1))
 
      .Add(Mix_LoadWAV_RW(fl[1], 1))
 
    End With
 
 
<FONT color=gray>' ''Esegue <SPAN Style="text-decoration=underline">contemporaneamente</span> entrambi i file WAV caricati , ed intercetta il rispettivo canale sul quale ciascuno di essi viene eseguito.''
 
' ''Passando il valore -1 al primo argomento della funzione, il campione audio sarà eseguito sul primo canale audio disponibile:''</font>
 
    channel.Add(Mix_PlayChannelTimed(-1, sound[0], 0, 0)
 
    If channel[0] = -1 Then Error.Raise("Impossibile eseguire il 1° file WAV: " & Mix_GetError())
 
 
    channel.Add(Mix_PlayChannelTimed(-1, sound[1], 0, 0)
 
    If channel[1] = -1 Then Error.Raise("Impossibile eseguire il 2° file WAV: " & Mix_GetError())
 
 
<FONT color=gray>' ''Attende che sia terminato il file WAV:''</font>
 
    While Mix_Playing(channel) <> 0
 
      Wait 0.01
 
    Wend
 
 
<FONT color=gray>' ''Libera la memoria precedentemente allocata per l'esecuzione sonora:''</font>
 
    Mix_FreeChunk(sound)
 
 
 
<FONT color=gray>' ''Chiude l'interfaccia audio SDL e SDL_mixer:''</font>
 
    Mix_CloseAudio()
 
 
 
    SDL_Quit()
 
 
'''End'''
 
 
 
 
 
==Eseguire gli altri formati di file audio==
 
Per poter eseguire i file audio di altro formato (ma compreso anche lo stesso formato WAV) |'''[[#Note|1]]'''|, bisognerà utilizzare la funzione ''Mix_PlayMusic'' appartenente alla libreria ''libSDL_mixer-1.2.so.0.12.0''. Detta funzione non consente di poter eseguire più file contemporaneamente.
 
Library "libSDL-1.2:0.11.4"
 
 
<FONT color=gray>' ''int SDL_Init(Uint32 flags)''</font>
 
'''Private''' Extern SDL_Init(flags As Integer) As Integer
 
 
<FONT color=gray>' ''char * SDL_GetError(void)''</font>
 
'''Private''' Extern SDL_GetError() As String
 
 
<FONT color=gray>' ''void SDL_Quit(void)''</font>
 
'''Private''' Extern SDL_Quit()
 
 
 
Library "libSDL_mixer-1.2:0.12.0"
 
 
<FONT color=gray>' ''char * Mix_GetError(void)''</font>
 
'''Private''' Extern Mix_GetError() As String
 
 
<FONT color=gray>' ''int Mix_OpenAudio(Int frequency, Uint16 Format, Int channels, Int chunksize)''</font>
 
'''Private''' Extern Mix_OpenAudio(frequency As Integer, formatSh As Short, channels As Byte, chunksize As Integer) As Integer
 
 
<FONT color=gray>' ''Mix_Music *Mix_LoadMUS(const char *file)''</font>
 
'''Private''' Extern Mix_LoadMUS(file As String) As Pointer
 
 
<FONT color=gray>' ''int Mix_PlayMusic(Mix_Music *music, int loops)''</font>
 
'''Private''' Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer
 
 
<FONT color=gray>' ''Int Mix_PlayingMusic()''</font>
 
'''Private''' Extern Mix_PlayingMusic() As Integer
 
 
<FONT color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)''</font>
 
'''Private''' Extern Mix_FreeChunk(chunk As Pointer)
 
 
<FONT color=gray>' ''void Mix_CloseAudio(void)''</font>
 
'''Private''' Extern Mix_CloseAudio()
 
 
 
'''Public''' Sub Button1_Click()
 
 
  Dim err As Integer
 
  Dim audio_rate As Integer = 44100  <FONT color=gray>' ''Imposta la frequenza che verrà usata da "SDL_mixer"''</font>
 
  Dim audio_buffers As Short = 4096  <FONT color=gray>' ''Determina la quantità di blocchi di memoria utilizzati per incamerare ed eseguire l'audio''</font>
 
  Dim music As Pointer
 
 
 
<FONT color=gray>' ''Inizializza il dispositivo SDL audio:''</font>
 
    err = SDL_Init(SDL_INIT_AUDIO)
 
    If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL: " & SDL_GetError())
 
 
<FONT color=gray>' ''Inizializza la libreria "SDL_mixer" con specifiche impoostazioni audio:''</font>
 
    err = Mix_OpenAudio(audio_rate, AUDIO_S16SYS, STEREO, audio_buffers)
 
    If err <> 0 Then Error.Raise("Impossibile inizializzare l'audio: " & Mix_GetError())
 
 
 
<FONT color=gray>' ''Carica il file audio:''</font>
 
    music = Mix_LoadMUS("''/percorso/del/file_audio''")
 
    If IsNull(music) Then Error.Raise("Impossibile caricare il file audio: " & Mix_GetError())
 
 
<FONT color=gray>' ''Esegue il file audio. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.''
 
' ''Se è posto a -1 il file sarà esguito all'infinito:''</font>
 
    err = Mix_PlayMusic(music, 0)
 
    If err < 0 Then Error.Raise("Impossibile eseguire il file audio: " & Mix_GetError())
 
 
 
<FONT color=gray>' ''Attende che sia terminato il file audio:''</font>
 
    While Mix_PlayingMusic() <> 0
 
      Wait 0.01
 
    Wend
 
 
<FONT color=gray>' ''Libera la memoria precedentemente allocata per l'esecuzione sonora:''</font>
 
    Mix_FreeChunk(music)
 
 
 
<FONT color=gray>' ''Chiude l'interfaccia audio SDL e SDL_mixer:''</font>
 
    Mix_CloseAudio()
 
 
 
    SDL_Quit()
 
 
'''End'''
 
 
 
 
 
 
 
=Note=
 
[1] I formati eseguibili sono i seguenti:
 
* WAVE/RIFF ( .wav )
 
* AIFF ( .aiff )
 
* VOC ( .voc )
 
* MOD (.mod .xm .s3m .669 .it .med ed altri)
 
* [[La_gestione_dei_file_MIDI_mediante_le_funzioni_esterne_del_API_di_SDL|MIDI (.mid)]]
 
* OggVorbis (.ogg)
 
* MP3 (.mp3)
 
 
 
 
 
 
 
=Riferimenti=
 
* Il sito dell'[http://wiki.libsdl.org/moin.fcg/CategoryAPI API di SDL].
 
* Il sito [http://www.webkinesia.com www.webkinesia.com sulla libreria SDL_mixer].
 

Versione attuale delle 08:14, 17 ago 2018