Eseguire un file WAVE mediante le funzioni di OpenAL Utility Toolkit
Vai alla navigazione
Vai alla ricerca
L'OpenAL Utility Toolkit (ALUT) è una libreria nettamente separata da quella ordinaria di OpenAl, e che dovrebbe essere portabile tra sistemi. ALUT dovrebbe essere un sistema di funzioni adatto per la produzione di semplici programmi demo e per aiutare i nuovi sviluppatori ad avere i primi approcci con OpenAL.
ALUT, eliminando i dettagli per ottenere un'applicazione audio funzionante, consente agli sviluppatori di imparare OpenAL facilmente.
E' necessario avere installata nel proprio sistema e richiamare in Gambas la libreria condivisa: "libalut.so.0.1.0 ".
Vediamo di seguito un semplice esempio per eseguire un file audio WAVE:
Library "libalut:0.1.0"
Private Const ALUT_ERROR_NO_ERROR As Byte = 0 ' Indica che non v'è alcun errore
Private Const AL_BUFFER As Short = 4105 ' Indica al buffer di fornire campioni sonori
Private Const AL_SOURCE_STATE As Short = 4112 ' Lo stato della sorgente sonora (AL_STOPPED, AL_PLAYING, ...)
Private Const AL_PLAYING As Short = 4114 ' Lo stato della sorgente sonora quando è in esecuzione del file audio
' ALboolean alutInit (int *argcp, char **argv) --> alutInit - initialize the ALUT library and create a default current context.
' alutInit returns AL_TRUE on success or AL_FALSE on failure
Private Extern alutInit(argcp As Integer, argv As Pointer) As Boolean
' ALenum alutGetError (void) --> alutGetError - return and clear the current error state
' alutGetError returns the contents of the global error state
Private Extern alGetError() As Integer
' ALuint alutCreateBufferFromFile (const char *filename) --> tries to guess the sound data format by looking at the filename and/or the file contents
' and loads the sound data into an OpenAL buffer. On success, alutCreateBufferFromFile returns a handle to an OpenAL buffer containing the loaded sound. It returns AL_NONE on failure.
Private Extern alutCreateBufferFromFile(fileWAV As String) As Pointer
' void alGenSources(Alsizei n, ALuint *sources)
Private Extern alGenSources(n As Integer, sources As Pointer)
' void alSourcei(ALuint source, ALenum param, ALint value) --> This function sets an integer property of a source
Private Extern alSourcei(source As Integer, param As Integer, value As Integer)
' void alSourcePlay(ALuint source) --> This function plays a source. The playing source will have its state changed To AL_PLAYING.
' When called On a source which Is Already playing, the source will restart at the beginning. When the attached buffer(s)are done playing,
' the source will progress To the AL_STOPPED state.
Private Extern alSourcePlay(sourcI As Integer)
' void alGetSourcei(ALuint source, ALenum pname, ALint * value) --> This function retrieves an integer property of a source
Private Extern alGetSourcei(sourcI As Integer, pname As Integer, value As Pointer)
' ' void alDeleteSources(ALsizei n, ALuint * sources) --> This function deletes one or more sources
Private Extern alDeleteSources(n As Integer, sources As Pointer)
' ' void alDeleteBuffers(ALsizei n, ALuint * buffers) --> his function deletes one or more buffers, freeing the resources used by the buffer
Private Extern alDeleteBuffers(n As Integer, buffers As Pointer)
' ALboolean alutExit (void) --> When the application has finished playing audio, it should shut down ALUT using aluExit.
' This closes any OpenAL device/context that ALUT may have created in alutInit. After calling alutExit, you may subsequently call alutInit or alutInitWithoutContext again.
' alutExit returns AL_TRUE on success or AL_FALSE on failure
Private Extern alutExit()
Public Sub Main()
Dim buffer, source, state, err As Integer
Dim ver As Boolean
Dim tm As Date
' Inizializza l'applicazione:
ver = alutInit(0, Null)
If ver = False Then Error.Raise("Rilevato errore nell'inizializzazione dell'applicazione !")
' Intercetta eventuali errori:
err = alGetError()
If err > ALUT_ERROR_NO_ERROR Then Error.Raise("Intercettato errore n. " & err & " (vedere file: alut.h)")
' Carica un file WAVE nella variabile "buffer":
buffer = alutCreateBufferFromFile("/percorso/del/file.wav")
' Crea una sorgente sonora:
alGenSources(1, VarPtr(source))
' Viene utilizzata la variabile "buffer" per riempire la sorgente:
alSourcei(source, AL_BUFFER, buffer)
alSourcePlay(source)
tm = Now
' Attende che l'esecuzione sia terminata:
Do
alGetSourcei(source, AL_SOURCE_STATE, VarPtr(state))
Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
Wait 0.01
Loop While state = AL_PLAYING
' Elimina sorgenti audio e buffer:
alDeleteSources(1, VarPtr(source))
alDeleteBuffers(1, VarPtr(buffer))
' Esce:
alutExit()
End