Eseguire un file WAVE mediante le funzioni di OpenAL Utility Toolkit

Da Gambas-it.org - Wikipedia.

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


Riferimenti